Redis Güvenliği: ACL Yapılandırması ve TLS ile Veri Koruma

Production ortamında Redis kurduğunuzda, varsayılan konfigürasyonla bırakmak gerçek anlamda bir güvenlik felaketi daveti çıkarmaktır. 2016 yılında dünya genelinde binlerce Redis sunucusu authentication olmadan internete açık şekilde çalışıyordu ve bu sunucular üzerinden ciddi veri sızıntıları yaşandı. Redis kendi doğası gereği hızlı ve erişilebilir olmak üzere tasarlanmış bir araç, ama bu “herkese açık” anlamına gelmiyor. Bu yazıda Redis ACL (Access Control List) yapılandırmasını ve TLS şifrelemesini gerçek dünya senaryolarıyla ele alacağız.

Redis Güvenliğinin Temelleri

Redis 6.0 öncesinde güvenlik modeli oldukça basitti: tek bir şifre, tam erişim. requirepass direktifi ile bir şifre koyuyordunuz, bilen herkes her şeye erişebiliyordu. Bu model küçük, izole ortamlar için belki yeterliydi ama modern mikroservis mimarilerinde, birden fazla uygulamanın aynı Redis instance’ına bağlandığı senaryolarda tamamen yetersiz kalıyordu.

Redis 6.0 ile gelen ACL sistemi bu problemi köklü biçimde çözdü. Artık farklı kullanıcılar, farklı komutlara ve farklı key pattern’larına erişebiliyor. Bir uygulama sadece kendi namespace’indeki key’leri okuyabilirken, diğeri sadece yazabilir. Admin kullanıcısı FLUSHALL çalıştırabilirken, servis kullanıcıları bu komutu hiç göremez.

Önce mevcut Redis kurulumunuzda güvenlik durumunu kontrol edelim:

# Redis'e bağlan ve mevcut kullanıcıları listele
redis-cli -h 127.0.0.1 -p 6379 ACL LIST

# Varsayılan kullanıcının yetkilerini gör
redis-cli ACL WHOAMI
redis-cli ACL CAT

# Dışarıdan erişilebilirlik kontrolü
ss -tlnp | grep 6379
netstat -an | grep 6379

Eğer ACL LIST komutunun çıktısında user default on nopass ~ & +@all görüyorsanız, Redis’iniz authentication olmadan tam yetkiyle çalışıyor demektir. Bu durumu düzeltmek için hemen harekete geçmeniz gerekiyor.

ACL Yapılandırması

Temel ACL Söz Dizimi

ACL kuralları belirli bir söz dizimi izler. Bir kullanıcı tanımı şu bileşenlerden oluşur:

  • on/off: Kullanıcının aktif veya pasif olduğunu belirtir
  • >password: Kullanıcı şifresi (birden fazla şifre tanımlanabilir)
  • ~pattern: Erişilebilir key pattern’ları (örn: ~app1:* sadece app1 prefix’li key’lere izin verir)
  • %R~pattern: Sadece okuma için key pattern’ı (Redis 7.0+)
  • %W~pattern: Sadece yazma için key pattern’ı (Redis 7.0+)
  • +command: İzin verilen komutlar
  • -command: Yasaklanan komutlar
  • +@category: Komut kategorisi bazlı izin (örn: +@read, +@write, +@string)
  • &pattern: Pub/Sub channel pattern’ları

redis.conf Üzerinden ACL Yapılandırması

En pratik yöntem ACL kurallarını redis.conf dosyasına yazmaktır:

# /etc/redis/redis.conf içine eklenecek ACL kuralları

# Varsayılan kullanıcıyı devre dışı bırak
user default off

# Admin kullanıcısı - tüm yetkiler
user redisadmin on >SuperG1zl1Sifre!2024 ~* &* +@all

# Uygulama kullanıcısı - sadece string ve hash komutları, belirli key pattern'ı
user webapp on >WebApp$ecure123 ~webapp:* &* +@read +@write +@string +@hash -@dangerous

# Cache servisi - sadece okuma
user cacheservice on >Cache$Only456 ~cache:* &* +@read +GET +MGET +HGET +HGETALL

# Monitoring kullanıcısı - sadece info ve monitor komutları
user monitoring on >M0nitor!ng789 ~* &* +INFO +PING +CLIENT +SLOWLOG +LATENCY

Bu yapılandırmayı uyguladıktan sonra Redis’i yeniden başlatın veya çalışır durumda uygulayın:

# Yapılandırmayı yeniden yükle (restart gerekmez)
redis-cli -u redis://redisadmin:[email protected]:6379 CONFIG REWRITE

# ACL kurallarını dosyadan yeniden yükle
redis-cli -u redis://redisadmin:[email protected]:6379 ACL LOAD

# Mevcut kullanıcıları listele
redis-cli -u redis://redisadmin:[email protected]:6379 ACL LIST

Harici ACL Dosyası Kullanımı

Büyük ortamlarda ACL kurallarını ayrı bir dosyada tutmak yönetimi kolaylaştırır:

# redis.conf dosyasına şunu ekle
aclfile /etc/redis/users.acl

# /etc/redis/users.acl dosyası oluştur
cat > /etc/redis/users.acl << 'EOF'
user default off
user redisadmin on #8c6976e5b5410415bde908bd4dee15dfb167a9c32ad57d6f59a6e4b7e0a1c9b3 ~* &* +@all
user webapp on >WebApp$ecure123 ~webapp:* &webapp:* +@read +@write -FLUSHDB -FLUSHALL -DEBUG -CONFIG
user readonly on >Read0nly!Pass ~* &* +@read +INFO +PING
EOF

# Dosya izinlerini güvenli hale getir
chown redis:redis /etc/redis/users.acl
chmod 640 /etc/redis/users.acl

Şifreleri düz metin yerine hash olarak saklamak için SHA256 hash kullanıyoruz. # prefix’i ile başlayan değer hash’lenmiş şifreyi temsil eder:

# Şifrenin SHA256 hash'ini üret
echo -n "SuperG1zl1Sifre!2024" | sha256sum | awk '{print $1}'

# Redis üzerinden de hash üretebilirsiniz
redis-cli ACL GENPASS 128

Çalışır Durumda ACL Yönetimi

Production ortamında Redis’i durdurmadan ACL değişikliği yapabilirsiniz:

# Yeni kullanıcı ekle
redis-cli ACL SETUSER newapp on >newapp_password ~newapp:* &* +@read +@write +@string

# Kullanıcıyı devre dışı bırak (silmeden)
redis-cli ACL SETUSER webapp off

# Kullanıcıya yeni komut kategorisi ekle
redis-cli ACL SETUSER webapp +@hash

# Kullanıcıdan yetki kaldır
redis-cli ACL SETUSER webapp -@write

# Kullanıcıyı sil
redis-cli ACL DELUSER olduser

# Değişiklikleri ACL dosyasına kaydet
redis-cli ACL SAVE

# Belirli bir kullanıcının detaylarını gör
redis-cli ACL GETUSER webapp

Gerçek Dünya ACL Senaryoları

E-ticaret Platformu Senaryosu

Diyelim ki bir e-ticaret platformu yönetiyorsunuz. Farklı servisler var: ürün kataloğu servisi, sepet servisi, oturum yönetimi ve bir raporlama aracı. Her birinin farklı Redis erişim ihtiyaçları var:

# /etc/redis/users.acl - E-ticaret platformu

# Katalog servisi: ürün bilgilerini okur, stok güncellemesi yapar
user catalog_service on >CatSvc!2024Prod ~product:* ~inventory:* &catalog:* +@read +@write +@string +@hash +@sorted_set -FLUSHDB -FLUSHALL -DEBUG

# Sepet servisi: kullanıcı sepet verilerini yönetir
user cart_service on >CartSvc#Secure ~cart:* ~session:cart:* &cart:* +@read +@write +@string +@hash +EXPIRE +TTL +PERSIST

# Session yönetimi: kimlik doğrulama token'larını yönetir
user session_service on >SessSvc@2024 ~session:* &session:* +@read +@write +@string +SET +GET +DEL +EXPIRE +TTL +EXISTS

# Raporlama: sadece okuma, tüm key'lere erişim
user reporting on >Report!Read ~* &* +@read +INFO +DBSIZE +SCAN +KEYS

# Monitoring (Prometheus, Datadog gibi araçlar için)
user monitoring on >Mon!t0r ~* &* +INFO +PING +CLIENT +SLOWLOG +LATENCY +MEMORY +COMMAND

Microservice Ortamında Namespace İzolasyonu

Kubernetes ortamında birden fazla microservice aynı Redis cluster’ını kullanıyorsa:

# Her servis kendi namespace'inden başkasına erişemesin
user auth_service on >Auth$Svc2024! ~auth:* &auth:events:* +@all -FLUSHDB -FLUSHALL -DEBUG -SHUTDOWN -SLAVEOF -REPLICAOF

user product_service on >Prod$Svc2024! ~products:* &products:events:* +@all -FLUSHDB -FLUSHALL -DEBUG -SHUTDOWN

user notification_service on >Notif$Svc2024! ~notifications:* &notifications:* +@read +@write +PUBLISH +SUBSCRIBE +PSUBSCRIBE

# Genel cache namespace'i için okuma yetkisi (tüm servisler okuyabilir)
user shared_cache_reader on >Shared!Read2024 ~shared:* &* +@read

TLS Yapılandırması

Sertifika Oluşturma

Redis için TLS yapılandırması önce sertifikaların hazırlanmasını gerektirir. Production ortamında Let’s Encrypt veya kurumsal CA kullanılabilir, test ortamı için self-signed sertifika üretelim:

# Sertifika dizinini oluştur
mkdir -p /etc/redis/tls
cd /etc/redis/tls

# CA (Certificate Authority) oluştur
openssl genrsa -out ca.key 4096
openssl req -new -x509 -days 3650 -key ca.key 
  -out ca.crt 
  -subj "/C=TR/ST=Istanbul/L=Istanbul/O=MyCompany/CN=Redis-CA"

# Redis sunucu sertifikası oluştur
openssl genrsa -out redis-server.key 2048
openssl req -new -key redis-server.key 
  -out redis-server.csr 
  -subj "/C=TR/ST=Istanbul/L=Istanbul/O=MyCompany/CN=redis.internal.mycompany.com"

# CA ile imzala
openssl x509 -req -days 365 
  -in redis-server.csr 
  -CA ca.crt 
  -CAkey ca.key 
  -CAcreateserial 
  -out redis-server.crt

# İstemci sertifikası oluştur (mTLS için)
openssl genrsa -out redis-client.key 2048
openssl req -new -key redis-client.key 
  -out redis-client.csr 
  -subj "/C=TR/ST=Istanbul/L=Istanbul/O=MyCompany/CN=redis-client"

openssl x509 -req -days 365 
  -in redis-client.csr 
  -CA ca.crt 
  -CAkey ca.key 
  -CAcreateserial 
  -out redis-client.crt

# Dosya izinlerini ayarla
chown -R redis:redis /etc/redis/tls
chmod 640 /etc/redis/tls/*.key
chmod 644 /etc/redis/tls/*.crt

Redis TLS Konfigürasyonu

Sertifikalar hazır olduktan sonra redis.conf dosyasını güncelleyin:

# /etc/redis/redis.conf - TLS yapılandırması

# Normal port'u kapat veya sadece localhost'a bağla
port 0
# veya
# bind 127.0.0.1

# TLS portu aç
tls-port 6380

# Sertifika dosyaları
tls-cert-file /etc/redis/tls/redis-server.crt
tls-key-file /etc/redis/tls/redis-server.key
tls-ca-cert-file /etc/redis/tls/ca.crt

# İstemci sertifikası doğrulamasını zorunlu kıl (mTLS)
tls-auth-clients yes

# TLS protokol versiyonu (TLSv1.2 minimum, TLSv1.3 tercih)
tls-protocols "TLSv1.2 TLSv1.3"

# Güvenli cipher suite'ler
tls-ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384"
tls-ciphersuites "TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256"

# TLS oturumlarını önbelleğe al (performans için)
tls-session-caching yes
tls-session-cache-size 5000
tls-session-cache-timeout 60

TLS ile Redis’e Bağlanma

Yapılandırma tamamlandıktan sonra TLS ile bağlantıyı test edin:

# Temel TLS bağlantı testi
redis-cli -h 127.0.0.1 -p 6380 
  --tls 
  --cacert /etc/redis/tls/ca.crt 
  PING

# mTLS ile bağlantı (istemci sertifikası gönder)
redis-cli -h redis.internal.mycompany.com -p 6380 
  --tls 
  --cacert /etc/redis/tls/ca.crt 
  --cert /etc/redis/tls/redis-client.crt 
  --key /etc/redis/tls/redis-client.key 
  -a "WebApp$ecure123" 
  --user webapp 
  PING

# openssl ile TLS sertifika bilgilerini kontrol et
openssl s_client -connect redis.internal.mycompany.com:6380 
  -CAfile /etc/redis/tls/ca.crt 
  -cert /etc/redis/tls/redis-client.crt 
  -key /etc/redis/tls/redis-client.key 
  2>/dev/null | openssl x509 -noout -text | grep -A2 "Subject:"

Uygulama Tarafında TLS Entegrasyonu

Python uygulamasında Redis TLS bağlantısı örneği:

# Python redis kütüphanesi kurulumu
pip install redis[hiredis]

# Python ile TLS bağlantısı test scripti
cat > /tmp/test_redis_tls.py << 'EOF'
import redis
import ssl

# SSL context oluştur
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
ssl_context.load_verify_locations('/etc/redis/tls/ca.crt')
ssl_context.load_cert_chain(
    certfile='/etc/redis/tls/redis-client.crt',
    keyfile='/etc/redis/tls/redis-client.key'
)
ssl_context.minimum_version = ssl.TLSVersion.TLSv1_2

# Redis bağlantısı
r = redis.Redis(
    host='redis.internal.mycompany.com',
    port=6380,
    username='webapp',
    password='WebApp$ecure123',
    ssl=True,
    ssl_context=ssl_context,
    decode_responses=True
)

# Bağlantıyı test et
print(r.ping())
r.set('webapp:test', 'TLS çalışıyor!')
print(r.get('webapp:test'))
EOF

python3 /tmp/test_redis_tls.py

Redis Sentinel ve Cluster için TLS

Sentinel yapılandırmasında TLS kullanımı farklı bir dikkat gerektiriyor:

# /etc/redis/sentinel.conf - TLS yapılandırması

port 0
tls-port 26380

tls-cert-file /etc/redis/tls/redis-server.crt
tls-key-file /etc/redis/tls/redis-server.key
tls-ca-cert-file /etc/redis/tls/ca.crt
tls-auth-clients yes
tls-replication yes

# Master'ı TLS ile izle
sentinel monitor mymaster redis-master.internal 6380 2
sentinel auth-user mymaster monitoring
sentinel auth-pass mymaster M0nitor!ng789

# Sentinel'in Redis'e bağlanması için TLS ayarları
sentinel tls-cert-file /etc/redis/tls/redis-client.crt
sentinel tls-key-file /etc/redis/tls/redis-client.key
sentinel tls-ca-cert-file /etc/redis/tls/ca.crt

Güvenlik Denetimi ve İzleme

ACL loglarını aktif etmek ve izlemek production’da kritik önem taşır:

# redis.conf'a ekle
acllog-max-len 256

# ACL loglarını görüntüle
redis-cli ACL LOG

# Son 5 ACL ihlalini göster
redis-cli ACL LOG COUNT

# ACL loglarını temizle
redis-cli ACL LOG RESET

# Cron job ile ACL log monitoring scripti
cat > /usr/local/bin/redis_acl_monitor.sh << 'EOF'
#!/bin/bash
REDIS_CLI="redis-cli -u redis://monitoring:[email protected]:6380 --tls --cacert /etc/redis/tls/ca.crt"
LOG_FILE="/var/log/redis/acl_violations.log"
ALERT_EMAIL="[email protected]"

ACL_VIOLATIONS=$($REDIS_CLI ACL LOG | grep -c "object")

if [ "$ACL_VIOLATIONS" -gt "0" ]; then
    echo "[$(date)] Redis ACL ihlali tespit edildi: $ACL_VIOLATIONS adet" >> "$LOG_FILE"
    $REDIS_CLI ACL LOG >> "$LOG_FILE"
    
    # E-posta bildirimi
    echo "Redis ACL ihlali: $ACL_VIOLATIONS adet ihlal tespit edildi" | 
        mail -s "[ALARM] Redis Güvenlik İhlali" "$ALERT_EMAIL"
fi
EOF

chmod +x /usr/local/bin/redis_acl_monitor.sh

# Crontab'a ekle (her 5 dakikada bir kontrol)
echo "*/5 * * * * /usr/local/bin/redis_acl_monitor.sh" | crontab -

Ek Güvenlik Önlemleri

ACL ve TLS’in yanında uygulamamız gereken diğer güvenlik katmanları:

  • bind direktifi: Redis’i sadece gerekli ağ arayüzlerine bağlayın, bind 127.0.0.1 10.0.1.5 gibi
  • rename-command: Tehlikeli komutları yeniden adlandırın veya tamamen devre dışı bırakın, rename-command FLUSHALL "" ile FLUSHALL’ı tamamen kapatabilirsiniz
  • maxmemory-policy: Bellek limitini ve tahliye politikasını belirleyin, DoS saldırılarına karşı koruma sağlar
  • protected-mode: Eğer bind ve requirepass ayarlanmamışsa Redis otomatik olarak sadece localhost’tan bağlantı kabul eder, bunu kapatmayın
  • Firewall kuralları: iptables veya nftables ile Redis portuna sadece yetkili IP’lerden erişim izni verin
  • Sertifika rotasyonu: TLS sertifikalarını otomatik yenileme scriptiyle yönetin, sertifika süresi dolması production kesintisine neden olabilir
# iptables ile Redis portunu koru
iptables -A INPUT -p tcp --dport 6380 -s 10.0.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 6380 -j DROP

# Kuralları kalıcı hale getir
iptables-save > /etc/iptables/rules.v4

Sonuç

Redis güvenliği tek bir önlemle halledilebilecek bir konu değil. ACL sistemi size granüler kullanıcı yönetimi sağlıyor: her servis sadece ihtiyacı olan key’lere ve komutlara erişebiliyor. TLS şifrelemesi ise ağ üzerindeki veriyi koruma altına alıyor, hem dinleme saldırılarına hem de man-in-the-middle saldırılarına karşı.

Gerçek bir production ortamında bu ikisini birlikte kullanmak artık standart bir gereklilik. ACL log monitoring ile güvenlik ihlallerini gerçek zamanlı yakalayabilir, firewall kurallarıyla saldırı yüzeyini minimize edebilirsiniz. Sertifika yönetimini otomatize edin, ACL kurallarını versiyon kontrolüne alın ve düzenli güvenlik denetimleri yapın.

Başlangıçta bu kadar konfigürasyon karmaşık görünebilir, ama bir kez doğru kurulum yapıldıktan sonra yönetimi oldukça kolaylaşıyor. Özellikle harici ACL dosyası ve TLS sertifika otomasyonunu bir kez kurarsanız, sisteminiz uzun süre güvenli biçimde çalışır. Riskli kısmı ise bunu yapmamak zaten.

Yorum yapın