Popular Categories

/home/ras0ir

there are no girls on the internet

tık tık… kim o?

Herhangi bir sunucu üzerinde ssh sunucu kurup öntanımlı portta (22) bıraktığınızda log dosyalarında bir çok başarısız giriş denemesi olduğunu görmüşsünüzdür. SSH sunucu üzerinde herhangi ek bir yapılandırma yapmamışsanız (mesela parolalı girişi kapatmak vb.) ve basit de bir parola atamışsanız, bir sabah sunucunuza giriş yaptığınızda çalışan anlamsız onlarca, yüzlerce süreç (çoğu rootkit) ile karşılaşmanız mümkün.

SSH güvenliğini sağlamak için çeşitli yöntemler yer alıyor, bunların başında parolalı girişi kapatmak, bir honeypot kurmak ya da port knocking yapmak geliyor. Ben bu yazımda port knocking ile SSH nasıl sebil olmaz onu göstermeye çalışacağım.

Port knocking işlemi, belirli port ve protokollerden sunucuya talep gönderilmesi suretiyle bir portun kullanıma açılması işlemi, en kaba tabiriyle. Dolayısıyla ortada çalışan bir firewall (iptables diyelim) olması durumunda (ki olmaması abes) belirli portlardan sunucunuza talep göndererek, SSH’ın öntanımlı portunu değiştirmeden sunucunuza uzaktan erişebilirsiniz.

Diyelim ki, sadece belli IP’lerin 22. porta doğrudan erişimi var. Bu IP’ler haricindekilerin paketleri ise doğrudan DROP veya REJECT yiyor. Bunun haricindekilerin 22. porttan giriş yapabilmesi için knocking işlemi yapmamız gerekiyor.

Knocking yapmak için “pratik” iki çözüm bulunuyor. Knockd ve xtables_addons içerisindeki xt_pknock modülü.

xtables_addons ekstra bir çekirdek modülü yüklemenizi, derlemenizi gerektirdiği için ona değinmeyeceğim. Ancak merak eden varsa, man sayfasından inceleyebilir.

Knockd ise bana göre daha kullanışlı bir uygulama. Çoğu dağıtımın paket depolarında zaten bulunuyor, elle kurmak isteyenler için de web sayfasında nasıl kurulacağını anlatan yönergeler mevcut. (RHEL ve RHEL tabanlı dağıtımlar için source rpm’ini alıp rebuild etmeniz yeterli.)

Kurulum yaptığınızı varsayıyorum, yapılandırmaya gelince, /etc/knockd.conf dosyası yapılandırma için kullanılıyor. Örnek bir knockd.conf üzerinden gidecek olursak:


[options]
UseSyslog

[opencloseSSH]
sequence = 6021,4903,23273
seq_timeout = 10
tcpflags = syn
start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
cmd_timeout = 10
stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

[options] kısmı genellikle log işlemleri için kullanılıyor. UseSyslog diyerek knockd log mesajlarınızı mevcut çalışan syslog’a gönderebileceğiniz gibi, bir log dosyası belirterek o dosyaya da yazılmasını sağlayabilirsiniz. (Logfile = /log/dosyasinin/yolu)

[opencloseSSH] kısmı ise alias tanımı aslında. Bir knockd.conf içerisinde istediğiniz kadar komut tanımlayabilirsiniz. Yukarıdaki örnekte sadece SSH için tanımlı bir kural var, opencloseSSH bu komutların tamamına karşılık geliyor. Dolayısıyla buna ne isim verdiğinizin pek önemi yok.

sequence ise knockd’nin hangi portlardan gelen işlemleri değerlendireceğini ifade ediyor. Burada sadece port numarası yazdığınızda tcp için geçerli oluyor. udp de tanımlamak isterseniz 6021:udp formatında yazmanız gerekiyor.

seq_timeout kısmı saniye cinsinden yazılan bir değer. Burada portlara kaç saniye içerisinde talep gönderilirse bunun bir knock işlemi olarak algılanacağını belirtiyorsunuz. Bağlantı problemleri vs. durumlar yaşayabileceğinizi düşünerek bu değeri çok düşük tutmamaya özen göstermenizi tavsiye ederim.

tcpflags parametresi ise knockd’nin hangi tcp bayraklarını dikkate alacağını ifade ediyor. Kullanabileceğiniz değerler: fin, syn, rst, psh, ack ve urg.

start_command ise tahmin edebileceğiniz gibi knock işlemi başarılı olursa sunucu tarafında çalıştırılacak komut. Örnek yapılandırmada INPUT zincirine 22. porttan knock talebinde bulunan IP için bir kural ekleniyor.

cmd_timeout değeri sadece stop_command tanımlanmışsa dikkate alınıyor. Yaptığı işlem start_command ile stop_command arasında geçecek zamanı belirtmek. cmd_timeout değeri de aynı seq_timeout gibi saniye cinsinden.

stop_command değeri cmd_timeout’ta belirlenen süre geçtikten sonra yapılacak işlemi ifade ediyor. Örnek yapılandırmada, INPUT zincirine daha önce girilmiş kuralı silindiğini görebilirsiniz.

Knockd yapılandırması temel olarak bunlardan ibaret. Sadece SSH için değil, aklınıza gelebilecek her komut için kullanabilirsiniz. SSH portunu dışarıya kapatıp, dilediğiniz zaman kendinize istisna tanımlamak için oldukça faydalı bir uygulama bence.

Kurulumu yaptık, knockd servisini çalıştırdık, nasıl bağlantı kuracağız? Bunun için çeşitli yöntemler ve araçlar mevcut. En başta gelen de knockd ile birlikte kurulan (dağıtıma göre ayrı paketlenmiş olabilir) knock aracı. Örnekteki portları kullanan bir sunucuya bağlantı kurmak için knock komutunu şu şekilde verebilirsiniz:

knock hostname 6021 4903 23273 && ssh hostname

Eğer farklı protokollere knock yapacaksanız, onları belirtmeniz gerekiyor:
knock hostname 6021:tcp 4903:udp 23273:udp && ssh hostname

Sadece tcp tanımlamışsanız, knock aracına hiç ihtiyaç duymadan da (telnet veya netcat ile mesela) knock işlemi yapabilirsiniz. Örneğin telnet kullarak port knock yapmak için:
telnet hostname 6021 ; telnet hostname 4903 ; telnet hostname 23273 ; ssh hostname

Bunun haricinde de kapıyı tıklamak için başka araçlar da var: sendip, packit ve hping.

  • acemi

    knockd’yi biliyordum ama kullanmamistim. Tam da bugunlerde knockd ile cok rahat cozulebilecek bir is icin cozum arayisindaydim. Yaziyi gorunce knokcd kullanmanin cok iyi olacagini farkettim. Bu nedenle yazi benim cok isime yaradi. Tesekkurler.

  • http://returnfalse.net Gökhan

    Senin yazı başlığını yerim ben.