Bir web sunucusunu ayağa kaldırmak kolay; onu saldırılara karşı dayanıklı hale getirmek asıl mesele. Yıllardır yönettiğim Linux sunucularda Apache sıkılaştırması her kurulumun standart adımı haline geldi. Bu yazıda, varsayılan kurulumdaki bir Apache’yi hem daha güvenli hem daha dayanıklı yapmak için uyguladığım temel ayarları paylaşıyorum.
Ayarların tamamı Apache yapılandırma dosyasında yapılıyor. Dosyanın yerini bilmiyorsanız:
|
1 2 |
find / -name httpd.conf # Debian/Ubuntu tarafında: /etc/apache2/apache2.conf |
1. Sürüm bilgisini gizleyin
Saldırganın ilk yaptığı şey keşiftir: sunucunuzun hangi yazılımın hangi sürümünü çalıştırdığını öğrenip bilinen açıkları dener. Apache’nin yanıt başlıklarında sürüm bilgisi vermesini kapatmak için:
|
1 2 |
ServerTokens Prod ServerSignature Off |
Bu ikili sayesinde hata sayfalarında ve HTTP başlıklarında yalnızca “Apache” yazar; sürüm, işletim sistemi ve modül bilgisi sızmaz.
2. Timeout değerlerini sıkın
Varsayılan timeout değerleri oldukça cömert. Saldırı anında (özellikle slowloris tarzı yavaş isteklerde) düşük timeout, sunucunun kaynaklarını koruyacaktır:
|
1 |
Timeout 60 |
3. KeepAlive dengesini kurun
Apache, TCP üzerinde çalışır. KeepAlive Off olursa her GET/POST isteği için üçlü el sıkışma yeniden yapılır ve bu kaynak israfıdır; bu yüzden açık olmalı. Ama sınırsız da bırakmamak gerekiyor, çünkü tek bağlantı üzerinden istek yağdıran saldırılara kapı açar. Dengeli bir ayar:
|
1 2 3 |
KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 5 |
MaxKeepAliveRequests bağlantı başına istek sayısını sınırlar; KeepAliveTimeout ise boşta kalan bağlantının kaç saniye açık tutulacağını belirler. Yoğun sitelerde timeout’u 5 saniyeye kadar çekmek bağlantı havuzunu rahatlatıyor.
4. MPM ayarlarınızı tanıyın
Apache’nizin hangi çoklu süreç modülüyle (MPM) çalıştığını öğrenin:
|
1 |
apachectl -V | grep MPM |
Prefork: Her istek için ayrı süreç açar, her süreç tek thread kullanır. İstekler birbirinden yalıtıldığı için kararlıdır ama kaynak tüketimi yüksektir. Eski PHP kurulumlarının (mod_php) mecburiyetiydi.
|
1 2 3 4 5 6 |
StartServers 8 MinSpareServers 5 MaxSpareServers 20 ServerLimit 256 MaxRequestWorkers 256 MaxConnectionsPerChild 4000 |
Worker/Event: Süreç başına birden çok thread kullanır; daha az bellek tüketir ve daha hızlıdır. Günümüzde PHP-FPM ile birlikte Event MPM fiili standart; yeni kurulumda tercihiniz bu olmalı.
|
1 2 3 4 5 6 |
StartServers 4 MaxRequestWorkers 300 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxConnectionsPerChild 0 |
Parametrelerin mantığı şöyle: StartServers açılışta kaç child süreç oluşturulacağını, MinSpareThreads/MaxSpareThreads boşta hazır bekleyecek thread aralığını, MaxRequestWorkers ise aynı anda hizmet verilecek istek tavanını belirler. Tavana takılan istekler kuyruğa alınır. Değerleri sunucunuzun RAM’ine göre ayarlayın; bellek dolup swap’e düşen Apache, saldırı olmadan da kendini yıkar.
5. Dizin listelemeyi kapatın
Index dosyası olmayan bir klasöre gelen ziyaretçinin dosya listesini görmesi, bilgi sızıntısının klasiğidir. Kök ayarda kapatın:
|
1 2 3 4 |
<Directory /> Options FollowSymLinks AllowOverride None </Directory> |
Listelemenin gerektiği belirli bir dizin varsa sadece orayı açın:
|
1 2 3 4 |
<Directory /home/kullanici/public_html/paylasim> Options Indexes FollowSymLinks AllowOverride None </Directory> |
6. PHP sıkılaştırması
Apache’yi sıkılaştırıp PHP’yi varsayılan bırakmak, kapıyı kilitleyip pencereyi açık bırakmaya benzer. php.ini tarafında dokunulması gereken başlıca ayarlar:
- expose_php = Off: PHP sürümünün HTTP başlıklarında görünmesini engeller
- display_errors = Off: Hata mesajları ziyaretçiye değil log’a yazılmalı; hatalar dosya yolları ve yapı bilgisi sızdırır
- max_execution_time: Script’in çalışma süresi tavanı; uygulamanızın gerçek ihtiyacına göre olabildiğince kısa tutun
- max_input_time: Girdi verisinin işlenmesi için maksimum süre
- memory_limit: Script başına RAM tavanı; sunucu kapasitenize göre optimize edin
- enable_dl = Off: Çalışma zamanında modül yüklenmesini kapatır
- disable_functions:
exec, shell_exec, system, passthrugibi tehlikeli fonksiyonları, uygulamanız kullanmıyorsa kapatın
Toparlayalım
Özet reçete: sürüm bilgisini gizle, timeout ve KeepAlive’ı dengele, MPM’i donanımına göre ayarla, dizin listelemeyi kapat, PHP’nin ağzını sıkı tut. Bunların üzerine ModSecurity gibi bir WAF ve düzenli güncelleme rutini eklerseniz, Apache’niz internetin gürültüsüne karşı gayet dayanıklı hale gelir.
Sunucu güvenliği ve Linux yönetimi üzerine diğer yazılarım Linux kategorisinde. Kendi sıkılaştırma rutininizde farklı neler var, yorumlarda konuşalım.
