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
requirepassyönergesi yerine kullanıcıları yönetmek için her zaman Erişim Kontrol Listeleri (ACL) kullanın.defaultkullanı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
maxmemoryyö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 birmaxmemory-policytanı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
journalctlile 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 updateSonra şunu yazarak Redis'i kurun:
sudo apt install redis-serverBu, 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 --versionBunun 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.confDosyanı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.serviceBö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 redisHerhangi 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 redisRedis’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-cliAşağıdaki istemde ping komutunu kullanarak bağlantıyı test edin:
pingPONGBu çı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!"OKDeğeri şu şekilde alabilirsiniz:
get testHer ş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:
exitSon 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 redisSonra komut satırı istemcisi ile tekrar bağlanın:
redis-cliVe test değerinizin hâlâ mevcut olduğunu doğrulayın
get testAnahtarınızın değeri hala erişilebilir olmalıdır:
"It's working!"İşi bitirdiğinizde tekrar kabuğa çıkın:
exitBö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.confBu 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 redisBu 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 redistcp 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-toolsBu çı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.confACL 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.serviceACL 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 pingArtı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.
pingRedis 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/tlsDaha 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 -sha256Sadece 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.confTLS'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.crtDosyayı kaydedin ve Redis'i yeniden başlatın.
sudo systemctl restart redis.serviceTLS 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.crtKimlik 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 -sha256Sonraki adımda /etc/redis/redis.conf dosyasında istemci doğrulamayı etkinleştirin.
tls-auth-clients yesRedis'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.keyAdı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 tcpyour_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 OpenSSHSon olarak, eğer henüz aktif değilse güvenlik duvarını etkinleştirin.
sudo ufw enableUzaktan 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_ipDaha 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 -FLUSHALLBu 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_COMMANDBellek 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-lrumaxmemory: 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-lruen 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.confdosyasında etkinleştirin:unixsocket /var/run/redis/redis.sock unixsocketperm 770Sonra
redis-cli -s /var/run/redis/redis.sockile bağlanın.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 300Bu, 300 saniye boyunca boşta kalan bağlantıları kapatacaktır.
/etc/redis/redis.conf
/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 redisBu 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 128slowlog-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 GETAdı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 yesVeri 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/redisAfet 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
gpggibi 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.