logo

Linux Sanallaştırma - Chroot Hapishanesi

UNIX işletim sistemlerindeki bir chroot, mevcut çalışma işlemi ve çocukları için görünen kök dizinini değiştiren bir işlemdir. Bu değiştirilmiş ortamda çalışan programlar, belirlenen dizin ağacının dışındaki dosyalara erişemez. Bu aslında bir dizin ağacına erişimini sınırlar ve böylece 'Chroot Hapishanesi' adını alırlar.

Fikir, bir işlemin çalıştırılması için gereken tüm sistem dosyalarını kopyaladığınız veya bağladığınız bir dizin ağacı oluşturmanızdır. Daha sonra, kök dizinini bu yeni ağacın tabanında olmak için değiştirmek için Chroot Sistem çağrısını kullanırsınız ve bu kroked ortamda çalışan işlemi başlatırsınız. Değiştirilmiş kökün dışındaki yollara gerçekten başvuramadığından, bu konumlara kötü niyetli bir şekilde okuyamaz veya yazamaz.



Neden gerekli ve sanal makinelerden nasıl farklı?

Bu, işletim sistemi düzeyinde sanallaştırmadır ve ana bilgisayar işletim sisteminin çoklu izole örneklerini oluşturmak için sanal makineler yerine genellikle kullanılır. Bu, çekirdek düzeyinde bir sanallaştırmadır ve sonuç olarak uygulama katmanı sanallaştırma olan sanal makinelere kıyasla hemen hemen hiçbir yük yoktur. Sanal makine (VM) bir makinenin yazılım uygulamasıdır ve genellikle bir çalışma işletim sisteminin sanal görüntüsünü oluşturmak için donanım sanallaştırması olarak bilinen şeyden yararlanırlar.

Chroot Hapishanesi Nasıl Kullanılır

Chroot hapishanesi oluşturma temel komutu aşağıdaki gibidir:

 chroot /path/to/new/root command  
OR
chroot /path/to/new/root /path/to/server
OR
chroot [options] /path/to/new/root /path/to/server

Not: Chroot sistemi çağrısını yalnızca kök/ayrıcalıklı bir kullanıcı kullanabilir. Komuta erişimi olan ayrıcalıklı olmayan bir kullanıcı, Chroot hapishanesini atlayabilir.



'Bash' ve 'LS' komutu için bir mini hapishane oluşturmak için adımlar


1. Komutun kökü görevi görecek bir dizin oluşturun.

 $ mkdir jailed  
$ cd jailed

2. Koşullandırma komutu için tüm temel dizinleri oluşturun: İşletim sisteminize bağlı olarak gerekli dizinler değişebilir. Mantıksal olarak gerekli kütüphanelerin bir kopyasını tutmak için tüm bu dizinleri oluşturuyoruz. Tüm dizinlerin gerekli olduğunu görmek için 4. Adım.

 $ mkdir -p bin lib64/x86_64-linux-gnu lib/x86_64-linux-gnu

3. 'Hangi' komutu: LS ve Bash komutunun konumunu bulmak için 'hangi' komutunu çalıştırın. Hapishanemizin 'bin' dizinindeki bu ikili dosyaları hangi komuta çalıştırın. Bu komutlardan herhangi birinin takma işlemine sahip olmadığından emin olun. Şu andan itibaren dizinimize atıfta bulunurduk. 'Hapsedildi' kolaylık için dizin.



çoklayıcı
 $ unalias ls # Required only if you have aliased ls command  
$ unalias bash # Required only if you have aliased bash command
$ cp $(which ls) ./bin/
$ cp $(which bash) ./bin/

4. Uygun kütüphaneleri/nesneleri kopyalayın : Bizimdeki yürütülebilir ürünler için Hapsedilmiş dizin çalışması için hapishane dizinindeki uygun kütüphaneleri/nesneleri kopyalamamız gerekir. Varsayılan olarak yürütülebilir, '/' ile başlayan yerlere bakar. Bağımlılıkları bulmak için 'LDD' komutunu kullanıyoruz

$ ldd $(which bash)  
linux-vdso.so.1 => (0x00007ffc75dd4000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f6577768000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f6577564000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f657719a000)
/lib64/ld-linux-x86-64.so.2 (0x000055979f3fd000)

Uygun dizinler oluşturmak için aşağıdaki komutları çalıştırın.

$ cp /lib/x86_64-linux-gnu/libtinfo.so.5 lib/x86_64-linux-gnu/  
$ cp /lib/x86_64-linux-gnu/libdl.so.2 lib/x86_64-linux-gnu/
$ cp /lib/x86_64-linux-gnu/libc.so.6 lib/x86_64-linux-gnu/
$ cp /lib64/ld-linux-x86-64.so.2 lib64/

LS için benzer şekilde 

$ ldd $(which ls)  
linux-vdso.so.1 => (0x00007fff4f05d000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f9a2fd07000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9a2f93e000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f9a2f6cd000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9a2f4c9000)
/lib64/ld-linux-x86-64.so.2 (0x000055e836c69000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9a2f2ac000)
$ cp /lib/x86_64-linux-gnu/libselinux.so.1 lib/x86_64-linux-gnu/  
$ cp /lib/x86_64-linux-gnu/libc.so.6 lib/x86_64-linux-gnu/
$ cp /lib/x86_64-linux-gnu/libpcre.so.3 lib/x86_64-linux-gnu/
$ cp /lib/x86_64-linux-gnu/libdl.so.2 lib/x86_64-linux-gnu/
$ cp /lib64/ld-linux-x86-64.so.2 lib64/
$ cp /lib/x86_64-linux-gnu/libpthread.so.0 lib/x86_64-linux-gnu/


Son dizin yapısı buna benzer olmalıdır

Chroot hapishanesi' title=

ddl ve dml

5. sudo chroot: Kabuk yoluyla birlikte kökü hapishane dizisine değiştirmek için bu komutu çalıştırın. Varsayılan olarak '/bin/sh' kabuğu yüklemeye çalışacaktır.

 $ cd ..  
$ sudo chroot jailed /bin/bash

Chroot komutunu çalıştırırken bu hatayla karşılaşabilirsiniz 

chroot: failed to run command `/bin/bash': No such file or directory

Bunun nedeni, dosyanın mevcut olmaması (açıktır) veya yükleme kütüphanesi başarısız olduğunda veya mevcut olmadığında olabilir. Kütüphaneler doğru konumdaysa çift kontrol edin.

6. Yeni bir kabuk açılmalıdır: Bizim hapse atılmış bash. Şu anda sadece 2 komutumuz var Bash ve LS. Neyse ki CD ve PWD, Bash Shell'de yerleşik komutlardır ve böylece bunları da kullanabilirsiniz.

Dizin etrafında dolaşın 'CD /../' veya benzer bir şeye erişmeyi deneyin. Muhtemelen yapamayacağınız hapishaneyi kırmaya çalışın. :)

Hapishaneden çıkmak için 

 $ exit

En önemli ve ilginç yanı, koştuğunuzda 

 $ ps aux

Ve sadece bir süreç olduğunu bulacağınız süreci bulun 

root 24958 … 03:21 0:00 /usr/bin/sudo -E chroot jailed/ /bin/bash

Hapishaneli kabuktaki ilginç bir şekilde süreçler, bu kabuğun basit bir çocuk süreci olarak çalışır. Hapishane ortamındaki tüm işlemler, ana bilgisayar işletim sisteminde basit kullanıcı seviyesi işlemidir ve çekirdek tarafından sağlanan ad alanları tarafından izole edilir, böylece minimal yük vardır ve ek bir fayda olarak izolasyon elde eder.

if-else ifadesi java

Benzer şekilde, sanal hapsedilmiş ortamınıza daha fazla komut ekleyebilirsiniz. Daha karmaşık programlar eklemek için '/proc' ve '/dev' gibi daha fazla dizin oluşturmanız gerekebilir. Bunlar sürecin karmaşıklığını arttırır. Umarım amacımız için buna gerek yoktur.

Chroot ve dizinlerin hapishanesi hakkında bilmeniz gereken tek şey budur. Nihai amacımız, kapsayıcıların ne olduğunu ve AWS (Amazon Web Services) Google Cloud ve Docker gibi hizmetlerin, talep üzerine çok sayıda sanal işletim sistemini sağlayabileceğini anlamaktır. Ayrıca Sys-Admin, tek bir fiziksel makinede birden fazla alan için birden fazla web sunucusu nasıl çalıştırıyor. Bu, bunu anlamak için sadece bir adımdı