Настройка 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.