Ez a dokumentum egy előző változata!
Tartalomjegyzék
Chroot
A chroot utasítás segítségével az operációs rendszer egy könyvtárában alakítjuk ki a program futásához szükséges környezetet. Ebben a környezetben a futtatáshoz szükséges összes állományt a forrás fájlrendszer struktúráját követve adjuk meg.
Programok futtatása
Egyszerű shell futtatása
Létrehozzuk a chroot könyvtárat, majd bemásoljuk a 'bash' programot. majd 'chroot' paramétereként.
# mkdir -p /opt/chroot/01-shell-minimal # type bash bash: /usr/sbin/bash # mkdir -p /opt/chroot/01-shell-minimal/usr/bin cp -a /usr/bin/bash /opt/chroot/01-shell-minimal/usr/bin
Futtatjuk a programot chroot nélkül. Ellenőrizzük a szülö shell PID-jét, a futtatot program PID-jét, majd kilépés után újra a szülőt.
# echo $$ 4595 # /opt/chroot/01-shell-minimal/usr/bin/bash # echo $$ 5121 # exit exit # echo $$ 4595
Futtassuk a programot 'chroot' segítségével. Hibát kapunk, mert a programhoz tartozó megosztott függvényeket tartalmazó állományok hiányoznak.
# chroot /opt/chroot/01-shell-minimal /usr/bin/bash chroot: failed to run command ‘/usr/bin/bash’: No such file or directory
Ellenőrizzük mire van szükség.
# ldd /usr/bin/bash linux-vdso.so.1 (0x00007f5879c64000) libtinfo.so.6 => /lib64/libtinfo.so.6 (0x00007f5879aa9000) libc.so.6 => /lib64/libc.so.6 (0x00007f58798b6000) /lib64/ld-linux-x86-64.so.2 (0x00007f5879c66000)
A hiányzó állományok listájában három típust különböztetünk meg:
- a programhoz linkelt állomány 'linux-vdso.so.1 (0x00007f5879c64000)' nincs vele teendő.
- dinamikusan linkelt állomány amit a program hivatkozás segítségével ér el 'libtinfo.so.6 ⇒ /lib64/libtinfo.so.6 (0x00007f5879aa9000)'.
- statikusan megadott állomány, amelynek helye nem módosítható '/lib64/ld-linux-x86-64.so.2 (0x00007f5879c66000)'.
Hozzuk létre a könyvtárstruktúrát és másoljuk be az állományokat. A példában a szimbolikus linkeket is létrehozzuk.
# mkdir /opt/chroot/01-shell-minimal/usr/lib64
# ln -s usr/bin /opt/chroot/01-shell-minimal/bin
# ln -s usr/lib64 /opt/chroot/01-shell-minimal/lib64
# cp -a /lib64/libtinfo.so.6* /lib64/libc.so.6* /lib64/ld-linux-x86-64.so.2 /opt/chroot/01-shell-minimal/usr/lib64/
# tree /opt/chroot/01-shell-minimal/
/opt/chroot/01-shell-minimal/
├── bin -> usr/bin
├── lib64 -> usr/lib64
└── usr
├── bin
│ └── bash
└── lib64
├── ld-linux-x86-64.so.2
├── libc.so.6
├── libtinfo.so.6 -> libtinfo.so.6.5
└── libtinfo.so.6.5
6 directories, 5 files
Futtassuk ismét a 'bash' programot chroot környezetben.
# chroot /opt/chroot/01-shell-minimal /usr/bin/bash bash-5.3# exit exit
Bővített környezet segédprogramokkal
A chroot-ban futtatott 'bash' shell csak a beépített utasításokat képes futtatni (pwd, cd). Minden külső program (ls, cat) hiányzik. A programok futtatásához és ellenőrzéséhez szükséges minimális programokat be kell másolni a strukrtúrába.
# chroot /opt/chroot/01-shell-minimal /usr/bin/bash bash-5.3# ls bash: ls: command not found bash-5.3# exit exit
Készítsünk másolatot a könyvtárról és bővítsük az alapvető utasításokkal.
# cp -a /opt/chroot/01-shell-minimal /opt/chroot/02-shell-extended # cp -a /usr/bin/cat /usr/bin/id /usr/bin/ls /opt/chroot/02-shell-extended/usr/bin # chroot /opt/chroot/02-shell-extended /usr/bin/bash bash-5.3# ls ls: error while loading shared libraries: libselinux.so.1: cannot open shared object file: No such file or directory
Hiányzik egy újabb megosztott könyvtári függvényeket tartalmazó állomán. Át kell nézni a bemásolt programokat és be kell másolni a hiányzó állományokat.
# ldd /usr/bin/cat linux-vdso.so.1 (0x00007f6c600ce000) libc.so.6 => /lib64/libc.so.6 (0x00007f6c5feb9000) /lib64/ld-linux-x86-64.so.2 (0x00007f6c600d0000)
A 'cat parancs futtatásához szükséges állományok már rendelkezésre állnak.
# ldd /usr/bin/id linux-vdso.so.1 (0x00007fa0165b3000) libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fa01655f000) libc.so.6 => /lib64/libc.so.6 (0x00007fa01636c000) libpcre2-8.so.0 => /lib64/libpcre2-8.so.0 (0x00007fa0162bf000) /lib64/ld-linux-x86-64.so.2 (0x00007fa0165b5000) # ldd /usr/bin/ls linux-vdso.so.1 (0x00007f53cf8f6000) libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f53cf888000) libcap.so.2 => /lib64/libcap.so.2 (0x00007f53cf87c000) libc.so.6 => /lib64/libc.so.6 (0x00007f53cf689000) libpcre2-8.so.0 => /lib64/libpcre2-8.so.0 (0x00007f53cf5dc000) /lib64/ld-linux-x86-64.so.2 (0x00007f53cf8f8000)
A hiányzó állományok másolását el kell végezni.
# cp -a /lib64/libselinux.so.1* /lib64/libcap.so.2* /lib64/libpcre2-8.so.0* /opt/chroot/02-shell-extended/usr/lib64
# tree /opt/chroot/02-shell-extended
/opt/chroot/02-shell-extended
├── bin -> usr/bin
├── lib64 -> usr/lib64
└── usr
├── bin
│ ├── bash
│ ├── cat
│ ├── id
│ └── ls
└── lib64
├── ld-linux-x86-64.so.2
├── libcap.so.2 -> libcap.so.2.76
├── libcap.so.2.76
├── libc.so.6
├── libpcre2-8.so.0 -> libpcre2-8.so.0.15.0
├── libpcre2-8.so.0.15.0
├── libselinux.so.1
├── libtinfo.so.6 -> libtinfo.so.6.5
└── libtinfo.so.6.5
6 directories, 13 files
Ellenőrizzük a környezetet
# chroot /opt/chroot/02-shell-extended /usr/bin/bash bash-5.3# ls bin lib64 usr bash-5.3# exit exit
Végezzünk el néhány szépészeti beavatkozást. Létrehozzuk a '/etc' és a '/root' könyvtárakat és bemásoljuk az inicializáló állományokat.
# mkdir -p /opt/chroot/02-shell-extended/etc # mkdir -p /opt/chroot/02-shell-extended/root # cp -a /etc/skel/.bash* /opt/chroot/02-shell-extended/root/ # cp -a /etc/bashrc /opt/chroot/02-shell-extended/etc/
Futtassuk a 'bash' utasítást a chroot környezetben. A prompt megváltozik.
# chroot /opt/chroot/02-shell-extended /usr/bin/bash [I have no name!@gepnev /]# id uid=0 gid=0 groups=0 [I have no name!@gepnev /]# exit exit
Az 'I have no name!' üzenet azért jelenik meg, mert a rendszer nem talál bejegyzést a futtató felhasználóhoz és a csoporthoz. Ez a bejegyzés a '/etc/passwd' és '/etc/group' fájlokban találhatók.
# echo 'root::0:0:Super User:/root:/bin/bash' > /opt/chroot/02-shell-extended/etc/passwd # echo 'root::0:' > /opt/chroot/02-shell-extended/etc/group # echo $$ 4595 # chroot /opt/chroot/02-shell-extended /usr/bin/bash [root@gepnev /]# echo $$ 9737 [root@gepnev /]# exit exit # echo $$ 4595
