SSH Nedir SSH (Secure Shell) güvenli veri iletimi için kriptografik ağ protokolüdür. SSH bağlantısı bilgisayar-bilgisayar, bilgisayar-sunucu, sunucu-sunucu arasında yapılabilir. SSH uzak kabuk üzerinde yetkili bir metin tabanlı arayüz sağlar. SSH bağlantısı kurulduktan sonra, yerel terminal yazdığınız tüm komutlar şifreli SSH tüneli aracılığıyla uzak sunucuya gönderir ve terminal komutlarınız orada yürütülür. SSH istemci-sunucu modelini kullanır. Standart […]
]]>SSH Nedir
SSH (Secure Shell) güvenli veri iletimi için kriptografik ağ protokolüdür. SSH bağlantısı bilgisayar-bilgisayar, bilgisayar-sunucu, sunucu-sunucu arasında yapılabilir. SSH uzak kabuk üzerinde yetkili bir metin tabanlı arayüz sağlar. SSH bağlantısı kurulduktan sonra, yerel terminal yazdığınız tüm komutlar şifreli SSH tüneli aracılığıyla uzak sunucuya gönderir ve terminal komutlarınız orada yürütülür. SSH istemci-sunucu modelini kullanır. Standart TCP portu olan 22 SSH bağlantısı için atanmıştır.
Bu kılavuzda, SSH sıkılaştırması için en iyi olan bazı temel güvenlik uygulamaları hakkında örnekler yer alacaktır.
SSH Bağlantısı Nasıl Kurulur?
Temelde iki bağlanma yöntemi mevcuttur. Bunlardan birincisi kullanıcı adı ve şifre ile oturum sağlandığı yöntemdir, ikincisi ise SSH key ( SSH açık / gizli anahtar ) yardımı ile oturumun sağlandığı yöntemdir. Şifre oturumları yeni kullanıcılar için anlaşılması kolaydır. Ancak, otomatik botlar ve kötü niyetli kullanıcılar genellikle art arda şifre denemeleri ile güvenlik tavizlerine yol açabilir. Bu yöntem yerine SSH anahtarı yardımı ile oturum sağlanmasını öneriyoruz. Bu yöntemde özel ve genel anahtar çifti kimlik doğrulama öncesinde oluşturulur. Ortak anahtar herkes ile paylaşılabilirken, özel anahtar kullanıcı tarafından güvende tutulmalıdır.
Bu bağlantı yöntemleri dışında SSH versiyonuna göre oturum sağlamak için kullanılabilecek birkaç yöntem daha bulunmaktadır.
( Solda SSH v2, sağda ise SSH v1’i görmektesiniz. )
SSH Sıkılaştırması Yöntemlerinden Bazıları
SSH Sıkılaştırması Uygulaması
Öncelikle elimizdeki sunucuya veya ev bilgisayarına SSH bağlantımızı açalım.
Örnek komut:
ssh [email protected]
SSH oturumundayız, klavuzda Ubuntu 14.04.5 LTS kullanacağım, komular işletim sistemine göre farklılık gösterebilir. Sistemde cagatay adlı bir kullanıcı olduğunu varsayıyoruz. Kullandığınız sistemde kendi isteğiniz doğrultusunda ismini yazabilirsiniz.
sudo apt-get install openssh-server
Terminalden:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.factory-defaults sudo chmod a-w /etc/ssh/sshd_config.factory-defaults
Terminalden:
sudo vi /etc/ssh/sshd_config
Ayarlarımıza sırasıyla standart portu değiştirerek başlıyoruz:
Yorum satırı halinde olan ( ‘#’ yorum satırı anlamına gelmektedir ) PasswordAuthentication yes satırını yorum’dan çıkartıp yes olan parametreyi no yapıyoruz.
PermitRootLogin’i no olarak değiştirerek yapabilirsiniz.
Yeni bir terminal sayfasında: ( SSH oturumunu kapatmayınız )
ssh-keygen -t rsa -b 4096
Yukarıdaki komut kendi bilgisayarınızda açık ve gizli olmak üzere iki anahtar üretecektir. Açık anahtarı şu şekilde bulabilirsiniz:
cat ~/.ssh/id_rsa.pub
Yukarıdaki anahtarı görüntülediğimiz terminal’den sunucuda SSH oturumumuz olan terminal’e geçiyoruz, aşağıdaki ayarlamayı yapıyoruz.
AuthorizedKeysFile satırını yorum satırı durumundan çıkartıyoruz.
Kendi açık anahtarımızı SSH dizinindeki authorized_keys’e ekliyoruz.
Terminalden: ( Sunucuda )
sudo vi ~/.ssh/authorized_keys
Açık anahtarımızı kaydedip çıkıyoruz.
/etc/ssh/sshd_config dosyasını tekrardan açıyoruz
Terminalden: ( Sunucuda )
sudo vi /etc/ssh/sshd_config
Aşağıdaki kodları dosyanın en altına ekliyoruz.
Subsystem sftp internal-sftp Match group sftponly ChrootDirectory /home/%u X11Forwarding no AllowTcpForwarding no ForceCommand internal-sftp
Yukarıda verilen yöntemler sayesinde SSH oturumu açmış kullanıcıların kendi dizinlere etkiyebilmesini sağladık. Standart olarak SSH 22. porttan çalışmaktaydı, onu değiştirdik. Şifre ile oturum açmayı engelledik bu giriş yöntemi yerine daha güvenli olarak önerilen SSH anahtarını kullandık. Sistemimize tünelleme aracılığı ile sağlanabilecek uzak masaüstü bağlantılarını engelledik. Hiyerarşik bir ağ yapısında olduğu varsayılan sunucumuza daha yetkili üst makinalardan erişimi kısıtladık. Sisteme kullanıcı olarak oturum elde etmiş kullanıcıların root yetkilerine erişimini engelledik. SSH bağlantınızı daha güvenli hale getirmek için port spoofing, port knocking ve two factor authentication ( iki aşamalı oturum onayı ) kullanabilirsiniz.
Sunucular, tanımı gereği, hizmet veren ve kullanıcılara uygulamaları ve kaynaklar erişilebilir kılma aracı olarak kullanılmaktadır. Ancak, internete bağlı herhangi bir bilgisayar kaçınılmaz bir şekilde kötü niyetli kullanıcılar ve güvenlik açıklarından yararlanmak için bekleyen komut dosyaları tarafından hedeflenmektedir. Sunucular kullandığı çeşitli geliştirme ortamları gereğince birden fazla servis hizmeti sunmaktadır. E-posta gönderme servisi, SSH ( İki bilgisayar […]
]]>Sunucular, tanımı gereği, hizmet veren ve kullanıcılara uygulamaları ve kaynaklar erişilebilir kılma aracı olarak kullanılmaktadır. Ancak, internete bağlı herhangi bir bilgisayar kaçınılmaz bir şekilde kötü niyetli kullanıcılar ve güvenlik açıklarından yararlanmak için bekleyen komut dosyaları tarafından hedeflenmektedir. Sunucular kullandığı çeşitli geliştirme ortamları gereğince birden fazla servis hizmeti sunmaktadır. E-posta gönderme servisi, SSH ( İki bilgisayar arasındaki güvenli iletişim protokolü – Secure Shell ), web sunucusu ( Apache – Nginx – LiteSpeed vb ), SSL ( Güvenli erişim protokü – https – Secure Socket Layer ). Bu servisler sunucumuzun temel işlevlerini yerine getirmesine yarar.
Güvenlik duvarları erişimi kontrol altında tutmaya yarar, sunucumuzda güvenlik duvarının yaptığı temel işlev budur. Evimizin çelik kapısı gibi düşünebiliriz. Kötü niyetli insanlar kapınızın çelik olduğunu gördüğünde diğer giriş yerlerini test edeceklerdir. Bu ev örneğinde diğer giriş yerleri, pencerelerimiz, balkonlarımız ve çatı girişimizdir.
Sunucularda ise diğer giriş kapılarımız, sunucudaki yazılımı güncellerken, kodumuzu yüklerken ve yine aynı kodumuzu güncellerken kullandığımız diğer servislerdir. Bunlara örnek FTP ( File Transfer Protocol ), SFTP ( Secure File Transfer Protocol ), SSH ( Secure Shell ), telnet ( * ) örnek olarak verilebilir. Sunucumuza eğer fiziksel erişim imkanımız var ise bu servisleri kullanmadığımızda kapatmamız, sadece kullanacağımız zaman açık konuma getirmemiz olası bir saldırı girişiminde kötü niyetli insanlara daha az saldıracak ortam/yol yaratmış olacaktır.
Sunucumuza fiziksel erişimimiz yoksa port knocking ( Port yoklama ) yöntemi ile belirli bir dizi istek sonrasında sunucumuz log kayıtlarını anlamlandırıp kullanmak istediğimiz servisi aktif hale getirecektir.
Yazımın devamında Ubuntu 14.04 dağıtımına sahip bir sunucu üzerine knockd paketini kullanarak ssh hizmetini durdurmadan nasıl gizleyebileceğimizi göstereceğim.
Not: Aşağıda kullanacağım araç ve gereç IPv4 için tasarlanmış olup, IPv6’da geçerliliğini yitirecektir, örneğin,” iptables ” sadece IPv4 adresleri için güvenlik duvarı kuralları korur ancak IPv6 ağ adresleri için güvenlik duvarı kurallarını korumak için kullanılabilecek ” ip6tables ” olarak adlandırılan bir IPv6 muadili vardır. Makale içerisinde port yoklaması terimi yerine ingilizce karşılığı olan port knocking’i kullanacağım.
Saldırganların direkt olarak hedefine koyduğu servislerin aktif halde olmaması esasını benimser. Servisler bir dizi alakasız servise gönderilen paketlerin log dosyalarının takibinden sonra aktif hale gelir. Aktiflik süresini ve/veya istekler arasındaki saniye farklarına göre servisi açmak sizin seçiminize sunulmuştur.
Port knocking’i HTTP servisleri için kullanmak yerinde olmayacaktır. Bu kurguyu SSH, FTP, SFTP gibi daha yetkili servislerde kullanmak daha yerinde bir harekettir.
Örnek olarak; SSH servisinizin kullanıcı adı şifre ikilisi ile giriş yapmasının bir güvenlik tavizi olarak görüldüğünü düşünüyoruz, bu yöntem yerine .pem uzantılı anahtarlar kullanarak sisteme girişi sağlıyoruz. Bu hizmeti direkt olarak kullanıcıların istek gönderebileceği bir katmandan sağlıyoruz. Fakat port knocking kullanırsak direkt olarak istek gönderemeyecekleri için sistemimizin bel kemiği olan servisleri daha karmaşık bir algoritma dahilinde gizlemiş bulunabiliriz.
Sisteminizde port taraması yapan, kötü niyetli birini yıldıracak veya yakalatacak bir yöntem olarak görünebilir. Tarama sonuçlarında açık servis göremeyen kötü niyetli kişi eli kolu bağlı bir şekilde başka bir giriş aramaya veya daha farklı bir şekilde bilgilerinizi ele geçirmeye çalışacaktır.
Port knocking hizmetini yapılandırmadan önce IPTables kurallarını oluşturalım. Ubuntu 14.04’de IPTables kurulu olarak gelecektir. Sunucumuzun tüm isteklere yanıt verebileceği şekilde ayarlamalar yapmamız, port knocking hizmeti için log toplama ortamı yaracaktır.
Terminal :
sudo iptables -A INPUT -i lo -j ACCEPT
Yukarıda yer alan kural tüm giriş isteklerine yanıt vermek üzere sunucumuzu ayarlayacaktır.
Terminal :
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Yukarıda yer alan kural kurulmuş bağlantıların sonlandırılmaması için gereklidir, örnek verecek olursak ssh servisine port knocking sonrasında bağlı olduğumuz süre boyunca kullanmadığımız zaman otomatik olarak sistemden düşerken bu port knocking ile giriş yapıldığında düşmemelidir çünkü tekrardan port’ların tetiklenmesi gereklidir.
Herkes için görünür kabul edilen servislerimize izin vermeliyiz, web sunucusu olarak yayın yapan servisler 80 portundan yayın yaparlar. İlgili porta izin verelim.
Terminal :
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Bu kuralımızdan sonra diğer tüm bağlantılara izin vermediğimizi IPTables kurallarına eklemeliyiz.
Terminal :
sudo iptables -A INPUT -j DROP
Gelecek tüm diğer bağlantı isteklerini düşürecektir.
Halihazırda kurmuş olduğumuz ayarları görüntüleyelim:
Terminal :
[code lang=”js”]sudo iptables -S[/code]
Şuanda sunucumuzda görüldüğü üzere SSH servisine erişimimiz mevcut değil, eğer sunucu ile aramızda fiziksel bir erişim yok ise erişimi servis sağlayıcılar üzerindeki yönetim panelinden sağlayabiliriz.
Hazırladığımız IPTables kurallarını kalıcı hale getirmek için ilgili paketi işletim sistemimize kuralım.
Terminal:
sudo apt-get install iptables-persistent
Yukarıdaki komutu çalıştırdığımızda ekranımıza aşağıdaki görseldeki gibi bir seçim ekranı gelecektir.
Boşluk ( Space ) tuşu aracılığı ile onaylayabilirsiniz, kuralların kaydedilmesini isteyip her sunucu tekrar açıldığında yürürlüğe girmesini isteyip istemediğinizi soruyor. Boşluk tuşuna bir kez daha basmanızı isteyecektir. Sonuç aşağıdaki ile benzer olacaktır.
Sonrasında yüklediğimiz hizmeti başlatalım.
Terminal :
sudo service iptables-persistent start
Terminal :
sudo apt-get install knockd
Knockd servisini sistemimize kurdu fakat henüz servisi açmadık, kurulum sonunda servisi açık hale getireceğiz. ( vi /etc/default/knockd )
Terminal :
sudo nano /etc/knockd.conf
Terminal komutunu girdiğimizde yukarıdakine benzer bir kod bloğu bizi karşılıyor. Options ( Seçenekler ) bölümünde UseSyslog parametresini görmektesiniz, 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
Seçenekler’in altındaki SSH servisini açma ve kapama istek desenlerini görmekteyiz.Orada yazan parametrelerin türkçe karşılıklarını ve açıklamalarını açıklamak istiyorum:
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.
Şuanda kurulumumuz tamamlandı, desenleri kendinize göre özelleştirebilir ve kullanabilirsiniz.Kurulum tamamlanmakla beraber henüz knockd servisimiz aktif durumda değildir. Kurulum başında not olarak bıraktığım dizine editor ile giriş yapıp hizmeti aktif hale getireceğiz.
Terminal :
sudo vi /etc/default/knockd
Yukarıda görüldüğü üzere START_KNOCKD=0 olan parametreyi START_KNOCKD=1 ile değiştirdik. Kaydedip çıktıktan sonra hizmetimizi yeniden başlatalım.
Terminal :
sudo service knockd start
Eğer servis başlatılırken benzer bir ekran ile karşılaşıyorsanız:
Çözümü :
Terminal :
ip a l</pre> <img class="alignnone size-full wp-image-2284" src="https://canyoupwn.me/wp-content/uploads/2016/05/15.png" alt="15" width="1210" height="514" data-mce-src="https://canyoupwn.me/wp-content/uploads/2016/05/15.png"> Yukarıdaki resimden anlaşılan üzere sunucumuz eth1 üzerinden yayın yapıyor. Terminal : <pre>[code lang="js"][/code]vi /etc/default/knockd
Yukarıdaki terminal komutunu çalıştırdıktan sonra ilgili kısmın önündeki yorum satırını kaldırıp hizmeti tekrar başlatmayı deneyelim.
Terminal :
sudo service knockd reload
Knockd hizmeti IPTables kurallarını güncellemek üzere çalışmaya başladı.
Port knocking’i kullanmak için çeşitli araçlar kullanabilirsiniz bunlara örnek olarak; netcat, nmap verilebilir fakat sadece knock için tasarlanmış olan bir arabirim kullanabilirsiniz, adı knock. Fakat ben örneğimde linux ve MAC OS X üzerinde direkt terminal aracılığı ile kullanılabilecek nmap aracını kullanacağım.
Terminal :
ssh root@server_ip_adresi
İlgili servise bağlanma talebinde bulunduğumuzda bizi epey bir bekletecek ve sonrasında Timeout hatası verecektir.
sh: connect to host server_ip_address port 22: Operation timed out
SSH servisimiz kapalı durumda. Sunucu üzerindeki açık portları görüntülemeye çalışalım;
Nmap taramamıza göre sadece http servisimiz açık konumda.
Port knocking işlemine geçelim:
Terminal :
for x in 7000 8000 9000; do nmap -Pn --host_timeout 201 --max-retries 0 -p $x server_ip_address; done
Yukarıdaki bash scripti terminalimize işliyoruz.
Ardından ssh bağlantımızı gerçekleştirmeye çalışıyoruz.
Terminal :
ssh root@server_ip_adresi
SSH servisinizin açık olduğunu göreceksiniz.
SSH erişimini tekrardan gizli hale getirmek için:
Terminal :
for x in 9000 8000 7000; do nmap -Pn --host_timeout 201 --max-retries 0 -p $x server_ip_address; done
Knock arabirimini kullanarak basit bir şekilde portları yoklayabilirsiniz. Knock arabirimini kurmak üzere linux dağıtımlarından olan Kali Linux dağıtımı üzerinden anlatıma devam ediyorum.
Terminal :
sudo apt-get install knockd
Kullanımı:
knock server_ip_address sequence
Örnek kullanım, servisi açmak için :
knock 104.131.28.251 7000 8000 9000
Örnek kullanım, servisi kapatmak için :
knock 104.131.28.251 9000 8000 7000
Kullanımlarımızdan sonra hizmeti kapatmayı unutma ihtimaline karşı otomatik kapatmaya ayarlayabilirsiniz.
Terminal :
sudo vi /etc/knockd.conf
Yukarıda görüldüğü üzere cmd_timeouti start/stop_command’lar eklenmiş durumda. Bu komutları sırasıyla açıklamak istiyorum:
cmd_timeout : Terminal erişimi kapatıldıktan 10 sn sonra stop command’ı yani durdurma komutunu yürürlüğe sokacaktır. Start_command ise gelen isteklerin ardından çalışacak komuttur. Dikkatinizi knock edilecek yani istek yapılacak portların sayısının arttığına ve seq_timeout’un 10 saniye arttığına çekmek istiyorum. Bu tamamiyle isteklerin kararlılığındaki bütünlüğü sağlamak amaçlıdır.
Servisimizi yeniden başlatalım.
Terminal :
sudo service knockd restart
Sunucumuzun ilgili portlarını yoklayalım.
Terminal :
knock server_ip_address 7000 8000 9000 1000 &amp;amp;&amp;amp; ssh root@server_ip_adresi
Sunucumuzda çalışan firewall servisi kullanım sonrasında 10 saniye bekleyip SSH servisini durdurmak üzere beklemektedir.
Servis gizleme hizmeti kullanmak, yurt içinden ve/veya yurt dışından gelecek rasgele port tarama ve kötü amaçlı kod parçalarını çalıştırma girişiminde bulunan kişilerin/kodların çalışacak ortam bulamamasına, evimizin camlarını görememesinde etkili olacaktır.
Bu tip bir hizmeti yapılandırmak sunucumuzun güvenlik seviyesine yeni bir katman ekleyecektir, hiç bir zaman güvenli bir sistem yoktur fakat denemekten sıkılan bir hacker olabilir.
]]>