Первое и самое сложное что необходимо сделать - создать директорию (например /home/chroot), содержащую все необходимые файлы (бинарники и библиотеки) для работы sftp в ней. Можно сделать это вручную копируя файлы из основной системы, но гораздо эффективнее сделать это с помощью jailkit. После установки тем или иным способом можно приступить к созданию директории:
mkdir /home/chroot chown root:root /home/chroot chmod 0755 /home/chroot jk_init -j /home/chroot basicshell jk_init -j /home/chroot sftp jk_init -j /home/chroot scp jk_init -j /home/chroot logbasics
После этого можно проверить chroot:
chroot /home/chroot ls / ls /home exit
Тут есть небольшая хитрость: нам нужно чтобы пользователь присутствовал в passwd как основной системы, так и chroot. Кроме того, нужно чтобы его домашняя директория также была доступна и там и там.
Вот как это делал я:
# создаем пользователя jailtest useradd -m jailtest # перемещаем его домашнюю директорию в chroot, а в основном /home/ делаем ссылку на нее: mkdir -p /home/chroot/home mv /home/jailtest /home/chroot/home/ ln -s /home/chroot/home/jailtest /home/ # добавляем запись о пользователе в passwd chroot-окружения: grep jailtest /etc/passwd >> /home/chroot/etc/passwd
Теперь "запрем" пользователей с помощью pam_chroot. В файле /etc/security/chroot.conf:
jailtest /home/chroot/
Итак, на этом этапе chroot уже работает, в чем можно убедиться зайдя пользователем jailtest:
su - jailtest
Однако скорее всего вам нужно запретить интерактивный вход, оставив только sftp и scp. Существуют разные способы сделать это, наиболее удобным мне показалось использование rssh - специальной командной оболочки, позволяющей запретить интерактивный логин, разрешив использование sftp.
Устанавливаем rssh, открываем его конфигурационный файл /etc/rssh.conf и убеждаемся что строчки
allowscp allowsftp
Теперь нужно поменять оболочку с /bin/bash на /usr/bin/rssh в файлах /etc/passwd и /home/chroot/etc/passwd. В дальнейшем можно указывать /usr/bin/rssh в качестве оболочки сразу при создании пользователя.
Кроме того, нужно скопировать rssh со всеми необходимыми ему библиотеками и конфигурационными файлами в chroot. В этом нам снова поможет jailkit:
jk_cp -j /home/chroot/ /usr/bin/rssh cp /etc/rssh.conf /home/chroot/etc/
Проверяем:
su - jailtest This account is restricted by rssh. Allowed commands: scp sftp If you believe this is in error, please contact your system administrator.
Остался последний штрих: хорошо было бы логировать все что происходит с нашим sftp сервером. Делается это так:
Во-первых, включаем логирование в sshd_config - находим строчку описания подсистемы sftp и дополняем опциями "-l INFO -f LOCAL1", стока должна выглядеть так:
Subsystem sftp /usr/libexec/openssh/sftp-server -l INFO -f LOCAL1
Далее необходимо создать лог-устройство в chroot и указать syslog'у что нужно прослушивать и его.
cd /home/chroot mknod dev/log c 21 5
Для того чтобы syslog прослушивал и это устройство, нужно запускать syslogd с опцией -a /home/jail/dev/log. В rhel этого можно добиться отредактировав файл /etc/sysconfig/syslog:
# Options to syslogd # -m 0 disables 'MARK' messages. # -r enables logging from remote machines # -x disables DNS lookups on messages recieved with -r # See syslogd(8) for more details SYSLOGD_OPTIONS="-m 0 -a /home/chroot/dev/log"
Ну и последний штрих: чтобы отделить сообщения sftp от других, добавим в /etc/syslog.conf следущую строчку:
# sftp logging local1.* /var/log/sftp.log