PHP Çalışan Linux Sunucular İçin Güvenlik Ayarları

PHP, web uygulamalarında sık kullanılan bir sunucu tarafı betik dilidir. Ancak PHP ile ilgili güvenlik sorunları çoğu zaman koddan değil, hatalı sunucu yapılandırmalarından doğar. Varsayılan ayarlarla çalışan PHP kurulumları, özellikle paylaşımlı ortamlarda tüm sunucuyu savunmasız bırakabilir. Ele alınan güvenlik önlemleri, PHP’nin davranışlarını işletim sistemi düzeyinde sınırlandırmayı hedefler.

PHP Tarafında Sık Görülen Saldırı Türleri

PHP sistemlerinde saldırganlar genellikle uygulamayı değil, doğrudan sunucuyu hedef alır. Bu yaklaşımda öne çıkan saldırı türleri şunlardır.

Remote Code Execution (RCE)

PHP üzerinden sistem seviyesinde komut çalıştırılmasını sağlar. Kritik fonksiyonlar kapatılmadığında ortaya çıkar.

disable_functions = exec,system,shell_exec,passthru,proc_open,popen

Dosya Yükleme Üzerinden Web Shell

Kontrolsüz upload alanları saldırganlar için giriş noktasıdır. PHP dosyası yüklenip çalıştırılabilir.

location /uploads {
    php_admin_flag engine off;
}

Local File Inclusion (LFI)

Yanlış include kullanımı sonucu sistem dosyalarına erişim sağlanabilir. Log poisoning ile birleştiğinde RCE’ye dönüşebilir.

open_basedir = "/var/www/site:/tmp"

SQL Injection

Filtrelenmeyen kullanıcı girdileri SQL sorgularını bozabilir. Veritabanı ele geçirilmesiyle sonuçlanabilir.

SELECT * FROM users WHERE id = ?

Bu saldırılar, PHP’nin erişim alanı kısıtlanmadığında ortaya çıkar.

PHP’yi Her Zaman Güncel Tutalım

PHP tarafında güvenliği artırmanın en temel yolu, güncel ve desteklenen sürümleri kullanmaktır. EOL durumundaki PHP 7.x sürümleri üretim ortamlarında ciddi güvenlik riski oluşturur.

Paket yöneticisi üzerinden güvenlik güncellemeleri düzenli olarak uygulanmalıdır.
PHP 7.4.3’ten PHP 8.x’e yükseltme işlemini komut satırından adım adım anlatan rehber, geçiş sürecini güvenli şekilde planlamanı sağlar.

🟠 PHP 7.4 Sürümünü Komut Satırıyla PHP 8’e Taşıma

Dosya Sistemi Erişimini Sınırlama

PHP, dosya sistemi üzerinde doğrudan işlem yaptığı için yanlış yapılandırmalar ciddi güvenlik sorunlarına yol açabilir. Bu yüzden ilk adım olarak PHP’nin erişebileceği dizinler açık şekilde tanımlanmalıdır.

open_basedir = "/var/www/site:/tmp"

PHP İşlemlerinin Yetkisi

Root yetkisiyle çalışan PHP süreçleri, bir güvenlik açığında tüm sunucunun kaybedilmesine neden olabilir. Bu nedenle PHP-FPM veya CGI süreçlerinin düşük yetkili kullanıcılarla çalışması zorunludur.

ps aux | grep php

Her uygulama için ayrı bir PHP-FPM havuzu ve kullanıcı tanımlamak gerekir. Plesk ortamlarında domain bazlı PHP-FPM havuzu ve kaynak limitleri kullanılarak bu yapı net şekilde uygulanabilir.

PHP Fonksiyonlarını Devre Dışı Bırak

PHP varsayılan olarak sistem komutu çalıştırabilen fonksiyonlarla gelir. Uygulama kullanmıyorsa açık kalmamalıdır.

disable_functions = exec,system,shell_exec,passthru,popen,proc_open

PHP’nin İletişimini Sınırla

Uzak dosya erişimi çoğu zaman zincirleme açıkların başlangıcıdır. Varsayılan olarak kapalı olmalıdır.

allow_url_fopen = Off
allow_url_include = Off

PHP Loglarını Ayır ve İzle

PHP error log’ları sadece debug değil, saldırı tespiti içindir. Her PHP-FPM havuzu için ayrı log dosyaları tanımlanmalıdır. Loglar merkezi sistemlere aktarılmalı ve izlenmelidir.

PHP Modüllerini Ters Mantıkla Yönet

Önce neye ihtiyaç olduğunu belirle, sonra modülleri aç. Kullanılmayan her modül ek saldırı yüzeyidir.

php -m
mv /etc/php.d/xmlrpc.ini /etc/php.d/xmlrpc.off
systemctl restart php-fpm

Dosya Yükleme Mekanizmalarını Daralt

Dosya yükleme mümkünse kapatılmalıdır. Zorunluysa sınırlandırılmalıdır.

file_uploads = On
upload_max_filesize = 2M
upload_tmp_dir = /var/lib/php/tmp

PHP Hata Mesajlarını Kullanıcıdan Gizle

Hata mesajları saldırgan için ipucu olabilir. Ekran kapalı, log açık olmalıdır.

display_errors = Off
log_errors = On
error_log = /var/log/php/runtime-error.log

Script Süresi ve Bellek Sınırları Koy

Sonsuz veya ağır script’ler saldırı olmasa bile sorundur. Temel sınırlar mutlaka tanımlanmalıdır.

max_execution_time = 30
max_input_time = 30
memory_limit = 256M

Dosya ve Dizin İzinlerini En Sona Al

En doğru zaman en sondur. Artık uygulamanın nereye yazdığını biliyorsundur.

find /var/www/site -type f -exec chmod 0444 {} \;
find /var/www/site -type d -exec chmod 0555 {} \;

SELinux ve WAF ile İkinci Savunma Katmanını Kur

PHP ayarları ilk savunma hattıdır. SELinux ve WAF ikinci katmandır.

getsebool -a | grep httpd

Sık Sorulan Sorular

PHP-FPM varken PHP güvenlik ayarlarını neden hâlâ uygulamalıyım?

PHP-FPM yalnızca süreçleri ayırır, erişim ve yetki sınırlarını tek başına belirlemez. Yanlış yapılandırma durumunda uygulama açığı sistem geneline yayılabilir.

Bir PHP uygulamasının hangi dosyalara erişmeye çalıştığını nasıl analiz ederim?

PHP-FPM sürecini sistem seviyesinde izleyerek bu davranışı net şekilde görebilirsin. Bu yöntem özellikle dosya erişimlerini ortaya çıkarır.

strace -f -p $(pgrep -n php-fpm)

PHP üzerinden veri sızıntısı olup olmadığını nasıl tespit ederim?

Ağ davranışı analiz edilmelidir. PHP proseslerinin olağan dışı dış bağlantılar kurup kurmadığı kontrol edilmelidir.

ss -tpn | grep php

Prod ve staging ortamları arasındaki PHP hatalarının temel nedeni nedir?

Çoğu zaman PHP güvenlik ayarları arasındaki farklardır. Özellikle fonksiyon kısıtları ve dosya erişim ayarları kontrol edilmelidir. Sorunlu ayar izole edilerek çözüm üretilmelidir.

Yorum yapın