
Belkide tüm sistem yöneticileri için en önemli konulardan olan güvenlik meselesine değineceğiz bu konumuzda. Güvenlik açıklıkları eminim ki bir çok sistemin ve sistemcinin başının belası olmakla kalmayıp uykularımızı dahi kaçırabilmektedir. Her sistem yöneticisi sistemini kurduktan sonra evine gidip rahatça uyuyabilmek ve kurduğu sistemi artık unutmak ister. Ama bunu başarabilmek için yeterince gayret gösterir mi?. İşte tam size göre bir belge. Artık rahatça uyuyabilirsiniz
Çünkü OpenSSH sizin için herşeyi düşünmüş ama kendini hemen ele vermemiş gizli tutmuş. Sloganından da belli değilmi zaten Don’t Tell Anyone That I’m Free
Openssh bir SSH protokolü uygulamasıdır. Genellikle uzaktaki sunuculara güvenli olarak bağlanma, yedek alma, scp vey sftp ile uzaktan dosya transferi ve daha birçok uygulamada kullanılır. SSH güvenlik protokolu iki network arasındaki iletişimlerde en güvenli yoldur. En önemli avantajları server authentication tabanlı olması ve public key şifrelemesi mantığı ile çalışabilmesidir. Aynı zamanda bu güvenlik yazılımının açık kaynaklı olmasından dolayı programda bulunan herhangi bir bug aynı gün içerisinde duyurulmakta ve onarılmaktadır.
Default konf dosyaları ve SSH portu
- /etc/ssh/sshd_config – openssh server konfigürasyon dosyası
- /etc/ssh/ssh_config – openssh client konfigürasyon dosyası
- ~/.ssh/ – kullanıcıların ssh konf klasörü
- ~/.ssh/authorized_keys – kullanıcılarının hesaplarına login olabilmelerini sağlayacak public keylerin listelendiği dosya ( RSA veya DSA )
- /etc/nologin – eğer bu dosya varsa sshd servisi root dışındaki giriş isteklerini reddeder.
- /etc/hosts.allow ve /etc/hosts.deny – tcp wrappers tarafından kullanılan giriş kontrol dosyalarıdır. ( tcp wrappers ile alakalı bilgi için http://www.bayramkaragoz.org/?s=tcp+wrappers )
- SSH default port – TCP 22 portudur.

Aktif durumdaki bir ssh bağlantısı yukarıda görülmektedir.
Şimdi teker teker iyileştirmelerimizi sıralayalım;
1- Kullanmayacaksanız OPENSSH serverını kapatın veya kaldırın
Eğer kullandığınız sistemde SSH ile dosya transferi, güvenli login işlemleri gibi servisleri hiç kullanmayacak iseniz SSHD serverının açık olmasının hiçbir mantığı olmayacaktır. Dolayısıyla bu durumda işe yaramıyorsa at gitsin felsefesinden yola çıkarak kapatın veya kaldırın gitsin.
CentOS / RHEL / Fedora Linuxlarda kaldırmak için;
# chkconfig sshd off
# yum erase openssh-server
Debian / Ubuntu Linuxlarda ise;
# apt-get remove openssh-server
kaldırma işlemlerinizi yaptıktan sonra firewall kullanıyorsanız değişiklerin aktif olması için;
# service iptables restart
# service ip6tables restart
2- Sadece SSH Protokol 2 yi kullanın
SSH protokolu 1 versiyonunda SSH-1 man-in-the-middle atakları problemi ve birçok güvenlik açığının olduğu bilindiği için sshd_config dosyasında allttaki ifadenin aktif olduğunu kontrol edin.
Protocol 2
3- Kullanıcıların Girişlerini Limitleyin
Default olarak tüm sistemlerde bütün kullanıcılar için giriş açıktır. Bazı durumlarda sadece bazı kullanıcıları örneğin ftp servisini veya e-mail servislerini kullanmasını isteyebilrisiniz. Fakat bu durumda ftp kullanımı için açmış olduğunuz kullanıcı bilgileri ile sisteme SSH girişi de yapılabilir. Girişle birlikte kullanıcılar birçok toolu kullanabilme, bazı scripting dilleri ile (PERL, PYTHON) açık portları kullarak fantazisi bol işler yapabilirler.
Mesela geçenlerde bir kullanıcım sistemime ssh ile bağlanarak hazırlamış olduğu PHP scripti ile başka kullanıcılar oluşturmaya çalışmış fakat loglara takılınca hemen ağıma düşmüş oldu. Allahtan aşağıdaki konfigürasyonu yapmıştım
Sadece root, forza ve bayram kullanıcılarının ssh ile sisteme login olmalarını sağlamak için sshd_config dosyasına aşağıdaki satırı ekleyelim;
AllowUsers root forza bayram
Alternatif olarak bazı kullanıcıları da yasaklayabilirsiniz;
DenyUsers saroj anjali foo
4- SSH Kullanıcısı IDLE Log Out Olma Zamanını Ayarlayın
SSH kullanıcıları sisteme giriş yapıp uzun süre herhangi bir işlemde bulunmadıkları zaman sistem belirli bir süre sonunda bu kullanıcıları dışarı atmalıdır. Aksi takdirde uzun süre login kalan kullanıcılar pc nin başından ayrıldıklarında kötü niyetli başka kullanıcılar sisteme zarar verebilirler veya istenmeyen işlemler yapabilirler. Bu yüzden boşta bekleyen ssh bağlantılarının belirli bir süre sonunda sonlandırılması için bir süre girelim. sshd_config dosyasına aşağıdaki ifadeyi eklemiş olursak bu süreyi 300 sn (5 dk) olarak ayarlamış oluruz.
ClientAliveInterval 300 ClientAliveCountMax 0
5- .rhosts Dosyasının Okunmasını Engelleyin
Kullanıcıların ~/.rhosts veya ~/.shosts dosyalarını ssh servisinin okumasını engelleyin. Çünkü SSH artık fazla kullanılmayan RSH komutlarını çalıştırabilme yeteneğine sahiptir. Bu yüzden RSH ile güvensiz girişleri engelleyelim.
IgnoreRhosts yes
6- Host Tabanlı Authentication ı Kapatalım
sshd_config de aşağıdaki tanımlamayı yaparak host-based authentication ı kapatalım.
HostbasedAuthentication no
7- ***Direk Olarak ROOT ile Login Olmayı Kapatalım!!!
Belkide yapılacak en önemli işlem sistemlere direk olarak yapılan root loginlerin engellenmesidir. FreeBSD de default olarak bu erişim kapalı olmasına rağmen çoğu linux dağıtımlarında erişim default olarak açıktır. Özellikle brute force ataklarında tahmin edilmesi kolay bir root şifresi sisteme atanıp erişim default olarak açıldığında makinenizi tamamen kötü niyetli kişilere teslim etmiş olursunuz. Ayrıca genelde kullanıcılar kendi kullanıcı bilgileri ile sisteme login olup illede root haklarına sahip bir komut çalışmaları gerektiğinde sudo ile işlemlerini yapabilmektedirler. Bu sayede hem yanlışlıkla geridönüşü olmayan önemli ve zararlı olabilecek bir komut çalışmaktan kaçınıyorlar yani kişilerin sorumlulukları azalıyor hem de hangi kullanıcının root komutu çalıştırdığını rahatça takip edebiliyorsunuz.
sshd_config dosyasına aşağıdaki ifadeyi ekleyelim;
PermitRootLogin no
8- Uyarı Banner ını Aktif edin
uyarı banner ını ayarlayın. Böylece kulanıcılar login olmak istediklerinde kullanıcı adını yazdıktan sonra kullanıcılara uyarı yazısı gösterebilirsiniz.
Banner /etc/issue
örnek issue dosyasının içeriği;
---------------------------------------------------------------------------------------------- You are accessing a XYZ Government (XYZG) Information System (IS) that is provided for authorized use only. By using this IS (which includes any device attached to this IS), you consent to the following conditions: + The XYZG routinely intercepts and monitors communications on this IS for purposes including, but not limited to, penetration testing, COMSEC monitoring, network operations and defense, personnel misconduct (PM), law enforcement (LE), and counterintelligence (CI) investigations. + At any time, the XYZG may inspect and seize data stored on this IS. + Communications using, or data stored on, this IS are not private, are subject to routine monitoring, interception, and search, and may be disclosed or used for any XYZG authorized purpose. + This IS includes security measures (e.g., authentication and access controls) to protect XYZG interests--not for your personal benefit or privacy. + Notwithstanding the above, using this IS does not constitute consent to PM, LE or CI investigative searching or monitoring of the content of privileged communications, or work product, related to personal representation or services by attorneys, psychotherapists, or clergy, and their assistants. Such communications and work product are private and confidential. See User Agreement for details. ----------------------------------------------------------------------------------------------
9- SSH 22. Portu Firewall da Tanımlayalım
Genellikle 22. portun erişiminin iptables veya pf firewall da tanımlanması gerekir. Sadece kendi ipnizden erişim için yetki verebilirsiniz.
Netfilter (Iptables) Ayarı
örneğin /etc/sysconfig/iptables dosyasına sadece 192.168.1.0/24 ve 202.54.1.5/29 iplerinden SSH erişimi ile ilgili yetkiyi verelim;
-A RH-Firewall-1-INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT -A RH-Firewall-1-INPUT -s 202.54.1.5/29 -m state --state NEW -p tcp --dport 22 -j ACCEPT
*BSD PF Firewall Ayarı
/etc/pf.conf dosyasına aşağıdaki ifadeyi ekleyelim;
pass in on $ext_if inet proto tcp from {192.168.1.0/24, 202.54.1.5/29} to $ssh_server_ip port ssh flags S/SA synproxy state
10- SSH Portunu Değiştirin ve IP Binding Limitlemesi Yapın
Default olarak ssh servisi tüm aktif ethernet interface ve IP leri dinler. Bu sebeple SSH dinleme iplerini sınırlandıralım ve dinleme portunu değiştirelim. Özellikle brute force yapan programların ssh için 22 potunu kullandıklarını düşünürsek port değiştirme çok uygun bir yöntemdir;
Port 300 ListenAddress 192.168.1.5 ListenAddress 202.54.1.5
Yukarıdaki örnekte sadece 192.168.1.5 ve 202.54.1.5 ile birlikte sadece 300 portu dinleniyor.
11- Güçlü Şifre ve Passphrase Kullanın
Brute force ataklarında sözlük saldırıları artık sıkça yapılan ve basit şifreleri olan sistemleri kısa sürede ele geçirmektedir. Bu yüzden tahmin edilmesi zor şifreler kullanmak artık bir ihtiyaçtır. Bu sebeple aşağıda hazırlanmış olan rastgele şifre oluşturma scriptini ~/bashrc dosyanıza girebilirsiniz.
genpasswd() { local l=$1 [ "$l" == "" ] && l=20 tr -dc A-Za-z0-9_ < /dev/urandom | head -c ${l} | xargs }
aşağıdaki gibi çalıştırın;
genpasswd 16
komut çıktısı aşağıdaki gibidir;
uw8CnDVMwC6vOKgW
12- Public Key Bazlı Authentication Kullanın
Public/Private Key çiftini kullarak tam güvenlik sağlayın. Bunun için http://www.cyberciti.biz/tips/ssh-public-key-based-authentication-how-to.html ve http://www.cyberciti.biz/faq/ssh-password-less-login-with-dsa-publickey-authentication/ linklerindeki dökümanlarını kullanabilirsiniz. Fakat kesinlikle bu şifreleme sistemini passphrase şifresini girmeden denemeyiniz!!!
13-Chroot SSHD ( kullanıcıları kendi home dizinlerine kilitleyin)
Default olarak kullanıcılar istedikleri klasörlere(/etc/ , /var/ ,…) girme haklarına sahiptir. Sistemlerin kendine özgü chroot özellikleri ile ssh kullanıcılarını kendi home dizinlerine kilitleyebilirsiniz. http://www.debian-administration.org/articles/590 linkindeki döküman ile chroot ile kullanıcıları home dizinlerine kilitlemeyi kendi sisteminize uygulayabilirsiniz.
14- TCP Wrappers Kullanın
TCP Wrapper host bazlı bir network ACL sistemidir. Internete yapılacak network girişlerini filtreleme yapabilmektedir. OpenSSH bu uygulamayı desteklemektedir. /etc/hosts.allow dosyasına aşağıdaki bilgileri ekleyerek ssh erişimlerimlerini 192.168.1.2 ve 172.16.23.12 iplerinin dışındaki tüm ipler için engelleyebilirsiniz.
sshd : 192.168.1.2 172.16.23.12
TCP Wrappers uygulaması ile alakalı ayrıntılı bilgi için http://www.bayramkaragoz.org/?s=tcp+wrappers ve http://www.cyberciti.biz/faq/tcp-wrappers-hosts-allow-deny-tutorial/ linklerini inceleyebilirsiniz.
15-Boş Parola Girebilme Özelliğini Kapatın
sshd_config dosyasına aşağıdaki satırı ekleyerek boş parola girişini engelleyin.
PermitEmptyPasswords no
16-SSH Şifre Kırıcılardan Korununuz ( Brute Force Attack)
Brute force yöntemi, belli bir sunucu üzerine kullanıcı adı ve parola olarak oldukça geniş aralıkta ihtimalleri deneyerek sisteme giriş yapabilme yöntemidir. Bu yöntemden korunabilmek amacıyla aşağıdaki programları kullanabilirsiniz.
- DenyHosts is a Python based security tool for SSH servers. It is intended to prevent brute force attacks on SSH servers by monitoring invalid login attempts in the authentication log and blocking the originating IP addresses.
- Explains how to setup DenyHosts under RHEL / Fedora and CentOS Linux.
- Fail2ban is a similar program that prevents brute force attacks against SSH.
- security/sshguard-pf protect hosts from brute force attacks against ssh and other services using pf.
- security/sshguard-ipfw protect hosts from brute force attacks against ssh and other services using ipfw.
- security/sshguard-ipfilter protect hosts from brute force attacks against ssh and other services using ipfilter.
- security/sshblock block abusive SSH login attempts.
- security/sshit checks for SSH/FTP bruteforce and blocks given IPs.
- BlockHosts Automatic blocking of abusive IP hosts.
- Blacklist Get rid of those bruteforce attempts.
- Brute Force Detection A modular shell script for parsing application logs and checking for authentication failures. It does this using a rules system where application specific options are stored including regular expressions for each unique auth format.
- IPQ BDB filter May be considered as a fail2ban lite.
17- Port# 22 ye Gelen Bağlantı Isteklerini Limitlendirin
iptables ve pf firewall uygulamaları ile ssh bağlantı denemelerini kısıtlayabilirsiniz.
Iptables Örneği
aşağıdaki kural 22. porta 60 saniye içinde 5 den fazla yapılan bağlantı isteklerini reddetmek için yazılmıştır.
#!/bin/bash inet_if=eth1 ssh_port=22 $IPT -I INPUT -p tcp --dport ${ssh_port} -i ${inet_if} -m state --state NEW -m recent --set $IPT -I INPUT -p tcp --dport ${ssh_port} -i ${inet_if} -m state --state NEW -m recent --update --seconds 60 --hitcount 5 -j DROP
yukarıdaki scpripti iptables uygulaması tarafından çalıştırınız. Farklı bir konfigürasyon;
$IPT -A INPUT -i ${inet_if} -p tcp --dport ${ssh_port} -m state --state NEW -m limit --limit 3/min --limit-burst 3 -j ACCEPT $IPT -A INPUT -i ${inet_if} -p tcp --dport ${ssh_port} -m state --state ESTABLISHED -j ACCEPT $IPT -A OUTPUT -o ${inet_if} -p tcp --sport ${ssh_port} -m state --state ESTABLISHED -j ACCEPT # another one line example # $IPT -A INPUT -i ${inet_if} -m state --state NEW,ESTABLISHED,RELATED -p tcp --dport 22 -m limit --limit 5/minute --limit-burst 5-j ACCEPT
*BSD PF Örneği
aşağıdaki örnekte kaynak başına max. 20 deneme yapılmak üzere 5 sn içerisinde en fazla 15 deneme yapabilmek üzere yapılan ayarlamadır. bu kuralı abusive_ips tablomuza girelim.
sshd_server_ip="202.54.1.5" table <abusive_ips> persist block in quick from <abusive_ips> pass in on $ext_if proto tcp to $sshd_server_ip port ssh flags S/SA keep state (max-src-conn 20, max-src-conn-rate 15/5, overload <abusive_ips> flush)
18 – Port Knocking Kullanın
Port knocking methodu firewall uygulamalarında kapalı olan portlara belirli bir zaman dilimi içerisinde belli sayıda bağlantı isteği göndererek ilgili portu açma yöntemidir. Yani kabaca tarif edecek olursak evin içinde bulunan ev sahibi kapıya gelen misafiri kapıyı belli sayıda çalmasıyla tanıyor gibi düşünebiliriz. Aşağıdaki örnekte iptables ta uygulanabilecek bir port knocking konfigürasyonu görülmektedir.
$IPT -N stage1 $IPT -A stage1 -m recent --remove --name knock $IPT -A stage1 -p tcp --dport 3456 -m recent --set --name knock2 $IPT -N stage2 $IPT -A stage2 -m recent --remove --name knock2 $IPT -A stage2 -p tcp --dport 2345 -m recent --set --name heaven $IPT -N door $IPT -A door -m recent --rcheck --seconds 5 --name knock2 -j stage2 $IPT -A door -m recent --rcheck --seconds 5 --name knock -j stage1 $IPT -A door -p tcp --dport 1234 -m recent --set --name knock $IPT -A INPUT -m --state ESTABLISHED,RELATED -j ACCEPT $IPT -A INPUT -p tcp --dport 22 -m recent --rcheck --seconds 5 --name heaven -j ACCEPT $IPT -A INPUT -p tcp --syn -j doo
diğer port knocking uygulamaları aşağıdadır;
- fwknop is an implementation that combines port knocking and passive OS fingerprinting.
- Multiple-port knocking Netfilter/IPtables only implementation.
19- Log Analyzer Kullanın
logwatch veya logcheck uygulamaları logları daha kolay bir şekilde takip edebilmenizi ve girdiğiniz kriterler ölçüsünde sizi bilgilendirmeye yaramaktadır. Bu uygulamalarda ssh bilgilerini de görmek isterseniz sshd_config dosyasında LogLevel değerinin INFO veya DEBUG olarak girilmiş olduğuna emin olun.
LogLevel INFO
20 – İşletim Sistemini ve OpenSSH Servisini Sürekli Güncel Tutun
yum, apt-get, freebsd-update gibi araçları kullanarak sürekli sisteminizi güncel ve patchlenmiş tutun. Böylece işletim sisteminin veya OpensSSH ın yayınlanmış farklı açıklıklarını da kapatmış olacaksınız.
Dökümanın ingilizce hazırlanmış versiyonunu buradan indirebilirsiniz.
Kaynaklar;
- http://www.cyberciti.biz/tips/linux-unix-bsd-openssh-server-best-practices.html
- yukarıdaki linkin yararlandığı tüm kaynaklar…
