Bu doküman, Apinizer üzerinde Elasticsearch uygulamasına Basit Kimlik Doğrulama yöntemi ile erişmek için gerekli konfigürasyonları içermektedir. Genel olarak, bu işlem Elasticsearch güvenlik seçeneği aktifleştirilerek ve kimlik bilgileri Apinizer API Manager üzerinden tanımlanarak gerçekleştirilir. Elasticsearch uygulaması ilk defa oluşturuluyorsa ilk adımdan itibaren işlemler uygulanır. Eğer Elasticsearch uygulaması varsa kullanıcı oluşturup, kimlik bilgilerini Apinizer API Manager üzerinden tanımlanma işlemine geçilebilir.

1.Lisans Kontrolü

Elasticsearch lisansı mutlaka Elastic Basic License olmalıdır. Apinizer, bu lisans içerisindeki X-Pack'e ait security eklentisinin desteklediği basit kimlik doğrulama yöntemini kullanmaktadır. Elasticsearch lisans bilgisini kontrol öğrenmek için aşağıdaki istek yapılır. 

curl -X GET "http://<ELASTICSEARCH_IP_ADDRESS>:<PORT>/_xpack/license?pretty"
CODE

2. Güvenliği Etkinleştirme

Varsayılan olarak, Elasticsearch güvenlik ayarı etkin değildir. Güvenlik seçeneğini aktifleştirmek için Elasticsearch kurulum dosyasındaki config/elasticsearch.yml dizininde yer alan bu dosyaya aşağıdaki özellik eklenir. Birden fazla node varsa hepsinde bu özellik aktifleştirilmelidir.

xpack.security.enabled: true
CODE

Bu işlemden sonra Elasticsearch uygulaması yeniden başlatılmalıdır.

2.1 Cluster daki nodeların iletişimlerinin şifreleme (TLS ayarı)

Elasticsearch yeniden başladıktan sonra aşağıdaki hata alınıyor ya da birden fazla node varsa bu bölümdeki ayarlar yapılmalıdır. Hem de güvenlik ayarı etkinleştirildğinde ve production ortamında çalışıyorsa Elasticsearch nodelarının birbirleriyle ilgili iletişiminin şifrelenmesini ister. Ayrıca bu iletişim transport katmanında gerçekleşmektedir.  

Transport SSL must be enabled for setups with production licenses. Please set [xpack.security.transport.ssl.enabled] to [true] or disable security by setting [xpack.security.enabled] to [false]
CODE

Birden fazla node varsa hepsinde bu ayar konfigure edilmelidir.

Birden fazla node olan clusterlar için config/elasticsearch.yml dosyası üzerinde dikkat edilmesi gereken ve isteğe bağlı diğer ayarlar;

# Nodeları cluster'ı bulması için benzersiz adı olmalıdır.
cluster.name: ApinizerEsCluster

# Aynı makinede birden fazla node olduğunda aynı ip/host bilgisine sahip olabilecekleri için bu node adı üzerinde sertifikanın konumu belirlenebilir.
node.name: <ELASTICSEARCH_IP_ADDRESS>

# Eğer tek bir node varsa bu ayar TLS hatasını erteleyebilir. Ama birden fazla node olduğunda silinmelidir.
# cluster.initial_master_nodes yaml dosyasında ekliyse discovery.type eklemeyiniz.
discovery.type: single-node

# Birden fazla master-eligible node varsa
cluster.initial_master_nodes: ["<ELASTICSEARCH_IP_ADDRESS>"]
CODE

2.2 Sertifika oluşturma

# Sertifika oluşturmak için aşağıdaki komut kullanılır. Bu dosyanın ayrıca parola ile korunması zorunlu değildir (Önerilmemektedir).
./bin/elasticsearch-certutil ca


./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12

# Sertifikalar config/certs dizini oluşturulup altına taşınır
mkdir config/certs/
mv elastic-certificates.p12 config/certs/
mv elastic-stack-ca.p12 config/certs/

# Devam etmeden önce bu sertifika dosyalarının Elasticsearch dosyalarıyla aynı ayrıcalıklara sahip olduğundan emin olun.
CODE


Daha sonra "/config/elasticsearch.yml" dosyasına aşağıdaki alanlar eklenmelidir. 

xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12
CODE


Bu işlemden sonra Elasticsearch uygulaması yeniden başlatılmalıdır.


Aşağıdaki istek ile güvenliği etkinleştirme durumu kontrol edilebilir.

curl -X GET -u <USERNAME>:<PASSWORD> "http://<ELASTICSEARCH_IP_ADDRESS>:<PORT>/_xpack?pretty"


...
 "security" : {
   "available" : true,
   "enabled" : true
 },
...                                                                                                                                                                                                               },  
...
CODE

Bu alan aktifleştirildiğinde kimlik bilgileri olmayan her istek aşağıdaki gibi reddedilecektir.

curl -X GET "http://<ELASTICSEARCH_IP_ADDRESS>:<PORT"
{
    "error": {
        "root_cause": [
            {
                "type": "security_exception",
                "reason": "missing authentication credentials for REST request [/]",
                "header": {
                    "WWW-Authenticate": "Basic realm=\"security\" charset=\"UTF-8\""
                }
            }
        ],
        "type": "security_exception",
        "reason": "missing authentication credentials for REST request [/]",
        "header": {
            "WWW-Authenticate": "Basic realm=\"security\" charset=\"UTF-8\""
        }
    },
    "status": 401
}
CODE

3.Built-in kullanıcı şifrelerini oluşturma 

Elasticsearch'in varsayılan built-in kullanıcı adı elastic'dir. Fakat bu kullanıcı adına oluşturulmuş şifre yoktur.

Şifre ataması yapılırken built-in tüm kullanıcıların şifreleri değiştirilecektir.

# Otomatik olarak şifreleri güncellemek için Elasticsearch kurulum dosyasında aşağıdaki komut çalıştırılır.
./bin/elasticsearch-setup-passwords auto
...
Changed password for user elastic
PASSWORD elastic = dd6mjMiemZlAKfOXkUAm

# Manuel olarak şifreleri güncellemek için Elasticsearch kurulum dosyasında aşağıdaki komut çalıştırılır.
./bin/elasticsearch-setup-passwords interactive
CODE


Bu adım, Elasticsearch günveliği aktifleştirdikten sonra yeni bir kullanıcı oluşturmak için gereklidir. Buradaki kimlik bilgileri de Apinizer API Manager da tanımlanabilir.

4.Kullanıcı ekleme

Yeni kullanıcı eklemek ya da güncellemek için aşağıdaki istek yapılır. İstekte kullanıcı adı apinizer_es_clusterşifresi apinizer ve rolü superuser olan yeni bir kullanıcı eklenmiştir. Eğer kullanıcı bilgileri güncellenirse, "created" : false olarak dönecektir.

# Windows için;
curl -X POST -u <USERNAME>:<PASSWORD> "http://<ELASTICSEARCH_IP_ADDRESS>:<PORT>/_security/user/apinizer_es_cluster?pretty" -H "Content-Type:application/json" -d "{\"password\":\"apinizer\", \"roles\":\[\"superuser\"\], \"full_name\":\"Apinizer Elasticsearch Cluster\",\"email\" : \"apinizer@mail.com\"}"

# Linux için;
curl -X POST -u <USERNAME>:<PASSWORD> "http://<ELASTICSEARCH_IP_ADDRESS>:<PORT>/_security/user/apinizer_es_cluster?pretty" -H "Content-Type:application/json" -d '{"password":"apinizer", "roles":["superuser"], "full_name":"Apinizer Elasticsearch Cluster","email" : "apinizer@mail.com"}'

{
  "created" : true
}
CODE

4.1 Şifre yenileme

Şifre değiştirmek için:

bin/elasticsearch-users passwd <USERNAME>
CODE


Eğer üstteki komut işe yaramazsa ve eğer Elasticsearch'deki kullanıcıların şifresi kaybedilmiş ise aşağıdaki komut satırından yeni kullanıcı oluşturalarak, cluster kurtarılabilir. Oluşturduğu kullanıcının kimlik bilgilerini kullanarak varolan kullanıcı adı ile parola bilgisini güncelleyebilir.

bin/elasticsearch-users useradd <NEW_USERNAME> -p <NEW_PASSWORD> -r superuser

curl -X POST "http://<ELASTICSEARCH_IP_ADDRESS>:<PORT>/_security/user/<OLD_USERNAME>/_password?pretty" -H 'Content-Type: application/json' -d'
{
  "password" : "<OLD_USERNAMES_NEW_PASSWORD>"
}
'
CODE


Ek olarak;

  • Postman gibi API test aracı üzerinde istek gönderileceği zaman isteğin header alanına Authorization: Basic <base64 ile encode edilmiş username:password> bilgisi eklenmelidir. 

# Örneğin;
Authorization: Basic YXBpbml6ZXJfZXNfY2x1c3RlcjphcGluaXplcg==
CODE
  • Kibana üzerinden kullanıcı yönetimini gerçekleştirmek için sırasıyla menüden Stack Management > Security > User ekranına gidilmelidir. Kibana kurulum dosyasına /config/kibana.yml aşağıdaki alanlar eklenmelidir.
elasticsearch.username: "apinizer_es_cluster"
elasticsearch.password: "apinizer"
CODE

Ek komutlar;

# Kimliği doğrulanmış kullanıcının bilgilerini öğrenme
curl -X GET -u apinizer_es_cluster:apinizer "http://<ELASTICSEARCH_IP_ADDRESS>:<PORT>/_security/_authenticate?pretty"

# Kullanıcı aktifleştirilebilinir ya da devre dışı bırakılabilir.
curl -X PUT -u apinizer_es_cluster:apinizer "http://<ELASTICSEARCH_IP_ADDRESS>:<PORT>/_xpack/security/user/apinizer_es_cluster/_enable"
curl -X PUT -u apinizer_es_cluster:apinizer "http://<ELASTICSEARCH_IP_ADDRESS>:<PORT>/_xpack/security/user/apinizer_es_cluster/_disable"

CODE

5.Apinizer konfigürasyonu

Tanımlanmış kullanıcının, kullanıcı adı ve şifresi Apinizer Manager Console daki Elasticseach Kümeleri sayfasından yapılmaktadır. Kimlik doğrulama switch butonunu aktifleştirip, kimlik bilgileri girilmelidir.