Bir programı güvenli bir ortamda çalıştırmanın yolu nedir?
1- Programı yetkileri azaltılmış bir kullanıcı hesabıyla çalıştırmak
2- Programı chroot ortamında çalıştırmak
Şimdi, sorunumuz şu: Bu iki önlem bir anlamda birbirini imkansız kılarlar. Bir programı chroot ortamında çalıştırmak için root olmanız gerekir. Root olarak chroot ortamında çalıştırdığınız bir program ise root yetkileriyle çalışır. Neyseki bu sorunun çözümü ilk bakışta oldukça kolaydır.
root@Serafettin:~# chroot /chroot/dizini su -
Bu cozumun sorunu su komutunu da chroot ortamimizin icine tasimamizi gerektirmesidir. Hem su tehlikeli bir komut olduğundan, hemde tembellikten bununla uğraşmak yerine chroot'un yerine geçip "su" işini bizim yerimize halledecek chrootuid adlı programı kullanabiliriz. Ne yazıkki apt-get chrootuid yazarak kullanamıyoruz, çünkü Debian stable için henüz yok, ama testing'den indirip dpkg -i ile kurmanız mümkün, dependency problemi yaşatmıyor. Chrootuid programının tek yaptığı "su" yükünü sırtımızdan almak. Programın kullanımı ise daha anlaşılır:
root@Serafettin:~# chrootuid /chroot/dizini yetkisiazaltilmiskullanici chrootortamindacalisacakkomut
Peki, buraya kadar geldik şimdi işi biraz pratiğe dökelim. önce sistemimize mlDonkey'i çalıştıracak kullanıcıyı ekleyelim
root@Serafettin:~# adduser essek
Sonra www.mldonkey.net adresinden mlDenkey'nin en son versiyonunu indirelim. Burada dikkat etmemiz gereken nokta programı chroot ortamında çalıştıracağımızdan dolayı statik olarak derlenmiş sürümünü indirmek (isminde static geçen sürüm).
root@Serafettin:~# su essek
essek@Serafettin:/root$ cd ~
essek@Serafettin:~$ wget http://savannah.nongnu.org/download/mldonkey/stable/mldonkey-2.02-0.static.i586-Linux.tar.bz2
essek@Serafettin:~$ tar -jxvf mldonkey-2.02-0.static.i586-Linux.tar.bz2
essek@Serafettin:~$ mv mldonkey-distrib-2.02-0 mldonkey
Böylece mlDonkey çalışmaya hazır hale geldi. Şimdi bir defa çalıştırıp gerekli ayar dosyalarını yaratmasını sağlıyoruz.
essek@Serafettin:~$ ./mldonkey/mldonkey
İlk defa çalıştıktan sonra Ctrl+C tuşlarına basarak programı durduralım. Şimdi root kullanıcısına dönerek mldonkey'i bu sefer chroot ortamında çalıştıracağız.
essek@Serafettin:~$ exit
root@Serafettin:~# chrootuid /home/essek essek /mldonkey/mldonkey
Şu anda mlDonkey'nin chroot ortamında essek kullanıcısıyla çalışıyor olması lazım bunu doğrulamak için aşağıdaki yöntemi uyguluyoruz:
root@Serafettin:~# ps -u essek
Karşımıza mldonkey sürecinin (prosesinin) çıkması lazım. Eğer çıktıysa bir de chroot olup olmadığını kontrol etmekte fayda var. Gelen listede en baştaki sütun, sürecin Process ID'sini (pid'ini) belirtir. mlDonkey'in pid'inin 333 olduğunu varsayarsak:
root@Serafettin:~# ls /proc/333/root
Bu komutun bize chroot dizinimizin (Örnekte /home/essek) içeriğini döndürmesi gerekir. Eğer bu sonucu aldıysak hayırlı uğurlu olsun. Artık güvenli olarak çalışan bir mlDonkey'miz var.
Ben bir de daemon olsun istiyorum
Eğer bir dosya paylaşımı fanatiğiyseniz mlDonkey'nin sadece bir terminalde öylece durması hoşunuza gitmeyebilir. Bu durumda yapılabilecek en iyi şey onu bir Daemon olarak çalıştırmak, hatta bir init scripti ile her sistem açılışında çalışmasını sağlamak olacaktır. Bunun için ben Debian ile gelen start-stop-daemon adlı ufak programcığı kullandım. Debian dışı dağıtımlar kullananlar için bu işin D. J. Berntein'ın daemontools'u kullanılarak nasıl yapılacağı burada anlatılmış.Aslında yukarıda yazılanlardan sonra start-stop-daemon'ın man sayfasına bir göz atmak yeterli olacaktır. Aslında start-stop-daemon kendi içerisinde chuid ve chroot seçenekleri sunsa da ben chroot olarak çalıştırmayı beceremedim, beceren varsa buyursun. mlDonkey'yi start-stop-daemon kullanarak çalıştırmak oldukça kolay:
root@Serafettin:~$ start-stop-daemon --start --background --quiet --exec /usr/bin/chrootuid -- /home/essek essek /mldonkey/mldonkey
Bu komutu masaya yatırıp parça parça incelersek:
--start: açıklama gereği duymuyorum, programın başlatılacağını gösteriyor
--background: Çalıştırdığınız program eğer kendiliğinden fork() ile kendini arkaplana atmazsa zorla arkaplanda çalıştırmayı sağlıyor.
--quiet: stat-stop-daemon'a bir hata olmadıkça ekranı doldurmamasını söylüyor.
--exec: Çalıştıracağımız komut, dikkat etmemiz gereken nokta komutun sadece adını değil tam yolunu yazmak gerektiği.
-- : Boş "-- " parametresinden sonra yazdıklarımız --exec bölümünde verdiğimiz komuta parametre olarak geçiriliyor
Çalıştırdığımız mlDonkey sürecini durdurmak içinse aşağıdaki komutu veriyoruz:
root@Serafettin:~#start-stop-daemon --stop --exec /home/essek/mldonkey/mldonkey
Aslında bu yöntemin performansının oldukça düşük olduğunu itiraf etmem lazım. Bunun yerine start-stop-daemon'ın --pidfile seçeneğini kullanabilirdik ancak bu seçenek gerçekte çalışıtrğımız komut chrootuid olduğundan ve mldonkey onun dışında çalıştığından işe yaramıyor.
Pekiala buraya kadar geldiğimize göre bir de init scripti yazarak programı sistem açılışında çalıştırmamızı kimse engelleyemez. Aşağıdaki scripti /etc/init.d dizininize kopyalayıp gerekli sembolik linkleri oluşturduğunuzda program sistem açılırken çalışacaktır. Tabii onun yerine sadece ./mldonkeyd start şeklinde de kullanmanız mümkün.
#!/bin/sh set -e MLDONKEY_BIN=/mldonkey/mldonkey CHROOTUID_BIN=/usr/bin/chrootuid CHROOT_DIR=/home/essek MLDONKEY_USER=essek test -f ${CHROOT_DIR}${MLDONKEY_BIN} || exit 1 test -f $CHROOTUID_BIN || exit 1 test -d $CHROOT_DIR || mkdir -p ${CHROOT_DIR} case "$1" in start) echo "MLDonkey Deamon Başlatılıyor" start-stop-daemon --start --background --exec ${CHROOTUID_BIN} -- ${CHROOT_DIR} ${MLDONKEY_USER} ${MLDONKEY_BIN} ;; stop) echo "MLDonkey Daemon Durduruluyor" start-stop-daemon --stop --exec ${CHROOT_DIR}${MLDONKEY_BIN} ;; restart) echo "MLDonkey Daemon Durduruluyor" start-stop-daemon --stop --exec ${CHROOT_DIR}${MLDONKEY_BIN} echo "MLDonkey Deamon Başlatılıyor" start-stop-daemon --start --background --exec ${CHROOTUID_BIN} -- ${CHROOT_DIR} ${MLDONKEY_USER} ${MLDONKEY_BIN} ;; *) echo "Kullanımı: /etc/init.d/mldonkeyd {start|stop|restart}" ;; esac
Hepinize hayırlı paylaşımlar.
Bu arada FZ`nin gönderdiği programlama dili karşılaştırma sitesinde, C`di Perl`dü birçok dili yayan bırakan bir dil var OCML. mldonkey`in yazıldığı dildir kendisi birara gözatın derim. Özellikle de Perl`e okuması zor diyenler :))