Chroot Nedir ?

Günümüzde artık iyice yaygınlaşmaya başlayan container yapılarını herkes duymaya ve kullanmaya başladı. Bu teknolojinin arkasında yatan teknoloji ise 1979 yılında bulunan chroot yapısıdır. Aşağıda gösterilen chroot dosya yapısını incelediğimizde daha net anlayacağımız üzere, chroot ile kullanıcının erişilmesi istenilen alanlar ve komutlar sınırlandırılıyor ve bu kullanıcının işletim sisteminin diğer dosyalarına erişim hakkı ve kullancının çalıştırabileceği komutlar sınırlandırılarak işletim sistemi üzerinde belirli ölçüde güvenlik sağlanmış oluyor.

Chroot yapısı günümüzde web sunucu barındıran sistemlerde ve ya sftp paylaşımı yapılması istenilen sistemlerde sıklıkla kullanılmaktadır. Ayrıca Android işletim sistemlerinde sıklıkla duyduğumuz bir ifade var “Android e root attım ve sisteme şu şu özelliği yükledim”. İşte burada bahsedilen android’e root atma işlemi ise android işletim sisteminin chroot yapısını aşıp, işletim sistemi üzerinde normal kullanıcıların erişemediği diğer dosylara erişim hakkı kazanmaktan başka birşey değildir.

Bu yazımda Ubuntu 20.04 işletim sistemi üzerinde bir chroot yapısı oluşturacağız ve create ettiğimiz kullanıcıya, işletim sistemi üzerinde nasıl sınırlı yetki verdiğimizi anlayacağız.

Kullanıcıya sadece ls komutu çalıştırma hakkı verecek şekilde bir chroot yapısı yapısı oluşturmaya başlayalım.

Chroot uygulayacağımız dizini create edelim, ismi chrooted olsun.

root@ahmetnumanaytemiz4c:~# mkdir /home/chrooted
root@ahmetnumanaytemiz4c:~# ls /home/
chrooted  cloud_user

Çalıştıracağımız komutlar sadece ls ve sh olacağı için chrooted dizini altında bir bin dizini create edelim ve çalıştıracağımız bu komutları buraya kopyalayalım.

root@ahmetnumanaytemiz4c:~# cp -v /bin/ls /bin/sh /home/chrooted/bin/
'/bin/ls' -> '/home/chrooted/bin/ls'
'/bin/sh' -> '/home/chrooted/bin/sh'

Bu komutların bağımlı olduğu kütüphaneleri de aynı şekilde tespit edip, aynı isim yapısı ile chrooted dizini altına taşıyalım.

root@ahmetnumanaytemiz4c:~# ldd /bin/ls
        linux-vdso.so.1 (0x00007ffe143c7000)
        libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f1c1239f000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1c121ad000)
        libpcre2-8.so.0 => /lib/x86_64-linux-gnu/libpcre2-8.so.0 (0x00007f1c1211d000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f1c12117000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f1c12401000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f1c120f4000)
root@ahmetnumanaytemiz4c:~# ldd /bin/sh
        linux-vdso.so.1 (0x00007fffacc6d000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5e9d266000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f5e9d48d000)

/home/chrooted dizini altında lib ve lib64 dizinlerini oluşturalım.

 

root@ahmetnumanaytemiz4c:~# mkdir -p /home/chrooted/{lib,lib64}
root@ahmetnumanaytemiz4c:~# ls /home/chrooted/
bin  lib  lib64

Şimdi ldd komutu ile tespit ettiğimiz, ls ve sh’in bağımlı olduğu kütüphanleri aynı isim yapısı ile create edelim.

/bin/ls komutu için;

root@ahmetnumanaytemiz4c:~# mkdir /home/chrooted/lib/x86_64-linux-gnu
root@ahmetnumanaytemiz4c:~# for i in /lib/x86_64-linux-gnu/libselinux.so.1 /lib/x86_64-linux-gnu/libc.so.6 /lib/x86_64-linux-gnu/libpcre2-8.so.0  /lib/x86_64-linux-gnu/libdl.so.2 /lib/x86_64-linux-gnu/libpthread.so.0 ; do cp -v $i /home/chrooted/lib/x86_64-linux-gnu/ ; done
'/lib/x86_64-linux-gnu/libselinux.so.1' -> '/home/chrooted/lib/x86_64-linux-gnu/libselinux.so.1'
'/lib/x86_64-linux-gnu/libc.so.6' -> '/home/chrooted/lib/x86_64-linux-gnu/libc.so.6'
'/lib/x86_64-linux-gnu/libpcre2-8.so.0' -> '/home/chrooted/lib/x86_64-linux-gnu/libpcre2-8.so.0'
'/lib/x86_64-linux-gnu/libdl.so.2' -> '/home/chrooted/lib/x86_64-linux-gnu/libdl.so.2'
'/lib/x86_64-linux-gnu/libpthread.so.0' -> '/home/chrooted/lib/x86_64-linux-gnu/libpthread.so.0'
root@ahmetnumanaytemiz4c:~# cp /lib64/ld-linux-x86-64.so.2 /home/chrooted/lib64/

/bin/sh komutu için ;

root@ahmetnumanaytemiz4c:~# cp /lib/x86_64-linux-gnu/libc.so.6 /home/chrooted/lib/x86_64-linux-gnu/
root@ahmetnumanaytemiz4c:~# cp /lib64/ld-linux-x86-64.so.2 /home/chrooted/lib64/

Şimdi oluşturduğumuz yapıyı tree ile kontrol edelim.

 

root@ahmetnumanaytemiz4c:~# tree /home/chrooted/
/home/chrooted/
├── bin
│   ├── ls
│   └── sh
├── lib
│   └── x86_64-linux-gnu
│       ├── libc.so.6
│       ├── libdl.so.2
│       ├── libpcre2-8.so.0
│       ├── libpthread.so.0
│       └── libselinux.so.1
└── lib64
    └── ld-linux-x86-64.so.2

4 directories, 8 files

/home/chrooted dizini altına ufak bir not bırakalım…

root@ahmetnumanaytemiz4c:~# vim /home/chrooted/notes.txt
root@ahmetnumanaytemiz4c:~# cat /home/chrooted/notes.txt
I love penguins...

Artık oluşturduğumuz yapıyı , chroot komutu ile çalıştırabiliriz.

root@ahmetnumanaytemiz4c:~# chroot /home/chrooted/ /bin/sh
# ls
bin  lib  lib64  notes.txt
# cat notes.txt
/bin/sh: 2: cat: not found
#

Görüldüğü gibi chroot ettiğimiz dizinde sadece ls komutunu çalıştrabiliyoruz, test için create ettiğimiz dosyanın içersini okuyamıyoruz.

Şimdi numan adında bir ssh user oluşturacağım ve sadece chroot ile oluşturduğumuz yapıya erişmesi için yetki vereceğim.

Bunun için, numan kullanıcısını oluşturup, /etc/ssh/sshd_config dosyasını editlememiz ve ssh servisini restart etmemiz yeterli olacaktır.

root@ahmetnumanaytemiz4c:~# useradd numan
root@ahmetnumanaytemiz4c:~# passwd numan
New password:
Retype new password:
passwd: password updated successfully
root@ahmetnumanaytemiz4c:~# vim /etc/ssh/sshd_config

Match User numan
ChrootDirectory /home/chrooted
X11Forwarding no
AllowTcpForwarding no
root@ahmetnumanaytemiz4c:~# service ssh restart

numan kullanıcısı ssh ile sisteme login olduğunda sadece kendisine çalıştırma izni verilen ls komutunu çalıştıracabilecektir.

 

İlk yorum yapan olun

Bir yanıt bırakın

E-posta hesabınız yayımlanmayacak.


*