Elasticsearch Güvenliği: X-Pack ile Kimlik Doğrulama
Production ortamında Elasticsearch kuruyorsunuz, her şey çalışıyor, veriler akıyor. Sonra fark ediyorsunuz ki cluster’ınıza herhangi biri erişebiliyor. Kimlik doğrulama yok, yetkilendirme yok, şifreleme yok. İşte bu yazıda tam olarak bu sorunu çözeceğiz: X-Pack ile Elasticsearch güvenliğini sıfırdan yapılandıracağız.
X-Pack Nedir ve Neden Gerekli?
Elasticsearch, başlangıçta güvenlik özellikleri olmadan geliştirildi. Sonradan Elastic şirketi X-Pack adında bir güvenlik eklentisi geliştirdi. Elasticsearch 6.8 ve 7.1 sürümlerinden itibaren X-Pack’in temel güvenlik özellikleri ücretsiz olarak kullanılabilir hale geldi. Elasticsearch 8.x ile birlikte ise güvenlik varsayılan olarak aktif geliyor.
Eğer 7.x ya da daha eski bir sürüm kullanıyorsanız güvenliği manuel olarak aktif etmeniz gerekiyor. Bu yazıda hem 7.x hem de 8.x senaryolarını ele alacağız.
X-Pack güvenlik katmanı şu özellikleri sunar:
- Authentication: Kullanıcı kimlik doğrulama
- Authorization: Rol tabanlı erişim kontrolü (RBAC)
- TLS/SSL: Node’lar arası ve HTTP katmanında şifreleme
- Audit Logging: Güvenlik olaylarının loglanması
- IP Filtering: IP bazlı erişim kısıtlaması
Ortam Hazırlığı ve Kurulum
Önce sisteminizin güncel olduğundan emin olun. Bu örneklerde Ubuntu 22.04 ve Elasticsearch 8.x kullanıyoruz.
# Java ve sistem güncellemesi
sudo apt update && sudo apt upgrade -y
sudo apt install -y openjdk-17-jdk curl wget gnupg
# Elasticsearch GPG key ve repo ekleme
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
sudo apt update && sudo apt install elasticsearch -y
Kurulum tamamlandığında terminal çıktısında önemli bilgiler görürsünüz. Bu bilgileri mutlaka kaydedin. Özellikle elastic kullanıcısının otomatik oluşturulan şifresi ve enrollment token burada görünür.
Elasticsearch 7.x için Güvenliği Aktif Etme
Eğer 7.x kullanıyorsanız güvenlik varsayılan olarak kapalı gelir. Manuel olarak açmanız gerekir.
# elasticsearch.yml dosyasını düzenleme
sudo nano /etc/elasticsearch/elasticsearch.yml
Dosyaya şu satırları ekleyin:
# Cluster adı
cluster.name: production-cluster
node.name: node-1
# Güvenlik ayarları
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
# HTTP SSL (opsiyonel ama önerilen)
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.keystore.path: http.p12
TLS Sertifikaları Oluşturma
Transport katmanı için sertifika oluşturmak zorunludur. HTTP için ise opsiyonel ama kesinlikle önerilir.
# Elasticsearch'ün kendi CA'sını oluşturma
sudo /usr/share/elasticsearch/bin/elasticsearch-certutil ca
# Bu komut elastic-stack-ca.p12 dosyası oluşturur
# Dosyayı config dizinine taşıyın
sudo mv elastic-stack-ca.p12 /etc/elasticsearch/
# Node sertifikası oluşturma
sudo /usr/share/elasticsearch/bin/elasticsearch-certutil cert
--ca /etc/elasticsearch/elastic-stack-ca.p12
--out /etc/elasticsearch/elastic-certificates.p12
# HTTP sertifikası oluşturma (8.x'te otomatik yapılıyor, 7.x için)
sudo /usr/share/elasticsearch/bin/elasticsearch-certutil http
Sertifika dosyalarının izinlerini ayarlayın:
sudo chown root:elasticsearch /etc/elasticsearch/elastic-certificates.p12
sudo chmod 660 /etc/elasticsearch/elastic-certificates.p12
sudo chown root:elasticsearch /etc/elasticsearch/elastic-stack-ca.p12
sudo chmod 660 /etc/elasticsearch/elastic-stack-ca.p12
Built-in Kullanıcı Şifrelerini Ayarlama
Elasticsearch’te bazı built-in kullanıcılar gelir. Bunların şifrelerini belirlemeniz gerekir.
Built-in kullanıcılar şunlardır:
- elastic: Süper kullanıcı, tüm yetkiye sahip
- kibana_system: Kibana’nın Elasticsearch’e bağlanması için
- logstash_system: Logstash monitoring için
- beats_system: Beats monitoring için
- apm_system: APM server için
- remote_monitoring_user: Uzak monitoring için
# Servisi başlatın
sudo systemctl start elasticsearch
sudo systemctl enable elasticsearch
# Otomatik şifre belirleme (interaktif)
sudo /usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive
# Ya da otomatik rastgele şifre oluşturma
sudo /usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto
Otomatik mod çıktısı şöyle görünür ve bu şifreleri güvenli bir yerde saklamanız şarttır:
Changed password for user apm_system
PASSWORD apm_system = xK8mN2pQr5wT
Changed password for user kibana_system
PASSWORD kibana_system = vL9nO3qRs6uU
Changed password for user logstash_system
PASSWORD logstash_system = yM0oP4rSt7vV
Changed password for user elastic
PASSWORD elastic = zN1pQ5sUu8wW
Özel Kullanıcı ve Rol Oluşturma
Gerçek dünya senaryosunda elastic kullanıcısını uygulama bağlantılarında kullanmazsınız. Her uygulama için ayrı kullanıcı ve rol oluşturursunuz.
Senaryo: E-ticaret uygulamanız orders ve products index’lerine yazıyor, raporlama servisiniz ise sadece okuyor.
# Raporlama rolü oluşturma (sadece okuma)
curl -X POST "https://localhost:9200/_security/role/reporting_role"
-H "Content-Type: application/json"
-u elastic:ELASTIC_SIFRENIZ
--cacert /etc/elasticsearch/certs/http_ca.crt
-d '{
"cluster": ["monitor"],
"indices": [
{
"names": ["orders", "products", "orders-*", "products-*"],
"privileges": ["read", "view_index_metadata"]
}
]
}'
# Uygulama yazma rolü oluşturma
curl -X POST "https://localhost:9200/_security/role/ecommerce_writer"
-H "Content-Type: application/json"
-u elastic:ELASTIC_SIFRENIZ
--cacert /etc/elasticsearch/certs/http_ca.crt
-d '{
"cluster": ["monitor", "manage_index_templates"],
"indices": [
{
"names": ["orders", "products", "orders-*", "products-*"],
"privileges": ["create", "create_index", "index", "write", "read"]
}
]
}'
# Raporlama kullanıcısı oluşturma
curl -X POST "https://localhost:9200/_security/user/reporting_user"
-H "Content-Type: application/json"
-u elastic:ELASTIC_SIFRENIZ
--cacert /etc/elasticsearch/certs/http_ca.crt
-d '{
"password": "R3portingS3cur3Pass!",
"roles": ["reporting_role"],
"full_name": "Reporting Service User",
"email": "[email protected]"
}'
# Uygulama kullanıcısı oluşturma
curl -X POST "https://localhost:9200/_security/user/ecommerce_app"
-H "Content-Type: application/json"
-u elastic:ELASTIC_SIFRENIZ
--cacert /etc/elasticsearch/certs/http_ca.crt
-d '{
"password": "Ecomm3rceS3cur3!",
"roles": ["ecommerce_writer"],
"full_name": "E-commerce Application",
"email": "[email protected]"
}'
Kibana ile Entegrasyon
Kibana’yı güvenli Elasticsearch’e bağlamak için de yapılandırma gerekir.
sudo nano /etc/kibana/kibana.yml
# Kibana ayarları
server.port: 5601
server.host: "0.0.0.0"
server.name: "production-kibana"
# Elasticsearch bağlantısı
elasticsearch.hosts: ["https://localhost:9200"]
elasticsearch.username: "kibana_system"
elasticsearch.password: "kibana_system_sifresi"
# SSL ayarları
elasticsearch.ssl.certificateAuthorities: ["/etc/kibana/certs/http_ca.crt"]
elasticsearch.ssl.verificationMode: "certificate"
# Kibana encryption key (rastgele 32+ karakter)
xpack.encryptedSavedObjects.encryptionKey: "buraya32karakterdenuzunbirsifrekoyun123"
xpack.security.encryptionKey: "baskabir32karakterdenuzunsifreburada456"
xpack.reporting.encryptionKey: "ucuncubir32karakterdenuzunsifreburda789"
CA sertifikasını Kibana’ya kopyalayın:
sudo mkdir -p /etc/kibana/certs
sudo cp /etc/elasticsearch/certs/http_ca.crt /etc/kibana/certs/
sudo chown -R kibana:kibana /etc/kibana/certs
sudo systemctl restart kibana
Audit Logging Yapılandırması
Kimin ne zaman ne yaptığını loglamak, hem güvenlik hem de uyumluluk açısından kritiktir. KVKK veya PCI-DSS kapsamındaki ortamlarda bu zorunludur.
sudo nano /etc/elasticsearch/elasticsearch.yml
Şu satırları ekleyin:
# Audit logging
xpack.security.audit.enabled: true
xpack.security.audit.logfile.events.include:
- authentication_success
- authentication_failed
- access_denied
- connection_denied
- run_as_denied
- index_access_denied
xpack.security.audit.logfile.events.exclude:
- system_access_granted
# Log dosyası konumu
xpack.security.audit.logfile.path: /var/log/elasticsearch/audit.log
Audit loglarını kontrol etmek için:
# Son başarısız giriş denemelerini göster
sudo grep "authentication_failed" /var/log/elasticsearch/audit.log | tail -20
# Belirli bir kullanıcının aktivitelerini filtrele
sudo grep '"user.name":"ecommerce_app"' /var/log/elasticsearch/audit.log | tail -50
# Erişim reddedilen işlemleri listele
sudo grep "access_denied" /var/log/elasticsearch/audit.log |
python3 -c "import sys,json; [print(json.loads(l).get('user.name',''), json.loads(l).get('request.uri','')) for l in sys.stdin]"
Kullanıcı Yönetimi: Pratik Komutlar
Günlük operasyonlarda sık kullandığınız komutları burada toparladım.
# Mevcut kullanıcıları listele
curl -X GET "https://localhost:9200/_security/user"
-u elastic:ELASTIC_SIFRENIZ
--cacert /etc/elasticsearch/certs/http_ca.crt | python3 -m json.tool
# Kullanıcı bilgilerini görüntüle
curl -X GET "https://localhost:9200/_security/user/ecommerce_app"
-u elastic:ELASTIC_SIFRENIZ
--cacert /etc/elasticsearch/certs/http_ca.crt
# Şifre değiştirme
curl -X PUT "https://localhost:9200/_security/user/ecommerce_app/_password"
-H "Content-Type: application/json"
-u elastic:ELASTIC_SIFRENIZ
--cacert /etc/elasticsearch/certs/http_ca.crt
-d '{"password": "YeniGucluSifre2024!"}'
# Kullanıcıyı devre dışı bırakma (silmeden)
curl -X PUT "https://localhost:9200/_security/user/ecommerce_app/_disable"
-u elastic:ELASTIC_SIFRENIZ
--cacert /etc/elasticsearch/certs/http_ca.crt
# Kullanıcıyı silme
curl -X DELETE "https://localhost:9200/_security/user/eski_kullanici"
-u elastic:ELASTIC_SIFRENIZ
--cacert /etc/elasticsearch/certs/http_ca.crt
# Rolleri listele
curl -X GET "https://localhost:9200/_security/role"
-u elastic:ELASTIC_SIFRENIZ
--cacert /etc/elasticsearch/certs/http_ca.crt | python3 -m json.tool
Güvenlik Testi ve Doğrulama
Yapılandırmanızın doğru çalıştığını test edin.
# Kimlik doğrulama testi
curl -X GET "https://localhost:9200/_cluster/health"
-u elastic:ELASTIC_SIFRENIZ
--cacert /etc/elasticsearch/certs/http_ca.crt
# Yanlış şifre ile test (401 dönmeli)
curl -X GET "https://localhost:9200/_cluster/health"
-u elastic:yanlis_sifre
--cacert /etc/elasticsearch/certs/http_ca.crt
# Reporting user'ın sadece okuma yapabildiğini doğrula
curl -X GET "https://localhost:9200/orders/_search"
-u reporting_user:R3portingS3cur3Pass!
--cacert /etc/elasticsearch/certs/http_ca.crt
# Reporting user'ın yazamadığını doğrula (403 dönmeli)
curl -X POST "https://localhost:9200/orders/_doc"
-H "Content-Type: application/json"
-u reporting_user:R3portingS3cur3Pass!
--cacert /etc/elasticsearch/certs/http_ca.crt
-d '{"test": "bu yazilmamali"}'
# Mevcut kullanıcı bilgilerini getir
curl -X GET "https://localhost:9200/_security/_authenticate"
-u ecommerce_app:Ecomm3rceS3cur3!
--cacert /etc/elasticsearch/certs/http_ca.crt
Sık Karşılaşılan Sorunlar ve Çözümleri
Servis başlamıyor, keystore hatası veriyor:
# Keystore'u kontrol et
sudo /usr/share/elasticsearch/bin/elasticsearch-keystore list
# Şifre korumalı sertifika için keystore'a ekle
sudo /usr/share/elasticsearch/bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
sudo /usr/share/elasticsearch/bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
“Connection refused” veya SSL handshake hatası:
# Sertifika geçerliliğini kontrol et
openssl x509 -in /etc/elasticsearch/certs/http_ca.crt -text -noout | grep -E "Subject|Validity|DNS"
# Elasticsearch loglarını incele
sudo journalctl -u elasticsearch -n 100 --no-pager
sudo tail -f /var/log/elasticsearch/production-cluster.log
Bootstrap.password hatası (8.x yeni kurulumda):
# Elastic şifresini sıfırlama
sudo /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic
# Keystore'dan bootstrap şifresini silme
sudo /usr/share/elasticsearch/bin/elasticsearch-keystore remove bootstrap.password
Güvenlik Sertleştirme Önerileri
Production ortamında uygulamanız gereken ek adımlar:
- elastic kullanıcısını devre dışı bırakın: Tüm kullanıcıları oluşturduktan sonra
elasticsuperuser’ını günlük operasyonlarda kullanmayın. Bunun yerine ayrı bir admin kullanıcısı oluşturun.
- Şifre politikası: Minimum 12 karakter, büyük/küçük harf, rakam ve özel karakter içeren şifreler kullanın. Bir şifre yöneticisi kullanın.
- Network katmanında kısıtlama: Elasticsearch portlarını (9200, 9300) sadece gerekli IP’lere açın. Doğrudan internete maruz bırakmayın.
- API key kullanımı: Uzun süreli uygulama bağlantıları için kullanıcı adı/şifre yerine API key kullanın. API key’ler kolayca revoke edilebilir.
- Sertifika yenileme planı: CA sertifikanızın geçerlilik süresini takip edin. Süresi dolmadan en az 30 gün önce yenileme işlemi başlatın.
- Log rotasyonu: Audit logları hızla büyür. Logrotate yapılandırması yapın ve logları merkezi bir SIEM sistemine gönderin.
- Snapshot güvenliği: Snapshot repository’lerine erişimi de kısıtlayın. Yetkisiz backup erişimi ciddi veri sızdırma riski yaratır.
Sonuç
Elasticsearch güvenliği artık görmezden gelinemez. İnternette güvenliksiz bırakılmış Elasticsearch cluster’larından milyonlarca kayıt çalındığı, silindiği ya da fidye amacıyla şifrelendiği haberleri hala gündemde. X-Pack ile gelen güvenlik katmanı, bu riskleri büyük ölçüde azaltıyor.
Bu yazıda anlattıklarımızı özetlersek: TLS ile şifreli iletişim, built-in kullanıcıların şifrelerinin ayarlanması, uygulama başına özel kullanıcı ve roller, audit logging ve temel güvenlik testleri. Bunlar minimum yapmanız gerekenler.
Elasticsearch 8.x kullanıyorsanız güvenlik varsayılan geldiği için işiniz biraz daha kolay. 7.x’ten 8.x’e geçiş planınız varsa, güvenlik yapılandırmasını bu geçişin ayrılmaz bir parçası olarak planlayın. Production’a almadan önce her zaman bir staging ortamında test edin ve şifrelerinizi bir secret manager (HashiCorp Vault, AWS Secrets Manager vb.) ile yönetin.
