tarafından Mark Nielsen (homepage)
Yazar hakkında:
Mark bağımsız danışman olarak çalışmaktadır. Zamanını GNUJobs.com,
makale yazımı, serbest yazılım yazılımı ve
eastmont.net'de gönüllü çalışarak geçirmektedir.
Türkçe'ye çeviri:
Erdal MUTLU <erdal(at)linuxfocus.org>
İçerik:
|
Linux altındaki tüm sunucuları chroot ortamında çalıştırmak
Özet:
Chroot ortamında çalışan sunucular, herhangi birinin, sunucunun güvenlik
açıklarından faydalanarak sisteme girdiğinde, sisteme verebilecekleri zarı
en aza indirmektedir.
Giriş
Chroot ne demektir? Chroot basit olarak, programın dünyasını yeniden
tanımlamaktadır. Daha kesin olmak gerekirse, programın çalıştığı "ROOT" (/)
dizinini ve giriş (login) ortamını değiştirmektedir. Böylece, chroot olarak kullanılan
dizinin dışındaki ortam, program için var olmamaktadır.
Bu neden kullanışlıdır? Eğer, sisteminize birisi girerse (güvenlik açıklarından
faydalanarak), sisteminizde yer alan tüm dosyaları göremeyeceklerdir.
Sistemin tümüne erişememeleri demek, sistemde yer alan tüm programları kullanamama ve
az güvenli olan diğer dosylara erişememeleri demektir.
Bence tek dezavantıj, ağ üzerinde olup bitenden haberder olabilmemelridir.
Dolayısıyla, bu yazıda çok fazla sözü edilmeyen birkaç şey daha yapmanız gerekecektir:
- Ağ bağlantı noktalarını (ports) güvence altına almak.
- Tüm sunucuları kendi kullanıcı alanlarında çalıştırmak, yani
root olarak çalıştırmamak. Buna ek olarak chroot ortamında çalıştırmak.
- Sistem loglarını (syslog) başka bir bilgisayara yönlendirmek.
- Log dosyalarını incelemek.
- Bilgisayarınızın rastgele olarak seçilmiş bağlantı noktalarına (port)
giriş yapmaya çalışanları incelemek.
- Sunucular için ayrılan MİB (CPU) ve belleği sınırlandırmak.
- Kullanıcı kotalarını aktif hale getirmek.
Chroot (root kullanıcısı alanı olarak değil) ortamını bir güvenlik çizgisi
olarak düşnmemin nedeni, eğer herhangi biri, sistemin güvenlik açıklarından
yararlanarak, root dışında bir kullanıcı olarak sisteme girmeyi başarabilirse,
sisteme verebilecekleri zarar, girdikleri ortamla sınırlıdır.
Girdikleri ortamda yer alan dosyaların genelde root'a ait olması,
saldırıda bulunabilecek seçenekleri daha da aza indirmektedir.
Açıktır ki, sisteminize birisinin girmesi pek hoş bir şey değildir, ancak
böyle bir durumda verebilecekleri zararı en aza indirmek önemlidir.
Bunu sağlamada benim kullandığım yöntemin 100%
güvenli olmayabileceğini LÜTFEN AKLINIZDAN ÇIKARTMAYIN.
Bu benim ilk denemem ve eğer çalışırsa, pürüzleri sonradan gidermek daha kolay olacaktır.
Ben bunu, chroot ortamı ile ilgili bir NASIL belgesi yaratmak için yolgösterim olarak
düşünmekteyim.
Herşeyi chroot olarak nasıl yapacağız?
"/chroot" adında bir dizin yaratıp, tüm sunucuları bu dizin altına aşağıdaki biçime
göre yerleştireceğiz:
- Syslogd chroot ortamında yer alarak, her sunucu ile birlikte çalışacak.
- Apache, /chroot/httpd dizininde chroot ortamında yer alacaktır.
- Ssh, /chroot/sshd dizininde yer alacaktır.
- PostgreSQL, /chroot/postmaster dizininde yer alacaktır.
- Sendmail, chroot ortamında olacak, ancak maalesef root olarak çalışması
gerekecektir.
- ntpd, /chroot/ntpd dizininde yer alacaktır.
- named, /chroot/named dizininde yer alacaktır.
Tüm sunucular, tamamen souyutlanmış olarak çalışmalıdır.
Chroot ortamlarını yaratan Perl programım.
Config_Chroot.pl.txt
programını çektikten sonra Config_Chroot.pl olarak, isminin değiştirilmesi gerekmektedir.
Program, yüklenmiş olan sunucuların listesini vermekte, yapılandırım dosyalarını
görüntülemekte, sunucuyu yapılandırabilmekte ve sunucuyu durdurup tekrar
çalıştırabilemktedir. Genelde bunlar sizin yapmanız gereken şeylerdir.
- Chroot dizini yaratmak.
mkdir -p /chroot/Config/Backup
- Config_Chroot.pl.txt
dosyasını indirip, /chroot/Config_Chroot.pl olarak ismini değitirmek.
- Eğer, ev dizin ismini /chroot olarak kullanmıyorsanız, programın
içinden bunu değiştirin.
- yapılandırım dosyalarını çekin.
Şimdi önemli bir not: Ben programı, sadece RedHat 7.2 ve RedHat 6.2 test ettim.
Kendi Linux dağıtımınıza göre Perl programını değiştirebilirsiniz.
Chroot konusunda kocaman bir yazı oluştu, ancak Perl programı sayesinde
yazı oldukça kısaldı. Aslında, birkaç sunucuyu chroot ortamına taşıyınca,
chroot ortamına taşınması gereken benzer dosya ve yapılandırım dosyalarına sahip
olduklarını gördüm. Bir sunucu için hangi dosyalara gereksinim duyduğunuz anlamanın
en kolay yolu man sayfasına bakmak veya program kütüphane dosyaları kullanıyorsa,
ldd /usr/bin/program bakmaktır. Ayrıca, sunucuyu chroot ortamına taşıdıktan sonra
elle çalıştırıp, oluşan hatalar veya loglara bakabilirsiniz.
Genel olarak bir sunucu yüklemek için:
cd /chroot
./Config_Chroot.pl config SERVICE
./Config_Chroot.pl install SERVICE
./Config_Chroot.pl start SERVICE
Chroot ortamında Ntpd
Ntpd bir zaman sunucusudur ve sizin bilgisayarınız ile diğer bilgisayarların zamanlarını
ayarlamaya yaramaktadır. bu sunbucuyu chroot ortamına taşımak oldukça basit bir işlem oldu.
cd /chroot
# Eğer, benim yapılandırma dosyamı kullanmıyorsanız,
# aşağıdaki satırın # ni kaldırın.
#./Config_Chroot.pl config ntpd
./Config_Chroot.pl install ntpd
./Config_Chroot.pl start ntpd
Chroot ortamında DNS veya named
Daha önceden yapılmıştır. Ayrıntılar için
http://www.linuxdoc.org/HOWTO/Chroot-BIND8-HOWTO.html
veya
http://www.linuxdoc.org/HOWTO/Chroot-BIND-HOWTO.html belgelerine bakabilirsiniz.
Eğer, benim programı kullanmak istiyorsanız
cd /chroot
# Eğer, benim yapılandırma dosyamı kullanmıyorsanız,
# aşağıdaki satırın # ni kaldırın.
#./Config_Chroot.pl config named
./Config_Chroot.pl install named
./Config_Chroot.pl start named
Chroot ortamındaki sunucularla Syslog ve benim şikayetlerim.
Syslogd chroot ortamında çalıştırmak istiyorum. Benimsenmiş değer olarak
syslogd, /dev/log sistem aygıtını kullanmaktadır ve bu aygıt chroot ortamından
görünmemekte, yani ulaşılamamaktadır. Dolayısıyla syslogd'yi kolayca chroot ortamına
kolayca taşıyamıyorsunuz. Bazı çözüm önerileri aşağıda verilmiştir:
- Syslogd'yi her sunucuyla birlikte chroot ortamına taşımak.
Ben bunu denedim ve log elde ettim. Bu yöntem benim hoşuma gitmiyor, çünkü
syslogd root kullanıcısı olarak çalışmaktadır.
- Loglar, bilgisayarın dışanda başka bir yere yönlendirilebilir mi, ona bakılmalıdır.
- Loglar, syslogd yerine sadece dosyalara alınabilir. Bu belkide en güvenli seçenektir.
Ancak, sistemin güvenliğini delerek giren birisi loglarla da oynayabilir.
- Ana syslogd'nin birden fazla yerdeki dosyalara bakması sağlanabilir. Bunun için syslogd'nin
-a seçeneğinden yararlanılabilir.
Benim tek çözümüm, syslogd'nin herbir sunucu ile birlikte chroot ortamına taşımak oldu.
Aslında, syslogd'yi root dışındaki bir kullancı olarak ve kendi chroot ortamında bulunarak
çalıştırmak isterdim, ancak daha iyi bir çözüm bulana kadar bu konuda başka bir şey yapmayacağım.
Eğer, syslogd'yi herbir sunucu ile birlikte ayrı ayrı çalıştırmak istemiyorsanız, ana
syslogd'nin çalıştırıldığı dosyaya, syslogd'nin çalıştırma satırını aşağıdaki gibi
değiştirin:
syslogd -a /chroot/SERVICE/dev/log
Eğer, ssh ve dns çalıştırıyor olsaydım, komut
syslogd -a /chroot/ssh/dev/log -a /chroot/named/dev/log -a /dev/log
şeklinde olacaktı.
Syslogd ile ilgi son olarak, syslogd'yi root dışında bir kullanıcı altında ve
chroot ortamında çalıştırmayı isterdim. Birkaç değişik şey denedim, ancak başarılı
olamadım. Eğer, syslogd'yi root dışında bir kullanıcı olarak her sunucu ile birlikte
çalıştırabilseydim, benim güvenlik ile ilgili olan gereksinimlerimi karşılamış olurdum.
Belkide, logları bilgisayar dışına göndererek yapılabilir.
Chroot ortamında Apache
Bunu yapmak çok kolay oldu. Bir kere ayarladıktan sonra, Perl programları
çalıştırma imkanını elde ettim. Şu anda yapılandırım dosyam oldukça büyük,
çünkü chroot ortamına, Perl ve PostgreSQL kütüphanelerini koymam gerekti.
Unutulmaması gereken bir not: Eğer, veritabınına bağlanacaksanız, onun 127.0.0.1
loopback aygıtı üzerinde çalıştırın ve Perl'ün DBI modülü için
programlarınızda bağlanılacak bilgisayar olarak 127.0.0.1 olarak belirtin.
Aşağıda benim veritabanına, apache'nin bağlantılarından faydalanarak, nasıl bağlandığıma dair bir örnek var:
$dbh ||= DBI->connect('dbi:Pg:dbname=DATABASE',"","", {PrintError=>0});
if ($dbh ) {$dbh->{PrintError} = 1;}
else
{$dbh ||= DBI->connect('dbi:Pg:dbname=DATABASE;host=127.0.0.1',"","",
{PrintError=>1});}
Kaynak:
http://httpd.apache.org/dist/httpd/
Apache'yi derleyerek /usr/local/apache dizinine yükleyin. Daha sonra
perl programını kullanın.
cd /chroot
# Eğer, benim yapılandırma dosyamı kullanmıyorsanız,
# aşağıdaki satırın # ni kaldırın.
# ./Config_Chroot.pl config httpd
./Config_Chroot.pl install httpd
./Config_Chroot.pl start httpd
Ben httpd.conf dosyasını aşağıdaki gibi değiştirdim:
ExtendedStatus On
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>
<Location /server-info>
SetHandler server-info
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>
Daha sonra İnternet gezgininizi
http://127.0.0.1/server-status veya http://127.0.0.1/server-info
adresine yöneltmeniz ve denemeniz yeterli olacaktır!
Chroot ortamında ssh
İlk olarak ve ideali 22 numaralı bağlantı noktasında (port) çalışan ssh'yı
2222 bağlantı noktasına yönlendirmek olacaktır. Onadan sonra, root
kullanıcısı dışında bir kullanıcı olarak ssh'yı 2222 bağlantı noktasını
dinleyecek şekilde çalıştırın. Ssh ile olan ilk bağlantı için bize gereken
sadece iyi geçişsözcüklerine sahip güvenli kullanıcı alanları, ki kullanıcılar
sisteme giriş yapabilsin. Sisteme girdikleri zaman, 127.0.0.1:2322'de
çalışacak ve gerçek sisteme girmelerini sağlayacak ikinci bir ssh sunucusunu
ayarlamanız gerekecektir. İkinci ssh suncusu SADECE loopback aygıtından gelen
bağlantılara izin veriyor olması gerekmektedir. Biz bunu yapmayacağız.
Bizim burada yapacağımız tek şey, ssh'yı chroot ortamına taşımaktır.
Sshd sunucusunu root dışında bir kullanıcı olarak
çalıştırmak ve ikinci bir sshd sunucusunu loopback aygıtını dinleyecek
şekilde ayarlamak, okuyucuya ödev olarak bırakılmıştır.
Tekrar söylemek gerekirse, biz burada sadece sshd sunucusunu chroot
ortamına taşıyacağız ve oluşacak sonuçlar (Eğer, sadece bunu yaparsanız, tüm
sisteminize ulaşamayacaksınız.) hakkında düşünmenizi sağlayacağız.
Ayrıca, en iyisi, bunu logları bilgisayarın dışına alabilmek için ayarlamaktır.
Siz büyük bir olasılıkla OpenSSH kullanıyor olacaksınız. Ben kolay olsun diye
SSH'nın ticari sürümünü kullanıyorum (Bu bir özür değil tabii.).
Kaynak:
http://www.ssh.com/products/ssh/download.cfm
Ssh'yı /usr/local/ssh_chroot dizinine yükleyiniz. Daha sonra perl programını kullanınız.
cd /chroot
# Eğer, benim yapılandırma dosyamı kullanmıyorsanız,
# aşağıdaki satırın # ni kaldırın.
# ./Config_Chroot.pl config sshd
./Config_Chroot.pl install sshd
./Config_Chroot.pl start sshd
Eğer, ftp sunucusunu ssh ile değiştirmek istiyorsanız, bence en iyisi
sshd'yi chroot ortamında çalıştırmanızdır. Dolayısıyla, kullanıcıların
sisteme ulaşımları kısıtlanmış olacaktır. Rsync ve SCP bilgisayara dosya
aktarmak için çok uygun. Birçok ftp sunucusu chroot ortamında çalışabilmektedir,
ancak ben, metin biçiminde kullanıcı adı ve geçişsözcüklerinin gidip gelmesinden
rahatsızlık duyuyorum.
Chroot ortamında PostgreSQL
Bu, perl kadar kolay oldu, sadece daha fazla kütüphane dosyası aktarmak gerekti.
Sonuç olarak bu o kadar da zor bir iş olmadı. Fazladan tek yapmam gerek,
PostgreSQL veritabanını ağ loopback aygıtı üzerinden açmaktır. Chroot ortamında
yer aldığından, sanaldoku sunucusu gibi diğer sunucuların ona ulaşması
mümkün olmayacaktı. PostgreSQL'e bir de Perl derledim. Böylece yapılandırma dosyamda
birçok Perl ile ilgili komut yer aldı.
Kaynak:
ftp://ftp.us.postgresql.org/source/v7.1.3/postgresql-7.1.3.tar.gz
Apache'yi derleyerek /usr/local/postgres dizinine yükleyiniz. Daha sonra
perl programını kullanınız.
cd /chroot
# Eğer, benim yapılandırma dosyamı kullanmıyorsanız,
# aşağıdaki satırın # ni kaldırın.
# ./Config_Chroot.pl config postgres
./Config_Chroot.pl install postgres
./Config_Chroot.pl start postgres
Chroot ortamında Sendmail
Devam edim ve benim perl programımı çalıştırın.
cd /chroot
# Eğer, benim yapılandırma dosyamı kullanmıyorsanız,
# aşağıdaki satırın # ni kaldırın.
# ./Config_Chroot.pl config sendmail
./Config_Chroot.pl install sendmail
./Config_Chroot.pl start sendmail
Evet, şimdi birşeyler fark edebildiniz mi? Evet, gerçekten root
kullanıcısı olarak çalışmaktadır. Ayrıca, /etc/rc.d/init.d/sendmail çalıştırıldığında,
bazı dosyalar tekrar yaratıldı. Benim program bunları yapmamaktadır.
/etc/mail dizininde yapacağınız her değişiklikten sonra, dosyaları /chroot/senmail/etc
altına kopyalamayı unutmayınız. Ayrıca, kullanıcılar sisteme
giriş yaptıklarında e-iletilerini okuyabilmeleri için, /var/spool/mail dizinini,
/chroot/sendmail/var/spool/mail dizinine yönlendirmeniz gerekmektedir.
İyi haber, e-ileti göndermek işini herzaman yapabilirsiniz. Sorun yaratan ileti alma
işlevidir. Dolayısıyla, apache ve sendmail'i yükleme sırasında hiçbir sorun yaşamadım.
Bazı Perl programlarım e-ileti göndermektedir. Dolayısıyla sendmail dosyalarını
apache'nin bulunduğu chroot ortamına kopyalamam gerekti.
Chroot ortamında çalıştırılması gereken başka sunucular.
İşte benim felsefem:
-
Sendmail, ssh, apache, postgresql, syslog dahil olmak üzere, bilgisayarda
çalışan tüm sunucular chroot ortamında çalıştırılmalıdır.
- Her sunucu root kullanıcısı dışındaki başka bir kullanıcı olarak
çalıştırılmalıdır (Bunun için 1024'ün altındaki, korumalı bağlantı noktalarını
1024 üstündeki başka bağlantı noktalarına yönlendirmenız gerekebilir.)
Sendmail ve syslogd için bunu zaten yapmanız gerekir.
- Logları bilgisayar dışına göndermeniz gereklidir.
- Her sunucu için ayrı bir disk bölmesi (partition) kullanılmalıdır.
Böylece, sisteme girebilecek korsanların, dosya yazmak veya oluşturmak
istediklerinde sınırlı alanları olacaktır. Eğer, yeterli sayıda disk
bölmesine sahip değil iseniz, loopback aygıtlarını mount edip kullanabilirsiniz.
- Değişmeyen tüm dosyaların sahibi root olmalıdır.
Sendmail ve syslogd sunucularına gelince. Ben hala bunların da root
olmayan kullanıcılar olarak çalıştırılması taraftarıyım.
Sendmail için bunun mümkün olması gerekmektedir, ancak ben henüz başaramadım.
Bunu yapmanın sakıncalı tarafları olduğunu biliyorum, ancak dosya erişim
hakları da gözönünde bulundurularak bunların üstesinden gelinebilir diye düşünüyorum.
Belkide benim göremediğim bazı sebepler vardır. Ancak, bunların aşılabileceği
düşüncesindeyim.
Syslogd'yi denemedim. Ancak, sistem loglarının root olmayan kullancı olarak
saklanmasının mümkün olacağını düşünüyorum. En azında syslogd'yi chroot ortamında
çalıştırabilmiştim.
Tüm sunucular root olmayan kullanıcılar olarak çalıştırılmalıdır. Buna NFS dahil. Herşey.
Öneriler
- Ssh için iki ayrı suncu ve giriş kullanın.
- Sendmail veya başka bir mail programının root olmayan kullanıcı olarak
nasıl çalıştırılabileceğini bulmaya çalışın.
- /lib altında yer alan tüm kütüphanelere gereksiniminiz yoktur. Ben kolaylık olsun diye
hepsini kopyalamıştım. Çoğuna gereksiminiz yoktur.
- Syslogd'nin loglarını uzaktaki başka bir bilgisayara aktarın. Syslogd'yi bir
bağlantı noktasında yer almasını ve buradan yerel loopback aygıtı üzerinden başka bir bilgisayara
logların aktarılması için bir yol bulun. Syslogd'nin root olmayan kullanıcı olarak
çalıştırma yollarını araştırın.
Sonuç
Bence chroot ortamı tüm sunucular için yapılmalıdır. İnancıma göre, root olmayan kullanıcı
olarak, chroot ortamında çalıştırılmayan sunucular çok hatalıdır.
Umarım büyük Linux dağıtıcıları bunu yaparlar, veya küçükleri, veya HERHANGİBİR dağıtıcı.
Mandrake, RedHat'ten esinlenerek işi daha da ileriye götürdü. Belkide birileri
Mandrake'den esinlenerek ve sunucuları chroot ortamına taşıyarak daha da ileriye
götürebilirler. GNU/Linux ortamında, başkalarının yaptıklarını bir başkasının
yeniden yapmasını engelleyecek hiç bir şey yoktur. Dolayısıyla bence bu mümkün.
Eğer, herhangibir şirket, chroot ortamını sağlayıcı sistematik ve
kolay bir yöntem oluşturursa, bence bu harika olur! Herşeyin grafik ortamlarda
yapıldığı şu günlerde, böyle birşeyin de KGA olarak yapılması birçok insanın
işini kolaylaştıracaktır. Birçok kişi için, komut satırından ayarlamalar yapmak
pek çekici gelmemektedir. KGA aracılıyla yapılandırma yapabilmeleri ve sunucuların
düzgün şalışması onlar için yeterli olmaktadır. Arka tarafta nelerin döndüğü
onları pek ilgilendirmemektedir!
Ben, tüm sunucuların chroot ortamında root olmayan kullanıcılar
olarak ayarlanması fikrini %100 olarak desteklemekteyim ve
bunu yapmayan dağıtımlar bana uygun olmayacaktır ve onları üretim ortamlarında kullanmayı
hiç düşünmüyorum. Herşeyi chroot ortamına taşımayı hedefliyorum. Sonunda
bunu başaracağım.
Chroot konusunda NASIL belgesi oluşturmayı planlıyorum. Bu yazıyı LyX biçimine
çevirebilecek birisi varsa, bana yardım etmesini istiyorum. Bunu Linux NASIL belgeleri
arasına koymak mümkün olabilir.
Kaynaklar
-
Eğer, bu yazı değişirse, onu
http://www.gnujobs.com/Articles/23/chroot.html adresinde bulabilirsiniz.
Bu yazı için görüş bildiriminde bulunabilirsiniz
Her yazı kendi görüş bildirim sayfasına sahiptir. Bu sayfaya yorumlarınızı yazabilir ve diğer okuyucuların yorumlarına bakabilirsiniz.
2002-01-15, generated by lfparser version 2.21