PHP açık kaynak kodlu bir server side kodlama dilidir ve dünya üzerinde yaygın olarak kullanılmaktadır. Apache/Nginx/Litespeed/Lighttpd/IIS gibi bilinen web servisleri desteklemektedir. Yanlış yapılandırılmış bir sunucu veya kod her türlü soruna neden olabilir. Bu nedenle de dikkatli kullanılması gerekir. Basit PHP güvenlik önlemleri yazısında güvenlikle ilgili bazı detayları, neler yapmanız gerektiğini bulabilirsiniz.
Bizim yapacağımız işlemler manuel kurulmuş PHP ve web servisi olarak Apache ile Freebsd işletim sistemi üzerindedir. Fakat diğer Linux dağıtımlarında veya Linux/Unix dağıtımları üzerinde bir web hosting kontrol panelini kullanıyor olsanız da benzer şekilde olacaktır.
Kullandığımız Php sürümü PHP 7.2.19 şeklindedir. Php sürümünüzü kontrol etmek için, ssh üzerinde yazın;
php -v
PHP 7.2.19 (cli) (built: Jul 4 2019 14:01:58) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with the ionCube PHP Loader v10.3.1, Copyright (c) 2002-2018, by ionCube Ltd.
with Zend OPcache v7.2.19, Copyright (c) 1999-2018, by Zend Technologies
Bu yazıda neler var?
Düşmanınızı Tanıyın
Herhangi bir muharebe veya mücadele veriyorsanız önce ilk bilmemiz gereken düşmanımızı tanımak olacaktır. PHP üzerindeki bilmeniz gereken düşmanlar;
- XSS : HTML tabanlı kodların arasına istemci tabanlı kod gömülmesi yoluyla kullanıcının tarayıcısında istenen istemci tabanlı kodun çalıştırılabilmesine olarak tanımlanır.
- File uploads : Siz kullanıcılara veya kendiniz için file upload izni veriyor olabilirsiniz. Fakat kötü niyetli kişilerde dosyaları upload yapabilir.
- eval () : Saldırgan tarafından kod içerisine farklı kodlar gizlemek için kullanılır.
- SQL injection : Bir php uygulamasının veritabanı tarafı için güvenlik açığıdır. Kullanıcı girişi yanlış bir şekilde filtrelendiğinde, uygulama tarafından herhangi bir SQL ifadesi çalıştırılabilir.
- Including local and remote files : İyi yapılandırılmamış bir web servisiniz ve hatalı kodlarınız var ise, saldırgan uzaktaki sunucuda bir kod parçacağını çalıştırabilir.
PHP güvenliği için neler yapabiliriz?
Öncelikle sistemimize hakim olmamız gerekiyor. Php yükledikten sonra ihtiyacımız olan bileşenleri (extensions) de yüklüyoruz. Peki kurduğumuz her bileşene ihtiyacımız var mı? Sistemimizdeki php bileşenlerini kontrol edelim;
Gereksiz php bileşenleri
php -m
Bu listede kullanmadığımız bileşen var ise ve hiç kullanmayacaksak kaldıralım. Freebsd üzerinde bileşenler /usr/local/etc/php dizininde tutuluyor. Linux dağıtımlarında /etc/php.d/ dizininde. Kullanmadığınız bir bileşen var ise silebilir veya ismini değiştirmeniz bile kafi gelir.
mv ext-30-imap.ini ext-30-imap.ini.iptal
veya
rm -rf ext-30-imap.ini
Bileşenlerinizi kontrol edin, kullanmadığınız bileşen var ise kaldırın.
PHP yazılım ve sürüm bilgisini gizleyin
Saldırganlar size saldırmadan önce sunucunuz ve web siteniz hakkında ne kadar az bilgiye sahip olurlarsa o kadar güvenli olacaktır. Hangi php versiyonunu kullandığınızı bilmesinler. Bu işlem gayet basit php.ini dosyanızı açın ve alttaki değeri “off” yapın.
expose=off
Daha fazla bilgi için bu yazımızı da görüntüleyebilirsiniz.
Php hatalarını kapatın
Olası bir php hatasını ziyaretçilere kapatın. Ziyatetçiler PHP hatalarını görmeyi hem sevmez, hem de kötü niyetli bir kişi php hatasında, web sitenizin yolunu (path) ve daha fazla bilgiyi öğrenebilir. Kapatmak için php.ini dosyanız üzerinde aşağıdaki değeri off yapın.
display_errors = off
Dosya yüklemeyi kapatın
Dosya yükleme (file_uploads) kullanıyor musunuz? Kullanmıyorsanız kapatın. Kullanıyorsanız da limiti gerektiği kadar ayarlayın. Kapatmak için php.ini dosyasındaki değeri off yapın.
file_uploads = off
Kullanıyorsanız yine php.ini dosyasında değeri minimuma indirin;
upload_max_filesize = 1M
Tehlikeli php fonksiyonlarını kapatın
PHP kodu düzgün yazılmadığında, kötü niyetli bir kişi sunucunuzda istediği gibi yetkiye sahip olur. Güvenlik önlemi olarak da bu fonksiyonları kapatın. php.ini dosyanızda “disable functions” bölümünü bulun ve aşağıdaki fonksiyonları kapatın;
disable_functions =exec,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source,passthru,mail
Mail fonksiyonunu da kapatın ve mail gönderim işleminizi smtp kimlik doğrulama ile halledin.
PHP izinlerini limitleyin
Open_basedir yönergesi, PHP’nin fopen gibi fonksiyonları kullanarak dosyalara erişmesine izin verilen dizinleri belirler. Eğer dosya open_basedir değerinin dışındaysa php bu işlemi reddeder. Open_basedir dizinini ayarlayın. php.ini dosyasında sadece kullanıcının erişmesi gereken yeri yazın. Yüksek ihtimalle bir /tmp dizinine bağlamanız yeterli olacaktır.
open_basedir="/var/www/html/tmp"
PHP yazılımınızı güncel tutun
PHP majör değişikliklerini tam sürüm güncellemesinde yapar. Yani PHP 5’den 7’ye geçerken dikkatli olun ama sürümler arası güncellemeyi sürekli yapın.
Dosya ve dizin sahiplikleri
Web sitenizi root kullanıcı ile çalıştırmayın. Bir veya bir kaç web siteniz var ise www kullanıcısı ile, daha fazla var ise her web sitesine ayrı bir kullanıcı oluşturun. Dosya ve dizin sahipliklerini “chown” komutu ile belirleyin.
Yazma koruma kullanın
Web siteniz statik bir site ise yazma koruma kullanın. chattr komutu bunun için var. Misal wp-config.php dosyanızı bir kere yapılandırıp bir daha bakmazsınız, bu sebeple değişiklik yapılmasın diye dosyayı chattr komutu ile kilitleyin. Daha fazla bilgi için bu yazımıza göz gezdirin.
Mod_security kullanın
Mod_security sql_injection veya XSS açıklarını kısmi şekilde engelleyecektir. Cpanel ve Plesk gibi kontrol paneller içinde kurulumu kolay olacaktır.
# Stop SQL injection
SecFilter "delete[[:space:]]+from"
SecFilter "select.+from"
Chroot jail kullanın
Eğer sizin için mümkünse apache/nginx vb. ve php’yi jail ile hapsedin. Bu çok detaylı bir konu olmak ile beraber, detaylı şekilde bir yazıyı kaleme alacağız.
Log dosyalarınızı inceleyin
Log dosyalarınızı sürekli takip edin. tail komutu ile loglarınızı kontrol edin. Logların analizini çıkartın.
PHP+Web Server konuları bunlarla sınırlı olmadığı gibi, uzman seviyesi için çok daha fazlasını içermektedir. Yukarıdaki anlatılan işlemler temel seviyede birer güvenlik önlemidir.
Add Comment