1- SSH Portunun değiştirilmesi
İlk komut ile ssh config dosyasını açıyoruz ve başında yer alan diyez # işaretini silip farklı bir port numarası belirtiyoruz. İşlem sonrası ssh servisini yeniden başlatarak aktif edebiliriz.
1 2 |
nano /etc/ssh/sshd_config service sshd restart |
2- SSH için ip izni
SSH bağlantısını tek bir ip adresi üzerinden yaparak sunucu güvenliğini arttırabilirsiniz.
1 |
nano /etc/hosts.allow |
nano ile hosts.allow dosyasını açarak aşağıdaki satırları eklemeniz yeterli.
1 2 3 |
sshd sshd1 sshd2 : xxx.xxx.xxx.xxx : ALLOW sshd sshd1 sshd2 : 127.0.0.1 : ALLOW sshd sshd1 sshd2 : ALL : DENY |
3-Ip tables hardering
Centos 7 default kurulumda iptables yerine firewald adında farklı bir servis ile gelmekte. Iptables’ı kurmadan önce bu servisi kaldrmamız gerekiyoır.
İlk olarak firewalld servisini kapatıyoruz
1 |
systemctl disable firewalld |
Yeniden başlamaması adına sistem ön yüklemesinden de kapatıyoruz
1 |
systemctl stop firewalld |
Otomatik başlamaması için servisi maskeliyoruz
1 |
systemctl mask firewalld |
Iptables servisini yükleyerek aktif ediyoruz
1 2 |
yum install iptables-services -y /etc/init.d/iptables status |
Tüm iptables içeriğini boşaltmak için
1 |
iptables -F |
Script ve bot saldırılarından korunmak için
1 |
iptables -A INPUT -p tcp –tcp-flags ALL NONE -j DROP |
Syn ve flood saldırıları engellemek için
1 |
iptables -A INPUT -p tcp ! –syn -m state –state NEW -j DROP |
Xmas paketleri engellemek için
1 |
iptables -A INPUT -p tcp –tcp-flags ALL ALL -j DROP |
4-Iptables zin verilmesi gereken portlar
İlk yapılacak iş yerel ağdan yani bilgisayarın kendisinden gelen isteklere izin vermek. Böylece VPS’in veritabanı ile iletişimi sağlanabilsin.
1 |
iptables -A INPUT -i lo -j ACCEPT |
Server trafik akışı için 80 ve 443 portları
1 2 |
iptables -A INPUT -p tcp -m tcp –dport 80 -j ACCEPT iptables -A INPUT -p tcp -m tcp –dport 443 -j ACCEPT |
Pop3 için 110 ve 995
1 2 |
iptables -A INPUT -p tcp -m tcp –dport 110 -j ACCEPT iptables -A INPUT -p tcp -m tcp –dport 995 -j ACCEPT |
Imap için 143 ve 993
1 2 |
iptables -A INPUT -p tcp -m tcp –dport 143 -j ACCEPT iptables -A INPUT -p tcp -m tcp –dport 993 -j ACCEPT |
SMTP portu için 25,465,587
1 2 3 |
iptables -A INPUT -p tcp -m tcp –dport 25 -j ACCEPT iptables -A INPUT -p tcp -m tcp –dport 465 -j ACCEPT iptables -A INPUT -p tcp -m tcp –dport 587 -j ACCEPT |
SSH için 22
1 |
iptables -A INPUT -p tcp -m tcp –dport 22 -j ACCEPT |
Sistem güncellemeleri ve ping için kullanabilmak amacıyla outgoing bağlantılara izin verelim:
1 |
iptables -I INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT |
Gerekli olan portları açtıktan sonra diğer tüm hizmetleri sonlandıralım
1 2 |
iptables -P OUTPUT ACCEPT iptables -P INPUT DROP |
Tüm ayarlar tamamlandığına göre kurallara bir göz atıp eksik kalan birşey olup olmadığını kontrol edelim:
1 |
iptables -L -n |
Tüm iptables uygulamalarından sonra restart etmeyi unutmuyoruz.
1 |
service iptables restart |
4-Iptables Rate Limiting
Iptables güvenlik duvarında temel kurallara ilave olarak dos ve ddos ataklarına önlem almak için ekstra kuralar ekleyebiliriz.
Aşağıdaki komut sayesinde tek bir ip’den Apache servisine (80 portuna) doğru, aynı anda en fazla 100 bağlantıya izin vererek, 101. bağlantı isteği reddelir.
1 |
iptables -t filter -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 100 --connlimit-mask 32 -j DROP |
5- Iptables Hit-Count
Son bir dakka içinde aynı ip’den gelen 20’nin üzerinde syn paketi varsa 20 üstü paketleri Linux centos Sunucu Güvenliği Hardeningeder. Rate limit ile benzer çalışır ama bunda zaman kısıtlaması da verebiliriz.
1 |
iptables -I INPUT -p tcp -m state --state NEW -m recent --set -j ACCEPT |
1 |
iptables -I INPUT -p tcp -m state --state NEW -m recent --update --seconds 60 --hitcount 20 -j DROP |
6- Iptables Limit Burst
Apache servisine yani 80 portuna gelen syn paketlere bakar. Eğer 80 portuna bir saniyede 6 ‘dan fazla syn paketi gelirse loglanır. Bu sayede eğer syn saldırı olursa saldırının nerden geldiğini loglardan bakarak anlayabiliriz. Paketleri droplamayıp sadece loglamamızın sebebi syn saldırılarında spoofing yapılabilmesidir.
Eğer syn saldırılarını iptables ile englemeye çalışırsak saldırganlar istemedğimiz halde bizim için önemli olan ip’leri spoof ederek onların ip’si ile bize saldırabilirler bizde o spoof edilmiş ip’leri enggelersek istemediğimiz bir durum oluşur. O yüzden syn flood saldırılarını iptables ile sadece loglarız. Engellemek için syn‐cookie kullanırız. Alt kısımda yer alan 2 komutu iptables içerisine ekliyoruz
1 |
iptables -I INPUT -p tcp --dport 80 --syn -m limit --limit 1/s --limit-burst 6 -j RETURN |
1 |
iptables -I INPUT -p tcp --dport 80 --syn -j LOG --log-prefix='[guvenlik-duvari]' |
sonraki işlemde rsyslog dosyasını açarak, son satıra loglama için 2. komutu ekliyoruz
1 2 |
nano /etc/rsyslog.conf :msg,contains,"[guvenlik-duvari]" /var/log/syn-saldiri.log |
nano ya da tail -f ile log dosyasını okuyabilirsiniz. çıktı alttaki gibi olacaktır.
1 2 |
nano /var/log/syn-saldiri.log service rsyslog restart |
6- Iptables Booyer Moore Algoritmesı
Wget kullanımını iptables ile engellemek için kullanabiliriz. Wget toolunun user‐agent’i Wget olduğu için paket başlıklarında user‐agenti Wget olan paketler drop edilmiş olur. (Eğer wget kullanırken user‐agent değiştirilirse işe yaramaz)
6- Linux dosya güvenliği:
777 iznine sahip dosyaların bulunarak tüm izilerin değiştirilmesi. Aşağıda yer alan komut ile tarama yaptığınız dizinde bulunan ve erişime açık tüm dosyaları 644 olarak düzenleyebilirsiniz.
Sunucu üzerinde 777 izni verilmiş dosyaların bulunması
1 |
find -type f -perm 0777 |
777 izinli klasörlerin 755 olarak düzenlenmesi
1 |
find . -type d -perm 0777 -exec chmod 0755 {} \; |
777 izinli dosyaların 644 olarak düzenlenmesi
1 |
find . -type d -perm 0777 -exec chmod 0644 {} \; |
Alternatif olarak bu komutu da uygulayabilirsiniz.
1 2 |
find . -type d -exec chmod 0755 {} \; find . -type f -exec chmod 0644 {} \; |
Kullanıcı olmayan dosyaların yeniden düzenlenmesi. İlk komut ile kullanıcısı olmayan dosya ve dizileri görebilir, 2. komut sayesinde eksik sahipli ve gurup tüm kullanıcısını root yapabilirsiniz.
1 2 |
find /var/www/html/ -xdev \( -nouser -o -nogroup \) find /var/www/html/ -xdev \( -nouser -o -nogroup \) -exec chown root:root {} \; |
Rhost dosyaları kullanıcıların uzaktan bağlantı yapmalarını sağlayan bir dosya türüdür ve sunucu üzerinde bulundurulması kesinlikle önerilmez. Komut sayesinde .rgost dosyalarını taratarak silebilirsiniz.
1 |
find -type f -name .rhost |
Herkes tarafından yazılabilir dosyaların düzenlenmesi.
1 |
find /home/ -perm -2 ! -type l -ls -exec chmod o-w {} \; |
SuID biti aktif olan dosyaların bulunması ve düzeltilmesi. İlk komut ile suid’si aktif olan dosyaları bulabilir ve ikinci komut ile bu dosyaları düzenleyebilirsiniz.
1 2 |
find / -type f -perm -02000 find / -type f -perm -04000 -exec chmod u-s {} \; |
PHP open_basedir Tweak
Aynı sunucuda yer alan ve hacklenen bir içeriğin farklı bir domaine zarar vermemesi için cpanel’de open basedir’i aktif edebilirsiniz. Bu şekilde zararlı shell dosyaları diğer dizinlere ulaşamayacaktır.
cPHulk Brute Force Protection
Yine WHM panel kullanıyorsanız, cphul servisini aktif etmelisiniz. Böylelikle sunucunuza düzenlenen bruteforce ataklarını engelleyebilirsiniz.
cPanel Security Advisor
WHM panel kullanıcıları için önemli bir bölüm olan wsecurity advisor çeşitli zaman aralıklarında sunucunuzu tarayarak güvenlik açıklarını size bildirecektir.
Apache sunucusunda kapatılması gereken PHP fonksiyonları.
WHM’de multi php.ini Editör bölümüne fonksiyon olarak ekleyebilirsiniz.
1 |
disable_functions = "mail,shell_exec,exec,system,cat,dl,openbasedir,popen,proc_close,proc_get_status,proc_nice,proc_open,escapeshellarg,show_source,posix_mkfifo,mysql_list_dbs,get_current_user,getmyuid,pconnect,link,symlink,pcntl_exec,ini_alter,parse_ini_file,leak,apache_child_terminate,posix_kill,posix_setpgid,posix_setsid,posix_setuid,proc_terminate,syslog,fpassthru,allow_url_fopen,stream_select,socket_select,socket_create,socket_create_listen,socket_create_pair,socket_listen,socket_accept,socket_bind,socket_strerror,pcntl_fork,pcntl_signal,pcntl_waitpid,pcntl_wexitstatus,pcntl_wifexited,pcntl_wifsignaled,pcntl_wifstopped,pcntl_wstopsig,pcntl_wtermsig,openlog,apache_get_modules,apache_get_version,apache_getenv,apache_note,apache_setenv,virtual,name" |
History ‘i detaylandırın
Bildiğiniz gibi history komutu ile sunucu üzerinde uygulanan geçmişe yönelik komutları görebiliriz, bu gözüken içeriği tarih ve saat ekleyerek detaylandırmak için yapmamız gereken.
1 |
nano /etc/bashrc |
açılan editor ile bashrc dosyasına alt kısımda yer alan kod bloğunu eklioruz.
1 2 3 4 5 |
HISTSIZE=1000 ##histzie değişkeni ile geçmişe yönelik kaç komut bilgisi tutulacak ayarlayabiliriz. export HISTTIMEFORMAT="%h/%d - %H:%M:%S " ##HISTTIMEFORMAT Değişkieni istediğimiz gibi düzenleyebiliriz. |
çıktı resimdeki gibi olacaktır.
Bash Kayıt Dosyalarınızı Loglayın
Tüm bash komutlarınızı loglayarak sunucu üzerinde daha önce hangi işlemleri sağladığınızı görebilirsiniz. Loglama yapabilmemiz için öncelikle bashrc dosyasını açıyoruz
1 |
nano /etc/bashrc |
ardından alt kısımda yer alan Promt Comand değişkenini ekliyoruz
1 |
export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local1.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"' |
2. adım olarak rsyslog.conf dosyasını açıyoruz ve 2. komutu ekliyoruz ve servisi restart ediyoruz.
1 2 3 |
nano /etc/rsyslog.conf local1.* /var/log/bashkayit.log /etc/init.d/rsyslog restart |
aşağıdaki komut ile tüm bash aktivitelerini okuyabilirsiniz.
1 |
more /var/log/bashkayit.log |
bashkayit.log dosyasını sadece root kullancısının açabilmesi için iznini 400 olarak ayarlarız.
chmod 400 /var/log/bashkayit.log
6- Apache ve Php Sıkılaştırması
Öncelikle find / -name httpd.conf komutu ile httpd conf dosyamızı buluyoruz. Sonrasında Apache servisinin versiyonunu telnet vs ile öğrenilmesini engellemek için OS yerine PROD ile değiştiriyoruz. Bu versiyon yeni Centos ile Production Only olarak geliyor.
1 |
ServerTokens PROD |
Diğer bir işlem timeout değeri, saldırı anında bu değerin düşük olması, daha az kaynak tüketmesine neden olacaktır.
1 |
Timeout 60 |
Apache servisi tcp protokolünü kullanır. Eğer KeepAlive off seçilirse her get post isteği için tekrar tekrar tcp 3’lü el sıkışma yapıması gerekir. Buda sunucun daha çok kaynak tüketmesine sebeb olur o yuzden on seçmemiz gerekir.
Fakat on seçildiğinde de ddos ataklarına karşı bir dezavantaj oluşabilir. Çünkü http get ddos atağında saldırganlar tek bir connection üzerinden get isteği yaparak bant genişliğini doldurmaya yönelik saldırı yapılabilir.
1 |
MaxKeepAliveRequests 100 |
Keepalive özelliği açık iken bağlantı başına en fazla kaç adet request(istek) yapılabileceğini belirtiyoruz. Daha fazla yüksek performans için bu değer ya 0(sonsuz) yada yüksek bir değerde tutmak gerekir.
1 |
KeepAliveTimeout 15 |
Bağlantının kaç saniye geçerli olacağını ayarlarız.15. saniye sonra bağlantı otamatik kapatılır istemci yei bağlantı açmak zorunda kalır.
Apache Çoklu süreç modülleri
1 |
/usr/sbin/apachectl ‐V | grep MPM |
ilgili komut ile yine Apache server’ınızın hangi çoklu süreç modülünü kullandığını öğrenebilirsiniz.
MPM PREFORK
Prefork çoklu süreç modülü gelen her istek için ayrı bir süreç(process) oluşturulur. Herbir süreç tek bir theread(iş arçacığı) kullanır. Her istek birbirinden yalıtıldığı için kararlı bir yapısı vardır ama her istek için ayrı bir süreç başlattığı için daha yavaştır.
1 2 3 4 5 6 |
StartServers 8 MinSpareServers 5 MaxSpareServers 20 ServerLimit 256 MaxClients 256 MaxRequestsPerChild 4000 |
StartServers: Apache’nin başlatılması sırasında oluşturulacak child process sayısını belirler.
MinSpareServers: Herhangi bir anda gelebilecek isteklere karşı hazır, boşta bulunan minimum child process sayısını belirler. Bu sayıdan az boşta bekleyen çocuk süreç olduğu durumda, Apache ana süreci boşta beklemesi için yeni çocuk süreçler yaratır.
MaxSpareServers: Herhangi bir anda gelebilecek isteklere karşı hazır, boşta bulunan maximum child process sayısını belirler. Bu sayıdan fazla boşta bekleyen child process olduğu durumda, Apache ana süreci fazla olan süreçleri öldürür.
MaxClients: Aynı anda hizmet verilecek istek sayısını belirler. Bu sayıdan fazla istek geldiğinde, bu istekler kuyruğa alınır (Kuyrukta bekletilecek maksimum istek sayısını ListenBacklog yönergesi ile ayarlayabilirsiniz).
MaxRequestsPerChild: Tek bir child process ömrü boyunca cevap verebileceği maksimum istek sayısını belirler. 0 değeri sınırsız anlamına gelir.
MPM WORKER
Daha az memory tüketir ve daha hızlıdır. Bunun nedeni worker çoklu süreç modülünde prefortaki gibi her süreç tek bir thread kullanmaz birden fazla thread (multithread) kullanabilir ve her bir istek için farklı bir süreç oluşturulmaz bunun yerine thread oluşturulur. Böylece hem daha olur hızlı hemde daha az kaynak tüketir. (thread‐safe kütüphanleri olan uygulamalar için uygundur)
1 2 3 4 5 6 |
StartServers 4 MaxClients 300 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 |
StartServers: Apache’nin başlatılması sırasında oluşturulacak child process sayısını belirler. Bu süreçlerden her biri ThreadsPerChild yönergesinde belirtilen kadar threade sahip olacaktır.
MaxClients: Aynı anda hizmet verilecek istek sayısını belirler. Bu sayıdan fazla istek geldiğinde, bu istekler kuyruğa alınır.
MinSpareThreads: Bütün süreçlerdeki toplam, minimum boştaki thread sayısını belirler (her sürecin sahip olması gereken boştaki minimum thread sayısını değil). Bu sayıdan az boşta bekleyen thread olduğu durumda, Apache bus sayıya ulaşana kadar yeni süreçler yaratır.
MaxSpareThreads: MinSpareThreads’e benzer şekilde, boştaki maksimum thread sayısını belirler.
ThreadsPerChild: Süreç başına yaratılacak thread sayısını belirler
**THEREAD iş parçacığı demektir. Multithread ve single thread olmak üzere iki çeşittir.multithread şekilnde çalışan süreçler(eğer processorslar destekliyorsa) birden fazla threadla çalışır ve her bir thread farklı cpu da ç alışabilir.
Örnekle açıklarsak: 0’dan 100 kadar olan sayıların toplamını 0‐50 arasını birinci. threada aynı anda 50‐100 arasını da ikinci thread’a yaptırılarak işlem süresi 2 kat azaltılabilir.
Dizin listelemenin kapatılması:
Yine httpd conf üzerinde aşağıdaki komutları kullanarak dizin listelemeyi kapatabilir ya da istediğiniz dizinleri erişime açabilrsiniz
1 2 3 4 |
<Directory /> Options FollowSymLinks AllowOverride None </Directory> |
istediğiniz bir dizini açmak için
1 2 3 4 |
<Directory /home/kullaniciadi/public_html/klasör> Options Indexes FollowSymLinks AllowOverride None </Directory> |