SSH kullanicilarini ev dizinlerine hapsetmek

Onceki gun, arkadasimin internet baglantisini sunucu uzerinden tunellemek icin ihtiyac duydugu bir kullanici olusturmak istedim. Gereksinimlerim ozetle soyleydi. Kullanici baglandiginda ev dizinine hapsedilecek. Temel dosya ihtiyaclari (ssh -N burada secenek olmaktan cikiyor) icin kullanabilecegi nano, rm, cp, ls, mv, grep ve cat disinda baska bir komut/programcik kullanamayacak. Shell olarak BASH atayacagim. Bu kisimdan itibaren yapilan tum islemler Ubuntu 12.04.2 LTS 64 bit sunucuda yapildi.

sshdconfig(5) man sayfasini okurken yapmak istedigim seyin ChrootDirectory direktifi sayesinde yapilabilecegini gordum. Problem ChrootDirectory’nin varsayilan olarak tum kullanicilari hapsetmesiydi. Sisteme yonetici olarak erismesi gereken uc kisiyi bir sekilde bu yeni olusturacagim tunel kullanicisindan ayirmam gerekiyordu. sshdconfig(5) sayfasinda chroot diye arama yaparken bir de Match direktifine denk geldim. Match ifadesi User, Group, Host ve Address kriterleriyle eslesme yapabiliyormus. Eslesme ardindan ise genel ayarlari ne sekilde ezecegimizi belirtmemiz gerekiyormus. Yapmak istedigime geri donecek olursak, kullanicilari ev dizinlerine hapsetme. Yalniz bir kullanici sana adim ORNEK diyorsa onu ev dizinine hapsetmelisin. Match ifadeleri bir baska Match ifadesine rastlayana ya da dosya bitene kadar devam ediyorlarmis. Dolayisiyla ornegin normalde X11Forwarding’e izin verdigimizi varsayarsak Match bloguna yazilacak X11Forwarding no ile kritere uyan oturumlar icin X yonlendirmeyi kapatabilmek mumkun.

man sayfasina gore ChrootDirectory en az bir kabuk, /dev/null, /dev/zero, /dev/stdin, /dev/stdout, /dev/arandom ve /dev/tty aygit dugumlerini icermeliymis. Bu bilgiyi bir kenarda tutup yavas yavas islemi nasil yapacagimizi anlatmaya baslayayim.

Once yeni kullanicimizi olusturuyoruz.

sudo adduser --home /home/ornek --shell /bin/bash ornek

Sifreyi ve bir iki soruyu yanitladiktan sonra kullanicimiz olusturulmus oldu. Simdi /etc/ssh/sshd_config dosyasinin en sonuna su ifadeleri eklemeliyiz. Duzenledigimiz yapilandirma dosyasinin aktif hale gelmesi icin servisi yeniden baslatiyoruz.

Match User ornek ChrootDirectory %h sudo service ssh restart

Su anda ornek kullanicisi SSH baglantisi yapmak isterse sifresini girdikten sonra su iki satiri gorecek ve baglanti kuramayacaktir.

Connection to ornek.com closed by remote host. Connection to ornek.com closed.

Yukarida da belirttigim gibi kullanici bir kabuk bulmayi bekliyor -olustururken /bin/bash demistik- fakat hapsoldugu dizinde -ki %h ile ev dizini olan /home/ornek altina hapsediyoruz- /bin/bash yok. O halde kopyalayalim.

sudo mkdir /home/ornek/bin sudo cp /bin/bash /home/ornek/bin

Su asamada baglanmayi denerse yine ayni sekilde hata alacaktir. (Ubuntu 12.04.2 LTS 64 bit altinda calistigimizi tekrar hatirlatayim) Bunun nedeni BASH’in kullandigi kitaplik nesnelerinin dinamik olarak baglanmis olmasi. Peki bunu nasil ogreniyoruz? Asagidaki komutu calistiralim ve ciktisina bakalim.

file /bin/bash /bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xe643cefb2c672ad94e955067c511537ddbab48da, stripped

Yukaridaki cikti kabaca bize BASH’i calistirmak icin birkac baska dosyaya ihtiyacimiz oldugunu soyluyor. Neyse ki bu dosyalari bulmak cok kolay. ldd komutunun bir dosyanin hangi paylasilan nesnelere ihtiyaci oldugunu gosterdigini biliyoruz. Hemen BASH icin bakalim. linux-vdso.so.1 icin bir dizin vermemis fakat bellek adresi oldugunu tahmin ettigim bir adres var. O halde bizim bir kopyalama islemi yapmamiza gerek yok. libtinfo.so.5, libdl.so.2, libc.so.6 nesnelerini /home/ornek/lib/x86_64-linux-gnu altina, ld-linux-x86-64.so.2 nesnesini ise /home/ornek/lib64 altina kopyalamamiz gerekiyor.

ldd /bin/bash linux-vdso.so.1 => (0x00007ffff8dfc000) libtinfo.so.5 => /lib/x8664-linux-gnu/libtinfo.so.5 (0x00007f5e61aa7000) libdl.so.2 => /lib/x8664-linux-gnu/libdl.so.2 (0x00007f5e618a3000) libc.so.6 => /lib/x8664-linux-gnu/libc.so.6 (0x00007f5e614e3000) /lib64/ld-linux-x86-64.so.2 (0x00007f5e61cd5000) sudo mkdir -p /home/ornek/lib/x8664-linux-gnu sudo mkdir /home/ornek/lib64 sudo cp /lib/x8664-linux-gnu/libtinfo.so.5 /home/ornek/lib/x8664-linux-gnu/ sudo cp /lib/x8664-linux-gnu/libdl.so.2 /home/ornek/lib/x8664-linux-gnu/ sudo cp /lib/x8664-linux-gnu/libc.so.6 /home/ornek/lib/x8664-linux-gnu/ sudo cp /lib64/ld-linux-x86-64.so.2 /home/ornek/lib64/ sudo chown -R root:root /home/ornek

Tekrar giris yapmayi denerse kullanici, su asamada giris yapabilecektir. Fakat bu haliyle henuz saydigim gereksinimlerin tumunu yerine getirebilmis degiliz. Kullanici bir ev dizini bulmayi bekliyor fakat /home/ornek altinda hapsoldugundan -yani /home/ornek dizinini / olarak gordugunden- ev dizinini bulamiyor. Bu yuzden dogrudan / altinda basliyor oturumuna. Bulmayi bekledigi dizini olusturup izinlerini verelim.

sudo mkdir -p /home/ornek/home/ornek sudo chown ornek:ornek /home/ornek/home/ornek

ls, nano, rm, cat ve grep hala eksik. Oncelikle bu komutlar icin hangi nesnelere ihtiyac duyuldugunu ogrenmeliyiz. libncursesw.so.5 disindaki nesneleri zaten BASH icin kopyalamistik. Dolayisiyla onu ve /bin/nano’yu kopyalayalim.

ldd /bin/nano linux-vdso.so.1 => (0x00007fffe97ff000) libncursesw.so.5 => /lib/x8664-linux-gnu/libncursesw.so.5 (0x00007f93b0480000) libc.so.6 => /lib/x8664-linux-gnu/libc.so.6 (0x00007f93b00c1000) libdl.so.2 => /lib/x8664-linux-gnu/libdl.so.2 (0x00007f93afebc000) libtinfo.so.5 => /lib/x8664-linux-gnu/libtinfo.so.5 (0x00007f93afc95000) /lib64/ld-linux-x86-64.so.2 (0x00007f93b06b4000) sudo cp /lib/x8664-linux-gnu/libncursesw.so.5 /home/ornek/lib/x8664-linux-gnu sudo cp /bin/nano /home/ornek/bin

Su anda nano’yu calistirabiliriz diye dusunuyorsaniz, yaniliyorsunuz. ornek kullanicisi ile hemen denememizi yapalim. Bir terminal emulatoru bulamadi. xterm icin gereken dosyayi kopyalayalim.

-bash-4.2$ nano ornekyazi Error opening terminal: xterm. sudo mkdir -p /home/ornek/lib/terminfo/x sudo cp /lib/terminfo/x/xterm /home/ornek/lib/terminfo/x/

Nano’yu boylelikle calisir hale getirdik. Simdi sirada ls ve rm var. rm icin gereken butun nesneleri daha once kopyalamistik. /bin/rm’i kopyaladigimizda o da calisir hale gelecek.

ldd /bin/rm linux-vdso.so.1 => (0x00007ffff8621000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fac4d2bf000) /lib64/ld-linux-x86-64.so.2 (0x00007fac4d685000) sudo cp /bin/rm /home/ornek/bin

ls ile devam ediyoruz. Eksik olanlari yerlerine kopyalayalim.

ldd /bin/ls linux-vdso.so.1 => (0x00007fffdd5ff000) libselinux.so.1 => /lib/x8664-linux-gnu/libselinux.so.1 (0x00007f3fde415000) librt.so.1 => /lib/x8664-linux-gnu/librt.so.1 (0x00007f3fde20d000) libacl.so.1 => /lib/x8664-linux-gnu/libacl.so.1 (0x00007f3fde004000) libc.so.6 => /lib/x8664-linux-gnu/libc.so.6 (0x00007f3fddc45000) libdl.so.2 => /lib/x8664-linux-gnu/libdl.so.2 (0x00007f3fdda41000) /lib64/ld-linux-x86-64.so.2 (0x00007f3fde63b000) libpthread.so.0 => /lib/x8664-linux-gnu/libpthread.so.0 (0x00007f3fdd823000) libattr.so.1 => /lib/x8664-linux-gnu/libattr.so.1 (0x00007f3fdd61e000) sudo cp /lib/x8664-linux-gnu/libselinux.so.1 /home/ornek/lib/x8664-linux-gnu/ sudo cp /lib/x8664-linux-gnu/librt.so.1 /home/ornek/lib/x8664-linux-gnu/ sudo cp /lib/x8664-linux-gnu/libacl.so.1 /home/ornek/lib/x8664-linux-gnu/ sudo cp /lib/x8664-linux-gnu/libdl.so.2 /home/ornek/lib/x8664-linux-gnu/ sudo cp /lib/x8664-linux-gnu/libpthread.so.0 /home/testci/lib/x8664-linux-gnu/ sudo cp /lib/x8664-linux-gnu/libattr.so.1 /home/ornek/lib/x86_64-linux-gnu/ sudo cp /bin/ls /home/ornek/bin/ls

ls’i de calisir hale getirdik. BASH ile ilgili dosyalari ev dizinine alip izinlerini duzenleyelim.

sudo cp /home/ornek/.bash* /home/ornek/home/ornek sudo cp /home/ornek/.profile /home/ornek/home/ornek sudo chown -R root:root /home/ornek sudo chown -R ornek:ornek /home/ornek/home/ornek

Kullanici giris yaptiginda .bashrc PS1 degiskenine kullanici adini atamaya calisacak fakat kullanici adini bulamadigi icin “I have no name!” ismiyle karsilasacagiz. Gereken dosyalari olusturalim. Genel bilgi olarak /etc/profile ve /etc/profile.d/ nedir ne ise yarar arastirilirsa iyi olacaktir. Aslinda bu dosyalar gerekli degil fakat kullaniciya masaustunde alistigi ortami yaratmak istiyoruz.

sudo mkdir /home/ornek/etc grep ornek /etc/passwd | sudo tee /home/ornek/etc/passwd grep ornek /etc/group | sudo tee /home/ornek/etc/group sudo cp /etc/profile /home/ornek/etc/profile sudo cp -R /etc/profile.d/ /home/ornek/etc

Su asamada giris yapilirsa id komutunun bulunamadigindan yakinacaktir. /etc/profile dosyasi id ile kullanici numarasini kontrol eder. Olusturalim.

sudo mkdir -p /home/ornek/usr/bin sudo cp /usr/bin/id /home/ornek/usr/bin

Tekrar giris yaptigimizda /etc/passwd ve /etc/group yerinde olmasina ragmen yine “I have no name!” ile karsilasilacagiz. Bunun nedeni bu dosyalari okumak icin gereken kitaplik nesnelerinin kayip olmasi. nsswitch.conf(5) man sayfasi FILES bolumunde ilgili dosyalardan bahseder.

sudo cp /lib/x8664-linux-gnu/libnssfiles* /home/ornek/lib/x86_64-linux-gnu/

Iste artik kullanici adi da gozukuyor. Gelelim geride kalan son birkac komut ve gorsel zenginlestirmeye. ~/.bashrc dircolors komutuna ihtiyac duyar ls’in renkli cikti verebilmesi icin. Hemen ayarlayalim.

sudo cp /usr/bin/dircolors /home/ornek/usr/bin

Kullanicinin hapsoldugu kok dizindeki gereksiz dosyalari silelim. Geri kalan gereksinimlerimizi tamamlayalim. Hepsinin paylasilan nesnelerini daha once kopyaladigimiz icin ana programlari kopyalamamiz yeterli.

sudo rm -rf /home/ornek/.cache sudo rm /home/ornek/.bash* sudo rm /home/ornek/.profile sudo cp /bin/cat /home/ornek/bin sudo cp /bin/grep /home/ornek/bin sudo cp /bin/cp /home/ornek/bin sudo cp /bin/mv /home/ornek/bin sudo chown -R root:root /home/ornek sudo chown -R ornek:ornek /home/ornek/home/ornek

Su asamada istedigimiz sekilde chroot ortamimizi yapilandirmis olduk. Butun bu islemleri baska bir kullanici icin de tekrarlamamak adina /home/ornek dizinimizin bir arsiv yedegini alabilir ve yeni kullanicilar yaratirken bu yedekten ev dizinlerini rahatlikla olusturabiliriz. chroot ortamindaki /etc/passwd, /etc/group dosyalarinin duzenlenmesi unutulmamali. Ayrica dosya isimleri ve sahiplikleri yeniden duzenlenip sunucudaki asil /etc/ssh/sshd_config dosyasina da kullaniciya ait Match direktifi eklenmeli ya da olan Match direktifine ek yapilmali ve ssh servisi yeniden baslatilmalidir. Fakat sunu da hatirlatmak gerek ki chroot etmeniz gereken kullanicilar eger sistemde yonetim islemlerini yapacak kullanicilardan fazla hale geliyorsa varsayilan ayari tum kullanicilari chroot edecek sekilde degistirip yonetim yetkisine sahip kullanicilari match ile kacmak daha mantikli olacaktir.

Bonus: Yazinin basinda /dev altindaki cesitli sanal aygitlarin da sshd_config(5) tarafindan baglanmasinin onerildigini yazmistim. Su ana kadar bu hesabi olusturdugumuz kullanici bu dugumlerin eksikliklerinden kaynaklanan bir hata bildirmedi. Fakat ornegin scp’yi de kullanicinin erisimi olan komutlar arasina katarsaniz /dev/null aygitini bulamadigindan yakinacaktir. Bunun icin aygit dugumlerini su adimlari izleyerek olusturabilirsiniz.

sudo mkdir /home/ornek/dev cd /home/ornek/dev sudo MAKEDEV -v std

Ardindan icinde bulundugunuz dizinde olusturulmus pekcok aygit dugumu goreceksiniz. Bunlardan kmem, mem, ram, loop olanlarini silmenizde bir sakinca yok. Digerleri cat ile kullanicinin da isine yarayabilecek olanlar.

Yazida dilimin dondugunce yonettigimiz makinede hesaba sahip olan bir SSH kullanicisini nasil istegimize gore kisitlayabilecegimizi anlatmaya calistim. Umarim benzer ihtiyaci olan birine yol gosterir.

26 Nisan 2013

Posted In: "I have no name!", chroot, Gezegen, linux, NSS, ssh

Twitter Auto Publish Powered By : XYZScripts.com