> ## Documentation Index
> Fetch the complete documentation index at: https://docs.apinizer.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Basit Kimlik Doğrulama

> Apinizer'ın Elasticsearch uygulamasına Basit Kimlik Doğrulama yöntemi ile erişmesi için gerekli konfigürasyonları sağlar. Elasticsearch güvenlik seçeneğini aktifleştirerek ve kimlik bilgilerini Apinizer API Manager üzerinden tanımlayarak güvenli bağlantı kurulmasını açıklar.

## 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 etmek için aşağıdaki istek yapılır:

```bash theme={null}
curl -X GET "http://<ELASTICSEARCH_IP_ADDRESS>:<PORT>/_xpack/license?pretty"
```

## Güvenliği Etkinleştirme

Varsayılan olarak, Elasticsearch güvenlik ayarı etkin değildir. Güvenlik seçeneğini aktifleştirmek için **config/elasticsearch.yml** dosyasına aşağıdaki özellik eklenir.

<Tip>
  Birden fazla node varsa hepsinde bu özellik aktifleştirilmelidir.
</Tip>

```yaml theme={null}
xpack.security.enabled: true
```

<Info>
  Bu işlemden sonra Elasticsearch uygulaması yeniden başlatılmalıdır.
</Info>

### Cluster'daki Nodeların İletişimlerinin Şifreleme (TLS Ayarı)

Elasticsearch yeniden başladıktan sonra aşağıdaki hata alınıyorsa veya birden fazla node varsa bu bölümdeki ayarlar yapılmalıdır. Güvenlik ayarı etkinleştirildiğinde ve production ortamında çalışıyorsa Elasticsearch nodelarının birbirleriyle iletişiminin şifrelenmesi gerekmektedir. 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]
```

<Info>
  Birden fazla node varsa hepsinde bu ayar konfigure edilmelidir.
</Info>

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

```yaml theme={null}
# 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>"]
```

### Sertifika Oluşturma

<Steps>
  <Step title="CA sertifikası oluşturma">
    Sertifika oluşturmak için aşağıdaki komut kullanılır:

    ```bash theme={null}
    ./bin/elasticsearch-certutil ca
    ```

    <Warning>
      Bu dosyanın ayrıca parola ile korunması zorunlu değildir ancak önerilmemektedir.
    </Warning>
  </Step>

  <Step title="Sertifika oluşturma">
    CA sertifikası kullanılarak sertifika oluşturulur:

    ```bash theme={null}
    ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
    ```
  </Step>

  <Step title="Sertifikaları taşıma">
    Sertifikalar **config/certs** dizini oluşturulup altına taşınır:

    ```bash theme={null}
    mkdir config/certs/
    mv elastic-certificates.p12 config/certs/
    mv elastic-stack-ca.p12 config/certs/
    ```

    <Info>
      Devam etmeden önce bu sertifika dosyalarının Elasticsearch dosyalarıyla aynı ayrıcalıklara sahip olduğundan emin olun.
    </Info>
  </Step>
</Steps>

<Warning>
  **"could not find java in JAVA\_HOME at /tools/java/home/bin/java" hatası alırsanız** aşağıdaki iki komut, ile Java uygulamalarının doğru bir şekilde çalışması için gerekli olan ortam değişkenlerini ayarlamak için kullanılır.

  ```bash theme={null}
  export JAVA_HOME=/opt/elasticsearch/elasticsearch-7.9.2/jdk
  export PATH=$JAVA_HOME/bin:$PATH
  ```
</Warning>

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

```yaml theme={null}
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
```

<Info>
  Bu işlemden sonra Elasticsearch uygulaması yeniden başlatılmalıdır.
</Info>

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

```bash theme={null}
curl -X GET -u <USERNAME>:<PASSWORD> "http://<ELASTICSEARCH_IP_ADDRESS>:<PORT>/_xpack?pretty"
```

Örnek çıktı:

```json theme={null}
...
"security" : {
  "available" : true,
  "enabled" : true
},
...
```

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

```bash theme={null}
curl -X GET "http://<ELASTICSEARCH_IP_ADDRESS>:<PORT>"
```

Örnek hata çıktısı:

```json theme={null}
{
  "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
}
```

## Built-in Kullanıcı Şifrelerini Oluşturma

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

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

```bash theme={null}
# 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

# Örnek çıktı:
# 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
```

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

## Kullanıcı Ekleme

Yeni kullanıcı eklemek veya 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.

<Info>
  Eğer kullanıcı bilgileri güncellenirse, **"created" : false** olarak dönecektir.
</Info>

```bash theme={null}
# 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"}'
```

Örnek çıktı:

```json theme={null}
{
  "created" : true
}
```

### Şifre Yenileme

Şifre değiştirmek için:

```bash theme={null}
bin/elasticsearch-users passwd <USERNAME>
```

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.

```bash theme={null}
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>"
} '
```

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.

  ```bash theme={null}
  # Örneğin;
  Authorization: Basic YXBpbml6ZXJfZXNfY2x1c3RlcjphcGluaXplcg==
  ```

* 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.

  ```yaml theme={null}
  elasticsearch.username: "apinizer_es_cluster"
  elasticsearch.password: "apinizer"
  ```

Ek komutlar;

```bash theme={null}
# 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"
```

## Apinizer Konfigürasyonu

Tanımlanmış kullanıcının kullanıcı adı ve şifresi Apinizer Manager Console'daki **Elasticsearch Kümeleri** sayfasından yapılmaktadır.

<Frame caption="Apinizer - Elasticsearch Kümeleri sayfası - Kimlik doğrulama konfigürasyonu">
  <img src="https://mintcdn.com/apinizer/rfZaKpIysRC7U9dY/images/setup/elasticsearch/basit-kimlik-dogrulama/01-apinizer-konfigurasyonu.png?fit=max&auto=format&n=rfZaKpIysRC7U9dY&q=85&s=99382c67e81e6aee8d1f9639fe40922d" alt="Elasticsearch Kümeleri - Kimlik Doğrulama" width="1200" height="640" style={{ borderRadius: '0.5rem' }} data-path="images/setup/elasticsearch/basit-kimlik-dogrulama/01-apinizer-konfigurasyonu.png" />
</Frame>

<Steps>
  <Step title="Kimlik doğrulamayı aktifleştirme">
    Kimlik doğrulama switch butonunu aktifleştirin.
  </Step>

  <Step title="Kimlik bilgilerini girme">
    Kullanıcı adı ve şifre bilgilerini girin.
  </Step>
</Steps>
