Ubuntu'da Redis Nasıl Kurulur ve Güvence Altına Alınır


Giriş

Redis, esnekliği, performansı ve geniş dil desteği ile bilinen bir bellek içi anahtar-değer deposudur. Genellikle veritabanı, önbellek ve mesaj aracısı olarak kullanılır. Varsayılan bir kurulum işlevsel olsa da güvenli değildir ve verilerinizi ile sunucunuzu saldırılara açık bırakır. Güvensiz bir Redis örneği, veri ihlallerine, yetkisiz erişime ve hatta sunucu güvenliğinin tehlikeye girmesine yol açabilir.

Bu öğretici, bir Ubuntu sunucusuna Redis'in en son sürümünü yüklemenizi ve üretim için hazır bir güvenlik yapılandırmasını uygulamanızı sağlayacaktır. Kullanıcı erişimini Erişim Kontrol Listeleri (ACL'ler) ile yapılandırmayı, trafik verilerini TLS ile şifrelemeyi, ağ erişimini bir güvenlik duvarı ile kısıtlamayı ve bellek yönetimi, kalıcılık ve güvenli ağ yapılandırmalarını kapsayan ek sistem sertleştirme önlemlerini uygulamayı öğreneceksiniz.

Önemli Noktalar

  • Modern Kimlik Doğrulama İçin ACL'leri Kullanın: Güncel olmayan requirepass yönergesi yerine kullanıcıları yönetmek için her zaman Erişim Kontrol Listeleri (ACL) kullanın. default kullanıcısını devre dışı bırakın ve artırılmış güvenlik için minimum gerekli izinlere sahip özel kullanıcılar oluşturun.
  • Tüm Ağ Trafiğini TLS ile Şifreleyin: Redis verilerini asla düz metin olarak iletmayın. İstemciler ile sunucu arasındaki tüm iletişimi şifrelemek için TLS uygulayın ve hassas bilgilerin ağda ele geçirilmesini önleyin.
  • Redis'i Asla Doğrudan İnternete Açmayın: Bir Redis portunu genel kullanıma açmak büyük bir güvenlik riskidir. Uzaktan erişim için her zaman VPN (WireGuard/OpenVPN) veya özel, şifreli bir bağlantı oluşturmak için bir SSH tüneli gibi güvenli alternatifler kullanın.
  • Sıkı Bir Güvenlik Duvarı Uygulayın: Güvenlik duvarı, ilk savunma hattınızdır. Uzaktan bağlantılara izin vermeniz gerekiyorsa, güvenlik duvarınızı (ufw) yalnızca belirli, güvenilir IP adreslerinden gelen Redis portu trafiğini kabul edecek şekilde yapılandırın.
  • Bellek Tükenme Saldırılarından Korunun: Sunucunuzu Hizmet Reddi (DoS) saldırılarından korumak için yapılandırmanızda maxmemory yönergesi ile bir bellek sınırı belirleyin. Ayrıca, sınır aşıldığında Redis’in hangi anahtarları temizleyeceğini kontrol etmek için bir maxmemory-policy tanımlayın.
  • Komut Yeniden Adlandırma Yerine ACL'leri Tercih Edin: Tehlikeli komutları yeniden adlandırma eski uygulamasından kaçının. Bu yöntem kırılgan olup istemci uygulamalarını ve çoğaltmayı bozabilir. Bunun yerine, bu komutlara erişimi kullanıcı bazında sınırlamak için ACL kurallarını kullanın (ör. -@dangerous).
  • Yerel Bağlantılar için Unix Soketlerini Kullanın: Redis ile aynı sunucuda çalışan uygulamalar için TCP portları yerine Unix soketlerini kullanın. Ağ yığınına gerek duymadıkları ve dosya sistemi izinlerine dayandıkları için daha hızlı ve daha güvenlidirler.
  • Tehditler İçin Günlükleri Aktif Olarak İzleyin: Sistem günlüklerini düzenli olarak journalctl ile izleyin ve Redis yavaş günlük kaydını etkinleştirin. Güvenlik sorunu veya performans problemi olabileceğini gösterebilecek tekrar eden başarısız kimlik doğrulamalar, bilinmeyen kaynaklardan gelen bağlantılar veya kötüye kullanım komutları gibi kalıpları takip edin.
  • Verilerinizi Saklarken Güvenceye Alın: Veri kaybını önlemek için Redis kalıcılığını (RDB ve/veya AOF) etkinleştirin. Veri dosyalarının (dump.rdb, appendonly.aof) sıkı dosya izinlerine sahip olduğundan ve düzenli, şifreli, sahadan bağımsız yedekleme stratejinize dahil olduğundan emin olun.
  • Yerleşik Sistem Güvenliğinden Yararlanın: İşletim sistemi tarafından sağlanan güvenlik özelliklerinden faydalanın. Ubuntu'da, Redis sunucusu için varsayılan bir AppArmor profili otomatik olarak etkinleştirilir; bu profil, sürecini sınırlar ve bir güvenlik açığından kaynaklanabilecek potansiyel zararı azaltır.

Önkoşullar

Bu kılavuzu tamamlamak için, sudo ayrıcalıklarına sahip kök olmayan bir kullanıcıya ve ufw ile yapılandırılmış bir güvenlik duvarına sahip bir Ubuntu sunucusuna erişiminiz olmalıdır. Bunu, Ubuntu için Başlangıç Sunucu Kurulumu kılavuzumuzu izleyerek ayarlayabilirsiniz.

Adım 1 — Redis’i Kurma ve Yapılandırma

Redis'i resmi Ubuntu depolarından yüklemek için APT paket yöneticisini kullanacağız. Bu yazının yazıldığı tarihte, varsayılan depolarda bulunan sürüm 7.0.15'tir.

Yerel apt paket önbelleğinizi güncelleyerek başlayın:

sudo apt update

Sonra şunu yazarak Redis'i kurun:

sudo apt install redis-server

Bu, Redis ve bağımlılıklarını indirip kuracaktır. Kurulum tamamlandıktan sonra, kurulu sürümü doğrulamak iyi bir uygulamadır:

redis-server --version

Bunun ardından, kurulum sırasında otomatik olarak oluşturulan Redis yapılandırma dosyasında yapılması gereken önemli bir yapılandırma değişikliği vardır.

Bu dosyayı tercih ettiğiniz metin düzenleyici ile açın:

sudo nano /etc/redis/redis.conf

Dosyanın içinde, supervised yönergesini bulun. Bu yönerge, Redis'i bir servis olarak yönetmek için bir init sistemi bildirmenize olanak tanır ve çalışması üzerinde daha fazla kontrol sağlar. supervised yönergesi varsayılan olarak no olarak ayarlanmıştır. Ubuntu çalıştırdığınız için, ki Ubuntu systemd init sistemini kullanır, bunu systemd olarak değiştirin:

. . .

# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:
#   supervised no      - no supervision interaction
#   supervised upstart - signal upstart by putting Redis into SIGSTOP mode
#   supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
#   supervised auto    - detect upstart or systemd method based on
#                        UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal "process is ready."
#       They do not enable continuous liveness pings back to your supervisor.
supervised systemd

. . .

Şu anda Redis yapılandırma dosyasında yapmanız gereken tek değişiklik bu, bu yüzden işiniz bittiğinde dosyayı kaydedip kapatın. Dosyayı düzenlemek için nano kullandıysanız, CTRL + X, Y ve ardından ENTER tuşlarına basarak yapabilirsiniz.

Ardından, yapılandırma dosyasında yaptığınız değişikliklerin uygulanması için Redis servisini yeniden başlatın:

sudo systemctl restart redis.service

Böylece Redis'i kurmuş ve yapılandırmış oldunuz ve bilgisayarınızda çalışıyor. Ancak kullanmaya başlamadan önce, Redis'in doğru bir şekilde çalışıp çalışmadığını kontrol etmek akıllıca olacaktır.

Adım 2 — Redis’i Test Etme

Her yeni yüklenen yazılımda olduğu gibi, Redis’in yapılandırmasında başka değişiklikler yapmadan önce doğru şekilde çalıştığından emin olmak iyi bir fikirdir. Bu adımda, Redis’in doğru çalışıp çalışmadığını kontrol etmenin birkaç yolunu inceleyeceğiz.

Redis hizmetinin çalışıp çalışmadığını kontrol ederek başlayın:

sudo systemctl status redis

Herhangi bir hata olmadan çalışıyorsa, bu komut aşağıdakine benzer bir çıktı üretecektir:

● redis-server.service - Advanced key-value store
     Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2020-04-30 23:26:54 UTC; 4s ago
       Docs: http://redis.io/documentation,
             man:redis-server(1)
    Process: 36552 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS)
   Main PID: 36561 (redis-server)
      Tasks: 4 (limit: 2345)
     Memory: 1.8M
     CGroup: /system.slice/redis-server.service
             └─36561 /usr/bin/redis-server 127.0.0.1:6379
. . .

Burada Redis'in çalıştığını ve zaten etkinleştirildiğini görebilirsiniz, bu da her sunucu başlatıldığında otomatik olarak çalışacak şekilde ayarlandığı anlamına gelir.

Not: Bu ayar, Redis’in birçok yaygın kullanım durumu için uygundur. Ancak, sunucunuz her açıldığında Redis’i manuel olarak başlatmayı tercih ediyorsanız, bunu şu komutla yapılandırabilirsiniz:

sudo systemctl disable redis

Redis’in doğru çalıştığını test etmek için, Redis’in komut satırı istemcisi olan redis-cli kullanarak sunucuya bağlanın:

redis-cli

Aşağıdaki istemde ping komutunu kullanarak bağlantıyı test edin:

ping
PONG

Bu çıktı, sunucu bağlantısının hâlâ aktif olduğunu doğrular. Sonraki adım olarak, anahtarları ayarlayabildiğinizden emin olmak için şu komutu çalıştırın:

set test "It's working!"
OK

Değeri şu şekilde alabilirsiniz:

get test

Her şeyin çalıştığını varsayarsak, depoladığınız değeri alabileceksiniz:

"It's working!"

Değeri alabileceğinizi doğruladıktan sonra, kabuğa dönmek için Redis istemcisinden çıkın:

exit

Son bir test olarak, Redis'in durdurulduktan veya yeniden başlatıldıktan sonra verileri kalıcı olarak saklayıp saklayamadığını kontrol edeceğiz. Bunu yapmak için önce Redis örneğini yeniden başlatın:

sudo systemctl restart redis

Sonra komut satırı istemcisi ile tekrar bağlanın:

redis-cli

Ve test değerinizin hâlâ mevcut olduğunu doğrulayın

get test

Anahtarınızın değeri hala erişilebilir olmalıdır:

"It's working!"

İşi bitirdiğinizde tekrar kabuğa çıkın:

exit

Böylece, Redis kurulumunuz tamamen çalışır duruma gelmiş ve kullanıma hazırdır. Ancak, varsayılan yapılandırma ayarlarının bazıları güvensizdir ve kötü niyetli kişiler için sunucunuza ve verilerinize erişim sağlama fırsatları sunar. Bu öğreticideki kalan adımlar, resmi Redis web sitesinde belirtildiği şekilde bu güvenlik açıklarını azaltma yöntemlerini kapsar. Bu adımlar isteğe bağlı olsa da ve bunları uygulamamayı seçerseniz Redis yine de çalışacaktır; ancak sisteminizin güvenliğini artırmak için bu adımları kesinlikle tamamlamanız önerilir.

Adım 3 — localhost'a Bağlanma

Varsayılan olarak, Redis yalnızca localhost üzerinden erişilebilir. Ancak, Redis'i bu eğitici dışında farklı bir kılavuzu takip ederek kurduysanız ve yapılandırdıysanız, bağlantılara her yerden izin vermek için yapılandırma dosyasını güncellemiş olabilirsiniz. Bu, localhost ile sınırlı kalmaktan daha az güvenlidir.

Bunu düzeltmek için Redis yapılandırma dosyasını düzenlemek üzere açın:

sudo nano /etc/redis/redis.conf

Bu satırı bulun ve yorum satırı olmadığından emin olun (varsa # işaretini kaldırın):

bind 127.0.0.1 ::1

İşiniz bittiğinde dosyayı kaydedip kapatın (sırasıyla CTRL + X, Y ve ardından ENTER tuşlarına basın).

Sonra, systemd'nin değişikliklerinizi okuduğundan emin olmak için servisi yeniden başlatın:

sudo systemctl restart redis

Bu değişikliğin yürürlüğe girip girmediğini kontrol etmek için aşağıdaki netstat komutunu çalıştırın:

sudo netstat -lnp | grep redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      14222/redis-server  
tcp6       0      0 ::1:6379                :::*                    LISTEN      14222/redis-server  

Not: netstat komutu sisteminizde varsayılan olarak bulunmayabilir. Eğer durum böyleyse, aşağıdaki komut ile bunu (ve diğer bir dizi kullanışlı ağ aracını) yükleyebilirsiniz:

sudo apt install net-tools

Bu çıktı, redis-server programının localhost (127.0.0.1) adresine bağlı olduğunu gösteriyor ve bu, yapılandırma dosyasında yaptığınız değişikliği yansıtıyor. Eğer o sütunda başka bir IP adresi görüyorsanız (örneğin 0.0.0.0), doğru satırın yorumunu kaldırdığınızdan ve Redis servisini yeniden başlattığınızdan emin olmalısınız.

Artık Redis kurulumunuz sadece localhost üzerinde dinlediği için, kötü niyetli kişilerin sunucunuza istek göndermesi veya erişim sağlaması daha zor olacaktır. Ancak, Redis şu anda kullanıcıların yapılandırmasını veya tuttuğu verileri değiştirmeden önce kendilerini doğrulamasını gerektirecek şekilde ayarlanmamıştır. Bunu düzeltmek için, Redis kullanıcıların Redis istemcisi (redis-cli) üzerinden değişiklik yapmadan önce bir şifre ile kimlik doğrulaması yapmasını gerektirmenize olanak tanır.

Adım 4 — Redis'i Erişim Kontrol Listeleri (ACL'ler) ile Güvenceye Alma

Redis 6 ile birlikte, Kullanıcı Erişim Kontrol Listeleri (ACL'ler) kullanıcı erişimi ve izinlerini yönetmenin tercih edilen yöntemi haline gelmiştir. ACL'ler, eski requirepass yönergesinin yerini, farklı şifreler ve komut izinlerine sahip birden fazla kullanıcı tanımlamanıza olanak tanıyan daha esnek bir sistemle alır.

Güvenli Bir Şifre Oluşturma

Öncelikle, kullanıcı için güçlü bir şifre oluşturun. Uzun ve rastgele bir dize oluşturmak için openssl komutunu kullanabilirsiniz.

openssl rand 60 | openssl base64 -A

Çıktıyı kopyalayın, çünkü yeni Redis kullanıcı şifreniz olarak bunu kullanacaksınız.

Yeni Bir Kullanıcıyı Yapılandırma

Şimdi, Redis yapılandırma dosyasını tekrar açın.

sudo nano /etc/redis/redis.conf

ACL bölümüne kaydırın. Yeni bir kullanıcı oluşturmak için bir user yönergesi ekleyeceksiniz. Ayrıca, varsayılan olarak şifresiz ve tam izinlere sahip olan default kullanıcısını devre dışı bırakmak da bir güvenlik en iyi uygulamasıdır.

Aşağıdaki satırları yapılandırmanıza ekleyin:

# Disable the default user.
user default off

# Create a new user with a strong password and full permissions.
user myuser on >your_generated_password ~* &* +@all

İşte yeni kullanıcı kuralının bir dökümü:

  • myuser: Kullanıcı adı.
  • on: Kullanıcıyı etkinleştirir.
  • >your_generated_password: Kullanıcının şifresini ayarlar.
  • ~* &* +@all: Kullanıcının tüm keyspace’lerde (~*) ve tüm Pub/Sub kanallarında (&*) tüm komutları (+@all) çalıştırmasına izin veren bir kural.

Dosyayı kaydedip kapatın, ardından Redis'i yeniden başlatın.

sudo systemctl restart redis.service

ACL Yapılandırmasını Doğrulama

Değişikliklerin işe yaradığını doğrulamak için redis-cli ile bağlanmayı deneyin ve kimlik doğrulaması yapmadan bir komut çalıştırın.

redis-cli ping

Artık default kullanıcısı devre dışı bırakıldığından, Redis bir kimlik doğrulama hatası döndürecektir.

NOAUTH Authentication required.

Bu, kimlik doğrulaması yapılmamış erişimin engellendiğini doğrular. Şimdi yeni kullanıcıyı test edin. --askpass bayrağını kullanmak, parolayı doğrudan yazmaktan daha güvenlidir, çünkü parolanın komut satırı geçmişinizde saklanmasını engeller.

redis-cli --user myuser --askpass

İstendiğinde oluşturduğunuz şifreyi girin. Bağlandıktan sonra bir komut çalıştırmayı deneyin.

ping

Redis PONG dönmelidir. ACL yapılandırmanız doğru şekilde çalışıyor.

Adım 5 — Redis İletişimini TLS ile Şifreleme

ACL'ler Redis örneğinizi yetkisiz erişimden korur, ancak ağ üzerinden iletilen verileri korumaz. TLS (Taşıma Katmanı Güvenliği), istemci ile sunucu arasındaki trafiği şifreleyerek dinlemeyi önler.

TLS Sertifikaları Oluşturma

İlk olarak, sertifikalarınızı saklamak için bir dizin oluşturun.

sudo mkdir /etc/redis/tls

Daha sonra, openssl kullanarak kendinden imzalı bir sertifika otoritesi (CA), bir sunucu anahtarı ve bir sunucu sertifikası oluşturun. Ülke Adı, Kuruluş Adı vb. bilgileri girmeniz istenecektir.

# Generate CA Key and Certificate

sudo openssl genrsa -out /etc/redis/tls/ca.key 4096

sudo openssl req -x509 -new -nodes -key /etc/redis/tls/ca.key -sha256 -days 365 -out /etc/redis/tls/ca.crt



# Generate Server Key and Certificate Signing Request (CSR)

sudo openssl genrsa -out /etc/redis/tls/redis.key 2048

sudo openssl req -new -key /etc/redis/tls/redis.key -out /etc/redis/tls/redis.csr



# Sign the server certificate with the CA

sudo openssl x509 -req -in /etc/redis/tls/redis.csr -CA /etc/redis/tls/ca.crt -CAkey /etc/redis/tls/ca.key -CAcreateserial -out /etc/redis/tls/redis.crt -days 365 -sha256

Sadece redis kullanıcısının bu hassas dosyalara erişebilmesini sağlamak için doğru izinleri ayarlayın.

sudo chmod 640 /etc/redis/tls/*

sudo chown redis:redis /etc/redis/tls/*

Uyarı: Kendinden imzalı sertifikalar, CA sertifikasını tüm istemcilere güvenli bir şekilde dağıtabileceğiniz geliştirme, test veya dahili hizmetler için uygundur. Genel internet üzerinden bağlanan üretim ortamları için, Let’s Encrypt gibi güvenilir bir Sertifika Yetkilisi (CA) tarafından verilen sertifikaları kullanın.

Redis'i TLS için Yapılandırma

Redis yapılandırma dosyasını açın.

sudo nano /etc/redis/redis.conf

TLS'i etkinleştirmek için aşağıdaki satırları ekleyin veya değiştirin. En iyi uygulama, şifresiz portu port 0 olarak ayarlayarak devre dışı bırakmak ve yalnızca TLS etkin portu kullanmaktır.

# Disable the non-encrypted TCP port.
port 0

# Enable the TLS port on the standard Redis port.
tls-port 6379

# Point to your certificate files.
tls-cert-file /etc/redis/tls/redis.crt
tls-key-file /etc/redis/tls/redis.key
tls-ca-cert-file /etc/redis/tls/ca.crt

Dosyayı kaydedin ve Redis'i yeniden başlatın.

sudo systemctl restart redis.service

TLS Bağlantısını Test Etme

redis-cli ile bağlanmak için artık TLS parametrelerini belirtmeniz gerekiyor.

redis-cli --user myuser --askpass --tls --cacert /etc/redis/tls/ca.crt

Kimlik doğrulamasından sonra, Redis bağlantınız tamamen şifrelenir.

İsteğe Bağlı: Karşılıklı TLS (mTLS) Yapılandırması

Daha yüksek bir güvenlik seviyesi için, istemcinin de sunucuya geçerli bir sertifika sunması gereken karşılıklı TLS (mTLS) yapılandırabilirsiniz.

Öncelikle, CA'nız tarafından imzalanmış bir istemci anahtarı ve sertifikası oluşturun.

# Generate client key and CSR

openssl genrsa -out client.key 2048

openssl req -new -key client.key -out client.csr



# Sign the client certificate with your CA

sudo openssl x509 -req -in client.csr -CA /etc/redis/tls/ca.crt -CAkey /etc/redis/tls/ca.key -CAcreateserial -out client.crt -days 365 -sha256

Sonraki adımda /etc/redis/redis.conf dosyasında istemci doğrulamayı etkinleştirin.

tls-auth-clients yes

Redis'i yeniden başlatın. Artık istemciler bağlanmak için sertifikalarını ve anahtarlarını sunmalıdır.

redis-cli --user myuser --askpass --tls \

  --cacert /etc/redis/tls/ca.crt \

  --cert client.crt \

  --key client.key

Adım 6 — Güvenlik Duvarı Kurallarının Yapılandırılması ve Güvenli Uzaktan Erişim

Bir güvenlik duvarı, sunucunuza olan ağ trafiğini kısıtlayan kritik bir güvenlik katmanıdır. Varsayılan olarak, Redis sadece yerel döngüsel arayüzde (127.0.0.1) dinler, bu nedenle genel internete açılmaz. Dış bir sunucudan bağlanmanız gerekiyorsa, Redis'i genel IP'sinde dinleyecek şekilde yapılandırmalı ve sıkı güvenlik duvarı kuralları belirlemelisiniz.

Uyarı: Bir Redis örneğini doğrudan genel internete açmak ciddi bir güvenlik riskidir. Uzaktan erişim için daha güvenli alternatifler kullanmanız şiddetle tavsiye edilir.

Uzak Sunucu için Güvenlik Duvarı Kuralları

Doğrudan bağlantılara izin vermeniz gerekiyorsa, ufw kullanarak sadece tek bir güvenilir IP adresinden Redis TLS portu (6379) trafiğine izin verin.

sudo ufw allow from your_trusted_ip/32 to any port 6379 proto tcp

your_trusted_ip öğesini uygulama sunucunuzun statik IP adresi ile değiştirin.

SSH bağlantı noktanızın her zaman izinli olduğundan emin olun.

sudo ufw allow OpenSSH

Son olarak, eğer henüz aktif değilse güvenlik duvarını etkinleştirin.

sudo ufw enable

Uzaktan Erişim İçin Daha Güvenli Alternatifler

Redis portunu herkese açmak yerine, bu daha güvenli yöntemleri düşünün:

  • VPN: WireGuard veya OpenVPN gibi bir VPN kullanarak özel bir ağ kurun. Uygulama sunucunuz ve Redis sunucunuz, genel erişime açık olmadan güvenli, özel bir kanal üzerinden iletişim kurabilir.
  • SSH Tüneli: İstemci makinenizden Redis sunucusuna şifreli bir SSH tüneli oluşturun. Bu, istemcinizdeki yerel bir portu güvenli SSH bağlantısı üzerinden sunucudaki Redis portuna yönlendirir.

Bir SSH tüneli oluşturma örneği:

ssh -L 8000:127.0.0.1:6379 user@your_redis_server_ip

Daha sonra yerel Redis istemcinizi localhost:8000 adresine bağlayabilir ve trafiğiniz güvenli bir şekilde Redis sunucusuna yönlendirilecektir.

Adım 7 — Ek Sertleştirme Tekniklerini Uygulama

Redis örneğinizi bu ek önlemlerle daha da güvence altına alabilirsiniz.

Komutları ACL'lerle Sınırlamak (Modern Yaklaşım)

Tehlikeli komutların adını değiştirmek yerine (eski bir uygulama), bunları kullanıcı bazında kısıtlamak için ACL kurallarını kullanın. Bu, daha ayrıntılı kontrol sağlar ve Redis istemcilerini veya izleme araçlarını bozmaz.

Örneğin, myuser'ın ciddi hasara yol açabilecek komutları (örneğin FLUSHALL, DEBUG, SHUTDOWN) kullanmasını önlemek için, ACL kuralını @all kategorisini kaldırarak ve daha spesifik kategoriler ekleyerek değiştirebilir ve tehlikeli komutları açıkça engelleyebilirsiniz.

# Example of a more restrictive user
user myuser on >your_generated_password ~* &* +@read +@write +@connection -@dangerous -FLUSHALL

Bu kural, kullanıcının okuma, yazma ve bağlantı komutlarını gerçekleştirmesine izin verir, ancak açıkça @dangerous komut kategorisini ve FLUSHALL komutunu engeller.

Komut Yeniden Adlandırma (Eski Yöntem - Önerilmez)

Komutların yeniden adlandırılması uygulaması büyük ölçüde geçerliliğini yitirmiştir ve yerine ACL'lerin kullanılması tercih edilmelidir. Komutların yeniden adlandırılması, istemci kütüphanelerini bozabilir, bakımı zorlaştırabilir ve kalıcılık (AOF) ile çoğaltma işlemlerinde sorunlara yol açabilir.

Bu yöntemi kullanan bir sistemle karşılaşırsanız, komutlar /etc/redis/redis.conf dosyasında şöyle yeniden adlandırılır:

# rename-command FLUSHALL ""
# rename-command CONFIG MY_SECURE_CONFIG_COMMAND

Bellek Yönetimi ve Güvenlik

Bir saldırgan, sunucunuzun belleğini doldurarak Hizmet Reddi (DoS) saldırısı yapmayı deneyebilir. Bunu önlemek için Redis’i bir bellek sınırı belirleyecek şekilde yapılandırın.

/etc/redis/redis.conf dosyasında, maxmemory ve maxmemory-policy yönergelerinin yorum işaretini kaldırın ve ayarlayın:

maxmemory 2gb
maxmemory-policy allkeys-lru
  • maxmemory: Redis’in kullanabileceği bellek miktarına katı bir sınır koyar.
  • maxmemory-policy: Redis, limit dolduğunda ne yapacağını söyler. allkeys-lru en az kullanılan anahtarları tahliye eder, bu da önbellekler için yaygın bir tercihtir.

Ağ Yapılandırması ve Zaman Aşımı

  • Unix Soketleri: Redis ile aynı makinede çalışan uygulamalar için Unix soket kullanmak, ağ yığınını atladığı için bir TCP portundan daha güvenlidir. Bunu redis.conf dosyasında etkinleştirin:

    unixsocket /var/run/redis/redis.sock
    unixsocketperm 770

    Sonra redis-cli -s /var/run/redis/redis.sock ile bağlanın.

  • /etc/redis/redis.conf

  • Boşta Kalma Zaman Aşımı: Kaynakları boşaltmak ve saldırı yüzeyini azaltmak için boşta olan bağlantıları otomatik olarak kapatın.

    timeout 300

    Bu, 300 saniye boyunca boşta kalan bağlantıları kapatacaktır.

  • /etc/redis/redis.conf

AppArmor

Ubuntu, programları sınırlı bir kaynak setiyle kısıtlayan bir güvenlik modülü olan AppArmor'u içerir. redis-server paketi, otomatik olarak etkinleştirilen varsayılan bir AppArmor profili ile gelir.

Durumunu şuradan doğrulayabilirsiniz:

sudo aa-status | grep redis

Bu profil, Redis işlemine sistem üzerinde neler yapabileceğini kısıtlayarak önemli bir savunma katmanı sağlar. CentOS gibi diğer Linux dağıtımlarında SELinux benzer bir amaçla hizmet eder.

Adım 8 — Redis Aktivitesini ve Kayıtlarını İzleme

Hataları, performans sorunlarını ve şüpheli aktiviteleri tespit etmek için günlükleri düzenli olarak izlemek önemlidir.

Sistem Günlükleri

journalctl ile systemd tarafından yönetilen gerçek zamanlı günlükleri görüntüleyebilirsiniz.

sudo journalctl -u redis-server.service -f

Şunlar gibi kalıplara dikkat edin:

  • Bilinmeyen IP'lerden çok sayıda yeni bağlantı.
  • Tekrarlanan kimlik doğrulama hataları (NOAUTH).
  • Sizin kısıtladığınız komutlarla ilgili hatalar.

Üretim sistemleri için, bu logları merkezi bir loglama platformuna (ELK yığını gibi) ileterek şüpheli desenler için otomatik uyarılar kurun.

Redis Yavaş Günlüğü

Redis yavaş günlüğü, belirli bir yürütme süresini aşan sorguları kaydeder. Performans darboğazlarını tespit etmek için faydalıdır ve ayrıca istemcilerden gelen kötüye kullanım veya verimsiz komutları belirlemeye yardımcı olabilir.

Bunu /etc/redis/redis.conf dosyasında etkinleştirin:

slowlog-log-slower-than 10000
slowlog-max-len 128
  • slowlog-log-slower-than: Bu değerden daha uzun süren komutları mikro saniye cinsinden kaydeder (10000=10ms).
  • slowlog-max-len: Yavaş kayıttaki maksimum giriş sayısı.

redis-cli ile yavaş logu görüntüleyin:

redis-cli SLOWLOG GET

Adım 9 — Redis Kalıcılığını ve Yedeklerini Yapılandırma

Varsayılan olarak, Redis tüm verileri bellekte tutar. Kalıcılık mekanizmaları bu verileri diske kaydeder ve sunucu yeniden başlasa bile verinin kaybolmasını engeller.

Kalıcılık Seçenekleri

Redis iki ana kalıcılık modu sunar:

  • RDB (Redis Veritabanı): Belirli aralıklarla veri kümenizin anlık görüntülerini alır. Genellikle daha hızlıdır.
  • AOF (Sadece Ekleme Dosyası): Sunucuya alınan her yazma işlemini kaydeder. Daha iyi dayanıklılık sağlar ancak daha büyük dosyalara yol açabilir.

/etc/redis/redis.conf dosyasında birini veya her ikisini etkinleştirebilirsiniz. Varsayılan yapılandırma RDB'yi etkinleştirir. AOF'yi etkinleştirmek için:

appendonly yes

Veri Dosyalarını ve Yedeklerini Güvence Altına Alma

Redis veri dosyaları (dump.rdb, appendonly.aof) varsayılan olarak /var/lib/redis/ dizininde saklanır. Bu dizinin ve içindeki dosyaların redis kullanıcısına ait olduğundan ve herkes tarafından okunabilir olmadığından emin olun.

sudo ls -l /var/lib/redis

Afet kurtarma için bu dosyaları yedeklemelisiniz.

  • Güvenli Depolama: Yedekleri güvenli, uzak bir konumda (örneğin bir nesne depolama kovası) saklayın.
  • Şifreleme: Yedek dosyalarınızı sunucudan aktarmadan önce gpg gibi bir araç kullanarak şifreleyin.
  • Yedekten Kurtarma Testi: Yedeklerin geçerli olduğunu ve sürecin beklendiği gibi çalıştığını doğrulamak için yedeklemeyi bir test sunucusuna geri yükleyerek kurtarma prosedürlerinizi düzenli olarak test edin.

SSS

1. Neden eski requirepass yöntem yerine Redis ACL'lerini kullanmalıyım?

Redis Erişim Kontrol Listeleri (ACL'ler), Redis 6 ile tanıtılmıştır ve kullanıcı izinlerini yönetmek için modern standarttır. requirepass ile sağlanan tek paroladan farklı olarak, ACL'ler size benzersiz parolalara sahip birden fazla kullanıcı oluşturma ve ayrıntılı izinler verme imkanı sağlar. Bir kullanıcının hangi komutları çalıştırabileceğini, hangi anahtarlara erişebileceğini ve hangi Pub/Sub kanallarını kullanabileceğini kontrol edebilirsiniz. Bu “asgari ayrıcalık ilkesi”, tek bir kullanıcının kimlik bilgileri ele geçirilirse oluşabilecek potansiyel zararı sınırladığı için temel bir güvenlik uygulamasıdır.

2. Redis örneğimi doğrudan genel internet erişimine açmak güvenli midir?

Hayır, bu şiddetle tavsiye edilmez. Redis'i doğrudan açmak, şifre ve TLS ile bile olsa, onu kaba kuvvet saldırıları ve potansiyel sıfır-gün (zero-day) güvenlik açıkları için hedef haline getirir. Uzak erişim için en güvenli yöntemler özel bir ağ kullanmayı içerir. Redis portunu açık internete hiç maruz bırakmadan, uygulama sunucunuz ile Redis örneğiniz arasında güvenli ve şifreli bir kanal oluşturmak için VPN (WireGuard veya OpenVPN gibi) veya SSH tüneli kullanmalısınız.

3. RDB ve AOF kalıcılığı arasındaki fark nedir ve hangisini kullanmalıyım?

Hem RDB hem de AOF, bellekteki Redis verilerinizi diske kaydetme yöntemleridir.

  • RDB (Redis Veritabanı): Verisetinizin belirli aralıklarla (örneğin, en az bir yazma işlemi varsa her 5 dakikada bir) anlık görüntülerini oluşturur. Genellikle yedekleme oluşturma ve Redis’i yeniden başlatma işlemleri için daha hızlıdır.
  • AOF (Sadece Ekleme Dosyası): Sunucu tarafından alınan her yazma işlemini kaydeder. Bu, çok daha iyi veri dayanıklılığı sağlar; bir çökme durumunda en fazla bir saniyelik veri kaybetme riski vardır, ancak log dosyaları daha büyük hale gelebilir.

Çoğu üretim senaryosu için, kalıcılık (AOF) avantajlarından ve pratik yedeklemeler (RDB) avantajlarından faydalanmak amacıyla her iki kalıcılık yönteminin de etkinleştirilmesi önerilir.

4. Redis’in belleğinin tükenmesini nasıl önleyebilirim?

Bir saldırgan, sunucunuzun belleği tükenene kadar sürekli veri yazarak Hizmet Reddi (DoS) saldırısı başlatabilir. Bunu önlemek için, redis.conf dosyanızda maxmemory yönergesini kullanarak bir bellek sınırı belirlemelisiniz (örn. maxmemory 2gb). Ayrıca, bu sınır ulaşıldığında Redis'in anahtarları nasıl boşaltacağını belirtmek için bir maxmemory-policy (örneğin allkeys-lru) tanımlamalısınız.

5. Güvenlik için tehlikeli Redis komutlarının adını değiştirmeli miyim?

Komutları yeniden adlandırmak, artık önerilmeyen eski bir güvenlik uygulamasıdır. Modern ve daha etkili yaklaşım, tehlikeli komutlara kullanıcı bazında erişimi kısıtlamak için Redis ACL'lerini kullanmaktır. Komutları yeniden adlandırmak, sürdürmesi zor olabilir, istemci kütüphanelerini ve izleme araçlarını bozabilir ve çoğaltma ile AOF kalıcılığı konusunda komplikasyonlara yol açabilir.

6. ACL'lerle ayarlanmış bir şifrem var. Neden ayrıca TLS'ye de ihtiyacım var?

ACL'ler ve parolalar, Redis sunucunuzu yetkisiz erişimden (kimlik doğrulama) korur, ancak verilerin ağ üzerinden geçişini korumazlar. TLS (Taşıma Katmanı Güvenliği) olmadan, tüm verileriniz—komutlar ve yanıtlar dahil—düz metin olarak gönderilir. Ağdaki bir saldırgan, hassas bilgileri çalmak için bu trafiği yakalayabilir. TLS, tüm bağlantıyı şifreler ve böylece istemciniz ile Redis sunucusu arasındaki tüm iletişimin özel ve güvenli olmasını sağlar.

7. Redis örneğimi şüpheli faaliyetler için nasıl izleyebilirim?

Hem sistem günlüklerini hem de Redis yavaş günlüklerini takip etmelisin.

  • Sistem Kayıtları (journalctl -u redis-server.service): Yüksek sayıda başarısız kimlik doğrulama denemeleri, bilinmeyen IP adreslerinden beklenmedik bağlantılar veya engellenmiş komutlarla ilgili hatalar için bunları kontrol edin.
  • Redis Yavaş Günlüğü: Bu özelliği, çalıştırması uzun süren sorguları kaydetmek için etkinleştirin. Öncelikle performans ayarlamaları için kullanılsa da, aynı zamanda saldırının bir parçası olabilecek kötü niyetli veya hatalı yazılmış komutları da ortaya çıkarabilir.

Üretim sistemleri için, bu günlükler merkezi bir günlükleme platformuna gönderilmeli ve bu desenler için otomatik uyarılar ayarlayabileceğiniz bir sistem kurulmalıdır.

8. AppArmor nedir ve Redis için bunu yapılandırmam gerekiyor mu?

AppArmor, Ubuntu ile birlikte gelen ve programları sınırlı bir sistem kaynakları setiyle kısıtlayan bir Linux güvenlik modülüdür. redis-server paketi, varsayılan olarak etkin olan önceden yapılandırılmış bir AppArmor profili ile birlikte gelir. Bu profil, Redis işleminin erişebileceği dosyaları ve ağ yeteneklerini kısıtlar ve eğer bir saldırgan Redis'in kendisinde bir güvenlik açığı bulursa kritik bir savunma katmanı sağlar. Standart bir kurulum için ek bir yapılandırma gerekmez.

9. Aynı sunucudaki bir uygulamadan Redis'e güvenli bir şekilde nasıl bağlanabilirim?

Uygulamanız ve Redis aynı makinede çalışıyorsa, en güvenli bağlantı yöntemi bir TCP portu değil, bir Unix soketidir. Unix soketi, süreçler arası iletişim için kullanılan bir dosya sistemindeki bir dosyadır ve ağ yığınını tamamen atlar. Bu, dosya sistemi izinlerine tabi olduğu ve sunucunun dışından erişilemediği için daha hızlı ve daha güvenlidir.

10. TLS'i kendi kendine imzalanmış sertifikalarla yapılandırdım. Bu üretim ortamı için uygun mu?

Kendi imzaladığınız sertifikalar, geliştirme, test veya kendi oluşturduğunuz Sertifika Yetkilisi (CA) bilgisini her istemciye güvenli bir şekilde dağıtabileceğiniz dahili hizmetler için kabul edilebilir. Ancak, genel internet üzerinden bağlanan uygulamalar veya daha büyük, daha karmaşık üretim ortamları için, Let’s Encrypt gibi güvenilir, halka açık bir Sertifika Yetkilisi tarafından verilen TLS sertifikalarının kullanılması güçlü bir şekilde tavsiye edilir. Bu, sertifika yönetimini basitleştirir ve istemcilerle güven sorunlarını önler.

Sonuç

Bu derste, Redis'i kurup yapılandırdınız, Redis kurulumunuzun doğru şekilde çalıştığını doğruladınız ve yerleşik güvenlik özelliklerini kullanarak kötü niyetli kişilerden gelen saldırılara karşı daha az savunmasız hale getirdiniz.

Unutmayın ki, birisi sunucunuza giriş yaptıktan sonra, uyguladığımız Redis'e özgü güvenlik özelliklerini aşmak oldukça kolaydır. Bu nedenle, Redis sunucunuzdaki en önemli güvenlik özelliği, eğer ön koşul Olan Başlangıç Sunucu Kurulumu kılavuzunu takip ettiyseniz yapılandırdığınız güvenlik duvarınızdır; çünkü bu, kötü niyetli kişilerin bu engeli aşmasını son derece zor hâle getirir.

Bu rehber sizi Redis'in kurulumu ve güvenliğini sağlamaya başlatacak olsa da, daha iyi güvenlik için resmi belgeleri incelemenizi şiddetle tavsiye ederiz:

  • Redis yönetimi
  • Redis Güvenliği
  • Redis yapılandırması

Linux-Console.net Topluluğu ile öğrenme sürecine katıldığınız için teşekkürler.