chroot — операция изменения корневого каталога в Unix-подобных операционных системах. Программа, запущенная с изменённым корневым каталогом, будет иметь доступ только к файлам, содержащимся в данном каталоге. Поэтому, если нужно обеспечить программе доступ к другим каталогам или файловым системам (например, /proc), нужно заранее примонтировать в целевом каталоге необходимые каталоги или устройства.
Папки будем создавать внутри «$HOME/jail»
$J=$HOME/jail $mkdir -p $J $mkdir -p $J/{bin,lib64,lib} $cd $J $cp -v /bin/{bash,ls} $J/bin [git@sigma jail]$ cp -v /bin/{bash,ls} $J/bin `/bin/bash' -> `/home/git/jail/bin/bash' `/bin/ls' -> `/home/git/jail/bin/ls'
Для копирования необходимых библиотек в $J, используем команду ldd, чтобы определить основные зависимости библиотек:
$ldd /bin/bash [git@sigma jail]$ ldd /bin/bash linux-vdso.so.1 => (0x00007fffb13ff000) libtinfo.so.5 => /lib64/libtinfo.so.5 (0x0000003608200000) libdl.so.2 => /lib64/libdl.so.2 (0x0000003310600000) libc.so.6 => /lib64/libc.so.6 (0x0000003605a00000) /lib64/ld-linux-x86-64.so.2 (0x0000003605600000) $cp -v /lib64/libtinfo.so.5 /lib64/libdl.so.2 /lib64/libc.so.6 /lib64/ld-linux-x86-64.so.2 $J/lib64/ [git@sigma jail]$ cp -v /lib64/libtinfo.so.5 /lib64/libdl.so.2 /lib64/libc.so.6 /lib64/ld-linux-x86-64.so.2 $J/lib64/ `/lib64/libtinfo.so.5' -> `/home/git/jail/lib64/libtinfo.so.5' `/lib64/libdl.so.2' -> `/home/git/jail/lib64/libdl.so.2' `/lib64/libc.so.6' -> `/home/git/jail/lib64/libc.so.6' `/lib64/ld-linux-x86-64.so.2' -> `/home/git/jail/lib64/ld-linux-x86-64.so.2' $ldd /bin/ls [git@sigma jail]$ ldd /bin/ls linux-vdso.so.1 => (0x00007fff21cc7000) libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003fbe000000) librt.so.1 => /lib64/librt.so.1 (0x0000003606a00000) libcap.so.2 => /lib64/libcap.so.2 (0x0000003608600000) libacl.so.1 => /lib64/libacl.so.1 (0x0000003609200000) libc.so.6 => /lib64/libc.so.6 (0x0000003605a00000) libdl.so.2 => /lib64/libdl.so.2 (0x0000003310600000) /lib64/ld-linux-x86-64.so.2 (0x0000003605600000) libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003606200000) libattr.so.1 => /lib64/libattr.so.1 (0x0000003608a00000)
Можно производить копирование руками, а можно отдать предпочтение скрипту:
$list="$(ldd /bin/ls | egrep -o '/lib.*\.[0-9]')" for i in $list; do cp -v "$i" "${J}${i}"; done [git@sigma jail]$ for i in $list; do cp -v "$i" "${J}${i}"; done `/lib64/libselinux.so.1' -> `/home/git/jail/lib64/libselinux.so.1' `/lib64/librt.so.1' -> `/home/git/jail/lib64/librt.so.1' `/lib64/libcap.so.2' -> `/home/git/jail/lib64/libcap.so.2' `/lib64/libacl.so.1' -> `/home/git/jail/lib64/libacl.so.1' `/lib64/libc.so.6' -> `/home/git/jail/lib64/libc.so.6' `/lib64/libdl.so.2' -> `/home/git/jail/lib64/libdl.so.2' `/lib64/ld-linux-x86-64.so.2' -> `/home/git/jail/lib64/ld-linux-x86-64.so.2' `/lib64/libpthread.so.0' -> `/home/git/jail/lib64/libpthread.so.0' `/lib64/libattr.so.1' -> `/home/git/jail/lib64/libattr.so.1'
Перемещаемся в chroot окружение и пробуем выполнить команду ls. Как видно из листинга, доступно только заданное нами дерево каталогов.
$sudo chroot $J /bin/bash [git@sigma git]# sudo chroot $J /bin/bash bash-4.1# $ls / bash-4.1# ls -l / total 12 drwxrwxr-x 2 500 500 4096 May 20 08:05 bin drwxrwxr-x 2 500 500 4096 May 20 08:05 lib drwxrwxr-x 2 500 500 4096 May 20 08:06 lib64