Erhan Yakut Software Developer @Binalyze | Founder @Passwall | Golang Enthusiast | Open Sorcerer

Sunucu Güvenliğini Artırma Yöntemleri

4 min read

Eskiden sitelerimizi barındırmak için basit standart hosting hesapları ihtiyacımızı görürken artık her site için birer sunucu kiralar duruma geldik. Durum böyle olunca temel seviyede sunucu yönetimini öğrenmek de kaçınılmaz oldu. Sunucu güvenliğinin de yönetim başlığı altında en önemli alt başlık olduğunu sanırım hatırlatmama gerek yok. Bu nedenle kendi sunucularınızı yönetirken alabileceğiniz temel güvenlik tedbirlerine bu yazımda kısaca değinmek istedim. İyi okumalar.

1. Root Girişinin Engellenmesi

Herhangi bir firmadan cloud sunucu (ya da başka tür sunucu) aldığınızda size işletim sistemi kurulu olarak verilir. Bununla birlikte size gelen bilgilendirme epostasında root kullanıcısına ait parola bulunur. Root kullanıcı adı standart olduğu için sitenize yapılan saldırılarda hackerlara sadece parolayı tahmin etmek kalır. Bu sebepten root kullanıcısı ile girişin derhal yasaklanması/engellenmesi gerekir. İşte bu noktada yapacağımız şeyler sırasıyla şu şekildedir.

1. Root olarak SSH üzerinden sisteme giriş yapmak: SSH kullanımını şuradaki yazımda detaylı olarak anlattığım için bu konuya yeniden değinmeyeceğim.

2. Sudo yetkisine sahip yeni bir kullanıcı oluşturmak: CentOS Linuxdağıtımı yüklü sunucularda bu işlemi yapmak için aşağıdaki komutları sırasıyla uygulamak yeterli.

$ adduser demo //Yeni kullanıcı ekler
$ passwd demo //Yeni kullanıcının parolasını belirler
$ gpasswd -a demo wheel //Yeni kullanıcıya root yetkisi verir

3. Root ile sisteme girişi engellemek: Bunun için sunucuya SSH ile uzaktan bağlanmayı sağlayan SSH daemon ayarlarını değiştirmeniz gerekir. Öncelikle /etc/ssh/sshd_config isimli dosyayı vi ya da nano gibi bir metin düzenleyici ile açın.

$ nano /etc/ssh/sshd_config

Brada #PermitRootLogin yes şeklinde olan satırı aşağıdaki gibi değiştirdikten sonra dosyayı kaydedip kapatıyoruz.
[php]PermitRootLogin no[/php]
Son olarak SSH’ı yeniden başlatıyoruz.

$ systemctl reload sshd

Not: Eğer sadece belirli bir kullanıcının sisteme erişmesini istiyorsanız, aynı dosyaya AllowUsers demo ibaresini eklemeniz yeterli.

Artık sunucuya SSH üzerinden root ile bağlanmak mümkün değil. Yalnızca kendi kullanıcı adınız ile aşağıdaki gibi bir komutu kullanarak bağlanabilirsiniz.

$ ssh demo@SERVER_IP_ADDRESS

2. SSH Portunun Değiştirilmesi

Sunuculara yapılan saldırıların %90’ı standart SSH portu olan 22 numaralı porta yapılır. SSH portunu farklı numaralı bir portla değiştirmek, alabileceğiniz en etkili, kolay ve hızlı güvenlik tedbirlerinden birisidir. Varsayılan (22) SSH portunu şu şekilde değiştirebilirsiniz:

  • Öncelikle SSH ile sunucunuza bağlanın: ssh username@servername
  • Ardından SSH config dosyasını bir metin editörü (nano, vi vb.) ile açın: vi /etc/ssh/ssh_config veya nano /etc/ssh/ssh_config. Config dosyasının ismi sshd_config de olabilir, ilgili klasörde ls komutu vererek bunu kontrol edersiniz.
  • Dosyada # Port 22 yazan satırı bulun ve başındaki # işaretini kaldırıp 22 rakamı yerine 4354 gibi farklı bir rakam yazıp dosyayı kaydedip kapatın. Seçeceğiniz yeni port numarası 0 ile 65,535 (64k) arasında değişebilir.
  • Son olarak SSH’ı CentOS için service sshd restart, Ubuntu için sudo restart ssh komutu ile yeniden başlatın.
  • Port değiştirme işlemi bu kadar. Artık yukarıda bahsedildiği şekilde istediğiniz porttan sunucuya bağlanabilirsiniz.

Bundan sonra sunucunuza SSH ile bağlanırken tek yapmanız gereken belirlemiş olduğunuz port numarasını da bağlantı komutuna aşağıdaki gibi eklemek.
[php]$ ssh -p portnumber username@servername
// Örnek: ssh -p 55555 [email protected][/php]

3. SSH Anahtar Çifti Kullanma

Alınacak tedbirler öncelikle kullanıcıların tahmin/deneme yoluyla sunucuya bağlanmalarını engellemek olduğu için, SSH ile kullanıcı girişinde kullanıcı adı ve parola yerine SSH anahtar çifti (SSH Key Pair) kullanabilirsiniz. Bu yöntem sayesinde kullanıcı adı ve parola girilmez, onun yerine bilgisayarınızda yüklü olan kriptolu SSH anahtarı ile sunucudaki kriptolu SSH anahtarı karşılaştırılır ve eğer eşleşirse sunucuya bağlantı sağlanır. Bunun nasıl yapılacağını merak ediyorsanız SSH (Secure Shell) başlıklı yazımı okuyabilirsiniz.

4. Firewall Kurulumu

CentOS’un en güzel yanlarından birisi de bünyesinde hazır ve oldukça kaliteli bir Firewall servisi olan Firewalld bulunmasıdır. Firewalld’nin birçok ayarı bulunmasına rağmen sadece başlatmak da sizi oldukça sağlam bir şekilde korur. Bu servisi başlatmak için aşağıdaki komuttan faydalanabilirsiniz
[php]sudo systemctl start firewalld.service[/php]
Firewalld’yi kullanırken ihtiyacınız olan en önemli iki konuya şu yazılarımdan ulaşabilirsiniz;

5. Fail2Ban Kullanımı

DDoS ve Brute Force saldırılarını önlemenin en etkili yollarından birisi de sunucuya yapılacak giriş denemelerinin sınırlandırılmasıdır. İşte bu işlem için Fail2Ban ihtiyacınızı karşılayacaktır. Fail2Ban detaylı kullanımı şuradaki yazımda anlatmıştım. İlgili yazıyı okuyarak sitenize yapılan deneme/tahmin tarzı saldırıları önleyebilirsiniz.

6. Gereksiz Servisleri Kapatın

Sunucu üzerinde birçok servis/hizmet bulunmaktadır. Bu nedenle olası bir saldırıda yeni bir servisin başlatıldığını takip etmek güçtür. Bununla birlikte ne kadar çok servis çalışırsa, o kadar potansiyel tehdit vardır. İşte bu nedenle gereksiz servisleri kapalı tutmak en doğru hareket tarzıdır.

CentOS ve türevi Linux dağıtımlarında hangi servislerin çalışır durumda olduğunu şu komutla görebilirsiniz:

$ /sbin/chkconfig --list |grep '3:on'

Herhangi bir servisi kapatmak için de aşağıdaki komutu kullanabilirsiniz.

$ chkconfig servis_ismi off 

7. Açık Portları Kontrol Edin

Bilindiği gibi sunucumuza yapılan bağlantılar “port” olarak adladırılan geçiş noktalarından yapılır. Yani herhangi bir saldırı söz konusu ise mutlaka açık portlardan birisi hedef alınacaktır. Gereksiz servisler gibi gereksiz portları da kontrol edip kapalı tutmakta fayda var. Aşağıdaki komut ile dinlemede (listen) olan portları ve bu portların hangi servisler tarafından kullanıldığını listeleyebilirsiniz.

$ netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address   Foreign Address   State    PID/Program name
tcp        0      0 127.0.0.1:53    0.0.0.0:*         LISTEN   1004/dnsmasq    
tcp        0      0 0.0.0.0:22      0.0.0.0:*         LISTEN   380/sshd        
tcp        0      0 127.0.0.1:631   0.0.0.0:*         LISTEN   822/cupsd       
tcp6       0      0 :::22           :::*              LISTEN   380/sshd        
tcp6       0      0 ::1:631         :::*              LISTEN   822/cupsd  

Eğer sunucunuzda firewalld aktif halde ise, güvenlik duvarında izin verilen portları ise şu komutla listeleyebilirsiniz.

$ firewall-cmd --list-ports

Herhangi bir porta güvenlik duvarında izin vermek için ise şu komuttan faydalanabilirsiniz.

firewall-cmd --permanent --add-port=21/tcp

Son Sözler

Güvenlik kavramının sonu yok desek sanırım abartmış olmayız. Bu yazıda aklıma ilk gelen ve olmazsa olmaz şeklinde değerlendirdiğim tedbirlere değindim. Zamanla bu yazıyı güncellemeyi düşünüyorum ancak konu o kadar geniş ki belki farklı başlıklar altında (Firewall, SSH, Kullanıcı Yönetimi, PORT Scan…) bu yazıyı dağıtabilirim. Şimdilik burada yazımı sonlandırıyorum. Umarım faydası dokunur.

Erhan Yakut Software Developer @Binalyze | Founder @Passwall | Golang Enthusiast | Open Sorcerer