Различия

Показаны различия между двумя версиями страницы.


wiki:articles:chroot_ssh [18/07/2014 12:45] (текущий) – создано - внешнее изменение 127.0.0.1
Строка 1: Строка 1:
 +^   **Настройка 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 окружения.
 +<code>
 +elw@sdf:~ $> mkdir /chroot 
 +elw@sdf:~ $> mkdir /chroot/bin 
 +elw@sdf:~ $> cp /bin/bash /chroot/bin/bash
 +</code>
 +однако, /bin/bash требует несколько библиотек. Чтобы выяснить, какие используем  команду "ldd". См. пример ниже:
 +<code>
 +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)
 +</code>
 +
 +Это список библиотек использует /bin/bash. Мы должны скопировать их из корня файловой системы в корень chroot-окружения. Однако, сначала мы должны создать необходимые каталоги.
 +<code>
 +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
 +</code>
 +Далее, мы хотим предоставить нашим пользователям возможность просмотра списка файлов и каталогов. Для этого необходимо поместить /bin/ls в chroot окружение, а также его библиотеки, как мы это делали для /bin/bash.
 +<code>
 +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
 +</code>
 +Вы, наверное, заметили, что в приведенном выше примере, мы не скопировали 
 +/lib/libc.so.6. Это потому, что он уже был скопирован с /bin/bash в в предыдущем примере. 
 +
 +Мы также должны предоставить chroot пользователю  какие-нибудь устройства. Минимально необходимые для работы в  chroot это /dev/null и /dev/zero. Мы используем команду mknod для создания этих устройств внутри chroot.
 +<code>
 +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
 +</code>
 +Пока мы создаем среду, давайте также создадим каталог /tmp.
 +
 +<code>elw@sdf:~ $> mkdir /chroot/tmp</code>
 +
 +Я также хотел бы  смонтировать /tmp как tmpfs, для того, чтобы любые файлы, записанные пользователем в /tmp, не сохранялись бы после перезагрузки. Не делайте этого, если используете установку на систему с низким ресурсом.
 +
 +<code> elw@sdf:~ $> echo "tmpfs /chroot/tmp tmpfs defaults 0  0"  >>  /etc/fstab</code>
 +
 +Пока мы в процессе монтирования файловых систем,  нам так же необходим адрес /proc. И предоставить его нужно внутри chroot-окружения , а то возникнут интересные проблемы. Для того, чтобы избежать этого используем bind mount.
 +<code>
 +elw@sdf:~ $> mkdir /chroot/proc 
 +elw@sdf:~ $> mount --bind /proc /chroot/proc
 +</code>
 +Чтобы сделать эти изменения постоянными, мы должны добавить еще одну запись в /etc/fstab. Добавьте следующую строку в конец файла /etc/fstab.
 +<code>
 + /proc    /chroot/proc    bind    defaults,bind    0  0
 +</code>
 +
 +====== Создаем Chroot пользователя ======
 +
 +Далее, давайте создадим нашего первого chroot-shell пользователя. Эта же схема может применяться для всех последующих пользователей, которых вы пожелаете ограничить внутри нашего окружения.
 +<code>
 +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
 +</code>
 +Опят же, пользователь не сможет получить доступ к любой информации за пределами /chroot поэтому нам необходимо либо скопировать или переместить  /home/chrootuser в /chroot/home, либо перенести все созданное до этого. Я предпочитаю переместить каталог, поскольку пользователь не имеет возможности использовать его в своем текущем местоположение.
 +<code>
 +elw@sdf:~ $> mkdir /chroot/home 
 +elw@sdf:~ $> mv /home/chrootuser /chroot/home
 +</code>
 +
 +Следующее, что нам необходимо, это скопировать его из /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 окружения.
 +<code>
 +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
 +</code>
 +====== Настроика SSH демона ======
 +
 +Заключительным шагом в попадании наших SSH пользователей в chroot окружение, это настройка sshd на места пользователей в chroot окружении, вместо корневой файловой системы. Мы будем использовать  параметр конфигурации "Match"для выполнения этой задачи. Добавьте следующие строки к конец файла /etc/ssh/sshd_config.
 +<code>
 +Match Group chroot_users 
 +ChrootDirectory /chroot
 +</code>
 +Эта опция будет проверять наличие пользователя в группе "chroot_users" и если он там есть, то она разместит его внутри /chroot. 
 +
 +В заключении перезапустим sshd.
 +<code>
 +elw@sdf:~ $> /etc/rc.d/rc.sshd restart
 +</code>
 +Теперь вы можете подключиться к системе по ssh  в качестве chrootuser и будете помещены   в созданное chroot окружение. Если вы хотите пойти еще дальше, то также можете  скопировать /etc/profile и /etc/profile.d в /chroot.
 +<code>
 +elw@sdf:~ $> cp /etc/profile /chroot/etc/profile 
 +elw@sdf:~ $> cp -R /etc/profile.d /chroot/etc/profile.d
 +</code>
 +Однако, если вы  решитесь сделать это, то существуют некоторые дополнительные файлы, которые должны быть скопированы в chroot окружение, иначе вы получите bash запрос, который будет выглядеть как в следующем примере:
 +<code>
 +I have no name!@sdf:~ $>
 +</code>
 +Чтобы устранить эту проблему, необходимо включить некоторые библиотеки, которые ldd не 
 +выявит. Это две библиотеки libnss_files. Используйте пример ниже:
 +<code>
 + elw@sdf:~ $> cp /lib/libnss_files* /chroot/lib
 +</code>
 +
 +Если  по умолчанию  /etc/profile и /etc/profile.d у вас включены в chroot, то также необходимо включить /bin/cat/, /usr/bin/id, /bin/grep и /bin/dircolors, поскольку они необходимы для 100% работы /etc/profile по умолчанию. Они не требуют добавления каких-либо дополнительных библиотек, так что вы можете просто скопировать их прямо в chroot окружение. См. пример ниже:
 +<code>
 +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
 +</code>
 +
 +Теперь у вас есть почти все, что необходимо для выполнения chroot окружения для доступа пользователей через ssh. Это также даст дополнительное преимущество chroot пользователям, которые обратятся к системе по sftp. 
 +Всякий раз, когда вы захотите  добавить другого пользователя, воспользуйтесь разделом [[#sozdaem_chroot_polzovatelja | по созданию пользователя]]. Если  необходимо скопировать дополнительные двоичные файлы, используйте пример с ldd  и имейте в виду, что более сложные двоичные файлы могут иметь зависимости и сложных динамических библиотек, которые могут не отражаться при использовании ldd.
 +
  
Навигация
Печать/экспорт
QR Code
QR Code wiki:articles:chroot_ssh (generated for current page)