Muallim-i Ali Posted July 16, 2007 Share Posted July 16, 2007 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.logPidFile logs/httpd.pidTimeout 300KeepAlive OnMaxKeepAliveRequests 100KeepAliveTimeout 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 250MaxRequestsPerChild 0</IfModule>LoadModule access_module modules/mod_access.so#LoadModule autoindex_module modules/mod_autoindex.soLoadModule dir_module modules/mod_dir.soLoadModule env_module modules/mod_env.soLoadModule log_config_module modules/mod_log_config.soLoadModule mime_module modules/mod_mime.soLoadModule setenvif_module modules/mod_setenvif.soLoadModule php5_module "C:\Apache\php5\php5apache2.dll"PHPIniDir "C:\Apache\php5"AddType application/x-httpd-php .php .inc .tplAddType application/x-httpd-php-source .phps .incs .tplsServerAdmin [email protected]ServerName localhost:80#Listen 192.168.2.2:80Listen 80UseCanonicalName OffDocumentRoot "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 FollowSymLinksAllowOverride NoneOrder allow,denyAllow from all</Directory>DirectoryIndex index.php index.html index.html.varAccessFileName .htaccess<Files ~ "^\.ht">Order allow,denyDeny from all</Files>TypesConfig conf/mime.typesDefaultType text/plain<IfModule mod_mime_magic.c>MIMEMagicFile conf/magic</IfModule>HostnameLookups OffErrorLog logs/error.logLogLevel warnLogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combinedLogFormat "%h %l %u %t \"%r\" %>s %b" commonLogFormat "%{Referer}i -> %U" refererLogFormat "%{User-agent}i" agentCustomLog 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 ProdServerSignature OffAddDefaultCharset ISO-8859-9AddType application/x-compress .ZAddType application/x-gzip .gz .tgzAddHandler 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.varBrowserMatch "Mozilla/2" nokeepaliveBrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0BrowserMatch "RealPlayer 4\.0" force-response-1.0BrowserMatch "Java/1\.0" force-response-1.0BrowserMatch "JDK/1\.0" force-response-1.0BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefullyBrowserMatch "^WebDrive" redirect-carefullyBrowserMatch "^WebDAVFS/1.[012]" redirect-carefullyBrowserMatch "^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 standaloneServerRoot "/usr/local/apache"PidFile /var/apache/run/httpd.pidScoreBoardFile /var/apache/run/httpd.scoreboardTimeout 300KeepAlive OnMaxKeepAliveRequests 100KeepAliveTimeout 15MinSpareServers 5MaxSpareServers 10StartServers 5MaxClients 150MaxRequestsPerChild 0LoadModule env_module libexec/mod_env.soLoadModule config_log_module libexec/mod_log_config.soLoadModule mime_magic_module libexec/mod_mime_magic.soLoadModule mime_module libexec/mod_mime.soLoadModule autoindex_module libexec/mod_autoindex.soLoadModule dir_module libexec/mod_dir.soLoadModule access_module libexec/mod_access.soLoadModule auth_module libexec/mod_auth.soLoadModule log_forensic_module libexec/mod_log_forensic.soLoadModule php4_module libexec/libphp4.soClearModuleListAddModule mod_env.cAddModule mod_log_config.cAddModule mod_mime_magic.cAddModule mod_mime.cAddModule mod_autoindex.cAddModule mod_dir.cAddModule mod_access.cAddModule mod_auth.cAddModule mod_log_forensic.cAddModule mod_so.cAddModule mod_php4.cAddType application/x-httpd-php .php .inc .tpl# Servisi çalıştıran kullanıcı ve grubun tanımlandığı bölümUser apacheGroup apacheServerAdmin [email protected]ServerName localhostListen 10.200.20.10:80Port 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 ProdDocumentRoot "/var/www/html"<Directory />Options FollowSymLinksAllowOverride None</Directory><Directory "/">Options FollowSymLinks MultiViewsOptions Indexes FollowSymLinks MultiViewsAllowOverride NoneOrder allow,denyAllow from all</Directory><IfModule mod_dir.c>DirectoryIndex index.php index.html</IfModule><Files ~ "^\.ht">Order allow,denyDeny from allSatisfy 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 OffErrorLog /var/apache/logs/error_logLogLevel warnLogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combinedLogFormat "%h %l %u %t \"%r\" %>s %b" commonLogFormat "%{Referer}i -> %U" refererLogFormat "%{User-agent}i" agentCustomLog /var/apache/logs/access_log commonServerSignature Off<IfModule mod_autoindex.c>ReadmeName READMEHeaderName HEADERIndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t</IfModule><IfModule mod_mime.c>AddCharset ISO-8859-9 .iso8859-9AddCharset WINDOWS-1254 .cp-1254AddCharset UTF-8 .utf8AddType application/x-tar .tgzAddEncoding x-compress .ZAddEncoding x-gzip .gz .tgz</IfModule>AddDefaultCharset ISO-8859-9[/CODE][b]PHP Kurulumu[/b]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 Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.