Adım Adım Apache Güvenliği (HERKESİN BİLMESİ GEREKN Bİ GÜVENLİK TİPİ)

M_T_Ç

Katılımcı Üye
5 Haz 2009
591
0
ADIYAMAN
Adım Adım Apache Güvenliği
--------------------------------------------------------------------------------
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):
pw groupadd apache
pw useradd apache -c "Apache Server" -d /dev/null -g apache -s /sbin/nologin
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:
https://tik.lat/fK8XX .
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:
./configure --prefix=/usr/local/apache --disable-module=all --server- uid=apache --server-gid=apache --enable-module=access --enable-
module=log_config --enable-module=dir --enable-module=mime --enable-module=auth
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:
mkdir -p /chroot/httpd/dev
mkdir -p /chroot/httpd/etc
mkdir -p /chroot/httpd/var/run
mkdir -p /chroot/httpd/usr/lib
mkdir -p /chroot/httpd/usr/libexec
mkdir -p /chroot/httpd/usr/local/apache/bin
mkdir -p /chroot/httpd/usr/local/apache/logs
mkdir -p /chroot/httpd/usr/local/apache/conf
mkdir -p /chroot/httpd/www
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
mknod /chroot/httpd/dev/null c 2 2
chown root:sys /chroot/httpd/dev/null
chmod 666 /chroot/httpd/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
ktrace/ktruss/kdump
*BSD
Kernal işleyiş izlemesini aktif eder, kernal trace data'ları gösterir
sotruss
Solaris
Paylaşımdaki library usül çağrılarını izler
strace/ltrace
Linux
Sistem çağrı ve sinyallerini izler
strings
Hepsi
Binary dosyaları içindeki yazdırılabilir kayıtları (string) bulur
trace
AIX
Seçilmiş sistem olaylarını kaydeder
trace (freeware)
HP-UX <10.20
Sistem çağrılarını ve kernal işleyiş izlerini yazdırır
truss
FreeBSD, Solaris, AIX 5L, SCO Unixware
Sistem çağrı ve sinyallerini izler
tusc (freeware)
HP-UX>11
HP-UX 11 içinde istek yapılan sistem işleyiş çağrılarını izler
ldd, strings ve truss komutlarının örnek kullanımları aşağıda gösterilmiştir:
localhost# ldd /usr/local/apache/bin/httpd
/usr/local/apache/bin/httpd:
libcrypt.so.2 => /usr/lib/libcrypt.so.2 (0x280bd000)
libc.so.4 => /usr/lib/libc.so.4 (0x280d6000)
localhost# strings /usr/local/apache/bin/httpd | grep lib
/usr/libexec/ld-elf.so.1
libcrypt.so.2
libc.so.4
localhost# truss /usr/local/apache/bin/httpd | grep open
(...)
open("/var/run/ld-elf.so.hints",0,00) = 3 (0x3)
open("/usr/lib/libcrypt.so.2",0,027757775370) = 3 (0x3)
open("/usr/lib/libc.so.4",0,027757775370) = 3 (0x3)
open("/etc/spwd.db",0,00) = 3 (0x3)
open("/etc/group",0,0666) = 3 (0x3)
open("/usr/local/apache/conf/httpd.conf",0,0666) = 3 (0x3)
(...)
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:
cp /usr/local/apache/bin/httpd /chroot/httpd/usr/local/apache/bin/
cp /var/run/ld-elf.so.hints /chroot/httpd/var/run/
cp /usr/lib/libcrypt.so.2 /chroot/httpd/usr/lib/
cp /usr/lib/libc.so.4 /chroot/httpd/usr/lib/
cp /usr/libexec/ld-elf.so.1 /chroot/httpd/usr/libexec/
truss komutunu kullanarak biz ayrıca aşağıdaki chroot ortamındaki konfigürasyon dosyalarını bulabiliriz:
cp /etc/hosts /chroot/httpd/etc/
cp /etc/host.conf /chroot/httpd/etc/
cp /etc/resolv.conf /chroot/httpd/etc/
cp /etc/group /chroot/httpd/etc/
cp /etc/master.passwd /chroot/httpd/etc/passwords
cp /usr/local/apache/conf/mime.types /chroot/httpd/usr/local/apache/conf/
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:
cp /usr/local/apache/conf/httpd.conf /chroot/httpd/usr/local/apache/co nf/
cp /usr/local/apache/htdocs/index.html.en /chroot/httpd/www/index.html
Dosyaları kopyaladıktan sonra, ********Root Directive'i aşağıdaki şekilde değiştirmeliyiz (/chroot/httpd/usr/local/apache/conf/httpd.conf içinde):
********Root "/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:
truss chroot /chroot/httpd /usr/local/apache/bin/httpd
Truss program sorunun sebebini gösterecektir.Hatalar giderildikten sonra, Aoache sunucumuzu kofigüre edebiliriz.
Apache Konfigürasyonu
İlk adım /chroot/httpd/usr/local/apache/conf/httpd.conf dosyasını kaldırmak ve aynı yere aşağıdakiler ile benzer içerikli yeni bir tane oluşturmaktır:
# Temel ayarlar
ServerType standalone
ServerRoot "/usr/local/apache"
PidFile /usr/local/apache/logs/httpd.pid
ScoreBoardFile /usr/local/apache/logs/httpd.scoreboard
ResourceConfig /dev/null
AccessConfig /dev/null
# Performans ayarları
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
MinSpareServers 5
MaxSpareServers 10
StartServers 5
MaxClients 150
MaxRequestsPerChild 0
# Apache modülleri
ClearModuleList
AddModule mod_log_config.c
AddModule mod_mime.c
AddModule mod_dir.c
AddModule mod_access.c
AddModule mod_auth.c
# Genel Ayarlar
Port 80
User apache
Group apache
ServerAdmin [email protected]
UseCanonicalName Off
ServerSignature Off
HostnameLookups Off
ServerTokens Prod
<IfModule mod_dir.c>
DirectoryIndex index.html
</IfModule>
********Root "/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>
# MIME encoding
<IfModule mod_mime.c>
TypesConfig /usr/local/apache/conf/mime.types
</IfModule>
DefaultType text/plain
<IfModule mod_mime.c>
AddEncoding x-compress Z
AddEncoding x-gzip gz tgz
AddType application/x-tar .tgz
</IfModule>
# Loglar
LogLevel warn
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
ErrorLog /usr/local/apache/logs/error_log
CustomLog /usr/local/apache/logs/access_log combined
# Sanal sunucular
NameVirtualHost *
<VirtualHost *>
********Root "/www/vhosts/www.ebank.lab"
ServerName "www.ebank.lab
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.