CHROOT ile Linux ve Container’lardaki izolasyon meselesini anlayalım
Tags: chroot, linux, jail, container
Published: 2021-08-01 13:55:46

**Chroot** adından da anlaşılacağı üzere **change root** olarak, kök dizini değiştirme ya da başka bir deyişle izole edilmiş farklı sanal kök dizinleri oluşturmak için kullanılır. Yani servis ve uygulamaların çalıştırdığı her bir process’in gördüğü ya da çalıştığı “**root**” “**kök**” “**/**” dizini değiştirmek için kullanılır.

İnternetten bulduğum aşağıdaki görsel ile durum daha kolay anlaşılabilir.

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hs8mgrti3hueyegxk5eu.png)

Şimdi biz **chroot**’u kullanarak kendi **process**’lerimiz için oluşturacağımız **sanal root** dizini ile **Linux** ve **Container** için dosya sistemi izolasyon konusunu anlamaya çalışalım.

**NoT:** **Bash**, her kullanıcı için ilk başlangıç **progress**’idir(çünkü bash ile yönetimimizi gerçekleştiririz), her hizmet ve uygulama altında çalışan süreçler olarak yer alır. Bundan ötürü bizde **bash**’e **chroo**t uygulayarak konuyu ele alacağız.

İlk önce kendi **sanal** **root directory**’imizi oluşturalım

```
mkdir jailroot
```

Sonra komutları atacağımız bin klasörünü oluşturalım

```
mkdir jailroot/bin
```

Akabinde bash ve istediğimiz **binary executable**(komutlar)leri bu dizin altına atacağız. Ben **bash, ps, pwd, ls, cat, mount, w, id, tree** komutlarını bu dizin altına atacağım ve onunla beraber bir takım klasörler oluşturacağım.

Fakat bu komutların çalışabilmesi için bağımlı olduğu kütüphaneleri de bu **sanal root(jailroot)** dizinin altına gönderilmesi gerekir.

Bash ve diğer komutlara ait bağımlı **lib**’leri görebilmek için “**ldd**” ve “**readelf**” komutlarını kullanabilirsiniz.
```
ldd /bin/bash

readelf -d /bin/bash | egrep -i "needed|rpath"
```
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/46n2q3raw8getieo215x.png)

Şimdi dosyaları **sanal root(jailroot)**un altına atalım. Tabi bağımlı kütüphane dosyalarını da gönderelim. Normalde yukarıdaki komutlar ile sadece kullanacağınız komutların kütüphane dosyalarını bulup atabilirsiniz ama ben direk uğraşmadan olduğu gibi atıyorum.
```
cp -a /lib jailroot/

cp -a /lib64 jailroot/

cp /bin/bash jailroot/bin/

cp /bin/ls jailroot/bin/

cp /bin/cat jailroot/bin/

cp /bin/mount jailroot/bin/

cp /bin/ps jailroot/bin/

cp /bin/pwd jailroot/bin/

cp /usr/bin/w jailroot/bin/

cp /usr/bin/id jailroot/bin/

cp /usr/bin/tree jailroot/bin/
```

Hiyerarşiye uygun bir takım klasörler oluşturalım.
```
mkdir	jailroot/opt

mkdir	jailroot/var

mkdir	jailroot/tmp
```

Son olarak **change root** yapalım.
```
chroot jailroot /bin/bash 
```
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mngkglszf1zdfg2bix7u.png)

Tüm attığımız komutlar çalışıyor, özellikle **pwd** ve **tree** komutlarını çalıştırdığınızda **kök directory**’nin izole olarak göründüğünü fark edebilirsiniz. Fakat **w** ve **ps** koutlarında aşağıdaki gibi uyarı alacaksınız.

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ka5mf45gugjjj9j3erj1.png)

Bu komutların çalışabilmesi için en tepedeki **/proc** süreçler dosyalarının saklandığı dizinin **proc** olarak **chroot** alanına **mount(mount proc /proc -t proc)** edilmesi gerekiyor uyarısı veriyor.

Bu yüzden aşağıdaki gibi **proc** klasörünü oluşturalım ve **mount** komutunu çalıştıralım.
```
mkdir	jailroot/proc

mount proc /proc -t proc
```
Ve sırasıyla **w, ps** ve **mount** komutlarını run edersek sorunsuz bir şekilde çalıştığını görebiliriz.

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nf4qv9rdxcvkc7s7afj0.png)

Böylelikle dosya sistemi izolasyon konusunu, hatta **volume mount** konusuda aklımıza yakınlaştırmış olduk.

**Tabi konu aslında bunlarla sınırlı değil kaldı ki chroot tam yalıtım sağlamaz ve etkileri yalnızca kök bağlama noktasıyla sınırlıdır. Asıl önemli olan namespaces’ler ve cgroup’lardır ki container teknolojileri bunların üzerine bina edilmiştir.**