Chroot-окружение SSH/SFTP в Debian Lenny
С версии 4.8 OpenSSH нативно поддерживает установку chroot-окружения и для этого больше не нужны патчи. Эта статья описывает настройку chroot-окружения для ваших пользователей при использовании SSH/SFTP. Пользователь будет “заперт” в своем каталоге без возможности доступа к основной системе
Предисловие
Описывается настройка chroot-окружения для OpenSSH версии 4.8 для Debian Lenny
Для примера я буду использовать пользователя boombick с домашней директорией /home/boombick. Пользователь boombick входит в группу users. Chroot-окружение будет ограничено директорией /home
Установка OpenSSH
Если OpenSSH-сервер еще не установлен в вашей системе, то установите его командой
# aptitude install ssh openssh-server
Включаем SFTP
Включить SFTP-доступ очень просто. Отредактируйте файл /etc/ssh/sshd_config следующим образом:
# vim /etc/ssh/sshd_config
[...] Subsystem sftp /usr/lib/openssh/sftp-server [...]
и добавьте в конец файла следующие строки (для каждого пользователя, которого вы хотите поместить в chroot):
[...]
Match User boombick
ChrootDirectory /home
AllowTCPForwarding no
X11Forwarding no
ForceCommand /usr/lib/openssh/sftp-server
… либо для группы пользователей:
[...]
Match Group users
ChrootDirectory /home
AllowTCPForwarding no
X11Forwarding no
ForceCommand /usr/lib/openssh/sftp-server
Последний вариант поместит всех пользователей, входящих в группу users, в chroot
Перезапустите ssh-сервер
# /etc/init.d/ssh restart
Если вы настраиваете chroot для нескольких пользователей в одну директорию (/home в нашем примере) и не хотите, чтобы они просматривали личные директории друг друга, то не забудьте присвоить верные права для директорий:
chmod 700 /home/boombick
Теперь вы можете зайти на сервер при помощи SFTP-клиента и работать в chroot-окружении.
SSH в chroot-окружении
Настройка chroot для SSH более трудоемка из-за того, что необходимо настроить еще и программное окружение, то есть поместить в chroot такие программы как /bin/bash, /bin/cp и т. д. Это значит, что мы должны будем скопировать эти программы и библиотеки, которые они используют, в наше chroot-окружение. Вы можете сделать это вручную, с помощью команды cp, а узнать список библиотек вам поможет команда ldd:
# ldd /bin/bash linux-gate.so.1 => (0xb7fbd000) libncurses.so.5 => /lib/libncurses.so.5 (0xb7f75000) libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb7f71000) libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7e0f000) /lib/ld-linux.so.2 (0xb7fbe000)
Также надо создать системные устройства /dev/null, /dev/zero, /dev/tty и /dev/urandom. Это можно сделать командой mknod
Но делать это вручную весьма утомительно :) Хорошо, что есть люди, которые помогли облегчить нам эту процедуру. Wolfgang Fuschlberger написал bash-скрипт, который позволяет автоматизировать процесс создания chroot-окружения.
Для начала установим некоторые необходимые пакеты:
aptitutde install sudo debianutils coreutils
Затем скачаем скрипт, пометим его в /usr/local/sbin сделаем его исполняемым
chmod 700 /usr/local/sbin/make_chroot_jail.sh
Но перед стартом добавим некоторые приложения, которые мы хотим сделать доступными для использования в chroot, например, vim
vim /usr/local/sbin/make_chroot_jail.sh
[...] elif [ "$DISTRO" = DEBIAN ]; then APPS="/bin/bash /bin/cp /usr/bin/dircolors /bin/ls /bin/mkdir /bin/mv /bin/rm /bin/rmdir /bin/sh /bin/su /usr/bin/groups /usr/bin/id /usr/bin/rsync /usr/bin/ssh /usr/bin/scp /sbin/unix_chkpwd /usr/bin/vim" else [...]
Затем создадим симлинк в /home, указывающий на сам /home
cd /home ln -s . home
Теперь можно запускать скрипт. Его запускают со следующими параметрами
make_chroot_jail.sh username [/path/to/chroot-shell [/path/to/chroot]]
chroot-shell – это специальная оболочка для пользователей в chroot, которую создает скрипт. Но OpenSSH поддерживает chroot нативно, поэтому мы будем использовать обычный /bin/bash или /bin/sh
Не имеет значения, существует ли пользователь в системе или нет. Если пользователя нет, то он будет создан. Если есть – его данные будут обновлены.
# make_chroot_jail.sh boombick /bin/bash /home
Эта команда создаст/обновит данные пользователя boombick для его работы в chroot
Для обновления всех файлов/библиотек в chroot выполните
make_chroot_jail.sh update /bin/bash /home
Теперь немного подредактируем конфиг (примерно так же, как мы делали для SFTP)
vim /etc/ssh/sshd_config
И добавим следующие строки для каждого пользователя в chroot
[...]
Match User boombick
ChrootDirectory /home
AllowTCPForwarding no
X11Forwarding no
Или для группы пользователей
[...]
Match Group users
ChrootDirectory /home
AllowTCPForwarding no
X11Forwarding no
Разница в том, что мы не добавляем строку ForceCommand /usr/lib/openssh/sftp-server в выражение Match
Таким образом пользователи могут использовать не только chroot-SFTP (убедитесь, что в /etc/ssh/sshd_config есть строка Subsystem sftp /usr/lib/openssh/sftp-server)
Не забудьте перезапустить ssh-сервер
# /etc/init.d/ssh restart
Это хорошая новость.
<<Разница в том, что мы не добавляем строку ForceCommand /usr/lib/openssh/sftp-server в выражение Match
Ого как все оказывается просто :) Спасиб большое!
Проделал все до слов:
Теперь вы можете зайти на сервер при помощи SFTP-клиента и работать в chroot-окружении.При коннекте юзера которому указоно окружене chroot ошибка:
debian sshd[2723]: fatal: bad ownership or modes for chroot directory "/home/kom1"Под тем у кого не указано все норм.
Как исправить?
translate.google.com
debian sshd[2723]: fatal: bad ownership or modes for chroot directory аналогично. не понятно на какую директорию у пользователя нет прав это A
не понятно какие права назначать на какие директории это B.
И C почему chroot делается на home а не на /home/username
Сделал chroot, заработал как по ssh так и по sftp, но вот одновременно для одного пользователя не работает. Если делаю так
Match group sftponly
ChrootDirectory %h
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
то работает sftp только, а если так
Match group sftponly
ChrootDirectory %h
AllowTcpForwarding no
X11Forwarding no
то ssh а по sftp не заходит.
Народ помогите разобраться как сделать чтоб то и то работало, а то два логина не хочится заводить.
Настроил по этому мануалу. Правда, не в дебиане, а в слаке. Теперь вопрос как добавить русскую локаль? Русского там нет совсем. Не подскажешь?
Русскую локаль куда?
Copying necessary library-files to jail (may take some time)
mv: после `.bak’ пропущен операнд, задающий целевой файл
Попробуйте `mv –help’ для получения более подробного описания.
mv: после `.bak’ пропущен операнд, задающий целевой файл
Попробуйте `mv –help’ для получения более подробного описания.
/usr/local/sbin/make_chroot_jail.sh: 428: cannot create : Directory nonexistent
/usr/local/sbin/make_chroot_jail.sh: 428: cannot create : Directory nonexistent
/usr/local/sbin/make_chroot_jail.sh: 428: cannot create : Directory nonexistent
/usr/local/sbin/make_chroot_jail.sh: 428: cannot create : Directory nonexistent
/usr/local/sbin/make_chroot_jail.sh: 428: cannot create : Directory nonexistent
/usr/local/sbin/make_chroot_jail.sh: 428: cannot create : Directory nonexistent
/usr/local/sbin/make_chroot_jail.sh: 428: cannot create : Directory nonexistent
/usr/local/sbin/make_chroot_jail.sh: 428: cannot create : Directory nonexistent
/usr/local/sbin/make_chroot_jail.sh: 428: cannot create : Directory nonexistent
/usr/local/sbin/make_chroot_jail.sh: 428: cannot create : Directory nonexistent
/usr/local/sbin/make_chroot_jail.sh: 428: cannot create : Directory nonexistent
/usr/local/sbin/make_chroot_jail.sh: 428: cannot create : Directory nonexistent
/usr/local/sbin/make_chroot_jail.sh: 428: cannot create : Directory nonexistent
/usr/local/sbin/make_chroot_jail.sh: 428: cannot create : Directory nonexistent
/usr/local/sbin/make_chroot_jail.sh: 428: cannot create : Directory nonexistent
/usr/local/sbin/make_chroot_jail.sh: 428: cannot create : Directory nonexistent
/usr/local/sbin/make_chroot_jail.sh: 428: cannot create : Directory nonexistent
/usr/local/sbin/make_chroot_jail.sh: 428: cannot create : Directory nonexistent
На этом все останавливается. Что не так?
Система убунту 9.10
Убунту это все-таки не дебиан :) А вообще надо смотреть скрипт
чтобы одновренно работало и SFTP и SSH в chroote надо Субстистем заменить на
Subsystem sftp internal-sftp
чем отличаеться от /usr/lib/openssh/sftp-server или /usr/local/libexec/sftp-server я незнаю(возможно камне преткновения служит патч который уже включен в последние версии но на взаимодествие с sftp-server не распространяеться), но это работает.
Такой вопрос, выше он уже был поднят, так и ответа нет, Значит а как реализовать чтобы при подключение по sftp и ssh чтобы сразу отправлял на корневую дерикторию и чтобы пользователь сидел строго в своей дериктории а точнее чтобы по ssh при коннекте он не мог выйти из своей корневой директории. Жду ответа )
Конечно это не вовремя но все-же отпишу предыдущему пользователю, засунуть пользователя в дом директорию что-бы он не мог никуда передвигаться невозможно. Вы просто не понимаете как работает chroot. А теперь о баге, я не знаю может это только у меня, но когда я использую /bin/bash в качестве шела при подключении по ssh меня перекидывает в корень chroot-a для того чтобы поправить это я проделал следующее, создал директорию в /home/jail/home/ под именем jail и в ней вот такую символьную ссылку home -> ../../home/. теперь при входе по ssh меня сразу перекидывает в дом дир пользователя.
/usr/local/sbin/make_chroot_jail.sh: 428: cannot create : Directory nonexistent
Правится заменой строчки #!/bin/sh на #!/bin/bash в файле make_chroot_jail.sh
Хорошая статья, но не законченная.
1) Чтоб не было bad ownership or modes for chroot directory право на записи всех родительских папок до папки chroot пользователя дать только root
2) строки Subsystem sftp /usr/lib/openssh/sftp-server
ForceCommand /usr/lib/openssh/sftp-server
работают только если изменить
на Subsystem sftp
internal-sftp
ForceCommand internal-sftp