Merhaba arkadaşlar, bugün sizlere özellikle birden fazla sunucunun olduğu ortamlarda çok kritik bir güvenlik önlemi olan Memcached için SASL kimlik doğrulamayı nasıl kuracağınızı ve uzaktan erişimi güvenli hale getirmeyi anlatacağım. Varsayılan kurulumda kimlik doğrulama olmadığı için, Memcached sunucusu ağa açıksa ciddi bir güvenlik açığı oluşturabilir. Bu rehberle bu açığı tamamen kapatmış olacağız.
SASL Nedir ve Neden Gerekli?
Memcached, varsayılan olarak herhangi bir kullanıcı adı/şifre sormadan bağlantıları kabul eder. Eğer sunucunuzun 11211 portu dış dünyaya açıksa, herkes bağlanıp veri ekleyebilir, silebilir veya sunucuyu DDoS atağı için kullanabilir. SASL (Simple Authentication and Security Layer) ile basit bir kullanıcı/şifre mekanizması ekleyerek bu riski ortadan kaldırıyoruz.
Adım 1: Gerekli Paketlerin Kurulumu
Öncelikle sunucumuzu güncelleyelim ve gerekli paketleri kuralım. Ben genelde Debian/Ubuntu tabanlı sistemlerde çalıştığım için komutlar ona göre. CentOS/RHEL kullanan arkadaşlar `yum` veya `dnf` kullanacaklar.
Bu komutlarla Memcached'i, SASL kütüphanelerini ve araçlarını kuruyoruz. Kurulum otomatik olarak Memcached servisini de başlatacaktır.
Adım 2: SASL Yapılandırmasını Oluşturma
Şimdi SASL için bir veritabanı oluşturacağız ve kullanıcı ekleyeceğiz. İlk olarak SASL'ın kullanacağı mekanizmayı belirleyelim. Ben basit ve etkili olan auxprop ve plain mekanizmasını kullanıyorum.
Aşağıdaki komutla SASL yapılandırma dosyasını oluşturalım. Dosya yoluna dikkat edin: /etc/sasl2/memcached.conf
Şimdi bu veritabanına bir kullanıcı ekleyelim. Siz kendi belirlediğiniz güçlü bir kullanıcı adı ve şifreyi kullanın. Ben örnek olarak cacheadmin kullanıyorum.
Komutu çalıştırdığınızda sizden şifre isteyecek, iki kere güçlü bir şifre girin. Son olarak, oluşturulan veritabanı dosyasının Memcached prosesi tarafından okunabilmesi için izinleri ayarlayalım.
Dikkat Edilmesi Gerekenler
Bu aşamada en çok yapılan hata, dosya izinlerini yanlış vermek veya sasldb_path yolunu yanlış yazmaktır. Komutları adım adım uygularsanız sorun yaşamazsınız. Ayrıca, şifrenizi unutmamaya özen gösterin, çünkü veritabanına tekrar erişmek biraz uğraştırıcı olabilir.
Adım 3: Memcached Yapılandırmasını Değiştirme
Asıl işlem şimdi başlıyor. Memcached'in ana yapılandırma dosyasını açıp SASL'ı etkinleştireceğiz. Dosyamız: /etc/memcached.conf
Aşağıdaki satırları bulup ya değiştireceğiz ya da dosyanın sonuna ekleyeceğiz. Öncelikle dosyayı bir editörle açalım.
Dosyanın içinde `-l` parametresiyle başlayan bir satır bulacaksınız (genellikle `-l 127.0.0.1` şeklindedir). Bu satır, Memcached'in hangi IP adresini dinleyeceğini belirler. Eğer sadece localhost üzerinden erişim olacaksa bu satırı olduğu gibi bırakın. Ancak, diğer sunuculardan da (örneğin web sunucunuzdan) erişim gerekiyorsa, o sunucunun özel IP'sini veya `0.0.0.0` (tüm ağ arabirimleri) yazmalısınız.
UYARI: `-l 0.0.0.0` yapmak, sunucuyu tüm IP'lere açar. Bunu YALNIZCA güvenli bir özel ağınız (VPC/VLAN) varsa ve SASL kimlik doğrulamayı etkinleştirdiğinizden eminseniz yapın. Doğrudan internete açmak çok risklidir!
Şimdi, SASL'ı etkinleştirmek için aşağıdaki parametreyi dosyaya ekleyin. Bu parametre genellikle dosyada yoktur, en son satıra ekleyebilirsiniz.
İlk parametre `-S`, SASL desteğini etkinleştirir. İkinci parametre `-s` ise UNIX soket dosyasının yolunu belirtir (isteğe bağlı, eğer sadece yerel uygulamalar bağlanacaksa kullanışlıdır). Eğer ağ üzerinden erişim sağlayacaksanız, `-s` parametresini kullanmayabilir veya yorum satırı yapabilirsiniz.
Değişiklikleri kaydedip editörden çıktıktan sonra, Memcached servisini yeniden başlatalım.
Adım 4: Test ve Uzaktan Erişim Kontrolü
Kurulumun çalışıp çalışmadığını test edelim. Öncelikle servisin durumuna bakalım.
Çıktıda "Initialized SASL." gibi bir mesaj görüyorsanız, SASL başarıyla yüklenmiş demektir.
Şimdi, yerelden kimlik doğrulama gerektirmeden bağlanmayı deneyelim. Aşağıdaki komut hata vermeli veya timeout'a uğramalı.
Şimdi de doğru kimlik bilgileriyle bağlanalım. `libmemcached-tools` paketini kurmanız gerekebilir.
Eğer istatistikleri (hit, miss, connection sayısı gibi) listeleyebiliyorsanız, kurulum tamamlanmış demektir! Tebrikler.
Uzaktan Erişim için Güvenlik Duvarı (Firewall)
Eğer diğer sunuculardan erişime izin verdiyseniz (`-l` parametresiyle), mutlaka güvenlik duvarınızı da yapılandırın. Sadece belirli kaynak IP adreslerinin 11211 portuna bağlanmasına izin verin. Örnek bir UFW kuralı:
Bu kural, sadece `10.0.1.0/24` ağındaki sunucuların bağlanmasına izin verir.
Sonuç ve Tavsiyeler
Memcached, varsayılan olarak herhangi bir kullanıcı adı/şifre sormadan bağlantıları kabul eder. Eğer sunucunuzun 11211 portu dış dünyaya açıksa, herkes bağlanıp veri ekleyebilir, silebilir veya sunucuyu DDoS atağı için kullanabilir. SASL (Simple Authentication and Security Layer) ile basit bir kullanıcı/şifre mekanizması ekleyerek bu riski ortadan kaldırıyoruz.
Öncelikle sunucumuzu güncelleyelim ve gerekli paketleri kuralım. Ben genelde Debian/Ubuntu tabanlı sistemlerde çalıştığım için komutlar ona göre. CentOS/RHEL kullanan arkadaşlar `yum` veya `dnf` kullanacaklar.
Bash:
sudo apt-get update
sudo apt-get install -y memcached libsasl2-modules sasl2-bin
Bu komutlarla Memcached'i, SASL kütüphanelerini ve araçlarını kuruyoruz. Kurulum otomatik olarak Memcached servisini de başlatacaktır.
Şimdi SASL için bir veritabanı oluşturacağız ve kullanıcı ekleyeceğiz. İlk olarak SASL'ın kullanacağı mekanizmayı belirleyelim. Ben basit ve etkili olan auxprop ve plain mekanizmasını kullanıyorum.
Aşağıdaki komutla SASL yapılandırma dosyasını oluşturalım. Dosya yoluna dikkat edin: /etc/sasl2/memcached.conf
Bash:
sudo mkdir -p /etc/sasl2
echo 'mech_list: plain
log_level: 5
sasldb_path: /etc/sasl2/memcached-sasldb2' | sudo tee /etc/sasl2/memcached.conf
Şimdi bu veritabanına bir kullanıcı ekleyelim. Siz kendi belirlediğiniz güçlü bir kullanıcı adı ve şifreyi kullanın. Ben örnek olarak cacheadmin kullanıyorum.
Bash:
sudo saslpasswd2 -a memcached -c -f /etc/sasl2/memcached-sasldb2 cacheadmin
Komutu çalıştırdığınızda sizden şifre isteyecek, iki kere güçlü bir şifre girin. Son olarak, oluşturulan veritabanı dosyasının Memcached prosesi tarafından okunabilmesi için izinleri ayarlayalım.
Bash:
sudo chown memcache:memcache /etc/sasl2/memcached-sasldb2
Bu aşamada en çok yapılan hata, dosya izinlerini yanlış vermek veya sasldb_path yolunu yanlış yazmaktır. Komutları adım adım uygularsanız sorun yaşamazsınız. Ayrıca, şifrenizi unutmamaya özen gösterin, çünkü veritabanına tekrar erişmek biraz uğraştırıcı olabilir.
Asıl işlem şimdi başlıyor. Memcached'in ana yapılandırma dosyasını açıp SASL'ı etkinleştireceğiz. Dosyamız: /etc/memcached.conf
Aşağıdaki satırları bulup ya değiştireceğiz ya da dosyanın sonuna ekleyeceğiz. Öncelikle dosyayı bir editörle açalım.
Bash:
sudo nano /etc/memcached.conf
Dosyanın içinde `-l` parametresiyle başlayan bir satır bulacaksınız (genellikle `-l 127.0.0.1` şeklindedir). Bu satır, Memcached'in hangi IP adresini dinleyeceğini belirler. Eğer sadece localhost üzerinden erişim olacaksa bu satırı olduğu gibi bırakın. Ancak, diğer sunuculardan da (örneğin web sunucunuzdan) erişim gerekiyorsa, o sunucunun özel IP'sini veya `0.0.0.0` (tüm ağ arabirimleri) yazmalısınız.
UYARI: `-l 0.0.0.0` yapmak, sunucuyu tüm IP'lere açar. Bunu YALNIZCA güvenli bir özel ağınız (VPC/VLAN) varsa ve SASL kimlik doğrulamayı etkinleştirdiğinizden eminseniz yapın. Doğrudan internete açmak çok risklidir!
Şimdi, SASL'ı etkinleştirmek için aşağıdaki parametreyi dosyaya ekleyin. Bu parametre genellikle dosyada yoktur, en son satıra ekleyebilirsiniz.
NGINX:
-S
-s /var/run/memcached/memcached-sasl.sock
İlk parametre `-S`, SASL desteğini etkinleştirir. İkinci parametre `-s` ise UNIX soket dosyasının yolunu belirtir (isteğe bağlı, eğer sadece yerel uygulamalar bağlanacaksa kullanışlıdır). Eğer ağ üzerinden erişim sağlayacaksanız, `-s` parametresini kullanmayabilir veya yorum satırı yapabilirsiniz.
Değişiklikleri kaydedip editörden çıktıktan sonra, Memcached servisini yeniden başlatalım.
Bash:
sudo systemctl restart memcached
Kurulumun çalışıp çalışmadığını test edelim. Öncelikle servisin durumuna bakalım.
Bash:
sudo systemctl status memcached --no-pager -l
Çıktıda "Initialized SASL." gibi bir mesaj görüyorsanız, SASL başarıyla yüklenmiş demektir.
Şimdi, yerelden kimlik doğrulama gerektirmeden bağlanmayı deneyelim. Aşağıdaki komut hata vermeli veya timeout'a uğramalı.
Bash:
echo "stats" | nc localhost 11211
Şimdi de doğru kimlik bilgileriyle bağlanalım. `libmemcached-tools` paketini kurmanız gerekebilir.
Bash:
sudo apt-get install -y libmemcached-tools
memcstat --servers=localhost --username=cacheadmin --password=GÜCLÜ_SIFRENIZ
Eğer istatistikleri (hit, miss, connection sayısı gibi) listeleyebiliyorsanız, kurulum tamamlanmış demektir! Tebrikler.
Eğer diğer sunuculardan erişime izin verdiyseniz (`-l` parametresiyle), mutlaka güvenlik duvarınızı da yapılandırın. Sadece belirli kaynak IP adreslerinin 11211 portuna bağlanmasına izin verin. Örnek bir UFW kuralı:
Bash:
sudo ufw allow from 10.0.1.0/24 to any port 11211 proto tcp
Bu kural, sadece `10.0.1.0/24` ağındaki sunucuların bağlanmasına izin verir.