Bu belge Apache yi chroot içinde çalıştırmak için uğraşırken yaşadığım kişisel tecrübelerden ortaya çıkmıştır. Kullanılan sistem Fedora Legacy projesi ile güncellemeleri yapılan bir Fedora Core 1 sunucu ve üzerinde Apache 2.x PHP 4.x barındırmaktadır. Bu belgeyi uygularken sorumluluk tamamen size aittir doğacak zaralardan vs vs. Artık başlayabiliriz;
Ben Apache yi kafes içinde çalıştırmak için 3 temel yöntem biliyorum. Önce bunlara kısaca bir göz atalım;
1. Klasik chroot yaklaşımları
Zor ve zahmetlidir ( genellikle ) aşağıdaki yapıyı chroot içinde oluşturmanız gerektirir
* C kütüphanesi
* Pekçok diğer kütüphane (libssl? libm? libmysqlclient?)
* Çözümleyici dosyalar (/etc/nsswitch.conf, /etc/resolv.conf)
* Kullanıcı dosyaları (/etc/passwd, /etc/group)
* log dosyaları için ayrı bir klasör
* Program tarafında kullanılacak modül dosyaları (for Apache: mod_php and other modules)
2. Mod-security nin chroot fonksiyonu
Basit, ancak kılavuzdaki kurulum belgesi kaynak koddan kurulmuş bütün dosyaları tek dizin içinde toplayan bir apache sunucusuna uygun. Dosyaları değişik konumlara dağılmış bir sunucuda uygulaması zor.
3. Mod_Chroot yaklaşımı
Basit hızlı ve kolay. Yalnızca chroot işlemine odaklanmış sade bir modül. Ek hiç bir dosyanın kopyalanmasına gerek kalmaz ( 1 - 2 istisnai durum olabilir :) )
Mod-security ve Mod_chroot u kısaca kıyaslarsak
* mod_chroot uzak istemcilerle iletişim kurmaz.
* mod_chroot yalnızca bir kere hafıza ayırır, başlangıçta.
* mod_chroot istekleri yakalamaz kendi işi ile uğraşır :)
Kurulum
Kuruluma başlamadan önce aşağıdaki sistemlerden birini kullanıyorsanız hazır paketlerden kurulum yapabilecek şanslı kişilerdensiniz :)
Apache Dinamik modülleri ile mod_chroot kurulumu için birkaç basit adım gerekiyor.
1. Kodu indirin ve açın
wget http://core.segfault.pl/~hobbit/mod_chroot/dist/mod_chroot-0.5.tar.gz
tar zxvf mod_chroot-0.5.tar.gz
2. Kendi sunucunuza uygun kaynak kod klasörüne gidin ( örneğin mod_chroot-0.5/src/apache20/ ) ve
apxs -cia mod_chroot.c
komutunu root olarak çalıştırın.
Not: Bazı headerlara ihtiyaç duyabilirsiniz eğer debian kullanıyorsanız apache2-prefork-dev veya
apache2-threaded-dev paketlerinden birini kurmanız gerekmekte.
Not 2: apsx fedora üzerinde apache-dev paketi ile gelmekte Dinamik modül olarak mod_chroot kurmak için bunu indirin.
Ayarlar
Sunucunuzun konfigürasyon dosyasında ( httpd.conf ) Apache için root olarak kabul edeceğiniz dizini ChrootDir direktifi ile belirtin ve DocumentRoot unuzu buna göre ayarlayın, Örneğin:
ChrootDir /var/www
DocumentRoot /
( Eğer DocumentRoot u /var/www şeklinde bırakırsanız sunucu /var/www/var/www dizinide arayacaktır ana dizininizi )
Apache 2.x için Özel Ayar Notları
Apache 2 deki MPM (multi-processing modules) yapısından dolayı pid dosyası chroot un içinde yer almalı Bunun için;
1. Pid dosyası için özel bir klasör yaratılmalı
mkdir -p /var/www/var/run
chown -R root.root /var/www/var/run
2. apachectl nin mutluluğu için gerçek pid dosyası ile arada bir sembolik bağ kurulmalı
ln -s /var/www/var/run/httpd.pid /var/run/httpd.pid
3. ve son olarak httpd.conf a chroot direktifinden önce
PidFile /var/run/httpd.pid
satırı eklenmeli. Sonuç olarak yapılandırma dosyanız şuna benzemeli
PidFile /var/run/httpd.pid
ChrootDir /var/www
DocumentRoot /
... diğer MPM direktifleri (LockFile? ScoreBoardFile?)
Yalnızca pid dosyasını jail içine almak yeterli olmalı ancak Apachenin özelleşterilebilirliğini düşünecek olursak kullanıcıya göre değişiklik gösteren istisnalar her zaman olabilir. mod_chroot tarafından etkilenen bütün MPM lerin tam listesi için buraya bakın adresine bakın.
Modül Sıralaması
mod_chroot Apache nin bütün işi bittikten sonra çağırılmalı bunun için modül listesinin en başına eklenmeli ( Apache modülleri yazım sırasının tersine yükler ) . Eğer modülü dinamik olarak derlediyseniz.
LoadModule chroot_module /usr/lib/httpd/modules/mod_chroot.so
satırlarını modül listesinin en başına ekleyin. Tabi burada kullandığınız dağıtıma bağlı olarak mod_chroot.so dosyasının tam yolunu yazmalısınız (apsx bu direktifi ( büyük ihtimalle ) modül listenizin en sonuna eklemiş olacak buradan kes-yapıştır yapabilirsiniz).
Evet buraya kadar mod_chroot un kurulum ve ayarlarını bitirdik. Ancak;
Başlamadan Önce
Apache yi chroot içinde çalıştırmak bir takım problemlere sebep olabilir.
Bilinen problemler ve çözümleri için okumaya devam edin :)
Apache yi Yeniden Başlatmak
'apachectl reload', 'apachectl graceful' veya 'kill -HUP apache_pid' komutlarını kullandığınız günleri unutun. Apache bunları yapmak için konfigürasyon dosyasını okumak log dosyalarına yazmak ve modüllerini yeniden yüklemek isteyecek ancak kafesinin dışına çıkamayacaktır. Tabi bu sorunu çözmek için gerekli dosyaları kafesin içine yerleştirebilirsiniz ancak bu durumda da chroot yapmanızın bir anlamı kalmaz :)
Sözü fazla uzatmadan çözümü söyleyeyim bundan sonra apacheyi durdurup başlatmak için yalnız iki komut kullanıyoruz. apachectl stop' ve 'apachectl start'
Veritabanları
Eğer veritabanı sunucunuz yalnız Unix soketlerini dinliyorsa onu 127.0.0.1 i de dinlemesi için ayarlamalısınız.
PHP mail() fonksiyonu
Unix altında php nin mail() fonksiyonu sendmail programının çalıştırılabilir haline ihtiyaç duyar. Bu sorunu aşmak için birkaç alternatif metod olmasına karşın ben smtp ile direkt olarak mail gönderen bir sınıf kullanmanızı önereceğim ( örneğin http://pear.php.net/package/Mail gibi).
Paylaşımlı Kütüphaneler Meselesi
Paylaşımlı kütüphaneler programlara çalışma zamanında bağlanan kütüphanelerdir. Bir programın kullandığı paylaşımlı kütüphanelerin tam listesine ldd /programın/tam/yolu şeklinde erişebilirsiniz.
Normal şartlarda bu kütüphaneler başlangıç sırasında ld.so tarafından otomatik olarak yüklenirler, mod_chroot un bu durumla ilgili bir sorunu yoktur. Ancak bazen programlar çalışmaya başladıktan sonrada bu kütüphaneleri dlopen() ve dlsym() fonksiyonları ile çağırabilirler. İşte bu durum chroot ortamı içinde size sorun yaratabilir.
Bununla ilgi şu ana kadar 2 durum raporlanmıştır. Çözüm olarak bu dosyaları chroot yapmadan önce elle yüklemeyi seçebilirsiniz. Bunun için ayar dosyanıza LoadFile direktifi ile beraber dosya adını eklemelisiniz.
1- DNS Lookup problemi için
LoadFile /lib/libnss_dns.so.2
direktifini eklemeniz gerekmektedir
2- Apache 2.0 mpm_worker modülünü Linux 2.6 çekirdeği üzerinde kullanıyorsanız GNU libc libgcc_s.so.1 kütüphanesini pthread_cancel fonksiyonu çağırıldığında yüklemeye çalışacaktır. Çözüm için:
LoadFile /lib/libgcc_s.so.1
direktifini eklemeniz gerekmektedir.
Sanal Sunucular Konusu
mod_chroot sanal sunucularla kesinlikle problemsiz ( tabi başka bir probleminiz yoksa ) çalışmaktadır. Ancak daha öncede belirtildiği gibi her bir Sanal Sunucu
ChrootDir /var/www/bir_ornek_klasoru
DocumentRoot /
ChrootDir /var/www/ikinci_ornek_klasoru
DocumentRoot /
Bunu yerine aşağıdaki biçimde bir yapılandırma oluşturmalısınız.
ChrootDir /var/www
DocumentRoot /birinci_ornek_klasoru
ServerName ikinci.ornek.com
DocumentRoot /ikinci_ornek_klasoru
Not: Bütün işlemleri başarıyla tamamlasanız bile apache başlangıç sırasında
Warning: DocumentRoot [/biricini_ornek_klasoru] does not exist
gibi bir hata verebilir. Bunu dikkate almayın :)
Diğer sorunlar ve destek için
Son olarak http://core.segfault.pl/~hobbit/mod_chroot/install.html adresinde daha detaylı bir kurulum kılavuzu bulabilirsiniz.
Hiç yorum yok:
Yorum Gönder