Son zamanlarda "RFI" (Remote File Include) tarzı yöntemlerle birçok hack olayı yasanıyor birçok kisi bunların önlemini almakta çaresiz kalıyor ve bu yüzden gerek itibarlarından gerekse sitelerinden oluyorlar. "RFI" açıklarını engelleyemeyenler için bir döküman yazmaya karar verdim. Bu sayede "RFI" açıgınız olsa bile en az zararla hatta "0" zararla nasıl kurtulacagınızı anlatacagım. Bu ayarlar sayesinde hem güvenliginizi hem de performansınızı artırmıs olacaksınız.
"php.ini" yapılandırmasına geçmeden önce sunucumuzda bulunan klasör ve dosya izinlerini "chmod" dogru sekilde ayarlayalım. Genelde FTP programlarında dosya yada klasör üzerine "sag click" yapılıp yada "file" seçeneginden "Change Attributes ya da Properties / CHMOD" seçeneklerinden düzenleriz burada "permissions" altında yani izinler altında önerilenleri girmek en uygunudur.
Klasörler için: 755
Dosyalar için: 644
İzinleri bu sekilde ayarlamanız güvenlik için ilk adımı atmanıza yardımcı olur.
"php.ini" yapılandırması:
Eger server admini iseniz yani root yetkilere sahipseniz bu ayarları serverda bulunan tüm siteler için yapabilirsiniz genellikle "/usr/local/Zend/etc/" altında bulunan "php.ini" dosyasını açarak düzenleyebilirsiniz veya "httpd.conf" dosyasının dogru yapılandırılmasıyla da olur. Daha sonra apache'ye restart atmanız gerekmektedir.
Root degilseniz sadece kendi siteniz için yapmanız gerekiyorsa kök dizininizde (public_html) bir "php.ini" dosyası olusturarak veya varolan "php.ini" dosyasının içerisine altta verdigim kodları ekleyerek güvenliginizi saglayabilirsiniz. Fakat sitenizle aynı serverda bulunan diger sitelerden kaynaklanan açıklardan yararlanan kisiler root olmayı basarırlarsa burada anlatılanlar yetersiz kalır, root olmayı basaramazlarsa ve sitenizin sifrelerini kaptırmazsanız güvendesinizdir.
***Altta anlattıgım bilgiler iyi bir güvenlik için yapılması gerekenler oldugundan dolayı bunları uyguladıktan sonra bazı scriptlerinizin çalısması engellenmis olabilir. Ama scriptin çalısmasını engelleyen degerleri iptal ederseniz script tekrar dogru sekilde çalısacaktır***
simdi gelelim "php.ini" yapılandırmasına:
"disable_functions" (Güvenlik)
"disable_functions" ile serverınızda birçok fonksiyonun çalısmasını engelleyebilirsiniz bu sayede sitenize inject edilen scriptler, sheller için güvenliginizi almıs olursunuz. Bu kadar fonksiyon fazla gelebilir ama iyi bir güvenlik için sart. Bu kadar sayıda devre dısı bırakılan fonksiyonlar ilk defa "eno7.org" adresinde verilmistir.
Önerilen:
CODE:
1.
disable_functions = foreach, glob, openbasedir, posix_getpwuid, f_open, system,dl, array_compare, array_user_key_compare, passthru, cat, exec, popen, proc_close, proc_get_status, proc_nice, proc_open, escapeshellcmd, escapeshellarg, show_source, posix_mkfifo, ini_restore, mysql_list_dbs, get_current_user, getmyuid, pconnect, link, symlink, fin, passthruexec, fileread, shell_exec, pcntl_exec, ini_alter, parse_ini_file, leak, apache_child_terminate, chown, posix_kill, posix_setpgid, posix_setsid, posix_setuid, proc_terminate, syslog, allow_url_fopen, fpassthru, execute, shell, curl_exec, chgrp, stream_select, passthru, socket_select, socket_create, socket_create_listen, socket_create_pair, socket_listen, socket_accept, socket_bind, socket_strerror, pcntl_fork, pcntl_signal, pcntl_waitpid, pcntl_wexitstatus, pcntl_wifexited, pcntl_wifsignaled, pcntl_wifstopped, pcntl_wstopsig, pcntl_wtermsig, openlog, apache_get_modules, apache_get_version, apache_getenv, apache_note, apache_setenv, virtual
Eger bu kadar fonsiyonu devre dısı bırakmak fazla geldiyse alttaki gibi de ayarlayabilirsiniz bu da güvenliginiz için yeterlidir:
CODE:
1.
disable_functions = glob, posix_getpwuid, array_compare, array_user_key_compare, ini_restore, exec, proc_get_status, proc_nice, proc_open, allow_url_fopen, fin, pconnect, system, dl, passthruexec, shell_exec, proc_close, proc_get_status, chown, chgrp, escapeshellcmd, escapeshellarg, fileread, passthru, popen,curl_exec, shell, execute
-------------------------
"safe_mode" (Güvenlik)
"Safe Mode" adından da anlasılacagı gibi "Güvenli Mod" anlamına geliyor. "Safe Mode" genelde birçok serverda "Off" durumdadır ve bu da birçok tehlikeye davetiye çıkaran unsurlar arasında yer alır. "Güvenli Modu Açık" durumuna getirmek shellerin serverımızda istedikleri gibi dolasmalarını, exploitlerin çalıstırılmasını ve komutların execute edilmelerini önler. Günümüzde "açık olan güvenlik modunu" kapalı duruma getiren scriptler mevcut fakat altta anlatılan önlemlerle bunun da önüne geçilebilir.
Önerilen:
CODE:
1.
safe_mode = on
-------------------------
"register_globals" (Güvenlik ve Performans)
php.ini dosyasında bulunan "post" "get" ile gönderilen degerlere kullanıcı adlarıyla ulasılıp ulasılamayacagını belirtir. Session, cookie degerlerini kendi adıyla tanımlayarak birer degisken olmasına neden olur. "Off" olarak ayarlanırsa bu gibi degerlere kendi tanımladıgı sekilde ulasılamaz.
Önerilen:
CODE:
1.
register_globals = off
-------------------------
"allow_url_fopen" (Güvenlik)
"allow_url_fopen" default olarak "açık" seklinde gelir ve bunun "on" açık olması "file_get_contents()", "include()", "require()" fonksiyonlar uzaktaki dosyaları da islemesine olanak tanır. Bunlara verilen bilgiler hiçbir kontrolden geçirilmezse kritik güvenlik açıklarını sebep olur.
Önerilen:
CODE:
1.
allow_url_fopen = off
-------------------------
"allow_url_include" (Güvenlik)
Bu deger kapalı yapıldıgında "require" ve "include" ile uzaktan dosya çagırılması engellenmis olur ve bu sayede büyük bir tehlikeden kurtulmus olursunuz.
Önerilen:
CODE:
1.
allow_url_include = off
-------------------------
"display_errors" (Güvenlik)
Bu seçenek sitenizin çalısmasında olusacak bir hatayı tarayıcıya yansıtıp yansıtmayacagını belirler yani siteniz için diyelim bir forum veya portal kullanıyorsunuz ve bunların çalısması esnasında genelde "Fatal error: Call to undefined function get_header() in /home/vhosts/site.com/index.php on line 37" seklinde benzeri hata görülür bunların gözükmesini engellemek için bu degeri kapalı duruma getirmek gerekir zira kötü niyetli kisiler sitenizin serverda bulunan tam yolunu ögrenmis olurlar.
Önerilen:
CODE:
1.
display_errors = Off
-------------------------
"cgi.force_redirect" (Güvenlik)
Bu deger normalde "on" olarak gelir ve Windows sunucularında IIS, OmniHTTPD gibi buralarda kapatılması gerekir. Kendi sunucunuz için bu durum yoksa degistirmenize gerek yoktur.
Önerilen:
CODE:
1.
cgi.force_redirect = on
-------------------------
"magic_quotes_gpc" (Güvenlik ve Performans)
Magic Quotes islemi GET/POST yöntemiyle gelen Cookie datasını otomatikmen PHP script'e kaçırır. Önerilen bu degerin kapalı olmasıdır.
Önerilen:
CODE:
1.
magic_quotes_gpc = off
-------------------------
"magic_quotes_runtime" (Güvenlik ve Performans)
Magic quotes çalısma sürecinde data olusturur, SQL'den exec()'den, vb.
Önerilen:
CODE:
1.
magic_quotes_runtime = Off
-------------------------
"magic_quotes_sybase" (Güvenlik ve Performans)
Sybase-style magic quotes kullanır (Bunun yerine \' ' bununla '' kaçırır)
Önerilen:
CODE:
1.
magic_quotes_sybase = Off
-------------------------
"session.use_trans_sid" (Güvenlik)
Bu ayarı dikkatli ayarlayın, kullanıcı emaile aktif oturum ID'si içeren URL gönderebilir
Önerilen:
CODE:
1.
session.use_trans_sid = off
-------------------------
"open_basedir" (Güvenlik)
Burada belirttiginiz bir dizin haricindeki dosyaları veya klasörleri görmeleri olanaksızdır yani sitenizde sadece dosyalar dizininin görüntülenmesini istiyorsanız böyle yapılır
CODE:
1.
/home/vhosts/site.com/public_html/dosyalar/
veya hem dosyalar hem de resimlerin bulundugu yerin gözükmesi için de böyle
CODE:
1.
/home/vhosts/site.com/public_html/resimler:/home/vhosts/site.com/public_html/dosyalar/
bunlar haricindeki yerlerin görünmesi imkansızdır.
Önerilen:
CODE:
1.
open_basedir = /home/vhosts/site.com/public_html/resimler:/home/vhosts/site.com/public_html/dosyalar/
/resimler ve /dosyalar yazan yere görünmesini istediginiz dizinleri belirtin.
-------------------------
"safe_mode_exec_dir" (Güvenlik)
Safe Mode açıkken bunu yaparsanız sadece belirttiginiz dizinde islem yapılmasına izin verirsiniz. Safe Mode kapalıyken burada belirttiginiz dizinlerin dısında hiçbir dizinde islem yapılamaz. "/home/vhosts/site.com/public_html/" yazan yere kendi dizininizi yazabilirsiniz. Böylece, diyelim "/etc" v.s dizininden herhangi birsey çalıstırmasına izin vermezsiniz.
Önerilen:
CODE:
1.
safe_mode_exec_dir = "/home/vhosts/site.com/public_html/"
"Safe Mode" yani "Güvenli Mod" açıkken yapılması tavsiye edilmez. Çünkü "safe mode" burada belirttiginiz dizinde etkisiz kalacaktır. Güvenli Mod'un açık olması o dizinde ise yaramayacaktır. Güvenlik için, "Safe Mod" yani "Güvenli Mod" "off" kapalıyken kullanılması daha uygundur.
-------------------------
"asp_tags" (Güvenlik)
ASP Style < % % > taglarına izin verilip verilmeyecegi belirlenir, kapalı duruma getirilmesi önerilir.
Önerilen:
CODE:
1.
asp_tags = Off
-------------------------
"session.hash_function" (Güvenlik)
Oturumlar için Hash Fonksiyonu
0: MD5 (128 bits)
1: SHA-1 (160 bits)
Önerilen:
CODE:
1.
session.hash_function = 0
-------------------------
"session.hash_bits_per_character" (Güvenlik)
Hash çevirirken her karakterde kaç bit saklansın
4 bits: 0-9, a-f
5 bits: 0-9, a-v
6 bits: 0-9, a-z, A-Z, "-", ","
Önerilen:
CODE:
1.
session.hash_bits_per_character = 5
-------------------------
"expose_php" (Güvenlik)
"expose_php" açık ise kapalı yapılması önerilir. Aksi takdirde PHP ile yaptıgınız herseyde sunucu tarafından PHP sürümü gibi bilgiler gösterilir. Hackerlar hatta Lamerlar bu bilgileri severler. Bunları engellemek için "off" konumuna getiriniz.
Önerilen:
CODE:
1.
expose_php = Off
-------------------------
"html_errors" (Güvenlik)
Bu degerin açık olması durumunda PHP tıklanabilir hata mesajları üretecektir. Kapalı olması güvenlik için önerilir.
Önerilen:
CODE:
1.
html_errors = off
-------------------------
"max_execution_time" (Güvenlik)
Scriptinizi maksimum uygulamayı yürütme zamanı mesela kullanıcı bir linke tıkladı ve bu linkin açılması belirtilen saniyeden fazla olursa sayfa sitenizin serverda bulundugu tam yolu göstererek hata verir. Bu hataların gözükmesi güvenlik açısından sakıncalıdır. 300 saniye yazan yeri istediginiz zaman ile degistirebilirsiniz.
Önerilen:
CODE:
1.
max_execution_time = 300
-------------------------
"max_input_time" (Güvenlik)
Scriptinizin aynı sekilde bir dataya ulasmak için istek yolladıgında maksimum geçen zaman
Önerilen:
CODE:
1.
max_input_time = 300
-------------------------
"ServerSignature" (Güvenlik ve Performans)
"ServerSignature" sitenizde bulunmayan bir dosyanın bakılması durumunda bu sayfanın altında serverla ilgili bir bilgi yer alır ve bu da performansı düsürür ayrıca kötü niyetli kisiler serverla ilgili bir bilgi ögrenmis olurlar.
Önerilen:
CODE:
1.
ServerSignature = Off
-------------------------
"UseCanonicalName" (Performans)
Bu ayarın açık olması Apache self-referencing URL olusturdugunda Server ismi ve porttan olusan bir çözülmüs isim kullanır.
Önerilen:
CODE:
1.
UseCanonicalName = Off
-------------------------
"HostnameLookups" (Performans)
"HostnameLookups" açık olması performansın düsmesine neden olur. IP numarası DNS sunucusundan bakılarak adres ögrenilir buda performansı düsürür.
Önerilen:
CODE:
1.
HostnameLookups = Off
-------------------------
"ExtendedStatus" (Performans)
Serverın durumunu ögrenmek için server-status kullanılıyorsa Apache her an bu islemcinin çagrılabilecegini bekledigi için hazır bekler ve her an sistem saatini ögrenmesi gerekir bu da performansı düsürür.
Önerilen:
CODE:
1.
ExtendedStatus = off
-------------------------
"register_long_arrays" (Güvenlik ve Performans)
Bu degerin "on" açık olması durumunda sisteminizde her script çalısmayacaktır install v.s yapmakta hatalarla karsılasabilirsiniz ama iyi bir güvenlik ve performans için "off" duruma getirilir.
Önerilen:
CODE:
1.
register_long_arrays = Off
-------------------------
"allow_call_time_pass_reference" (Performans)
Fonksiyonların çagrılma zamanında yasanan uyumsuzluklarla ilgili uyarı verir.
Önerilen:
CODE:
1.
allow_call_time_pass_reference = off
-------------------------
"enable_dl" (Güvenlik)
Bu degerin "off" kapalı olması gerekir aksi halde kisilerin sistemde php modüllerinde çalısma yapmasına olanak saglar ve sistemde rahat dolasmalarını saglar güvenlik için kapalı olması gerekir.
Önerilen:
CODE:
1.
enable_dl = off
-------------------------
"track_errors" (Güvenlik ve Performans)
Sürücülerde meydana gelen hatalarda yetki verildigi taktirde hata mesajı errormsg olarak degiskende gösterilir.
Önerilen:
CODE:
1.
track_errors = Off
-------------------------
"file_uploads" (Güvenlik)
Açık olursa eger sunucuda dosya yüklenmesine izin verilmis olur ve bu da ciddi bir güvenlik açıgına neden olur eger kullandıgınız scriptden herhangi bir dosya yüklemeniz gerekmiyorsa mutlaka kapalı duruma getiriniz. Bu sayede sitenize herhangi bir shell, script inject edise bile kesinlikle dosya yüklenmesine izin vermez.
Önerilen:
CODE:
1.
file_uploads = off
-------------------------
"ignore_repeated_errors" (Güvenlik ve Performans)
Açık olursa tekrarlanan hataları loglamaz.
Önerilen:
CODE:
1.
ignore_repeated_errors = Off
-------------------------
"ignore_repeated_source" (Güvenlik ve Performans)
Tekrarlanan mesajlar engellendiginde, mesaj kaynagını engeller Bu ayar açık yapıldıgında hataları loglamayacaktır farklı dosyalardan ya da kaynaklardan tekrarlanan mesajlarla.
Önerilen:
CODE:
1.
ignore_repeated_source = Off
-------------------------
"display_startup_errors" (Güvenlik ve Performans)
"display_errors" degeri "on" açık olsa bile, Php'nin çalısma sırasında meydana gelen hatalar gözükmeyecektir. Bu degerin siddetle "off" kapalı duruma getirilmesi önerilir.
Önerilen:
CODE:
1.
display_startup_errors = off
-------------------------
"safe_mode_gid" (Güvenlik)
UID - GID kontrollerini sadece UID ile yapmasına izin verir böylece aynı grupta dosyalar bulunsa bile göremezler yani serverda bulunan diger clientların scriptlerini v.s görmeleri engellenir.
Önerilen:
CODE:
1.
safe_mode_gid = Off
-------------------------
"output_buffering = 4096" (Performans)
4 KB'lik bir tampon çıktısı ayarlar "output buffer"
Önerilen:
CODE:
1.
output_buffering = 4096
-------------------------
"register_argc_argv" (Performans)
Kapalı olursa gereksiz ARGV ve ARGC kayıtlarını önler. PHP nin ARGV ve ARGC degiskenlerini bildirip bildirmemesini anlatır.
Önerilen:
CODE:
1.
register_argc_argv = Off
-------------------------
"php_value session.use_trans_sid - php_value session.use_only_cookies"
Bu sekilde ayarlanması URL'deki PHPSESSID bilgilerini kaldırır.
Önerilen:
CODE:
1.
php_value session.use_trans_sid = 0
2.
php_value session.use_only_cookies = 1
-------------------------
"session.auto_start"
Oturum baslatmayı baslangıçta isteme
Önerilen:
CODE:
1.
session.auto_start = 0
-------------------------
"session.cookie_lifetime"
Cookie'nin zaman ayarı
Önerilen:
CODE:
1.
session.cookie_lifetime = 0
-------------------------
"memory_limit"
Scriptin tükettigi maksimum hafıza miktarı
Önerilen:
CODE:
1.
memory_limit = 8M
-------------------------
"post_max_size"
PHP'nin kabul edecegi maksimum POST data boyutu
Önerilen:
CODE:
1.
post_max_size = 256K
-------------------------
"upload_max_filesize"
Upload edilen dosyaların maksimum boyutu
Önerilen:
CODE:
1.
upload_max_filesize = 256K
-------------------------
"upload_tmp_dir"
Temporary klasörü HTTP'den gelen dosyalar, ayarlanmazsa default klasörü kullanacaktır.
Önerilen:
CODE:
1.
upload_tmp_dir = /path/to/www/belirlediginiz-dizin
-------------------------
"variables_order"
(Ortam, GET, POST, Çerez, Sunucu) bunların islenmedeki sıralarını belirler.
Önerilen:
CODE:
1.
variables_order = "EGPCS"
Üstte belirttigim kodları "php.ini" dosyanıza alt alta ekleyebilirsiniz.
Kaynak: eno7
php.ini Yapılandırmasıyla, Hackten korunmak
- velociraptor
- Yottabyte4
- Mesajlar: 51251
- Kayıt: 14 Mar 2006, 02:33
- cinsiyet: Erkek
- Teşekkür etti: 12649 kez
- Teşekkür edildi: 9560 kez