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.

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.

nano /etc/hosts.allow

nano ile hosts.allow dosyasını açarak aşağıdaki satırları eklemeniz yeterli.

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

systemctl disable firewalld

Yeniden başlamaması adına sistem ön yüklemesinden de kapatıyoruz

systemctl stop firewalld

Otomatik başlamaması için servisi maskeliyoruz

systemctl mask firewalld

Iptables servisini yükleyerek aktif ediyoruz

yum install iptables-services -y
/etc/init.d/iptables status

Tüm iptables içeriğini boşaltmak için

iptables -F

Script ve bot saldırılarından korunmak için

iptables -A INPUT -p tcp –tcp-flags ALL NONE -j DROP

Syn ve flood saldırıları engellemek için

iptables -A INPUT -p tcp ! –syn -m state –state NEW -j DROP

Xmas paketleri engellemek için

iptables -A INPUT -p tcp –tcp-flags ALL ALL -j DROP

Ip tables hardering

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.

iptables -A INPUT -i lo -j ACCEPT

Server trafik akışı için 80 ve 443 portları

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

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

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

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

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:

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

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:

iptables -L -n

Tüm iptables uygulamalarından sonra restart etmeyi unutmuyoruz.

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.

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.

iptables -I INPUT -p tcp -m state --state NEW -m recent --set -j ACCEPT
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

iptables -I INPUT -p tcp --dport 80 --syn -m limit --limit 1/s --limit-burst 6 -j RETURN
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

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.

nano /var/log/syn-saldiri.log
service rsyslog restart

Iptables Limit Burst

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ı

find  -type f -perm 0777

777 izinli klasörlerin 755 olarak düzenlenmesi

find . -type d -perm 0777 -exec chmod 0755 {} \;

777 izinli dosyaların 644 olarak düzenlenmesi

find . -type d -perm 0777 -exec chmod 0644 {} \;

Alternatif olarak bu komutu da uygulayabilirsiniz.

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.

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.

find -type f -name .rhost

Herkes tarafından yazılabilir dosyaların düzenlenmesi.

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.

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.

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.

nano /etc/bashrc

açılan editor ile bashrc dosyasına alt kısımda yer alan kod bloğunu eklioruz.

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.

linux History 'i detaylandırın

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

nano /etc/bashrc

ardından alt kısımda yer alan Promt Comand değişkenini ekliyoruz

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.

nano /etc/rsyslog.conf
local1.*  /var/log/bashkayit.log
/etc/init.d/rsyslog restart

aşağıdaki komut ile tüm bash aktivitelerini okuyabilirsiniz.

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.

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.

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.

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.

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

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

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)

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

<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>

istediğiniz bir dizini açmak için

<Directory /home/kullaniciadi/public_html/klasör>
    Options Indexes FollowSymLinks
    AllowOverride None
</Directory>

 

4.9

1 Yorum

  • Çok başarılı bir rehber olmuş. Belli ki bayağı emek harcanmış (:
    Elinize sağlık. Sitene arada uğrayacağım (:

Yorum Bırakın

This site uses Akismet to reduce spam. Learn how your comment data is processed.

BÜLTEN ABONELİĞİ

Siteye eklenen içeriklerden öncelikli olarak haberdar olmak isterseniz aşağıdaki forma e-posta adresinizi yazarak ücretsiz bültenime üye olabilirsiniz.