Bu makale, Apache13.xx versiyon web sunucularının, yazılımda yeni açıkları bulunduğunda başarıya ulaşabilecek saldırılardan korunmak ya da bunları en aza indirmek için nasıl kurulacağını ve konfigure edileceğini adım adım göstermektedir.
Fonksiyonellik
Apache'nin güvenliğini almaya başlamadan önce, sunucudan hangi fonksiyonları beklediğimizi belirlememiz gerekmekte.Apache'nin kullanım değişkenliği, her şartta sunucu güvenliğini almak için kullanılacak genel prosedürler yazılmasını oldukça zorlaştırmaktadır. Bu sebeple makalemizde aşağıdaki fonksiyonları temel alacağız:
Web sunucusu İnternet üzerinden erişilebilir olacak, ve; Sadece statik HTML sayfaları sunulacak, Sunucu isim tabanlı sanal hosting mekanizmasını destekleyecek, Belirli web sayfalarına, sadece seçilmiş IP adresleri erişebilir olacak (temel doğrulama); Sunucu tüm web isteklerini (web browser bilgileri de dahil olmak üzere) loglayacak, Özellikle belirtmek gerekir ki; yukarıdaki model, PHP, JSP, CGİ ya da herhangi interaktif web servisini sağlayan teknolojileri desteklemez. Bu teknolojilerin kullanımı daha fazla güvenlik tehlikelerini beraberinde getirir, önemsiz küçük scriptler köklü sunucu güvenlik seviyesi düşüklüklerine yol açabilir. Neden mi? İlk olarak, ASP/CGI uygulamaları güvenlik açıkları içerebilirler (örnek olarak SQL enjeksiyonlar, bölüm atlama kodlamaları). İkinci olarak, teknoloji kendi kendine tehlikeli olabilir (PHP' de ki açıklar, Perl modülleri vb.). Bu sebeple şiddetle tavsiyem, bu gibi interaktif servisler, web sayfalarında eğer gerekli ise kullanılmalıdır.
Güvenlik Gereklilikleri
Her bilgisayar projesinin en önemli birincil unsuru, güvenlik gerekliliklerinin belirlenmesidir. Bu gereklilikler, proje hayata geçirilmeden önce tamamı ile belirlenmelidir. Web sunucumuz için güvenlik gereklilikleri aşağıdaki gibi olacaktır;
Lokal ve uzaktan saldırılara karşı, işletim sistemi mümkün olduğunca sertleştirilmelidir; Sunucu, http (port 80/TCP) haricinde, network servislerine sunulmamalıdır; Sunucuya uzaktan erişim, dış kaynaklardan gelecek bağlantıları ret edecek ve sadece iç kaynaktan (web üzerinden) gelecek http port 80/ TCP bağlantılarına izin verecek bir firewall ile kontrol edilmelidir; Apache Web sunucusu, sistem üzerinde sadece servis kullanılabilir durumunda bulunmalıdır; Sadece ve kesinlikle önemli apache modülleri aktif olmalıdır; Herhangi bir diagnostik Web sayfası ve otomatik uzantı indeksleme servisi kapatılmış olmalıdır; Sunucu, kendine ait bilgileri asgari düzeyde ifşa etmelidir (gizleyerek, güvenlik); Apache sunucusu, başka bir sistem işleyişi tarafından kullanılmayan tek bir UID/GID altında çalışıyor olmalıdır; Apache'nin işleyişleri sistem dosyalarına kısıtlı giriş yetkisine sahip olmalı; ve, Apache'nin sunum çevreselleri içinde (/bin/sh, /bin/csh vb.) çekirdek programlar sunulmamalıdır. İşletim Sisteminin Yüklenmesi
Apache'nin yüklenmesinden önce, hangi sunucunun çalışacağına bağlı olarak işletim sistemini seçmeliyiz. Bu noktada çok geniş bir seçim alanına sahibiz, çünkü Apache neredeyse tüm işletim sistemlerinde çalıştırılabilmektedir. Makalenin geri kalan kısımlarında ise, Apache web sunucusunun FreeBSD sistemlerde nasıl güvenlik altına alınacağı tarif edilecektir ki bu metotlar aynı zamanda çoğu UNIX/Linux sistemlerde de uygulanabilir. Tavsiye etmediğim tek işletim sistemi ise MS Windows � temel olarak sebebi ise Apache'nin güvenliğini almaktaki kapasite yetersizliğidir. Web sunucunun güvenliğini sağlamaktaki ilk adımımız, işletim sistemini güçlendirmektir. A İşletim sistemini sağlamlaştırmayı tartışmak, bu makalenin de gizli amaçlarındadır. Ancak, Internet üzerinden, bunun nasıl yapılacağına dair bir çok doküman bulabilirsiniz. Bu başlıkla ilgili olarak, okuyucular kendi tecrübelerini kullanabilirler. İşletim sistemi yüklendikten ve sağlamlaştırıldıktan sonra, yeni grup ve "apache" isminde uygun kullanıcı eklemek zorundayız, (FreeBSD sistemlerden örneklenmiştir):
Default olarak, Apache işleyişi nobody kullanıcısının özel hakları ile birlikte çalışır (root hakları ile birlikte çalışan ana işleyiş hariç ) ve nogroup grubunun GID'i dir. Bu ise, belirli bir güvenlik açığına sebebiyet vermektedir. Başarılı bir saldırı sonucu giriş yapan, aynı UID/GID altında çalışan tüm diğer işleyişlere erişim hakkı sağlayabilir.En iyi çözüm, yazılıma bağlı olarak apache'yi UID/GID altında oluşturulmuş tek bir kullanıcı/grup altında çalıştırmaktır.
Yazılımı Hazırlamak
Sonraki adım ise Apache Web server 'ın son versiyonunu download etmektir Bazı Apache'lerin opsiyonları derlenme zamanları ile oranlıdır, bu sebeple açık kod olarak download etmek önem kazanmaktadır. Download ettikten sonra bunu unpack etmemiz gerekiyor. Bundan sonra ise hangi modüllerin aktif olacağına karar vermemiz gerekiyor. Bütün modüller hakkında k ısa bir açıklama Apache'nin son versiyonunda mevcut durumda ve bu link te bulunabilir: http://httpd.apache.org/docs/mod/.
Apache Modülleri
Modüllerin seçimi, Apache'nin güvenliğini sağlamaktaki önemli adımlardan biridir.Şu kuralla devam edebiliriz, "ne kadar az, o kadar iyi" Fonksiyonellik ve Güvenlik Gerekliliklerinin sağlanabilmesi için, aşağıdaki modüller aktif olarak bırakılmalıdır:
Modül ismi / Tanımlama
httpd_core Apache'nin temel özelliğidir, her Apache kurulumunda istenir.
mod_access Client host ismi, IP adresi ya da client'ın diğer karakteristik özeliklerini esas alarak erişim izni sağlar. Çünkü bu modül, "order", "allow" ve "deny" talimatlarını kontorl etmekte kullanılır, kesinlikle aktif olmalıdır.
mod_auth Fonksiyonel gerekliliklerde açıklanan, text dosyası kullanarak kullanıcı doğrulaması işlemi (HTTP temel doğrulama) isteklerini gerçekleştirmek için gereklidir.
mod_dir Dizin index dosyalarını ("index.html, "default.htm" gibi) aramak ve sunmak için gereklidir.
mod_log_config Sunucuya yapılan istekleri loglamak için gereklidir.
mod_mime Karakter ayarı, içerik- kodlama, taşıma, içerik-dil, ve MIME doküman tipleri ayarlamaları için gereklidir.
Diğer tüm Apache modülleri pasif edilmelidir. Hepsini kapatabiliriz çünkü onlara ihtiyacımız yok. İhtiyaç duyulmayan modülleri kapatarak, bu modüllerde ortaya çıkacak yeni güvenlik açıkları yolu ile sisteme sızmaları önlemiş oluruz. Özellikle belirtmek gerekir ki, 2 Apache modülü diğerlerine göre oldukça tehlikelidir: mod_autoindex ve mod_info. İlk modül otomatik dizin indexlemesi sağlamak için kullanılır, ve default olarak aktiftir. Eğer apache sunucu üstünde çalışır durumda ise bu modülü kontrol etmek oldukça kolaydır (örn.http://server_name/icons/) ve index dosyası bulunamadığında web sunucusu dizinlerinin içerikleri alınabilir. İkinci modül ise, mod_info, internet üzerinden erişilebilir olmamalıdır, temel sebebi ise Apache sunucu konfigürasyonunu gösterir. Diğer bir soru ise modüllerin nasıl derleneceğidir. Kalıcı metot en iyi seçim gibi gözüküyor.Eğer Apache'de yeni açıklar bulunursa, biz de muhtemelen açık olmayan modülü değil de, tüm yazılımı tekrar derleriz. Kalıcı metodu seçerek, bir modülü daha pasif yapma ihtiyacımız doğmaktadır - mod_so.
Yazılımın Derlenmesi
Her şeyden önce herhangi bir güvenlik yaması � eğer varsa � uygulanmalıdır. Sonra sunucu aşağıdaki gibi derlenmeli ve yüklenmelidir:
make su umask 022 make install chown -R root:sys /usr/local/apache
Sunucu yetkilendirme
Diğer adım dosya sistemine Apache işlemlerinin erişim yetkilerini kısıtlamaktır. Bunu da sunucunun ana damemon'unun (httpd) yetkilendirmesi ile yapabiliriz. Genellikle, yetkilendirme tekniği yeni bir root dizini yapısı oluşturmak, tüm daemon dosyalarını bunu içine taşımak ve yeni yapı içinde uygun daemon 'u çalıştırmak anlamına gelmektedir.Bunun için daemon ve alt işleyişlerine teşekkür etmemiz gerekir, çünkü sadece yeni root dizinindeki yeni yapıya giriş izni verirler. Yeni işleme, /chroot/httpd dizni altında yeni bir root dizin yapısı oluşturarak başlıyoruz:
Yukarıda bulunan tüm dizinlerin sahibi root olmalıdır ve giriş izni hakları 0755' e ayarlanmalıdır. Sonra, özel bir aygıt dosyası oluşturacağız: /dev/null:
ls -al /dev/null crw-rw-rw- 1 root wheel 2, 2 Mar 14 12:53 /dev/null
/chroot/httpd/dev/log aygıtı olarak oluşturulacak değişik bir metot için, ki bu FreeBSD sistemlerde sunucunun doğru ve uygun çalışması için ihtiyaçtır, aşağıdaki satıra şu kodlar eklenmelidir /etc/rc.conf:
syslogd_flags="-l /chroot/httpd/dev/log"
Sistemi tekrar başlatmalıyız ya da syslogd daemon değişikliklerin sonucu olarak bunu kendi kendine yapacaktır. FreeBSD'den başka bir sistemde /chroot/httpd/dev/log aygıtı yaratmak için geçerli kullanım manuallerine bakmak gerekecektir.(man. syslogd). Sonraki adım ise ana httpd programını, gerekli tüm library ve binary dosyaları ile birlikte yeni dizin ağacı içine kopyalamaktır. Bunu yaparken, gereken tüm dosyaların bir listesini yapmalıyız. Bu tip bir listeyi aşağıdaki komutları kullanarak yapabiliriz (komutların gereklilikleri işletim sistemlerine bağlıdır):
Komut / Uygulanabilir sistem / Tanım
ldd Hepsi Uygulanabilir dosya ya da paylaşımdaki library dosyalarının dinamik bağımlığını listeler
Yukarıdaki komutlar sadece httpd programına değil, diğer tüm gerekli binary ve library dosyalarına uygulanmalıdır (library dosyaları sık sık diğer library dosyalarını gerektirir). FreeBSD sistemlerde, aşağıdaki dosyalar yeni root dizin yapısına kopyalanmalıdır:
Not /chroot/httpd/etc/passwords "nobody" ve "apache" hariç diğer tüm satırlar kaldırılmalıdır. Benzer bir yöntemle, /chroot/httpd/etc/group dizininden "apache" ve "nogroup" hariç diğer tüm satırları da kaldırmalıyız. Sonra, aşağıdaki şekilde şifre veritabanı yapılandırmamız gerekmektedir:
cd /chroot/httpd/etc pwd_mkdb -d /chroot/httpd/etc passwords rm -rf /chroot/httpd/etc/master.passwd
Sonraki adım ise, eğer httpd sunucusu yeni yapılandırılmış bölümde doğru çalışıyorsa, test etmektir. Bunu yapmak için, default Apache konfigürasyon dosyası ve ve örnek bir index.html dosyasını aşağıdaki dizinin altına kopyalamalıyız:
Dosyaları kopyaladıktan sonra, DocumentRoot Directive'i aşağıdaki şekilde değiştirmeliyiz (/chroot/httpd/usr/local/apache/conf/httpd.conf içinde):
DocumentRoot "/www"
Sonra sunucuyu çalıştırmaya çalışalım:
chroot /chroot/httpd /usr/local/apache/bin/httpd
Herhangi bir sorun olması halinde tavsiyem Apache log dosyalarının tam olarak çözümlenmesidir (/chroot/httpd/usr/local/apache/logs). Alternatif olarak aşağıdaki komutlar kullanılabilir:
Port 80 User apache Group apache ServerAdmin Webmaster@www.ebank.lab UseCanonicalName Off ServerSignature Off HostnameLookups Off ServerTokens Prod <IfModule mod_dir.c> DirectoryIndex index.html </IfModule> DocumentRoot "/www/vhosts"
# Erişim Kontrolü
<Directory /> Options None AllowOverride None Order deny,allow Deny from all </Directory> <Directory "/www/vhosts/www.ebank.lab"> Order allow,deny Allow from all </Directory> <Directory "/www/vhosts/www.test.lab"> Order allow,deny Allow from all </Directory>
Yukarıdaki konfigürasyon, fonksiyonellik ve güvenlik gerekliliklerini içeren önemli komutları kapsamaktadır. Konfigürasyonda sunulan, web sunucusu tarafından desteklenen 2 adet virtual host:
Yukarıdaki dizinler, Apache sunucusu ilk kez çalıştırılmadan önce yaratılmış olmalıdır � aksi halde Apache doğru çalışmayacaktır. Yukarıdaki dizinlerin sahibi mutlaka root olmalıdır, sys, haklar 0755' e ayarlanmış olmalıdır. Apache'nin default konfigürasyon dosyası ile karşılaştırdığımızda aşağıdaki değişikliklerin yapılmış olduğu görülmektedir:
Aktif modüllerin sayısı hatırı sayılır şekilde azaltılmıştır. Apache Versiyonu ile ilgili bilgileri açığa vurmamaktadır (Sunucu İzleri, Sunucu İmzası) Apache'nin işleyişleri (root işleyişi hariç) bir tek geçerli kullanıcının/grubun ayrıcalıkları ile uygulanabilir olarak ayarlanmıştır. (Kullanıcı, Grup) Apache sadece konfigürasyon dosyasında açık olarak belirlenmiş dosyalar olan dizinler, alt dizinler ve dosyalara erişim izni verecektir.(Dizin, erişim); Diğer tüm istekler default olarak ret edilecektir. Apache http istekleri hakkında daha fazla bilgiyi log tutacaktır. Son Adımlar
Son olarak, içeriği aşağıdaki ile aynı olan "apache.sh" adında bir başlat script'i yaratmalıyız:
Yukarıdaki script, (UNIX sistemlere bağlı olarak) başlat scriptlerinin bulunduğu uygun dizinin altına kopyalanmalıdır. FreeBSD sistemlerde bu dizin /usr/local/etc/rc.d dizinidir.
Özet
Yukarıdaki metotlar, default olarak kurulan Apache sunuculardan çok daha yüksek güvenlik seviyeleri elde etmek için uygulanmalıdır.
Yazar
Artur Maj güvenlik danışmanı olarak Avrupa Network Güvenlik Enstitüsünde çalışmaktadır. Solaris Administrator Güvenlik Rehberi için Yardımcı Otoritedir, adım adım rehberi de SUN Solaris işletim sistemlerine saldırılardan korunmak amacı ile hazırlanmıştır. Yazar, hali hazırda internet bankaları, devlet enstitüleri ve çeşitli organizasyon ve şirketler için güvenlik denetlemeleri yapmaktadır.