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

Оригинал: http://howtoforge.org/chrooted-ssh-sftp-tutorial-debian-lenny


 

Система Orphus

 


 

Comments: 15

  1. GiNeR March 20th, 2009 at 3:22 pm

    Это хорошая новость.

  2. Валентинов March 22nd, 2009 at 10:56 pm

    <<Разница в том, что мы не добавляем строку ForceCommand /usr/lib/openssh/sftp-server в выражение Match
    Ого как все оказывается просто :) Спасиб большое!

  3. 4Rino May 6th, 2009 at 10:35 am

    Проделал все до слов:
    Теперь вы можете зайти на сервер при помощи SFTP-клиента и работать в chroot-окружении.

    При коннекте юзера которому указоно окружене chroot ошибка:
    debian sshd[2723]: fatal: bad ownership or modes for chroot directory "/home/kom1"

    Под тем у кого не указано все норм.
    Как исправить?

  4. boombick May 6th, 2009 at 10:37 am

    translate.google.com

  5. semlanik August 28th, 2009 at 10:22 am

    debian sshd[2723]: fatal: bad ownership or modes for chroot directory аналогично. не понятно на какую директорию у пользователя нет прав это A
    не понятно какие права назначать на какие директории это B.
    И C почему chroot делается на home а не на /home/username

  6. Сергей November 12th, 2009 at 2:01 pm

    Сделал 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 не заходит.
    Народ помогите разобраться как сделать чтоб то и то работало, а то два логина не хочится заводить.

  7. Rett Pop November 20th, 2009 at 11:34 am

    Настроил по этому мануалу. Правда, не в дебиане, а в слаке. Теперь вопрос как добавить русскую локаль? Русского там нет совсем. Не подскажешь?

  8. boombick November 20th, 2009 at 11:52 am

    Русскую локаль куда?

  9. PeoneEr December 3rd, 2009 at 3:47 pm

    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

  10. boombick December 3rd, 2009 at 9:10 pm

    Убунту это все-таки не дебиан :) А вообще надо смотреть скрипт

  11. Emerald December 5th, 2009 at 3:10 am

    чтобы одновренно работало и SFTP и SSH в chroote надо Субстистем заменить на
    Subsystem sftp internal-sftp

    чем отличаеться от /usr/lib/openssh/sftp-server или /usr/local/libexec/sftp-server я незнаю(возможно камне преткновения служит патч который уже включен в последние версии но на взаимодествие с sftp-server не распространяеться), но это работает.

  12. idGreen March 27th, 2010 at 3:40 am

    Такой вопрос, выше он уже был поднят, так и ответа нет, Значит а как реализовать чтобы при подключение по sftp и ssh чтобы сразу отправлял на корневую дерикторию и чтобы пользователь сидел строго в своей дериктории а точнее чтобы по ssh при коннекте он не мог выйти из своей корневой директории. Жду ответа )

  13. zysyl November 4th, 2010 at 3:06 am

    Конечно это не вовремя но все-же отпишу предыдущему пользователю, засунуть пользователя в дом директорию что-бы он не мог никуда передвигаться невозможно. Вы просто не понимаете как работает chroot. А теперь о баге, я не знаю может это только у меня, но когда я использую /bin/bash в качестве шела при подключении по ssh меня перекидывает в корень chroot-a для того чтобы поправить это я проделал следующее, создал директорию в /home/jail/home/ под именем jail и в ней вот такую символьную ссылку home -> ../../home/. теперь при входе по ssh меня сразу перекидывает в дом дир пользователя.

  14. dfsdf July 14th, 2011 at 12:15 pm

    /usr/local/sbin/make_chroot_jail.sh: 428: cannot create : Directory nonexistent

    Правится заменой строчки #!/bin/sh на #!/bin/bash в файле make_chroot_jail.sh

  15. guard November 4th, 2011 at 11:47 am

    Хорошая статья, но не законченная.
    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

Add a Comment