Содержание

Настройка Chroot окружения для использования с сервером SSH в Slackware


Перевел: Graf
Дата перевода: 17.07.2014 г.
Оригинал: http://gopherproxy.meulie.net/sdf.org/0/users/elw/docs/slackchroot.txt

Основные понятия

Основная концепция chroot-тюрьмы — это запирание пользователей внутри окружения, эмулирующего настоящую *nix систему, но в действительности являющейся системой «sudo» внутри реальной корневой файловой системы. Такой тип системы полезен, когда нужно ограничить круг приложений, доступных для отдельных пользователей системы.

Благодаря недавним изменениям в демоне ssh стало очень легко настраивать chroot-окружение для удалённых пользователей. В этом документе предпринята попытка объяснить, как использовать возможности ssh chroot в Slackware Linux. По завершении чтения вы получите начальное представление о настройке chroot-окружения и настроите базовое chroot-окружение для доступа пользователей по ssh.

Настройка среды Chroot

Из-за того, что в chroot среде пользователь не может увидеть или получить доступ к любым файлам выше директории / chroot окружения, вы должны убедиться, что все бинарные файлы и библиотеки, которые потребуются пользователю, видны, когда он будет в chroot окружении. Мы должны сначала скопировать минимум двоичных файлов для chroot-окружения, в данном случае мы скопируем /bin/bash. В этом примере мы будем использовать /chroot как нашу директорию chroot окружения.

elw@sdf:~ $> mkdir /chroot 
elw@sdf:~ $> mkdir /chroot/bin 
elw@sdf:~ $> cp /bin/bash /chroot/bin/bash

однако, /bin/bash требует несколько библиотек. Чтобы выяснить, какие используем команду «ldd». См. пример ниже:

elw@sdf:~ $> ldd /bin/bash 
                linux-gate.so.1 =>  (0xffffe000) 
                libtermcap.so.2 => /lib/libtermcap.so.2 (0xb77ee000) 
                libdl.so.2 => /lib/libdl.so.2 (0xb77ea000) 
                libc.so.6 => /lib/libc.so.6 (0xb7687000) 
                /lib/ld-linux.so.2 (0xb7807000)

Это список библиотек использует /bin/bash. Мы должны скопировать их из корня файловой системы в корень chroot-окружения. Однако, сначала мы должны создать необходимые каталоги.

elw@sdf:~ $> mkdir /chroot/lib 
elw@sdf:~ $> cp /lib/libtermcap.so.2 /chroot/lib 
elw@sdf:~ $> cp /lib/libdl.so.2 /chroot/lib 
elw@sdf:~ $> cp /lib/libc.so.6 /chroot/lib 
elw@sdf:~ $> cp /lib/ld-linux.so.2 /chroot/lib

Далее, мы хотим предоставить нашим пользователям возможность просмотра списка файлов и каталогов. Для этого необходимо поместить /bin/ls в chroot окружение, а также его библиотеки, как мы это делали для /bin/bash.

elw@sdf:~ $> cp /bin/ls /chroot/bin 
elw@sdf:~ $> ldd /bin/ls 
                linux-gate.so.1 =>  (0xffffe000) 
                librt.so.1 => /lib/librt.so.1 (0xb7868000) 
                libcap.so.2 => /lib/libcap.so.2 (0xb7864000) 
                libacl.so.1 => /lib/libacl.so.1 (0xb785c000) 
                libc.so.6 => /lib/libc.so.6 (0xb76f9000) 
                libpthread.so.0 => /lib/libpthread.so.0 (0xb76df000) 
                /lib/ld-linux.so.2 (0xb7886000) 
                libattr.so.1 => /lib/libattr.so.1 (0xb76da000) 
elw@sdf:~ $> cp /lib/librt.so.1 /chroot/lib 
elw@sdf:~ $> cp /lib/libcap.so.2 /chroot/lib 
elw@sdf:~ $> cp /lib/libacl.so.1 /chroot/lib 
elw@sdf:~ $> cp /lib/libpthread.so.0 /chroot/lib 
elw@sdf:~ $> cp /lib/libattr.so.1 /chroot/lib

Вы, наверное, заметили, что в приведенном выше примере, мы не скопировали /lib/libc.so.6. Это потому, что он уже был скопирован с /bin/bash в в предыдущем примере.

Мы также должны предоставить chroot пользователю какие-нибудь устройства. Минимально необходимые для работы в chroot это /dev/null и /dev/zero. Мы используем команду mknod для создания этих устройств внутри chroot.

elw@sdf:~ $> mkdir /chroot/dev 
elw@sdf:~ $> mknod -m 0666 /chroot/dev/null c 1 3 
elw@sdf:~ $> mknod -m 0666 /chroot/dev/zero c 1 5

Пока мы создаем среду, давайте также создадим каталог /tmp.

elw@sdf:~ $> mkdir /chroot/tmp

Я также хотел бы смонтировать /tmp как tmpfs, для того, чтобы любые файлы, записанные пользователем в /tmp, не сохранялись бы после перезагрузки. Не делайте этого, если используете установку на систему с низким ресурсом.

 elw@sdf:~ $> echo "tmpfs	/chroot/tmp	tmpfs	defaults	0  0"  >>  /etc/fstab

Пока мы в процессе монтирования файловых систем, нам так же необходим адрес /proc. И предоставить его нужно внутри chroot-окружения , а то возникнут интересные проблемы. Для того, чтобы избежать этого используем bind mount.

elw@sdf:~ $> mkdir /chroot/proc 
elw@sdf:~ $> mount --bind /proc /chroot/proc

Чтобы сделать эти изменения постоянными, мы должны добавить еще одну запись в /etc/fstab. Добавьте следующую строку в конец файла /etc/fstab.

 /proc    /chroot/proc    bind    defaults,bind    0  0

Создаем Chroot пользователя

Далее, давайте создадим нашего первого chroot-shell пользователя. Эта же схема может применяться для всех последующих пользователей, которых вы пожелаете ограничить внутри нашего окружения.

elw@sdf:~ $> groupadd chroot_users 
elw@sdf:~ $> useradd -s /bin/bash -g chroot_users -d /home/chrootuser -mk /etc/skel chrootuser 
elw@sdf:~ $> passwd chrootuser

Опят же, пользователь не сможет получить доступ к любой информации за пределами /chroot поэтому нам необходимо либо скопировать или переместить /home/chrootuser в /chroot/home, либо перенести все созданное до этого. Я предпочитаю переместить каталог, поскольку пользователь не имеет возможности использовать его в своем текущем местоположение.

elw@sdf:~ $> mkdir /chroot/home 
elw@sdf:~ $> mv /home/chrootuser /chroot/home

Следующее, что нам необходимо, это скопировать его из /etc/passwd. Причина этого заключается в том, что когда пользователь регистрируется в bash происходит ссылка на /etc/profile и /etc/profile.d что, в свою очередь, повлечет поиск имени пользователя в /etc/passwd и отображение его как «\u значение» в $PS1(прим. Grafпеременная $PS1, это вид приглашения командной строки, почитать про нее можно, например ТУТ). Как правило, я не копирую весь /etc/passwd, потому что это не нужно (я предпочитаю, в основном, использовать минимум необходимого, насколько это возможно, чтобы не предоставить подробную информацию о системе общим системным пользователям). Пример, приведенный ниже, показывает, как просто вытащить «chrootuser» из /etc/passwd и «chroot_users» из /etc/group, разместив их в соответствующих местах внутри chroot окружения.

elw@sdf:~ $> mkdir /chroot/etc 
elw@sdf:~ $> touch /chroot/etc/{passwd,group} 
elw@sdf:~ $> grep chrootuser /etc/passwd >> /chroot/etc/passwd 
elw@sdf:~ $> grep chroot_users /etc/group >> /chroot/etc/group

Настроика SSH демона

Заключительным шагом в попадании наших SSH пользователей в chroot окружение, это настройка sshd на места пользователей в chroot окружении, вместо корневой файловой системы. Мы будем использовать параметр конфигурации «Match»для выполнения этой задачи. Добавьте следующие строки к конец файла /etc/ssh/sshd_config.

Match Group chroot_users 
ChrootDirectory /chroot

Эта опция будет проверять наличие пользователя в группе «chroot_users» и если он там есть, то она разместит его внутри /chroot.

В заключении перезапустим sshd.

elw@sdf:~ $> /etc/rc.d/rc.sshd restart

Теперь вы можете подключиться к системе по ssh в качестве chrootuser и будете помещены в созданное chroot окружение. Если вы хотите пойти еще дальше, то также можете скопировать /etc/profile и /etc/profile.d в /chroot.

elw@sdf:~ $> cp /etc/profile /chroot/etc/profile 
elw@sdf:~ $> cp -R /etc/profile.d /chroot/etc/profile.d

Однако, если вы решитесь сделать это, то существуют некоторые дополнительные файлы, которые должны быть скопированы в chroot окружение, иначе вы получите bash запрос, который будет выглядеть как в следующем примере:

I have no name!@sdf:~ $>

Чтобы устранить эту проблему, необходимо включить некоторые библиотеки, которые ldd не выявит. Это две библиотеки libnss_files. Используйте пример ниже:

 elw@sdf:~ $> cp /lib/libnss_files* /chroot/lib

Если по умолчанию /etc/profile и /etc/profile.d у вас включены в chroot, то также необходимо включить /bin/cat/, /usr/bin/id, /bin/grep и /bin/dircolors, поскольку они необходимы для 100% работы /etc/profile по умолчанию. Они не требуют добавления каких-либо дополнительных библиотек, так что вы можете просто скопировать их прямо в chroot окружение. См. пример ниже:

elw@sdf:~ $> mkdir /chroot/usr/bin 
elw@sdf:~ $> cp /bin/cat /chroot/bin 
elw@sdf:~ $> cp /bin/grep /chroot/bin 
elw@sdf:~ $> cp /bin/dircolors /chroot/bin 
elw@sdf:~ $> cp /usr/bin/id /chroot/usr/bin

Теперь у вас есть почти все, что необходимо для выполнения chroot окружения для доступа пользователей через ssh. Это также даст дополнительное преимущество chroot пользователям, которые обратятся к системе по sftp. Всякий раз, когда вы захотите добавить другого пользователя, воспользуйтесь разделом по созданию пользователя. Если необходимо скопировать дополнительные двоичные файлы, используйте пример с ldd и имейте в виду, что более сложные двоичные файлы могут иметь зависимости и сложных динамических библиотек, которые могут не отражаться при использовании ldd.