spacer.png, 0 kB
Bilgi için: bilgi at bilgiguvenligi gov tr   

 

spacer.png, 0 kB
spacer.png, 0 kB
Port Knocking - Girmeden Önce Kapıyı Çalmak Yazdır E-posta
Can Bican, TÜBİTAK BİLGEM   
24.06.2008

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 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.

Kaynakça

http://en.wikipedia.org/wiki/Port_knocking - Wikipedia yazısı

http://www.portknocking.org/ - "Port knocking" üzerine bilgiler ve Perl üzerinde yazılmış bir uygulama

http://www.cipherdyne.org/fwknop/ - iptables tabanlı başka bir uygulama

http://www.zeroflux.org/cgi-bin/cvstrac.cgi/knock/wiki - bu yazıda adı geçen "knockd" uygulaması

http://www.hping.org/ - hping web sayfası

http://www.vulnwatch.org/netcat/ - netcat web sayfası

http://www.netfilter.org/ - iptables / netfilter web sayfası


Favori olarak ekle (2) | Görüntüleme sayısı: 9019

Bu yazıya ilk yorumu yazın

Sadece kayıtlı kullanıcılar yorum yazabilir.
Lütfen sisteme giriş yapın veya kayıt olun.

 
spacer.png, 0 kB
spacer.png, 0 kB
Copyright 2017 TÜBİTAK-BİLGEM. Sitenin teknik altyapısında Joomla kullanılmıştır. Yazar ve site referans gösterilmeden alıntı yapılamaz. Görüşleriniz
spacer.png, 0 kB