TR | Apache Hardening
TR | Apache Hardening
Bu rehberde size Apache sunucularını güvenceye almak için elimden geldiğince ipuçları vermeye çalışacağım. Sıkılaştırma işlemlerini Linux platformu üzerinden gerçekleştireceğiz. Apache 2.4.x ve 2.2.x sürümlerine uygun testler gerçekleştiriyor olacağız. Gelin ilk önce Apache nedir ona bir bakalım.
Apache Nedir?
Apache, 1995 tarihinden beri geliştirilmekte olan açık kaynak kodlu, güçlü, sağlam, yetenekli ve esnek bir web sunucusudur. Apache, 1999’da kurulan Apache SoftwareFoundation(ASF) tarafından geliştirilmektedir. Unix, GNU, FreeBSD, Linux, Solaris, Novell NetWare, Mac OS X, Microsoft Windows, OS/2, TPF ve eComStation işletim sistemleri üzerinde çalışabilmektedir.
İlk Apache sürümü 1 Aralık 1995’ te piyasaya sürülmüş kısa sürede internetin bir numaralı sunucusu haline gelmiştir. İnternet’ teki web sitelerinin %60’ ı Apache üzerinde çalışmaktadır. Aşağıdaki grafikte de görüldüğü üzere Apache sunucular piyasaya sürüldükten sonra kısa sürede popüler hale gelmiştir.
Bu kadar popüler olmasının elbet bir dezavantajı olacaktır. Apache sunucular aldığı saldırılar yönünden de popüler hale gelmiştir.
Bu saldılar çoğunlukla XSS, Info Leakage, Session Management ve SQL Injection yoluyla yapılmaktadır. Apache sunucular en çok XSS açıkları yüzünden saldırıya maruz kalmaktadır.
Apache Kurulumu
1.Adım
İlk önce kütüphanemizi güncelleyelim.
2.Adım
Apache’ yi sistemimize kuralım.
3.Adım
İnternet tarayıcınızdan http://localhost veya 127.0.0.1 adreslerine girdiğinizde karşınıza aşağıdaki gibi bir ekran çıkıyorsa kurulum başarılı bir şekilde sonuçlanmıştır.
4.Adım
Eğer yukarıdaki ekranı göremediyseniz bir sorun var demektir. Apache’ nin çalışıp çalışmadığını kontrol edelim.
Apache yukarıda görüldüğü üzere aktif halde değil. Apache’ yi başlatalım.
Apache aktif olduğu halde http://localhost adresine erişemiyor olabilirsiniz.
Bunun için Apache’ yi restart edip tekrar kontrol edelim.
Apache kurulumu burada sona ermiştir.
Apache Sıkılaştırma Adımları
Apache’ yi ayrı bir kullanıcı hesabı ve grupta çalıştırın
Örneğin, Apache’ yi yapılan başarılı bir saldırı sonucunda saldırgan aynı kullanıcı hesabında bulunan e-posta sunucusuna erişebilir. Tam tersi bir senaryo da işleyebilir. Bu yüzden Apache’ yi kendi kullanıcı hesabı ve grubunda çalıştırmak en doğrusu olacaktır.
Öncelikle Apache için yeni bir grup oluşturalım.
Daha sonra bu gruba yeni bir hesap oluşturalım.
Oluşturduğumuz yeni kullanıcı hesabının içine daha önce bahsettiğimiz gibi Apache sunucuyu kurabiliriz.
Apache’ yi sürekli olarak güncel tutmak
Apache geliştirici topluluğu güvenlik açıklarını kapatabilmek için sürekli çalışmaktadır. Genellikle her ay güncelleme almaktadır. Bu sebepten dolayı Apache’ yi güncel tutmak kesinlikle önemlidir.
İlk önce Apache’ i sürümünü kontrol edelim.
Eğer Apache’ mizin sürümü eskiyse aşağıdaki adımları takip edelim.
Apache sürüm bilgilerini ve diğer bilgileri gizlemek
Apache, varsayılan olarak sürümünü, işletim sistemini ve hangi Apache modüllerinin sunucuda kurulu olduğunu bir hata sonucunda saldırgana söyleyebilir.
Bunu çözmek için ilk önce apache2.conf dosyasını terminalden açalım.
Daha sonra dosyanın sonuna gelerek aşağıdaki gibi iki satırlık kodu ekleyerek kayıt edip çıkalım.
ServerSignature Off ServerTokens Prod
Apache servisimizi tekrar başlatalım.
Gördüğünüz gibi artık sürümü, kullanılan işletim sistemi gibi bilgileri vermemekte.
İhtiyaç duyulmayan modüllerin kapatılması
Apache, çeşitli modüllerle birlikte kurulmaktadır. Aktif durumda bazı modüllere ihtiyacınız olmayabilir.
Bu modülleri aratmak için aşağıdaki kod satırını kullanalım.
Bu sorgudan sonra herhangi bir çıktı alamadıysak açık modül yok demektir.
Eğer alıyorsak aktif modül var demektir. Editörle apache2.conf dosyasının içine girerek ‘LoadModule’ ile başlayan satırların başlarına ‘#’ işaretini koyarak bu satırları yorum satırı haline getirebiliriz. Bu sayede istediğiniz modülü devre dışı bırakabilirsiniz.
Apache’ nin konfigürasyon ve çalıştırılabilir dosyalarına sadece root için okuma izni verilmesi
Apache kurulumunuzun /usr/local/apache olduğunu varsayarak aşağıdaki adımları izleyelim.
Bu kodla apache klasörünü ve alt klasörlerini sahipliğini root olarak değiştirdik.
Bu kodla apache klasörünün ve alt klasörlerinin diğer kullanıcılar tarafından okuma, yazma ve çalıştırma izinlerini kaldırdık.
Timeout değerinin düşürülmesi
DoS(Servis Kullanımını Engelleme) saldırılarının etkilerini azaltmak için Timeout(Zaman aşımı) süresini düşürebiliriz. Timeout süresi varsayılan olarak 300 saniyedir.
Terminalden apache2.conf dosyamızı açıyoruz.
Daha sonra ‘Timeout 300’ yazan yeri aşağıdaki gibi düzeltiyoruz. Bu değeri kendinizde belirleyebilirsiniz.
Timeout 45
Büyük boyutlu isteklerin sınırlandırılması
Apache, bir HTTP isteğinin boyutunu sınırlamaya izin verir. Varsayılan olarak bu değerler çoğu sunucu için uygun değerlere ayarlanmıştır. Yine de bu değerleri değiştirmek gelebilecek saldırıları minimuma indirebilir.
Küçük bir örnek göstermek amacıyla apache2.conf dosyasını açalım.
Örneğin 1 Mb’ın üzerindeki isteklere izin vermiyorsanız aşağıdaki gibi bir kod satırı ekleyebilirsiniz.
LimitRequestBody 1048576
Bu direktife benzer LimitRequestFields, LimitRequestFieldSize ve LimitRequestLine direktiflerini de kullanabilirsiniz.
Mod_security kurulumu
Mod_security, Ivan Ristic tarafından hazırlanmış bir Apache modülüdür. Mod_security ile basit filtreleme, URL kodlama kontrolü, upload hafıza sınırları, reguler exprenssion tabanlı filtreleme gibi ve daha fazlasını yapabiliriz
Mod_security kurulumunu aşağıdaki adımları izleyerek gerçekleştirelim.
Dizin listelemeyi devre dışı bırakmak
Apache’ de varsayılan olarak dizin listeleme özelliği aktif haldedir. Bu özellik saldırganlar tarafından kullanılabilir. Saldırgan bir hata sonucunda veya başka bir yolla kök dizini altındaki dosyalara erişebilir.
Tüm klasör ve alt dizin listelemeyi kapatmak için apache2.conf dosyasını terminalden açalım.
Daha sonra aşağıdaki kod satırlarını ekleyerek kayıt edip çıkalım.
<Directory /> Options FollowSymLinks AllowOverride None </Directory>
Eğer istediğimiz bir dizini listelemeye açmak istiyorsak aşağıdaki kod satırlarına benzer bir yöntem kullanabiliriz.
<Directory /var/www/html/> Options Indexes FollowSymLinks AllowOverride None </Directory>
Apache’ nin sembolik linkleri takip etmesinin engellenmesi
Örnek üzerinden açıklamak gerekirse, /www/test/index.html dosyasına erişmek istediğimizde Apache ilk önce /www adresine daha sonra /www/test adresine son olarak ta /www/test/index.html adresine ulaşmak isteyecektir. Bu doğrulama işlemi ciddi bir zaman kaybına neden olacaktır. Yoğun sitelerde ciddi performans kayıplarına sebep olabilir.
Bu sorunu apache2.conf dosyasına tek satırlık bir kod ekleyerek çözebiliriz.
<Directory > Options -FollowSymLinks </Directory>
Server side include ve CGI çalıştırılmasının kapatılması
Server side include özelliğini kapatabilir ve gerekli değilse CGI’ in çalıştırılmasını engelleyebiliriz.
Terminalden apache2.conf dosyasını açalım.
Daha sonra Directory tagı içerisine kodlarımızı ekleyelim.
<Directory > Options -Includes Options -ExecCGI </Directory>
Klasör içeriği görüntülemenin kapatılması
Bu özelliği apache2.conf dosyasının içerisine ‘Directory’ tagı içerisinde Options –Indexes satırını ekleyerek kapatabiliriz.
<Directory > Options -Indexes </Directory>
XML Body boyutunun sınırlandırılması
Apache sunucunuzda bir XML isteğinin maksimum boyutunu sınırlandırmak isteyebilirsiniz.
Bunun için apache2.conf dosyasının içine aşağıdaki gibi kabul edilecek maksimum XML Body boyutunu belirtebilirsiniz.
LimitXMLRequestBody 10485760
Erişimleri IP adresine göre sınırlama
Apache sunucunuza belirli bir ağdan veya IP adresinden erişilmesini isteyebilirsiniz. Bunun için aşağıdaki adımları uygulamanız yeterli olacaktır.
Apache2.conf dosyamızı terminalden açalım.
Örneğin sunucumuza sadece 166.16.0.0 ile 166.17.0.0 arasında kalan IP adreslerinden erişilmesini istiyoruz.
<Directory > Order Deny,Allow Deny from all Allow from 166.16.0.0/16 </Directory>
Veya sadece 127.0.0.1 IP adresinden erişilmesini isteyebiliriz.
<Directory > Order Deny,Allow Deny from all Allow from 127.0.0.1 </Directory>
SSL Sertifikası ile Apache güvenliğinin sağlanması
SSL sertifikası kullanımının iki farklı yolu vardır. Bunlardan birincisi sertifika isteği oluşturarak geçerli bir sertifika(CA) otoritesi göndermek, ikincisi ise sertifika otoritemizi oluşturarak sertifika taleplerini onaylamaktır.
1.Adım
Gizli anahtar oluşturma
CA için sertifika oluşturma
Web sunucusu için gizli anahtarın oluşturulması
2.Adım
Sunucu için sertifika imzalama isteği
3.Adım
Sertifika Otoritesini(CA) kullanarak CSR’ i onaylama
Gerekli dosya izinlerini verelim
4.Adım
Apache’ i SSL ile başlatalım
Apache KeepAlive özelliğinin ayarlanması
Bu özelliğin dikkat edilmesi gereken önemli bir noktası bulunmaktadır. DoS saldırılarına karşı önlem alırken performanstan önemli ölçüde ödün verebilirsiniz. Apache dokümantasyonuna göre bu özellik istemci performansını %50 oranında azaltmaktadır. Bu yüzden ayarları değiştirirken dikkatli olmakta fayda var.
Öncelikle apache2.conf dosyamızı açalım.
‘MaxKeepAliveRequests 100 ’ ve ‘KeepAliveTimeout 5 ’ yazan satırlardaki değerleri dilediğiniz şekilde değiştirebilirsiniz.
Apache log kayıtlarının incelenmesi
Apache işletim sistemine kurulumundan sonra yaşanan sorunların kullanıcıya bilgi vermesi için bir kaydını tutar. Aslında sadece Apache için değil kurulan bütün eklentilerin log kayıtlarına linux işletim sisteminde ulaşabiliriz.
Bu kayıtlar sunucuda yaşanan problemler hakkında bize detaylı bilgi vermektedir. Bu kayıtları düzenli bir şekilde incelemek sunucu güvenliğini sağlamanızda faydalı olacaktır.
Apache’ nin log kayıtları /var/log/apache2 dizinin altında tutulmaktadır. Genellikle error_log veya error.log isimli dosyalarda kayıt altına alınmaktadır. Terminalden veya editörle bu dosyaları açarak bilgi edinebilirsiniz.
Apache FileETag özelliğinin kapatılması
Apache Etag özelliği birçok hassas bilgiyi istemciye aktarabilmektedir (inode sayısı, Mime Type ve ChildProcess header gibi). Etag bilgilerinin saldırganlar tarafından kullanılmaması için kapatmanızı tavsiye ederiz.
Bunun için apache2.conf dosyasına ‘FileETag None’ satırını eklemeniz yeterli olacaktır.
FileETag None
Yazımızın sonuna gelmiş bulunmaktayız. Bu yazımızda sizlerle Apache nedir?, Kurulumu nasıl yapılır? ve Apache sunucusu nasıl daha güvenli bir hale getirilir? konularını inceledik.
- Fiziksel / GRUB Güvenliği
- Disk Güvenliği
- Dosya Güvenliği
- Kullanıcı Güvenliği
- Root Güvenliği
- Gereksiz Servislerin Kapatılması
- PAM Modülü
- IP Tables
- TCP Wrappers
- ssh Sıkılaştırması
- History Formatının Düzenlenmesi
- BASH Aktivitelerinin Loglanması
- Varnish
- Mod Evasive
- Apache Sıkılaştırması
- PHP Sıkılaştırması