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, […]
]]>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, 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.
İlk önce kütüphanemizi güncelleyelim.
Apache’ yi sistemimize kuralı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.
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.
Ö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 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, 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.
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 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.
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
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, 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.
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>
Ö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 ö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>
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>
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
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ı 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.
Gizli anahtar oluşturma
CA için sertifika oluşturma
Web sunucusu için gizli anahtarın oluşturulması
Sunucu için sertifika imzalama isteği
Sertifika Otoritesini(CA) kullanarak CSR’ i onaylama
Gerekli dosya izinlerini verelim
Apache’ i SSL ile başlatalım
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 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 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.
Linux sistemlerde disk güvenliğini sağlamak için alınması gereken önlemlerden ilki klavyenizi başkasına teslim etmemek olmalıdır. Bilgisayarınıza fiziksel erişim sağlanırsa ne kadar sağlam bir password’e sahip olursanız olun saldırgan hard diskinizi başka bir bilgisayara takarak da erişim sağlayabilir. Disk yani veri güvenliği için kişisel bilgisayarın fiziksel güvenliğinin tüm teknik önlemlerden önce geldiği unutulmamalıdır. Sonrasında ise disk […]
]]>Linux sistemlerde disk güvenliğini sağlamak için alınması gereken önlemlerden ilki klavyenizi başkasına teslim etmemek olmalıdır. Bilgisayarınıza fiziksel erişim sağlanırsa ne kadar sağlam bir password’e sahip olursanız olun saldırgan hard diskinizi başka bir bilgisayara takarak da erişim sağlayabilir. Disk yani veri güvenliği için kişisel bilgisayarın fiziksel güvenliğinin tüm teknik önlemlerden önce geldiği unutulmamalıdır.
Sonrasında ise disk şifreleme teknolojisi kullanılarak verilerinizi izinsiz erişimlerden koruyabilirsiniz. Disk encryption, network üzerinden gelen saldırılara karşı bir korunma yöntemi değildir. İnternete bağlı olduğumuz her an zararlı bir yazılım indirebilir veya zararlı bir siteye giriş yapabiliriz. Yani diski şifrelemek aslında verileri sadece fiziksel erişimlere karşı korur. Disk parolasını oluştururken yapay zeka yardımıyla tahmin edilemez, güçlü ve aynı zamanda akılda kalıcı olmasına dikkat edilmelidir. Tüm güvenlik önlemlerini aldınız ve diskinizi sağlam bir parola ile koruyorsunuz. Acil bir durum olduğunda ve bilgisayarınızın başından kalkmanız gerektiğinde belli bir süre sonra aktifleşen bir ekran kilidiniz yoksa aldığınız tüm önlemleri çöpe attınız demektir.
Disk encryption, çeşitli side channel attack’lara karşı zafiyetlidir. Örneğin bilgisayar kapatıldığında kısa süreliğine RAM içinde bulunan bilgilere RAM’inizi fiziksel olarak ele geçiren birisi başka bir bilgisayara takarak ulaşabilir. Bu işlemi RAM içindeki verinin kaybolma süresini uzatmak için RAM’i fiziksel olarak dondurarak gerçekleştirdiğinden saldırı cold boot attack olarak adlandırılır.
Linux sistemlerde disk encryption işlemi sistem kurulumunda veya sonrasında yapılabilir. Kurulum aşamasında disk encryption yapmak için usb stick veya dvd’den boot işlemini başlattıktan sonra kurulum talimatlarını takip ederek kolaylıkla yapılabilirsiniz.
Kurulum esnasında diski şifrelediğimizde işletim sistemi çalışmadan önce doğru encryption key girilerek diski aktif hale getirilir. Kurulum tamamlandıktan sonra disk unlocked olmadan önce bilgisayar çalışmayacaktır.
Kurulum sırasında yapmayı unuttup sonradan fikrinizi değiştirdiyseniz de Linux tabanlı işletim sistemleriyle gelen Linux Unified Key Setup (LUKS)’tan faydalanabilirsiniz.
Linux makinelerde disk şifreleme işlemi için dm-crypt (device-mapper crypto target) özelliğini LUKS ile birlikte kullanacağız. Dm-crypt, aygıtların şifrelenmesini kernel crypto API kullanarak sağlar.
LUKS yardımıyla şifreleme yapmak için cryptsetup yardımcı programını indirelim.
Debian/Ubuntu kullanıcıları için;
apt-get install cryptsetup
Disk üzerinde herhangi bir işlem yapmadan önce sistemin yedeğini almayı unutmayalım. Yedek aldıktan sonra /dev/sdb diskini şifreleyelim.
sudo cryptsetup -y -v luksFormat /dev/sdb
luksOpen, doğru password girildiği takdirde şifrelenmiş disk bölümünü açar ve verilen yeni isim ile bir mapping oluşturur.
ls -l /dev/mapper/cryptdisk
komutu ile oluşturduğunuz mappingi görebilirsiniz.
Dosya sistemini oluşturup diğer sistemlerde olduğu gibi diski mount ediyoruz.
mkfs.ext4 /dev/mapper/cryptdisk
mount /dev/mapper/cryptdisk /data
Son olarak şifrelenmiş diski luksClose ile kapatabilirsiniz.
cryptsetup luksClose /dev/mapper/cryptdisk
Linuc sistemlerde disk güvenliğini sağlamak için ekstra bir güvenlik önlemi için fstab biçimlendirme dosyasını kullanabiliriz. Fstab işletim sisteminizin değiştirilebilir bir dosya sistemi tablosudur. Sabit disk bölümlerini sisteme bağlama (mount) işleminin otomatik olarak gerçekleşmesini sağlayan ayar dosyasıdır. Mount işlemi, diskteki bir bölümün dosya sisteminde oluşturulan başka bir dizine bağlanma işlemidir. Böylece disk bu dizin üzerinden erişime açılmış olur.
fstab dosyasında belirtilen bağlanma noktası diskin varsayılan bağlanma noktasıdır. Yani herhangi bir bağlanma noktası verilmeden mount komutu çalıştırılırsa dosya içinde tanımlı olan bağlantı noktası geçerli olur.
Bağlama işlemini alışılmışın dışında başka bir dizine yaptığımızda ilk denemede ele geçirilememiş olacaktır. Böylece ekstra bir güvenlik önlemi almış ve zaman kazanmış oluruz. Kullanıcıların home dizinini bir disk bölümüne bağlamak için fstab dosyasına /dev/sdc /home ext4 defaults,nosuid,noexec 1 2 satırını ekleyelim.
/dev/sdc : aygıt ismi
/home : bağlanma noktası
ext4 : bağlanacak dosyanın türü
defaults, nosuid, noexec : nosuid ile home dizinine suid erişimine izin verilmez. noexec ile binary dosyaların çalışması engellenir.
1 : dump alanı. 1 ve 0 değerlerini alır. Yedekleme yapılıp yapılmayacağını belirtir.
2 : yeniden başlatılan sistemlerde denetimdeleri belirler. 0 denetim yapmaz. 1 root için, 2 ise diğer dizinler içindir.
echo "/dev/sdc2 /home ext4 defaults,nosuid,noexec 1 2 " >> /etc/fstab
daha sonra
mount - a
komutu ile diski bağlayabilirsiniz.
SSH Nedir SSH (Secure Shell) güvenli veri iletimi için kriptografik ağ protokolüdür. SSH bağlantısı bilgisayar-bilgisayar, bilgisayar-sunucu, sunucu-sunucu arasında yapılabilir. SSH uzak kabuk üzerinde yetkili bir metin tabanlı arayüz sağlar. SSH bağlantısı kurulduktan sonra, yerel terminal yazdığınız tüm komutlar şifreli SSH tüneli aracılığıyla uzak sunucuya gönderir ve terminal komutlarınız orada yürütülür. SSH istemci-sunucu modelini kullanır. Standart […]
]]>SSH Nedir
SSH (Secure Shell) güvenli veri iletimi için kriptografik ağ protokolüdür. SSH bağlantısı bilgisayar-bilgisayar, bilgisayar-sunucu, sunucu-sunucu arasında yapılabilir. SSH uzak kabuk üzerinde yetkili bir metin tabanlı arayüz sağlar. SSH bağlantısı kurulduktan sonra, yerel terminal yazdığınız tüm komutlar şifreli SSH tüneli aracılığıyla uzak sunucuya gönderir ve terminal komutlarınız orada yürütülür. SSH istemci-sunucu modelini kullanır. Standart TCP portu olan 22 SSH bağlantısı için atanmıştır.
Bu kılavuzda, SSH sıkılaştırması için en iyi olan bazı temel güvenlik uygulamaları hakkında örnekler yer alacaktır.
SSH Bağlantısı Nasıl Kurulur?
Temelde iki bağlanma yöntemi mevcuttur. Bunlardan birincisi kullanıcı adı ve şifre ile oturum sağlandığı yöntemdir, ikincisi ise SSH key ( SSH açık / gizli anahtar ) yardımı ile oturumun sağlandığı yöntemdir. Şifre oturumları yeni kullanıcılar için anlaşılması kolaydır. Ancak, otomatik botlar ve kötü niyetli kullanıcılar genellikle art arda şifre denemeleri ile güvenlik tavizlerine yol açabilir. Bu yöntem yerine SSH anahtarı yardımı ile oturum sağlanmasını öneriyoruz. Bu yöntemde özel ve genel anahtar çifti kimlik doğrulama öncesinde oluşturulur. Ortak anahtar herkes ile paylaşılabilirken, özel anahtar kullanıcı tarafından güvende tutulmalıdır.
Bu bağlantı yöntemleri dışında SSH versiyonuna göre oturum sağlamak için kullanılabilecek birkaç yöntem daha bulunmaktadır.
( Solda SSH v2, sağda ise SSH v1’i görmektesiniz. )
SSH Sıkılaştırması Yöntemlerinden Bazıları
SSH Sıkılaştırması Uygulaması
Öncelikle elimizdeki sunucuya veya ev bilgisayarına SSH bağlantımızı açalım.
Örnek komut:
ssh [email protected]
SSH oturumundayız, klavuzda Ubuntu 14.04.5 LTS kullanacağım, komular işletim sistemine göre farklılık gösterebilir. Sistemde cagatay adlı bir kullanıcı olduğunu varsayıyoruz. Kullandığınız sistemde kendi isteğiniz doğrultusunda ismini yazabilirsiniz.
sudo apt-get install openssh-server
Terminalden:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.factory-defaults sudo chmod a-w /etc/ssh/sshd_config.factory-defaults
Terminalden:
sudo vi /etc/ssh/sshd_config
Ayarlarımıza sırasıyla standart portu değiştirerek başlıyoruz:
Yorum satırı halinde olan ( ‘#’ yorum satırı anlamına gelmektedir ) PasswordAuthentication yes satırını yorum’dan çıkartıp yes olan parametreyi no yapıyoruz.
PermitRootLogin’i no olarak değiştirerek yapabilirsiniz.
Yeni bir terminal sayfasında: ( SSH oturumunu kapatmayınız )
ssh-keygen -t rsa -b 4096
Yukarıdaki komut kendi bilgisayarınızda açık ve gizli olmak üzere iki anahtar üretecektir. Açık anahtarı şu şekilde bulabilirsiniz:
cat ~/.ssh/id_rsa.pub
Yukarıdaki anahtarı görüntülediğimiz terminal’den sunucuda SSH oturumumuz olan terminal’e geçiyoruz, aşağıdaki ayarlamayı yapıyoruz.
AuthorizedKeysFile satırını yorum satırı durumundan çıkartıyoruz.
Kendi açık anahtarımızı SSH dizinindeki authorized_keys’e ekliyoruz.
Terminalden: ( Sunucuda )
sudo vi ~/.ssh/authorized_keys
Açık anahtarımızı kaydedip çıkıyoruz.
/etc/ssh/sshd_config dosyasını tekrardan açıyoruz
Terminalden: ( Sunucuda )
sudo vi /etc/ssh/sshd_config
Aşağıdaki kodları dosyanın en altına ekliyoruz.
Subsystem sftp internal-sftp Match group sftponly ChrootDirectory /home/%u X11Forwarding no AllowTcpForwarding no ForceCommand internal-sftp
Yukarıda verilen yöntemler sayesinde SSH oturumu açmış kullanıcıların kendi dizinlere etkiyebilmesini sağladık. Standart olarak SSH 22. porttan çalışmaktaydı, onu değiştirdik. Şifre ile oturum açmayı engelledik bu giriş yöntemi yerine daha güvenli olarak önerilen SSH anahtarını kullandık. Sistemimize tünelleme aracılığı ile sağlanabilecek uzak masaüstü bağlantılarını engelledik. Hiyerarşik bir ağ yapısında olduğu varsayılan sunucumuza daha yetkili üst makinalardan erişimi kısıtladık. Sisteme kullanıcı olarak oturum elde etmiş kullanıcıların root yetkilerine erişimini engelledik. SSH bağlantınızı daha güvenli hale getirmek için port spoofing, port knocking ve two factor authentication ( iki aşamalı oturum onayı ) kullanabilirsiniz.