Bu yazıda, kapalı ağ kapılarına önceden belirlenmiş bir şekilde bağlanmaya çalışarak ateş duvarında istenen ağ kapılarını açmaya yönelik bir yöntem olan port knocking (kapı çalmak) yöntemi açıklanacak ve örnek bir Linux kurulumu gösterilecektir.
Kapı çalmak metaforu, günlük hayatta kullanılan, kapının çalınma şekline göre kimin çaldığını ayırdetmek ve farklı tepki göstermek (yanıt vermemek ya da kapıyı açmak) şeklinde gelişen iletişim biçimine gönderme yapmaktadır. Buna benzer bir şekilde, kapıyı çalan ve kapıyı dinleyen iki uygulamadan yararlanarak kurulan bir sistemde, ağ kapıları sadece bilinen istemcilerin erişimine açılabilir ve böylece özellikle sadece yönetim amacıyla uzaktan erişime açık bırakılması gereken servislerin (ssh, ftp, tftp, v.b.) denetlenmesi sağlanarak kapı taraması (port scanning) saldırılarından kısmen korunulabilir.
Yöntem
Kapının çalınma yöntemi basit bir şekilde sırayla birkaç kapıya bağlanılmasından, zamana bağlı, gelen IP adresine bağlı veya şifrelenmiş veri gönderilmesine kadar değişebilir. Bu yazıda, en basit kapı çalma şekli olan, sırayla birden fazla kapıya bağlanılması yöntemi örnek olarak verilecektir. Diğer yöntemler hakkında detaylı bilgi, artı ve eksileri, yazının sonunda verilen göndermelerden edinilebilir. Örnek bir senaryoda, istemcinin belli bir sırayla kapalı kapılara bağlanması sonucunda (sırayla 1111/tcp, 3333/udp, 5555/tcp) sunucunun ateş duvarı kurallarını değiştirerek ssh/tcp kapısını açması düşünülebilir. Sunucu gelen bağlantıları dinlemek için bağlantı katmanında işlem yaptığı için 1111, 3333 ve 5555 kapılarının açık olmasına gerek yoktur. Bağlanılabilecek olası 65535 kapı ve bunların her birinin tcp ve udp olasılıkları olduğundan, saldırganın doğru sırayı bilmesi olasılığı kabaca 1/(65535*2)3‘tür. Bu da en kötü durumda 2,251,696,736,043,000 farklı kombinasyon denemesi gerektiği anlamına gelir. Doğru kapı çalınma bağlantısını dinleyen sunucu, genellikle aradaki iletişimin halini kaydeder (stateful), böylece kapı tarama programlarının tesadüf eseri doğru sırayı tutturmaları engellenmiş olur. Sunucu hizmetinin bağlantı kapısının tamamen kapalı olması, kapı tarama saldırılarını engellediği kadar, dolaylı olarak kaba kuvvet (brute force) saldırılarını da engeller. Örneği verilen basit bir sıraya dayanan kapı çalma yönteminin, üstte belirtilen yararlarının yanı sıra, bazı zayıf yönleri de vardır. En başta saldırganın sırayı tahmin etmesini engellemek için sunucunun istemciyi belirlemek için DNS sorgulama yapması engellenmelidir. Aksi takdirde, özel ayarlanmış bir DNS sunucusu yardımıyla saldırganın bağlanılacak kapıları ve sıralarını tahmin etmesi olasıdır. Bu olmasa bile, kapalı görünen bir kapıya bağlanma durumunda sunucunun bağlananı belirlemek için DNS sorgusu yapması sonucunda yine kapının aslında açık fakat filtrelenmiş olduğu bilgisi sızabilir. Ayrıca gerek istemci tarafındaki, gerek sunucu tarafındaki, gerekse aradaki ateş duvarlarının çoğu kapıya erişimi sınırlandırması, kapı çalma etkinliğinin her ağda uygulanabilirliğini azaltmaktadır.
knockd – Bir Kapı Çalma Uygulaması
Kurulum kolaylığı ve kullanım eksikliği açısından uygun olarak tanımlanabilecek bir kapı çalma sunucusu/istemcisi olarak knockd örnek verilebilir. Yazılımın web sayfasına http://www.zeroflux.org/cgi-bin/cvstrac.cgi/knock/wiki - http://www.zeroflux.org/cgi-bin/cvstrac.cgi/knock/wiki adresinden erişmek mümkündür. Sayfalarda kullanım açıklamalarının yanısıra, bir kaç Unix için hazır paketlerine ve Windows/OSX için istemci programları için bağlantılar bulunmaktadır. Eğer sunucu tarafında Debian ya da Redhat ailesinden bir Linux dağıtımı kuruluysa, hazır paketler bulunmaktadır. Debian serisi dağıtımlarda
$ sudo aptitude install knockd
komutu yeterlidir. Redhat serisi dağıtımlar içinse programın sayfasından .rpm (kaynak rpm dosyasıdır) dosyası indirilmeli ve
$ su - # rpm -i knock-*.src.rpm # cd /usr/src/redhat/SPECS/ # rpmbuild -bb knock.spec # rpm -i /usr/src/redhat/RPMS/i386/knock-server-*.rpm
komutlarıyla kurulum yapılmalıdır.
İstemci için Debian serisi dağıtımlarda yapılacak olan, sunucu ve istemci programlarının aynı pakette bulunmasından dolayı, sunucuyla aynıdır. Redhat serisinde yapılması gereken ise sunucu tarafında yapılması gerekenden son satırda ayrılmaktadır. Yani kaynak rpm dosyasından ikili rpm’ler yaratıldıktan sonra
# rpm -i /usr/src/redhat/RPMS/i386/knock-server-[0-9]*.rpm
komutu verilmelidir. Windows ve OSX istemcileri de programın web sayfasından edinilebilir. İstemci tarafında programın derlenememesi, edinilememesi gibi sorunlar olduğunda, hping, netcat gibi genel amaçlı programlar da kullanılabilir. Bunlara örnekler aşağıda verilecektir.
Kurulumdan sonra yapılandırma gerektiren dosyalar /etc/knockd.conf dosyası ile dağıtıma özel seçenek dosyasıdır. Dağıtıma özel dosya Redhat serisinde /etc/sysconfig/knockd , Debian serisinde ise /etc/default/knockd dosyalarıdır. Dosyaların varsayılan içerikleri aşağıda verilmiştir, dosyaların özelleştirilmesi yazının devamında anlatılacaktır:
/etc/knockd.conf:
[options] logfile = /var/log/knockd.log
[openSSH] sequence = 7000,8000,9000 seq_timeout = 5 command = /sbin/iptables -A INPUT -s %IP% -p tcp –dport 22 -j ACCEPT tcpflags = syn
[closeSSH] sequence = 9000,8000,7000 seq_timeout = 5 command = /sbin/iptables -D INPUT -s %IP% -p tcp –dport 22 -j ACCEPT tcpflags = syn
/etc/default/knockd:
################################################ # # knockd’s default file, for generic sys config # ################################################
# control if we start knockd at init or not # 1 = start # anything else = don’t start START_KNOCKD=0
# command line options #KNOCKD_OPTS=”-i eth0″
/etc/sysconfig/knockd:
#OPTIONS=”"
Uygulama
Uygulamanın kolaylığı ve açıklığından dolayı, örnek senaryoda sunucuda, varsayılan şekliyle bağlantıları kabul eden fakat belli kapıları sınırlayan bir ateş duvarı, ssh sunucusu ve knock sunucusu kurulu olduğu, istemcide ise knock ve ssh istemcilerinin kurulu olduğu varsayılacaktır.
Sunucunun Ayarlanması
knockd sunucusunun dinleyeceği ağ arabiriminin belirtilmesi için aşağıdaki dosyalar düzenlenmelidir:
/etc/default/knockd (debian):
KNOCKD_OPTS=”-i eth0″
/etc/sysconfig/knockd (redhat):
OPTIONS=”-i eth0″
Sunucunun her sistem açılışında çalışması için, Redhat serisi dağıtımlarda # chkconfig –level 345 knockd on komutu verilmeli, debian serisi dağıtımlar içinse /etc/default/knockd dosyasına aşağıdaki satır eklenmeli, ya da varolan satır değiştirilmelidir: START_KNOCKD=1 Bunun dışında, ateş duvarının en baştan ssh/tcp kapısına bağlantıyı kabul etmediğini varsayıyoruz:
# /sbin/iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination REJECT tcp – 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT) target prot opt source destination
Chain OUTPUT (policy ACCEPT) target prot opt source destination
Eğer durum böyle değilse, engelleme kipini aşağıdaki komutu vererek ayarlayabiliriz:
# iptables -A INPUT -p tcp -m tcp –dport 22 -j REJECT –reject-with icmp-port-unreachable
Sunucunun ne tür bağlantılara yanıt vereceği, /etc/knockd.conf dosyasında belirtilmektedir. Buradaki tüm kullanımlar sunucunun web sayfasında listelenmektedir. Örneğin özelinde kullanılacak dosyanın içeriği aşağıdaki gibidir:
/etc/knockd.conf:
[options] UseSyslog
[openSSH] sequence = 1111:tcp,3333:udp,5555:tcp seq_timeout = 10 tcpflags = syn command = /sbin/iptables -I INPUT -s %IP% -p tcp –dport 22 -j ACCEPT
[closeSSH] sequence = 5555:tcp,3333:udp,1111:tcp seq_timeout = 10 tcpflags = syn command = /sbin/iptables -D INPUT -s %IP% -p tcp –dport 22 -j ACCEPT
Bu ayarları kullanarak, istemcinin 1111/tcp, 3333/udp, 5555/tcp kapılarını en fazla 10 saniye aralıkla çalması sonucunda erişimine izin vermesi, 5555/tcp, 3333/udp, 1111/tcp kapılarını aynı şekilde çalması sonucundaysa erişimin kapatılması sağlanmakta, ayrıca kayıtların da syslog sunucusuna gönderilmesi istenmektedir. Bu ayarlar da yapıldıktan sonra /etc/init.d/knockd start komutuyla sunucu çalıştırılabilir.
İstemcinin kullanılması
Deneme amacıyla ssh kullanarak sunucuya bağlanılması gerektiğinde $ ssh deneme.host ssh: connect to host deneme.host port 22: Connection refused hatası alınacaktır. Bu durumda kapı çalma sırasını uygulamak gerekir: $ knock -v deneme.host 1111:tcp 3333:udp 5555:tcp hitting tcp 10.0.1.1:1111 hitting udp 10.0.1.1:3333 hitting tcp 10.0.1.1:5555 yeniden ssh kullanarak bağlantı denendiğinde, bu sefer bağlantı başarılı olacaktır. İhtiyaç kalmadıktan sonra kapıyı geri kapamak içinse $ knock -v deneme.host 5555:tcp 3333:udp 1111:tcp hitting tcp 10.0.1.1:5555 hitting udp 10.0.1.1:3333 hitting tcp 10.0.1.1:1111 komutu kullanılabilir. knock istemcisinin erişilebilir olmadığı durumlarda netcat ya da hping kullanılabilir. Örneğin hping3 kullanarak kapıyı açmak şu komutlarla mümkündür: $ hping3 deneme.host -p 1111 -c 1 $ hping3 deneme.host -2 -p 3333 -c 1 $ hping3 deneme.host -p 5555 -c 1 Bu komutlar bir betik dosyasına yazılarak, knock istemcisiyle aynı etkide kullanılabilir.
knockd Sunucusunun Potansiyel Farklı Kullanımları
Dikkat edilirse, yapılandırma dosyasında command seçeneği ile verilen, kapı çalınması sonucunda çalıştırılacak komut, sadece kapı açıp kapayan bir komut değil, herhangi bir komut olabilir. Bu şekilde bir kapıyı, kapıları tamamen kapatmak, sunucu servislerini başlatıp durdurmak, hatta sistemi yeniden başlatmak mümkündür. Ayrıca bu yazılıma benzer yazılımlar, çoğu zaman kötü niyetli kullanıcılar tarafından ele geçirilen bilgisayarlarda isteğe göre arka kapı açmak için de kullanılmaktadırlar.
Sonuç
Kapı çalma yöntemi, açık olmaması gereken kapıları kapalı bırakarak güvenlik politikalarında ilgilenilmesi gereken istisnaları azaltmaya yardımcı olabilecek bir yöntemdir. Bu yöntem sayesinde bir kaç popüler saldırı yöntemine karşı da önlem alınmış olmaktadır. Bu yazıda basit bir örnekle incelenmiş olmakla birlikte, uygulamacının hayal gücüne bağlı olarak çok çeşitli kapı çalma yöntemleri uygulanarak aradaki iletişimin güvenliği artırılabilir. Göz önünde bulunan ve sürekli kötü niyetli kaynaklardan kaba kuvvet saldırılarına maruz kalan sunucular için, rahatlatıcı bir önlem olarak düşünülebilir.
Saygılar..
|