DBAtlas · Veritabanı operasyon atlası

Güvenlik sıkılaştırma: MongoDB / Redis / Elasticsearch

Belirti

Amaç: NoSQL/veri depolarını CIS-tarzı sıkılaştır — kimlik doğrulama, ağ kısıtlama, tehlikeli komut engelleme, TLS, en az yetki rolleri ve denetim.

1. Kimlik doğrulamayı AÇ — kimliksiz erişimi kes

Bu ürünler varsayılan olarak sık sık kimlik doğrulaması KAPALI gelir ve internete açık bırakılınca ele geçirilir. Kimlik doğrulamayı etkinleştir ve yönetici kullanıcı oluştur.

MongoDB

// mongod.conf:
security:
  authorization: enabled
// Yönetici kullanıcı oluştur (localhost exception ile ilk kez):
use admin
db.createUser({ user: "admin", pwd: passwordPrompt(),
  roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] })
// Sonra bağlanırken: mongosh -u admin --authenticationDatabase admin

Redis

# redis.conf — ACL (Redis 6+): varsayılan kullanıcıyı kapat, adlı kullanıcılar tanımla:
user default off
user admin on >YoneticiParola789! ~* &* +@all
user app on >AppParola456! ~app:* +@read +@write
# Not: requirepass yalnızca 'default' kullanıcısının parolasını ayarlayan eski uyumluluk ayarıdır;
# ACL kullanıcılarıyla karıştırmayın. Kullanıcıları aclfile içinde de tutabilirsiniz (ACL SAVE ile kalıcı).

Elasticsearch

# 8.x: güvenlik (kimlik doğrulama + TLS) ilk açılışta otomatik yapılandırılır; elasticsearch.yml:
xpack.security.enabled: true
# 'elastic' kullanıcısının parolasını belirle/sıfırla:
bin/elasticsearch-reset-password -u elastic
# (elasticsearch-setup-passwords 8.0'dan beri deprecated)
# Kibana/istemciler için 'elastic' yerine ayrı rol'lü kullanıcı üret.

2. Ağı kısıtla — yalnızca gerekli arayüz ve portları aç

Servisi 0.0.0.0 üzerinde tüm dünyaya dinletmekten kaçın. Bağlanma adresini iç arayüze/loopback'e sabitle ve koruma modunu aç.

MongoDB

# mongod.conf — yalnız iç arayüz + loopback:
net:
  bindIp: 127.0.0.1,10.0.0.10
  port: 27017
# Asla bindIpAll: true kullanma; güvenlik duvarıyla portu sınırla.

Redis

# redis.conf:
bind 127.0.0.1 10.0.0.10
protected-mode yes
port 6379
# protected-mode, parola yoksa dıştan erişimi engeller;
# yine de güvenlik duvarıyla 6379'u sınırla.

Elasticsearch

# elasticsearch.yml — dinlenen arayüzü sabitle:
network.host: 10.0.0.10
http.port: 9200
transport.port: 9300
# Yalnız gerekli portları güvenlik duvarında aç;
# 9300 (transport) dışarıya asla açılmamalı.

3. Tehlikeli komutları kısıtla

Tek bir komut tüm veriyi silebilir. Yıkıcı/idari komutları yeniden adlandır, kaldır veya joker (wildcard) hedeflemeyi engelle.

MongoDB

// Ayrı komut engeli yerine rol bazlı kontrol kullan:
// Yıkıcı ayrıcalıkları (dropDatabase, dropCollection) yalnız
// dbAdmin/clusterAdmin rollerine ver; uygulama kullanıcısına verme.
db.grantRolesToUser("app", [ { role: "readWrite", db: "appdb" } ])
// Uygulama kullanıcısına dbAdmin/root VERME.

Redis

# Redis 6+ için tercih edilen yol ACL'dir (uygulama kullanıcısına tehlikeli komut verme):
# ACL SETUSER app ... -@dangerous
# Eski yöntem — redis.conf'ta komutları devre dışı bırak/yeniden adlandır:
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command KEYS ""
rename-command DEBUG ""
# Dikkat: CONFIG'i yeniden adlandırmak Sentinel'i, CONFIG REWRITE'ı ve yönetim araçlarını bozabilir.

Elasticsearch

# elasticsearch.yml — joker/tüm indeks silmeyi engelle:
action.destructive_requires_name: true
# Böylece DELETE /* veya DELETE /_all reddedilir;
# indeks adı açıkça belirtilmeden toplu silme yapılamaz.

4. TLS/şifreli bağlantı aç

Kimlik bilgileri ve veri açık ağda şifresiz gitmemeli. İstemci ve düğümler arası trafik için TLS etkinleştir.

MongoDB

# mongod.conf — istemci TLS:
net:
  tls:
    mode: requireTLS
    certificateKeyFile: /etc/ssl/mongodb.pem
    CAFile: /etc/ssl/ca.pem
# İstemci: mongosh --tls --tlsCAFile ca.pem

Redis

# redis.conf — TLS'i aç, düz portu kapat:
port 0
tls-port 6379
tls-cert-file /etc/redis/redis.crt
tls-key-file  /etc/redis/redis.key
tls-ca-cert-file /etc/redis/ca.crt

Elasticsearch

# elasticsearch.yml — HTTP ve transport TLS:
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.keystore.path: http.p12
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: transport.p12

5. En az yetki rolleri ver — geniş rollerden kaçın

Her kullanıcıya yalnız işi için gereken erişimi ver. Geniş/yönetici rolleri yerine belirli veritabanı, anahtar deseni veya index'e sınırlı ince roller kullan.

MongoDB

// Geniş readWrite yerine yalnız gereken DB'ye ver;
// gerekiyorsa özel rol tanımla:
db.createRole({ role: "ordersRW",
  privileges: [ { resource: { db: "appdb", collection: "orders" },
    actions: [ "find", "insert", "update" ] } ], roles: [] })
db.grantRolesToUser("app", [ { role: "ordersRW", db: "appdb" } ])

Redis

# ACL ile anahtar deseni ve komut kategorisine sınırla:
ACL SETUSER app on >AppParola456! ~app:* +@read +@write -@dangerous
# Yalnız 'app:' önekli anahtarlar, okuma/yazma; tehlikeli komutlar yasak.
ACL LIST
ACL WHOAMI

Elasticsearch

# İnce rol tanımla (yalnız belirli indekse okuma):
POST /_security/role/orders_read
{ "indices": [ { "names": [ "orders-*" ],
    "privileges": [ "read" ] } ] }
# Kullanıcıya ata:
POST /_security/user/app
{ "password": "...", "roles": [ "orders_read" ] }

6. Denetim/loglama aç — erişim ve değişiklikleri izle

Yetkisiz erişim denemeleri ve idari işlemler kayıt altına alınmalı. Audit log etkinleştir ve merkezi bir yere gönder.

MongoDB

# Denetim (MongoDB Enterprise gerektirir) — mongod.conf:
auditLog:
  destination: file
  format: JSON
  path: /var/log/mongodb/audit.json
# Filtre: authenticate, createUser, dropDatabase gibi olayları yakala.

Redis

# Redis'te tam audit yoktur; ACL LOG ile reddedilen
# kimlik doğrulama/komut denemelerini gör:
ACL LOG
ACL LOG RESET
# Ayrıca: loglevel notice ve logfile ayarlarını merkezi toplayıcıya yönlendir.

Elasticsearch

# elasticsearch.yml — güvenlik denetimini aç:
xpack.security.audit.enabled: true
xpack.security.audit.logfile.events.include:
  [ authentication_failed, access_denied, connection_denied ]
# Kayıtlar <cluster>_audit.json dosyasına yazılır.
DBAtlas'ta aç →