Это старая версия документа!


Статья не закончена, ведется ее редактирование !!!
Настройка 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

The next thing we need to copy over is /etc/passwd. The reason for this is that when a user is logged in bash will reference /etc/profile and /etc/profile.d which in turn will look up the users name in /etc/passwd and display it as the \u value in $PS1. I generally do not, however, like to copy over the entire /etc/passwd file because it is not necessary (I prefer to, in generally, use the minimum required as to not provide more information about the system to general system users as possible). The example below will show you how to extract just «chrootuser» from /etc/passwd and extract just «chroot_users» from /etc/group and place it in the cooresponding locations inside the chroot jail.

Следующее, что нам необходимо, это скопировать его из /etc/passwd. Причина этого заключается в том, что когда пользователь регистрируется в bash происходит ссылка на /etc/profile и /etc/profile.d что, в свою очередь, повлечет поиск имени пользователя в /etc/passwd и отображение его как \u значение в $PS1(прим. Graf — переменная $PS1, это вид приглашения командной строки, почитать про нее можно, например http://ubuntologia.ru/blog/console-scripting/88.html#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

If you have included the default /etc/profile and /etc/profile.d in your chroot, you will also want to include /bin/cat, /usr/bin/id, /bin/grep and /bin/dircolors as they are required for the default /etc/profile to work 100%. They do not require the addition of any more libraries, however so you can just copy the binraries directly over to the chroot environment. See the example below:

Если по умолчанию /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

With that, you should pretty much have all you need to have a decently well running chroot jail for your users to access via ssh. This will also have the added benfit of chrooting the users that access the system with sftp as well. Whenever you want to add another user, just reference the creating a user section. If you need to copy over additional binaries, use the ldd examples and keep in mind that more complicated binaries may have dependencies and complicated dynamic libraries which may not appear when using ldd.

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

Навигация
Печать/экспорт
QR Code
QR Code wiki:articles:chroot_ssh (generated for current page)