Port Knocking Nedir ?

Muhammed Eren Uygun
5 min readMar 31, 2019

--

Port Knocking

Merhabalar bu yazımızın konusuna girmeden önce bazı tanımlara göz atalım.Port Knocking, port tıklatması demektir.Peki bunu biz niye ve nerede kullanabiliriz.Öncelikle kullanacağımız alan sunuculardır.Sunucular bize , tanımı gereği, hizmet veren ve kullanıcılara uygulamaları ve kaynakları erişilebilir kılma aracı olarak kullanılmaktadır.

Sunucu kısmını anladık.Elimizde bir sunucumuz var ve burada bir hizmet çalıştırıyoruz.Elbette bu hizmetin giriş kapıları olması gerekir ki başka insanlarda hizmeti kullanabilsin.Bu yüzden de giriş kapıları yerine sunucuların portlarını kullanıyoruz.Bu portlarda ise hizmet vereceğimiz servisleri çalıştırıyoruz.

Bazı detayları da tamamladıktan sonra sistemimiz tamamen çalışır durumda olacak fakat bizim bu servisimiz sadece iyi insanlar tarafına geçmeyecek, kötüye kullanmak isteyen kullanıcılarda olacaktır.Bu yüzden sunucumuzun güvenliğini sağlamalıyız.İşte tam da burada Port Knocking ile sunucumuzu bir nebze daha güvenli hale getireceğiz.

Port Knocking Nedir ?

Port Knocking, erişmek istediğimiz port veya portlara yapılan bağlantı isteklerine göre istenilen portların açılması tekniğidir.Aktiflik süresini ve istekler arasındaki saniye farklarına göre servisi açmak sizin seçiminize sunulmuştur.

Port Knocking’i HTTP servislerine kullanmak genellikle tercih edilmez.Bunun yerine SSH,FTP,SFTP gibi daha çok işlem yapılan,yetkili servislerde kullanılması tercih edilir.

Örneğin FTP hizmetini kullanırken bir kullanıcı adı,parola girişi yapmamız gerekiyor.Fakat bazen sistemlere BruteForce(Kaba Kuvvet) Saldırısı yaparak veyahutta FTP hizmetinde versiyondan kaynaklı bulunan zafiyeti kullanarak girilebiliyor.Bu şekilde de sistemimiz güvenli olmuyor.Fakat biz Port Knocking ile FTP hizmetimizin çalıştığı portu gizlersek eğer saldırgan artık bizim sunucumuzda FTP portunun açık olduğunu göremeyecek böylelikle hiçbir şekilde saldırıya kalkışamayacak.

Nasıl Yapılır ?

Öncelikle karşı sunucuya(Sanal makinemizi sunucu olarak kabul ediyoruz), bir nmap taraması yaparak hangi portlarının açık olduğuna bakmak istiyorum.

Nmap taraması sonucunda gördüğümüz gibi iki tane port açık durumda.Biz burada SSH portu üzerinden işlem yapacağız.

Öncelikle ssh üzerinden bağlanıyor mu diye sunucuyu kontrol edelim.

Gayet güzel bir şekilde bağlandık.Şimdi ise karşı sunucumuz üzerinde portlarımızı güvenli hale getireceğiz.

Öncelikle Port Knocking hizmetini düzenlemeden, sunucumuzda IPTables kurallarımızı gireceğiz.Sunucumuzun tüm isteklere yanıt verebileceği şekilde ayarlar yapmamız gerekiyor.

Burada gördüğünüz üzere IPTables komutları var.Şimdi bunları tek tek açıklayalım.

  • İlk kuralımız tüm gelen isteklere yanıt vermek üzere sunucumuzu ayarlayacaktır.
  • İkinci kuralımız ise çok önemli bir detaydır.Kurmuş olduğumuz bir bağlantının, tam bağlantı sırasında kopmaması için girilmiş bir kuraldır.Yani siz port knocking yaptığınız bir SSH servisine bağlandığınızda siz SSH servisinden çıkmadığınız sürece kapatılmayacaktır.
  • Üçüncü kuralımız ise aslında burada izin vermek istediğiniz portun kuralını nasıl yazarsınız onu göstermek istedim.Genellikle de web hizmeti açık kalması gerektiğinden 80. porta izin verilir.
  • Son kuralımız ise gelecek tüm bağlantı isteklerini düşürecektir.

Evet bu komutları yazdıktan sonra sunucumuzun portlarında ne gibi değişiklik olmuş kontrol etmek için istemci tarafından nmap taraması yapıyorum.

Gördüğünüz gibi şuanda SSH servisi artık gözükmüyor.

Bu düzenlediğimiz kuralları her defasında tekrardan girmemek için bir paket kurmamız gerekiyor.

sudo apt-get install iptables-persistent

Bu komutu çalıştırdıktan sonra karşımıza şu şekilde bir seçim ekranı geliyor.

Yes diyerek geçtikten sonra.Paketimiz yüklenmiş oluyor.Bundan sonra kurallarımızı girdikten sonra;

netfilter-persistent save
netfilter-persistent reload

Komutlarını kullanarak kurallarımızı kalıcı hale getiriyoruz.

Knock.d Servisi Ayarları:

Kurulum:

sudo apt-get install knockd

Bu şekilde sistemimize kuruyoruz.Fakat bir config dosyasını düzenleyerek servisi açabiliyoruz.

sudo vi /etc/default/knockd

knockd isimli config dosyamızı düzenliyoruz.

knockd config dosyamızda bulunan START_KNOCKD=0 kısmı 1 yaptığımız zaman servisimiz artık çalışacaktır.

Ayarlar:

sudo vi /etc/knockd.conf

knockd.conf dosyasının içine girdiğimizde Options ( Seçenekler ) bölümünde UseSyslog parametresini görüyoruz, bu koşul knockd hizmetinin logları sistemdeki loglardan okuyacağını söyler. Eğer okunacak logların yolunu değiştirmek isterseniz “UseSyslog” yerine aşağıdaki komutu girmelisiniz.

LogFile = /path/to/log/file

Options’un altındaki SSH servisini açma ve kapama istek desenlerini görüyoruz.Orada yazan parametrelerin türkçe karşılıklarını ve onların açıklamalarına değinelim:

sequence : sıra, dizi — İsteklerimizin hangi portlara sıra sıra geleceğini belirtir.

seq_timeout: Her bir istek arasında kaç saniye süre içersinde bitmesi gerektiğini belirtir.

command: Arkada saklamaya çalıştığımız servisi tekrar açacak komut dizisidir.

tcpflags : tcp isteklerimizin hangi bayrağa sahip olması gerektiğini bildirir.

Eğer yukarıdaki kurallara uygun bir şekilde istekleri yapabilirseniz sunucunuzda kapalı olan ssh servisi açılmış durumda olacaktır. Makalemizin başında belirttiğimiz -A IPtables kuralına dikkati çekmek isterim, bu parametre isteklerimizin hepsini düşürüyor durumdadır, bu problemi çözmek için openSSH parametremizin başına 1 koyarak tekrardan düzenliyoruz ve bu sayede sadece o isteği yapan istek sahibinde izin vermiş olacağız.

command = /sbin/iptables -I INPUT 1 -s %IP% -p tcp --dport 22 -j ACCEPT

Yukarıda belirttiğimiz özelliklerin benzerleri aşağıdaki özellikler için geçerlidir ve ssh servisini kapalı duruma getirecektir.

Artık knockd servisimizi başlatabiliriz.

sudo service knockd start

Şuan da knockd servisimiz çalışıyor durumda.Test edelim bakalım olmuş mu ?

Bunun için 7000,8000,9000 portlarına istek atmamız gerekiyor.

for x in 7000 8000 9000; do nmap -Pn --host_timeout 201 --max-retries 0 -p $x server_ip_address; done

Gördüğümüz gibi portlara istek attıktan sonra SSH servisimize ulaşabildik.Birnevi SSH kapısını 3 kere tıklattık,SSH’da bize kapıyı açtı.

Fakat şuan da ssh servisimiz açık kaldığı için tekrar kapatmamız gerek.Bunun içinde bu portlara ters istek atıyoruz ve bu şekilde SSH servisi kapanıyor.

for x in 9000 8000 7000; do nmap -Pn --host_timeout 201 --max-retries 0 -p $x server_ip_address; done

Knock servisi ile Port Knocking

Knock servisi ile Port Tıklatması daha kolay bir şekilde oluyor.Siz sadece IP ve istek göndereceğiniz portları belirtiyorsunuz.Geri kalan işlemi knockd sizin için yapıyor.

Yukarı da görüldüğü gibi aynı işlemleri knockd servisi sayesinde daha hızlı bir şekilde hallettik.

Peki bu sistemi her seferinde manuel mi yapmamız gerekiyor ?

Hayır tabiki.Kullanımlarımızdan sonra hizmeti kapatmayı unutma ihtimaline karşı otomatik kapatmaya ayarlayabilirsiniz.

sudo vi /etc/knockd.conf

Open SSH ve Close SSH kısımlarını birleştiriyoruz.Daha sonradan cmd_timeout komutunu ekliyoruz.Bu komut terminal erişimi kapatıldıktan 5 sn sonra stop komutunu yürürlüğe sokuyor.Start ve stop komutları tahmin ettiğiniz gibi başlatmaya ve kapatmaya yarıyor.

Bu kısımıda düzenleyip knockd servisimizi yeniden başlattığımızda artık otomatize bir şekilde sistemimiz çalışmış olacaktır.

Yazımı okuduğunuz için teşekkür ederim.Bir hatam olduysa veyahutta bir sorunuz olursa eğerki yorum atmaktan çekinmeyin.Kişisel hesaplarıma da yazabilirsiniz.Güvenli günler !

Kişisel Hesaplarım:

Gmail : erenn.uygun@gmail.com

LinkedIn: 3ren-uygun

Instagram: m.erenuygun

Twitter: erenuyguun

Github: erennuygun

Website: https://cyseclab.com

--

--