|
Seri 3 - PHP Kurulum ve Ayarları |
|
Gönderiliyor lütfen bekleyin... |
|
|
Bir çoğumuz için kurulum
sistemi ayağa kaldırmak için yapılan işlemi ifade etmekte. Esasında kurulum güvenliğin
ilk ortaya çıktığı noktadır ve çoğu etkisi yüksek olan saldırılar kurulum esnasında
bilerek veya bilmeyerek bırakılan açıklardan faydalanırlar.
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 Apachenin) 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 Accountdur.
# 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-taskingi desteklemekteydi 2.0 ile beraber
# aynı zamanada multi-threadingi 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 [email protected]
ServerName localhost:80
#Listen 192.168.2.2:80
Listen 80
UseCanonicalName Off
DocumentRoot "C:/Apache/Apache2/htdocs"
# Indexes klasör indexlerine 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 bugları
# 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 [email protected]
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 bugları
# 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
PHPyi windows
üzerinde kurmaktan pek bahsedemeyiz çünki yapmamız gereken bir kaç dosyayı kopyalamak.
Fakat *nix sistemler üzerinde Apachede 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 PHPnin
kaynak koddan 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 Directorye
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 koddan 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ı. PHPnin shelle (kabuka) 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
Makale:
Seri 3 - PHP Kurulum ve Ayarları PHP ile Programlama Ahmet İpek
|
|
|
-
-
Eklenen Son 10
-
Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
|
|