PHP Kurulum ve Ayarları
Kurulum Dosyaları:
Apache: apache_2.0.52-win32-x86-no_ssl.msi "http://httpd.apache.org"
PHP: php-5.0.3-Win32.zip "http://www.php.net"
Bu konuyu bir örnek üzerinden devam ettirmek istiyorum. Bildiğiniz gibi her servisi çalıştıran bir kullanıcı bulunmalıdır bunun nedeni o servis herhangibi kaynağa ulaşmak istediğinde yetkilendirme yapabilmemizi sağlamaktır.PHP için sunucu olarak kullanacağımız Apache tüm işletim sistemlerinde servis olarak çalışabilmektedir; özellikle Linux ve Unix üzerindeki Apache kurulumlarında tanımlı olarak servisi çalıştıran kullanıcı nobody (kullanıcı id: -1) , grubu nobody (grup id: -1) olarak belirlenmiştir. Bu nobody kullanıcısının özelliği sistem üzerinde kayıtlı olmamasıyla beraber tüm sistemde bir hayalet gibi gezinebilmesidir. Bu durumda yazmış olduğunuz kodlarda yapmış olduğunuz bir hata eğer saldırganın içerisi girmesine izin veriyorsa etkisi düşündüğünüzden çok daha derin olacaktır çünki sisteme saldıran kişi istediği bilgileri çaldıktan sonra ruhunuz duymadan erişim tutanakları (access log) dosyalarından kendi kayıtlarını silip ortadan kaybolacaktır. Bu durumda ne yapmanız gerektiğinden çok; bu duruma nasıl gelmemeniz gerektiği üzerinde durmaya çalışıcaz. Proje geliştirme terimlerinin içerisinde olan risk yönetiminin anahtarıda burdadır, oluşabilecek felaketlerin tespit edilmesi ve tedbirinin alınması.
Peki nasıl tedbir alabiliriz ? Ne yazık ki bunun standart bir yanıtı yok çünki geliştirdiğiniz yazılım çok farklı kaynaklara erişebilir. (Bu arada makaleler içerisinde kaynak kelimesini sürekli verguladığım için açıklamak istedim. Kaynak bir yazılım için belki bir dosya, belki bir veritabanı, ftp veya mail sunucusu gibi veri aktardığı veya topladığı herhangibi servis olabilir.) Çalışan PHP programları bulunduğu servisin kimliğine bürünür, örneğin Apache servisi için sistem üzerinde apache kullanıcısı ve apache grubu açarsanız PHP programımız erişmek istediği tüm dosyalarda işetim sistemi yetkilendirme kontrolünden geçer. Bu şekilde apache kullanıcısı için sadece programımızın bulunduğu klasöre okuma yetkisi verip Apache servisinin ve dolayısı ile PHP programımızın bu klasör dışındaki hiç bir sistem dosyasına erişmesini engelleriz. Gördüğünüz gibi ilk önce dosya sisteminde bir yetkilendirme yaptık sonra servis düzeyinde bir yetkilendirme yaptık, aynı zamanda servisin modülü olan PHP bazında da güvenlik ayarları yapabiliriz bunun için gerekli parametreleri değiştirmemiz yeterli olacaktır. İşte bu makalenin devamında bu ayarları nasıl gerçekleştirebileceğimize bakıcaz.
Bir geliştirici olarak kurulum esnasında benim amacım programımdan kaynaklanan hatalar sonucu yazdığım program üzerinde sisteme zarar verecek saldırıların önüne geçecek şekilde konfigrasyonu gerçekleştirmek. Bu yüzden bana sistemciler tarafından devredilen sistemin zaten güvenli olduğunu, yani bana sistem üzerinden gelebilecek saldırılar konusunda gerekli tedbirlerin aldığını varsayıyorum.
IIS 6.0 ve 5.5 Konfigrasyonu
Ipucu 01: IIS üzerinde Web Publishing serivisini Local System Account ile çalıştırabiliriz fakat yetkilendirme için Directory Settings bölümünden Anonymous yetkiyi kaldırıp geliştirdiğimiz program için açmış olduğumuz kullanıcıya yönlendirmeli ve dosya sistemi bazında programımızın çalışacağı klasörde gerekli yetkilendirmeleri yapmalıyız. Aynı şekilde aşağıdaki PHP konfigrasyonu bölümündeki etkenlere de dikkat etmeliyiz. (PHP5 yeni çıkmış olduğundan şuan isapi olarak IIS üzerinde pek stabil çalışmamaktadır. Gerekli iyileştirmeler yapıldıktan sonra ilgili kurulum demosunu .NET TV bölümünden teymin edebilirsiniz.)
Apache Sunucu Kurulumu
Ipucu 02: Her Apache modülü üzerinde bug barındırma ihtimali yüzünden bir risk içermektedir! Aynı zamanda her modül ayrıca hafızaya yük getirir. Bu sebeplerden ihtiyacınız olamayan modüller mutlaka kullanım dışı bırakılmalıdır. Bu Linux ve Unix (*nix) sistemlerde iki yol ile sağalanabilir. Bildiğiniz üzere *nix sistemlerde kurulum kaynak kodun derlenmesi ile gerçekleşebilmektedir, derleme esnasında bazı moduller tanımlı olarak eklenir, bazı modüller sizin girdiğiniz parameterlere göre eklenir. Burda derlendiğiniz uygulamanın (yani Apache'nin) kullanma kılavuzunu mutlaka okuyup nelerin tanımlı bulunduğunu tespit edip kullanmayacaklarınızı devre dışı bırakınız. Eğer *nix sistemlerde derlenmiş paketleri rpm (Redhat Packge Management) gibi araçlar ile dağıtıyorsanız mutlaka konfigrasyon dosyasında modüllerin dinamik eklendiği yerleri bulup kullanmayacağınız modüllerin ".so" dosyalarını devre dışı bırakınız. Windows sistemler üzerinde kurlum dosyası çalıştırıldıktan sonra derlenmiş dosyalar ilgili klasörlerine kopyalanır, ardından konfigrasyon dosyasında modüllerin dinamik eklendiği yerleri bulup kullanmayacağınız modüllerin ".dll" dosyalarını devre dışı bırakınız.
Ipucu 03: *nix sistemlerde olabildiğince kaynak kod 'dan derleme yaparak kurlum gerçekleştirmeye özen gösteriniz. Bu şekilde hem sistem ile uyumluluğundan emin olursunuz hem istemediğiniz modülleri daha güvenli bir şekilde elimine ederek aynı zamanda performans iyileştirmesinde bulunmuş olursunuz.
Örnek httpd.conf (konfigrasyon) dosyası:
| httpd.conf (Apache 2.0 / Windows) |
# Bu dosyadaki tüm ayarlar Apache 2.0 minimum gereksinimlere göre şekillendirilmiştir. # Değişiklikleri yapmadan önce geçerli olan konfigrasyon dosyanızın yedeğini almayı # lütfen unutmayınız. # Windows üzerinde servisi çalıştıran kullanıcı tanımlı olarak Local System Account'dur. # Bunu gerekli gördüğünüz durumda Services bölümünden değiştirebilirsiniz. ServerRoot "C:/Apache/Apache2" ScoreBoardFile logs/apache_runtime_status.log
PidFile logs/httpd.pid
Timeout 300 KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 15
# Apache 1.3 ile sadece multi-tasking'i desteklemekteydi 2.0 ile beraber # aynı zamanada multi-threading'i de desteklemeye başladı. Bunu kurulum # aşamasında verdiğiniz parametreler ile berlileyebilirsiniz. Windows # sürümünde tanımlı olarak multi-threading alınmıştır.
# Kurulum ile beraber gömülü gelen modülleri "C:\Apache\Apache2\bin>Apache.exe -l" # satırı ile görüntüleyebilirsiniz.
<IfModule mpm_winnt.c> ThreadsPerChild 250 MaxRequestsPerChild 0 </IfModule>
LoadModule access_module modules/mod_access.so #LoadModule autoindex_module modules/mod_autoindex.so LoadModule dir_module modules/mod_dir.so LoadModule env_module modules/mod_env.so LoadModule log_config_module modules/mod_log_config.so LoadModule mime_module modules/mod_mime.so LoadModule setenvif_module modules/mod_setenvif.so LoadModule php5_module "C:\Apache\php5\php5apache2.dll"
PHPIniDir "C:\Apache\php5" AddType application/x-httpd-php .php .inc .tpl AddType application/x-httpd-php-source .phps .incs .tpls
ServerAdmin sadun@csharpnedir.com ServerName localhost:80 #Listen 192.168.2.2:80 Listen 80
UseCanonicalName Off DocumentRoot "C:/Apache/Apache2/htdocs"
# Indexes klasör index'lerine ulaşamadığı zaman klasörün içeriğini ekrana # yazdırır. Açık bırakılması güvenlik açığına neden olabilir. Bu şekilde # saldırgan alt klasördeki dosyalara direkt erişme şansını elde edebilir.
<Directory /> Options FollowSymLinks # Options Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory>
DirectoryIndex index.php index.html index.html.var AccessFileName .htaccess
<Files ~ "^\.ht"> Order allow,deny Deny from all </Files>
TypesConfig conf/mime.types
DefaultType text/plain
<IfModule mod_mime_magic.c> MIMEMagicFile conf/magic </IfModule>
HostnameLookups Off
ErrorLog logs/error.log LogLevel warn
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent
CustomLog logs/access.log common # Alt satırdaki iki konfigrasyon karşı taraftaki istemcinin sunucumuzun sürümünü örenmesini # engellemektedir. Sürümü bilinmeyen sunucuya saldırmak daha zordur çünki hangi bug'ları # içerdiğini tespit edilmesi zordur. ServerTokens Prod ServerSignature Off
AddDefaultCharset ISO-8859-9
AddType application/x-compress .Z AddType application/x-gzip .gz .tgz AddHandler type-map var
# ErrorDocument 400 C:/Apache/Apache2/error/ApacheHTTP_BAD_REQUEST.html.var # ErrorDocument 401 C:/Apache/Apache2/error/HTTP_UNAUTHORIZED.html.var # ErrorDocument 403 C:/Apache/Apache2/error/HTTP_FORBIDDEN.html.var # ErrorDocument 404 C:/Apache/Apache2/error/HTTP_NOT_FOUND.html.var # ErrorDocument 405 C:/Apache/Apache2/error/HTTP_METHOD_NOT_ALLOWED.html.var # ErrorDocument 408 C:/Apache/Apache2/error/HTTP_REQUEST_TIME_OUT.html.var # ErrorDocument 410 C:/Apache/Apache2/error/HTTP_GONE.html.var # ErrorDocument 411 C:/Apache/Apache2/error/HTTP_LENGTH_REQUIRED.html.var # ErrorDocument 412 C:/Apache/Apache2/error/HTTP_PRECONDITION_FAILED.html.var # ErrorDocument 413 C:/Apache/Apache2/error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var # ErrorDocument 414 C:/Apache/Apache2/error/HTTP_REQUEST_URI_TOO_LARGE.html.var # ErrorDocument 415 C:/Apache/Apache2/error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var # ErrorDocument 500 C:/Apache/Apache2/error/HTTP_INTERNAL_SERVER_ERROR.html.var # ErrorDocument 501 C:/Apache/Apache2/error/HTTP_NOT_IMPLEMENTED.html.var # ErrorDocument 502 C:/Apache/Apache2/error/HTTP_BAD_GATEWAY.html.var # ErrorDocument 503 C:/Apache/Apache2/error/HTTP_SERVICE_UNAVAILABLE.html.var # ErrorDocument 506 C:/Apache/Apache2/error/HTTP_VARIANT_ALSO_VARIES.html.var
BrowserMatch "Mozilla/2" nokeepalive BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0 BrowserMatch "RealPlayer 4\.0" force-response-1.0 BrowserMatch "Java/1\.0" force-response-1.0 BrowserMatch "JDK/1\.0" force-response-1.0 BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully BrowserMatch "^WebDrive" redirect-carefully BrowserMatch "^WebDAVFS/1.[012]" redirect-carefully BrowserMatch "^gnome-vfs" redirect-carefully
# # Bir çoğumuz üyelik girişlerinde SSL kullanmıyoruz. Fakat text olarak gönderilen # kullanıcı adı ve şifreler network ağına sızmış bir kişi trafından IP paketleri # takip edilerek kolaylıkla çalınabilir. Bu yüzden Ticari yazılımlarda mutlaka # üyelik girişleri SSL üzerinden yapılmalıdır. Bu kurulumda SSL barından Apache # kullanmadık bu yüzden şuan sunucumuz SSL desteklemiyor. #
<IfModule mod_ssl.c> Include conf/ssl.conf </IfModule> |
| httpd.conf (Apache 1.3 / Unix) |
# Bu dosyadaki tüm ayarlar Apache 1.3 minimum gereksinimlere göre şekillendirilmiştir. # Değişiklikleri yapmadan önce geçerli olan konfigrasyon dosyanızın yedeğini almayı # lütfen unutmayınız. ServerType standalone ServerRoot "/usr/local/apache"
PidFile /var/apache/run/httpd.pid ScoreBoardFile /var/apache/run/httpd.scoreboard
Timeout 300 KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 15
MinSpareServers 5 MaxSpareServers 10
StartServers 5 MaxClients 150 MaxRequestsPerChild 0
LoadModule env_module libexec/mod_env.so LoadModule config_log_module libexec/mod_log_config.so LoadModule mime_magic_module libexec/mod_mime_magic.so LoadModule mime_module libexec/mod_mime.so LoadModule autoindex_module libexec/mod_autoindex.so LoadModule dir_module libexec/mod_dir.so LoadModule access_module libexec/mod_access.so LoadModule auth_module libexec/mod_auth.so LoadModule log_forensic_module libexec/mod_log_forensic.so LoadModule php4_module libexec/libphp4.so
ClearModuleList AddModule mod_env.c AddModule mod_log_config.c AddModule mod_mime_magic.c AddModule mod_mime.c AddModule mod_autoindex.c AddModule mod_dir.c AddModule mod_access.c AddModule mod_auth.c AddModule mod_log_forensic.c AddModule mod_so.c AddModule mod_php4.c
AddType application/x-httpd-php .php .inc .tpl # Servisi çalıştıran kullanıcı ve grubun tanımlandığı bölüm User apache Group apache
ServerAdmin sadun@csharpnedir.com ServerName localhost Listen 10.200.20.10:80 Port 80 # Alt satırdaki iki konfigrasyon karşı taraftaki istemcinin sunucumuzun sürümünü örenmesini # engellemektedir. Sürümü bilinmeyen sunucuya saldırmak daha zordur çünki hangi bug'ları # içerdiğini tespit edilmesi zordur. ServerTokens Prod
DocumentRoot "/var/www/html"
<Directory /> Options FollowSymLinks AllowOverride None </Directory>
<Directory "/"> Options FollowSymLinks MultiViews Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny Allow from all </Directory>
<IfModule mod_dir.c> DirectoryIndex index.php index.html </IfModule>
<Files ~ "^\.ht"> Order allow,deny Deny from all Satisfy All </Files>
UseCanonicalName Off
<IfModule mod_mime.c> TypesConfig /etc/apache/mime.types </IfModule>
DefaultType text/plain
<IfModule mod_mime_magic.c> MIMEMagicFile /etc/apache/magic </IfModule>
HostnameLookups Off
ErrorLog /var/apache/logs/error_log
LogLevel warn
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent
CustomLog /var/apache/logs/access_log common
ServerSignature Off
<IfModule mod_autoindex.c> ReadmeName README HeaderName HEADER IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t </IfModule>
<IfModule mod_mime.c>
AddCharset ISO-8859-9 .iso8859-9 AddCharset WINDOWS-1254 .cp-1254 AddCharset UTF-8 .utf8
AddType application/x-tar .tgz AddEncoding x-compress .Z AddEncoding x-gzip .gz .tgz
</IfModule>
AddDefaultCharset ISO-8859-9
|
PHP Kurulumu
PHP'yi windows üzerinde kurmaktan pek bahsedemeyiz çünki yapmamız gereken bir kaç dosyayı kopyalamak. Fakat *nix sistemler üzerinde Apache'de olduğu gibi PHP de iki şekilde kurulabilmekte. Bunlardan biri RPM paketleri aracılığı ile hazır derlenmiş paketlerin dağıtılması veya kaynak koddan derlenerek kurulumun gerçekleşmesi. *nix sistemlerde PHP'nin kaynak kod'dan derlenerek kurulması hayati önem taşımaktadır. Bir çok konfigrasyon kurulum esnasında verilen parametreler ile sağlanır. Aynı zamanda kurulum sisteminizdeki kütüphaneleri kullanacağından PHP sisteminiz ile kesinlikle uyumlu bir şekilde çalışır. Örneğin gömülü (built-in) olarak gelen LDAP (Genelde Active Directory'e ulaşmak için gerekli) kütüphaneleri bazı *nix işletim sistemleri ile uyumsuzdur. RPM dağıtımı ile bunun önüne geçemeyebilirsiniz bu yüzden kaynak kod'dan kurulum ile sistemin LDAP kütüphaneleri gösterilip devam edilmelidir.
Dikkat ettiyseniz kurulum esnasında ilk önce sistem bazında güvenlikten söz ettik sonra sunucu bazında güvenlikden söz ettik ve sırada modül bazında güvenlik bulunmakta. PHP içerisinde güvenlik için bazı ayarlamalar bulunmaktadır. Bu konfigrasyonu yaparken amacım programımdan kaynaklanan hatalar sonucu yazdığım program üzerinde sisteme zarar verecek saldırıların önüne geçecek şekilde konfigrasyonu gerçekleştirmek. Bunu asla aklımdan çıkarmamalıyım. Tabiki geliştirdiğim yazlımın kendi içerisindeki güvenliği de söz konusu ama şuan ne yazık ki kapsamımız dahilinde değil.
Ipucu 04: Sanal barındırma yapan sunucu sahiplerinin güvenlik için gösterdiği özeni dedicated sunucu sahipleri de göstermelidir. Bunun için PHP içerisindeki SAFE MODE (güvenli mod) kesinlikle açılmalı. PHP'nin shell'e (kabuk'a) erişmesi kesinlikle engellenmeli, Apache sunucusu sanal klasörler ve sanal barındırmalar kullanılıyorsa php_admin_flag ve php_value özellikleri mutlaka kullanılmalıdır. (Dedicated "atanmış" sunucu tek bir uygulamayı barındıran ve bu uygulama için konfigre edilmiş sunucudur. Kurumsal uygulamalar genelde dedicated sunucular ile karşılaşırız) PHP içerisinde çalışacağı klasör open_basedir ile kesinlikle belirlenmeli dışarıdaki herhangibi klasöre erişmesi engellenerek bu şekilde modül bazında güvenlik teymin edilmelidir.
Bu makale esasında gittikçe uzayabilir. Fakat ilerde bu makaleye bir eklenti yapıp ayrıntılı PHP konfigrasyonunu gözden geçirmeyi planlıyorum. Fakat birşeyler yazmak için sabırsızlandığınızın farkındayım. Bir sonraki makale PHP Geliştirme ortamı olan Zend Studio ile alakalı olacak ve artık kod örneklerine geçmeye başlayacağız. Kurulum ile ilgili bir demoyu yukardaki ekten edinebilirsiniz.
*nix sistemler üzerinde kaynak kod üzerinden kurulum yaparken yollayabileceğiniz parametreler ve açıklamaları: http://www.php.net/manual/en/configure.php
*PHP Konfigrasyonları hakkında ayrıntılı bir döküman hazırlayana kadar ilgili linkden bilgi alabilirsiniz: http://www.php.net/manual/en/ini.php
© Her Hakkı Saklıdır.