TR | Linux PHP Sıkılaştırma
PHP Sıkılaştırma
Linux sistemlerimiz üzerinde yüklediğimiz PHP için başlangıçta gelen ayarlara ek olarak bazı değişiklikler yapmamız gerekmektedir.Default olarak gelen ayarlar kısmında güvenlik konusunda eksiklikler bulunmaktadır ve bunların bilinçli bir şekilde giderilmesi gerekmektedir.Bütün bu işlemlere başlamadan önce ilk hedefimiz düşmanımızı tanımak olmalıdır.Bu anlamda karşıdan bize gelebilecek olan saldırı türleri ve detayları hakkında ne kadar çok bilgi sahibi olursak kendimizi koruma konusunda o kadar başarılı oluruz.Sadece başlıklar halinde bahsetmek gerekirse zaafiyetler aşağıdaki gibi listelenebilir
- Full Path Disclosure
- Arbitrary File Upload
- Arbitrary File Delete
- Arbitrary File Download
- Local File Inclusion
- Remote File Inclusion
- Cookie Injection
- Header Injection
- Sql Injection
- Xml Injection
- XXE Injection
- Email Injection
- Html Injection
- Xpath Injection
- Code Injection
- Command Injection
- Object Injection
- Cross Site Scripting
- Cross Site Request Forgery
- Broken Authentication and Session Management
Evet ilk adımı gerçekleştirdik.Şimdi ise PHP yüklendiği zaman hazır gelen modülleri inceleyelim.Burdaki amacımız PHP modülleri arasında bizim ihtiyacımız olmayanları bulmak ve onları ihtiyacımız olana dek kaldırmaktır.
php -m
Burada listelenenler arasından kaldırmak istediğimiz modülü 3 farklı şekilde kaldırabiliriz.
– rm komutu ile silebilirsiniz
– mv komutu ile adını değiştirebiliriz
– config ayarlarını değiştirerek disable edebiliriz.
Fakat burada belirtilen bütün modülleri kaldırmamıza PHP izin vermemektedir.Bunun için yapmamız gereken ilk kurulumda yüklenilmesi istediğimiz modülleri belirterek bu işlemi gerçekleştirmektir.
Bu adımı da hallettikten sonra şimdi sahip olduğumuz PHP’nin dışarıya bilgi sızdırmasını engellemeye çalışacağız.Bunun için php.ini dosyası içinde yer alan expose_php özelliğini
expose_php=off
şeklinde değiştiriyoruz.Burdaki amacımız PHP’nin dışarıya hangi server üzerinde çalıştığımız,hangi PHP versiyonunu kullandığımızı gibi bilgileri vermesini engellemektir.
PHP üzerinde bir hata oluştuğu zaman bu hatayı hata mesajı şeklinde dışarıya vermemek için yine php.ini içinde display_errors özelliğini disabled etmemiz gerekmektedir.
display_errors=Off
Disable ettiğimiz bu hata mesajlarını daha sonra log_erros özelliğini aktif ederek log kayıtları şeklinde tutmamız gerekmektedir.
log_errors=On error_log?/var/log/httpd/php_scripts_error.log
Daha sonra yine php.ini dosyası içindeki file_uploads özelliğini kapatmamız gerekmektedir.
file_uploads=off
Burdaki amacımız dışarıdan bizim istediğimiz dışında dosya girişine izin vermemek ve bunu en basit yoldan engellemektir. Projemizde dışarıdan dosya alımı gibi bir işlev kullanmamız gerektiğini farzedelim.Bu gibi durumlarda yapmamız gereken file_upload özelliğini aktif etmek ve buna ek olarak dışarıdan gelen dosyaların maksimum boyutlarını belirtmemiz gerekmektedir.
file_uploads=On upload_max_filesize=1M
Yukarda bahsi geçen saldırı çeşitlerinden RFI saldırısına karşı önlem almak amacıyla php.ini dosyası içerisinde yer alan allow_url_fopen ve allow_url_include özelliklerinin kapatılması gerekilmektedir
allow_url_fopen=Off allow_url_include=Off
Yine aynı şekilde php.ini dosyası içerisinde yer alan sql.safe_mode özelliğini de aktif etmememiz gerekmektedir.
sql.safe_mode=On
Bunu özellliği aktif hale getirdiğimiz zaman mysql_connect,mysql_pconnect gibi fonskiyonlar dışarıdan gelen argümanları göz ardı ederek sadece başlangıçta bizim tanımladığımız parametrelere göre hareket etmektedir.
Sonraki adımda yapmamız gereken POST işlem boyutlarını kontrol sınırlamaktır.Bunun için yapmamız gereken php.ini dosyası içerisinde post_max_size ifadesine değer atamaktır.
post_max_size=1K
Bunu yapmaktaki amacımıza gelecek olursak eğer karşımızda kötü niyetli bir kullanıcı varsa,bizim sistemimize boyutu çok büyük bir POST isteği atmayı deneyebilir ve böylece bizim kaynaklarımızı sömürmüş olur.Bİzde bu ve bunun gibi durumlardan kaçınmak için bunun üst sınırını belirleyerek önlem alırız.
Şimdi ise sahip olduğumuz kaynakların kontrolünü sağlamak için yine php.ini dosyası içindeki bazı değerleri belirleyeceğiz.
max_execution_time = 30 max_input_time = 30 memory_limit = 40M
Yukarıdaki işlemlerde bir PHP scriptinin maksimum çalışma zamanını,yine bu script için maksimum input süresini belirlemiş olduk.Son olarak ise bir PHP scriptinin tüketebileceği maksimum hafıza miktarı için limit belirleyerek kontrolsüz bir şekilde bir PHP sayfasının kaynaklarımızı harcamasına engel oluyoruz.
Bir sonraki güvenlik önlemi olarak PHP içinde yer alan ve tehlikeli olarak adlandırılan fonskiyonları kaldırmaktır.Bunun için php.ini dosyasında aşağıdaki ayarları yapmamız gerekmektedir.
disable_functions =exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
Buradaki amacımızdan bahsetmeden önce burda kullanılan fonksiyonlardan bazılarından bahsedelim.
shell_exec fonksiyonu kabuk üzerinde komut çalıştırılmasını sağlar ve çalışan komutun çıktısını geri döndürür.
curl_exec fonksiyonu bir curl oturumunu işleme sokar
parse_ini_file fonksiyonu ise bir yapılandırma dosyasını çözümler.
Evet bazı fonksiyonlardan bahsettik ve gördüğünüz üzere bu fonksiyonlar dışarıdan sistem üzerinde komut çalıştırılması,dışarıya bilgi çıkarılması gibi tehlikeli durumlara sebep olabilmektedir.Bu yüzden bu fonskiyonların disabled edilmesi gerekmektedir.
Şimdi ise PHP’nin hangi klasör yapısı altında çalışmasına izin verileceğini belirlememiz gerekmektedir.Tek klasör altında çalışmasına izin verilebileceği gibi birden fazla klasör altında çalışmasına izin de verilebilir.Bunun için php.ini dosyası içerisinde
open_basedir="/var/www/html"
şeklinde düzenleme yapabiliriz.Böylelikle bu klasöre yetkisi olmayan kişilerin sistem üzerinde PHP kodlarını çalıştırmasını engellemiş oluruz.
PHP üzerinde gerçekleşen session işlemlerinin kayıtlarının tutulduğu bir dizin vardır.Bu dizin bütün kullanıcılara açık bir dizin ise session ile ilgili bilgileri başkalarının da okumasına olanak sağlar.Bu durumdan korunmak için php.ini dosyası içinde aşağıdaki değişikliği yaparız.
session.save_path="/var/lib/php/session" upload_tmp_dir="/var/lib/php/session"
Daha sonra belirlediğimiz yolu sadece root yetkisi ile müdahale edilecek şekilde değiştirelim
chmod 0700 /var/lib/php/session
En son olarak kontrol ettiğimizde çıktı bu şekilde olmaktadır.
Bunun dışında daha genel bir güvenlik önlemi olarak sistemimi her zaman güncel tutmamız gerekmektedir.Bunun için Linux,Apache,PHP ve MySQL için gelen güvenlik güncellemelerini almamız önerilmektedir.Eğer PHP’yi paket yöneticisi ile kurduysak
yum update
komutu ile ya da
apt-get update && apt-get upgrade
komutu ile güncellemeleri alabiliriz.
Sonraki adım olarak dosya ve dizin erişimi üzerinde değişiklikler yapmalıyız.Öncelikli olarak Apache’yi root olmayan bir kullanıcı ile çalıştırmamız gerekmektedir.Bütün dosyalar ve dizin yapısı root olmayan bir kullanıcı tarafından sahiplenilmedilir.Bunun için aşağıdaki kod ile dizinin sahibini direk olarak değiştirebiliriz.
chown -R apache:apache /var/www/html/
Bu dosyalara verilen izinlerin sadece okuma izni olduğundan emin olmak için aşağıdaki komutu çalıştırıyoruz.
chmod -R 0444 /var/www/html/
Bu işlemi de gerçekleştirdikten sonra aşağıdaki şekilde kontrol edebiliriz.
Bitmek bilmeyen güvenlik önlemlerinin bir diğer adımı olarak Apache,PHP,MySQL konfigurasyon dosyalarının izinlerini yazmaya karşı korumalı olarak değiştiriyoruz.
chattr +i /etc/php.ini chattr +i /etc/php.d/* chattr +i /etc/my.ini chattr +i /etc/httpd/conf/httpd.conf chattr +i /etc/
Bu komutu /var/www/html dizini altındaki dosyaları için de uygulayabiliriz.
chattr +i /var/www/html/
Daha sonra sisteme düşen logları düzenli bir şekilde takip etmemiz gerekmektedir.Apache log dosyaları için
tail -f /var/log/httpd/error_log grep 'login.php' /var/log/httpd/error_log egrep -i "denied|error|warn" /var/log/httpd/error_log
komutlar ile,PHP logları için
tail -f /var/log/httpd/php_scripts_error.log grep "...etc/passwd" /var/log/httpd/php_scripts_error.log
komutları ile istenen takibi yapabiliriz.
Son olarak ise dışarıdan ekstra programlar yükleyerek güvenliği artırabiliriz.Örneğin Mod_securtiy programını yükleyerek ve üzerinde bazı kurallar belirleyerek saldırılardan korunabiliriz.SELinux prgoramı ile Apache’nin SELinux ile korunmasını sağlayabiliriz.(Not:Yazıda bahsedilen php.ini,error_log gibi dosyaları tam yolları sistemler ve sürümler arasında farklılık gösterebilir.Bahsedilen kodların tam olarak çalışması için doğru yolların verildiğinden emin olunuz)
- 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ı