Linux sunuculara erişim sağlamak için SSH protokolü kullanıyoruz. Çoğu kullanıcı SSH bağlantısını varsayılan ayarlar ile kullanıyor. Ancak bu şekilde bir kullanım güvenlik risklerini de beraberinde getiriyor. SSH erişimi dışarı açık bir sunucunun root parolasının kırılması sunucu açıldıktan sonra dakikalar içinde gerçekleşebilir. Hele ki public bir IP kullanıyorsanız çok daha hızlı da olabilir 🙂 Bu makalemizde SSH bağlantımızı nasıl güvenli hale getirebileceğimizi inceleyeceğiz.
Güvenlik duvarı cihazları üzerinden erişim kısıtlaması veya VPN uygulamaları ile güvenli bağlantı sağlayarak sunuculara erişim sağlanması bu makalemizin kapsamı dışındadır. Zaten kurumsal bir yapı üzerinde çalışan sunucular için güvenlik duvarı, VPN bağlantıları günümüzde alınması gereken varsayılan uygulamalardır. Kapsamımız, Linux sunucu içerisindeki sshd_config dosyası üzerinde yapılacak işlemler üzerinedir.
1. Kullanıcı sınırlaması ve root kullanıcısını kapatmak
İşe ilk olarak root kullanıcısının SSH erişimini kapatıp root yetkilerine sahip bir kullanıcı oluşturmakla başlıyoruz. Root kullanıcısını kapatmak saldırganların amacına ulaşmasını engelleyecek savunma stratejilerinden bir tanesidir. Öncelikle ozguraydin isimli bir kullanıcı oluşturarak işe başlıyorum.
useradd -m ozguraydin komutuyla kullanıcı oluşturuyoruz. -m belirteci oluşturduğumuz kullanıcı için aynı zamanda home klasörü altında bir dosya oluştur anlamına geliyor.
passwd ozguraydin komutu oluşturduğumuz kullanıcıya parola atıyoruz. Kullanıcılara vereceğiniz parolaların karmaşık ve tahmin edilmesi zor olması gerektiğini hatırlatmama gerek yok sanırım 🙂
usermod -aG sudo ozguraydin komutu ile admin grubuna kullanıcıyı dahil ediyoruz. SSH bağlantısı için /etc/ssh/sshd_config dosyasını düzenliyoruz. Bu dosyada root kullanıcısının erişim sağlamasına izin veren PermitRootLogin satırını no olarak değiştiriyoruz. Hemen alt satıra da AllowUsers ozguraydin ifadesini ekleyerek yeni oluşturduğumuzu kullanıcıya izin veriyoruz. Dosyayı kaydedip çıkıyoruz.
# Authentication:
#LoginGraceTime 2m
PermitRootLogin no
AllowUsers ozguraydin
Son olarak systemctl restart sshd ile SSH servisini yeniden başlatıyoruz.
root kullanıcısı ile giriş yapmaya çalıştığımızda erişim sağlayamıyoruz.
2. Port Değişikliği
Diğer önemli değişiklik port değişikliğidir. SSH bağlantısının portu varsayılan olarak 22’dir. Portu değiştirerek saldırganların 22 portundan sunucuya erişimini engelleyeceğiz. Elbette dışarıya açık olan bir sunucuya nmap taraması yapan bir saldırgan, sunucunun SSH erişimi için kullandığı portu bulacaktır. Ancak amaç saldırgana kolay yem olmamaktır. Bunun için /etc/ssh/sshd_config dosyamızın altına gidiyoruz. Satır başındaki # işaretini kaldırıp port numaramızı değiştiriyoruz. Burada kullanacağımız portun sunucu içerisinde başka bir uygulama tarafından kullanılmadığına dikkat etmek gerekiyor.
Include /etc/ssh/sshd_config.d/*.conf
Port 5722
#AddressFamily any
Yine systemctl restart sshd ile SSH servisini yeniden başlatıyoruz. Artık yeni belirlediğimiz portu kullanarak sunucumuza erişim sağlayabiliriz. Elbette bu değişiklikten sonra firewall kullanıyorsanız orada da gerekli kural değişikliklerini yapmanız gerekiyor.
3. Belirli bir adres için SSH isteklerine izin vermek
Sunucunuz birden fazla IP’ye sahip olabilir. Sunucu varsayılan olarak bütün adreslerden SSH erişimini dinler.
sudo netstat -an | grep 5722
tcp 0 0 0.0.0.0:5722 0.0.0.0:* LISTEN
Sunucunuza ait belirli bir IP adresi üzerinden bu erişimi sağlamak istiyorsanız ListenAddress satırını düzenleyebilirsiniz.
Include /etc/ssh/sshd_config.d/*.conf
Port 5722
#AddressFamily any
ListenAddress 192.168.1.41
#ListenAddress ::
Bu şekilde sunucu sadece 192.168.1.41 ‘e gelen SSH isteklerine cevap verecektir.
sudo netstat -an | grep 5722
tcp 0 0 192.168.1.41:5722 0.0.0.0:* LISTEN
4. Belirli adreslerden SSH erişimine izin vermek
Sadece belirlediğiniz adreslerden SSH erişim sağlamak istiyorsanız, burada sunucu güvenlik duvarı çok işe yarayacaktır. Ubuntu üzerinden örnek vereceğiz ancak diğer işletim sistemlerinde de benzer mantık geçerlidir. Ubuntu’da güvenlik duvarı olarak ufw kullanılıyor. Siz isterseniz iptables veya bildiğiniz beğendiğiniz birini kurabilirsiniz. Ufw yi ilk önce active hale getiriyoruz.
sudo ufw enable
Sonrasında sadece belirtiğim IP’den erişim sağlayacağım kuralı giriyorum. Dilerseniz burada bir subnet de girebilirsiniz.
sudo ufw allow from 192.168.1.209 to any port 5722
Diğer IP’lerden erişimi engellemek için bir kural daha ekliyorum.
ufw deny from any to any port 5722
Sonuçta güvenlik duvarındaki kurallar aşağıdaki gibi görünüyor. Bu şekilde sadece 192.168.1.209 adresinden SSH erişimine izin vermiş olduk.
5. Host bazlı erişim engelleme
Belirli nedenlerle sunucu içerisindeki güvenlik duvarını kullanmıyorsunuz. O zaman host bazlı erişim engelleme ile belirlediğimiz IP’ler üzerinden erişim sağlayabiliriz. /etc/hosts.allow dosyasına giriş yapıyoruz. sshd : izin_vereceğimiz_ip satırını ekliyoruz. Ardından /etc/hosts.deny dosyasına sshd : * satırını ekliyoruz. Bu şekilde sshd servisine belirlediğimiz IP’nin erişimini sağlarken diğer IP’lerden erişimi engellemiş oluyoruz.
6. Boş parolalar ile erişimi engelleme
Farkına varmadan parolasını boş geçerek oluşturduğunuz kullanıcılar olabilir. Bu tip kullanıcıların erişimini engellemek için sshd_config dosyamızdaki PermitEmptyPasswords satır değerini no yapabiliriz.
PermitEmptyPasswords no
7. Erişim denemesini sınırlama
Varsayılan olarak istediğiniz kadar parola denemesi yaparak sunucuya erişim sağlayabilirsiniz. Ancak saldırganlar bu zafiyeti kullanarak sunucuya brute-force saldırıları düzenleyebiliyorlar. Parola deneme sayısı belirleyerek belirli bir denemeden sonra SSH bağlantısını otomatik olarak sonlandırabilirsiniz. sshd_config dosyasındaki MaxAuthTries değerini belirlediğiniz sayıda değiştirebilirsiniz. Genel itibariyle 3 sayısı iyidir. 3 denemeden sonra sunucuya bağlanamayan birisinin zaten o sunucuda işi yoktur 🙂
MaxAuthTries 3
8. SSH 2 versiyonunu kullanmak
SSH’ın 1 nci versiyonunda bir çok zafiyet olması nedeniyle 2 nci versiyonu çıkarıldı. Varsayılan olarak sunucunun 2 nci versiyonu kullanmasını sshd_config dosyamıza ekleyeceğimiz Protocol parametresi ile sağlıyoruz. Bu şekilde versiyon 1 ile gelecek istekleri engellemiş oluyoruz.
Include /etc/ssh/sshd_config.d/*.conf
Protocol 2
9. TCP Port Forwarding ve X11 Forwarding özelliklerini kapatmak
Saldırganlar SSH bağlantıların içerisinden port forwarding yaparak diğer sistemlerinize erişim sağlamaya çalışabilirler. Bunu engellemek için sshd_config dosyasının içerisinde bulunan AllowTcpForwarding ve X11Forwarding özelliklerini kapatabilirsiniz.
X11Forwarding no
AllowTcpForwarding no
10. Sunucunuza olan erişim ile alakalı daha fazla bilgi alın.
Varsayılan olarak sunucu bütün SSH erişimlerini loglar. Ancak başarısız erişim denemeleri hakkında daha fazla bilgiye sahip olmak için LogLevel değerini VERBOSE olarak değiştirebilirsiniz.
LogLevel VERBOSE
11. Banner ile uyarı göstermek
sshd_config dosyası içerisinde bulunan Banner parametresine sunucuya login olacaklara uyarı maksadıyla oluşturduğunuz bir metnin gösterilmesini sağlayabilirsiniz.
Banner /etc/uyari
12. SSH Key ile bağlanmak
Sunucunuza bağlanmanın en güvenli yolu bir SSH Key kullanmaktır. SSH Key kullandığınızda suncuya parolasız erişim sağlayabilirsiniz. Ayrıca sshd_config dosyası içerisindeki parola ile ilgili parametreleri değiştirerek sunucuya parola ile erişimi tamamen kapatabilirsiniz.
Bir SSH Key oluşturduğunuzda Public ve Private olarak iki key oluşur. Public Key bağlanmak istediğiniz sunucuya yüklenir. Private Key ise bağlanacağınız bilgisayarda saklanır.
Sunucumuza bağlanacağımız bilgisayar üzerinden ssh-keygen komutu ile bir SSH key oluşturuyoruz. Passphrase (Parola) kısmını boş bırakmamanızı tavsiye ediyorum. Buraya girdiğiniz parolayı unutmayın. Boş bırakırsanız sadece SSH Key dosyası ile erişim sağlarsanız ancak bir parola belirleyerek key dosyasını eline geçiren birinin sadece dosyayı kullanarak erişimini engellemiş olursunuz. Test amaçlı bir Centos sunucuda SSH key’i oluşturuyorum.
ssh-copy-id ozguraydin@192.168.1.41 -p 5722 (portu değiştirmiştik çünkü) komutu ile Public Key’i erişim sağlamak istediğimiz sunucuya kopyalıyoruz.
Ardından Centos sunucumuzdan SSH bağlantısı deniyoruz. Key için girdiğimiz parolamızı yazarak sunucumuza erişim sağlıyoruz.
Son olarak sshd_config dosyamız içerisinden PasswordAuthentication değeri no yaparak parolalı erişimi engelliyoruz. systemctl restart sshd komutu ile sshd servisini yeniden başlatıyoruz.
Parola ile erişim sağlamaya çalıştığımızda Public key ile erişim sağlamamız gerektiğini bildiren bir uyarı alıyoruz.
Windows bir cihazdan powershell ile ssh yapmak istersek yine bir ssh key oluşturuyoruz.
Ardında scp ile public key’i sunucumuza kopyalıyoruz.
scp -P 5722 C:\Users\Fury/.ssh/id_rsa.pub ozguraydin@192.168.1.41:/home/ozgur/.ssh/authorized_keys
ssh –p 5722 ozguraydin@192.168.1.41 komutunu kullanarak sunucumuza Windows Client üzerinden bağlanıyoruz.
sshd_config içerisinde yapacağınız her değişikliğin geçerli olması için sshd servisini yeniden başlatmayı unutmayın 🙂
Faydalı olması dileğiyle,