[LinuxFocus-icon]
Ev  |  Erişimdüzeni  |  İçindekiler  |  Arama

Duyumlar | Belgelikler | Bağlantılar | LF Nedir
Bu makalenin farklı dillerde bulunduğu adresler: English  Castellano  ChineseGB  Deutsch  Francais  Italiano  Nederlands  Portugues  Turkce  Arabic  

convert to palmConvert to GutenPalm
or to PalmDoc

[Photo of the Author]
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

[illustration]

Ö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:

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: 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.
  1. Chroot dizini yaratmak.
    mkdir -p /chroot/Config/Backup
  2. Config_Chroot.pl.txt dosyasını indirip, /chroot/Config_Chroot.pl olarak ismini değitirmek.
  3. Eğer, ev dizin ismini /chroot olarak kullanmıyorsanız, programın içinden bunu değiştirin.
  4. 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: 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:
  1. Sendmail, ssh, apache, postgresql, syslog dahil olmak üzere, bilgisayarda çalışan tüm sunucular chroot ortamında çalıştırılmalıdır.
  2. 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.
  3. Logları bilgisayar dışına göndermeniz gereklidir.
  4. 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.
  5. 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

 

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

  1. 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.
 talkback page 

Görselyöre sayfalarının bakımı, LinuxFocus Editörleri tarafından yapılmaktadır
© Mark Nielsen, FDL
LinuxFocus.org

Burayı klikleyerek hataları rapor edebilir ya da yorumlarınızı LinuxFocus'a gönderebilirsiniz
Çeviri bilgisi:
en --> -- : Mark Nielsen (homepage)
en --> tr: Erdal MUTLU <erdal(at)linuxfocus.org>

2002-01-15, generated by lfparser version 2.21