sftp сервер в chroot с ведением логов

 

Иногда возникает необходимость предоставить некоторому кругу лиц sftp доступ, но без возможности подключиться по ssh и ходить по основной файловой системе, читая файлы типа /etc/passwd, обычно доступные всем для чтения. В этом случае можно создать chroot-окружение для этих пользователей, изолировав их в отдельной "песочнице" и не давай выйти за ее пределы. Вот как это делается:

Создание chroot

Первое и самое сложное что необходимо сделать - создать директорию (например /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

Теперь "запрем" пользователей с помощью pam_chroot. В файле /etc/security/chroot.conf:

jailtest                /home/chroot/

Итак, на этом этапе chroot уже работает, в чем можно убедиться зайдя пользователем jailtest:

su - jailtest

Отключение интерактивного входа

Однако скорее всего вам нужно запретить интерактивный вход, оставив только sftp и scp. Существуют разные способы сделать это, наиболее удобным мне показалось использование rssh - специальной командной оболочки, позволяющей запретить интерактивный логин, разрешив использование sftp.

Устанавливаем rssh, открываем его конфигурационный файл /etc/rssh.conf и убеждаемся что строчки

allowscp
allowsftp

раскомментированы, а все остальные закомментированы. rssh также умеет самостоятельно делать chroot (без pam_chroot), но я не использовал эту возможность, поэтому оставил опцию chrootpath закомментированой.

Теперь нужно поменять оболочку с /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

Как-то мне хватало вот такой

Как-то мне хватало вот такой настройки в sshd.conf

Match Group sftponly
ChrootDirectory /home/sftponly
AllowTCPForwarding no
X11Forwarding no
ForceCommand internal-sftp

Пользователей, естественно нужно поместить в группу sftponly, а их домашние папки перенести в /home/sftponly

Проще.
А логи он и так в auth.log пишет.

К сожалению, с некоторыми

К сожалению, с некоторыми версиями sshd (4.3, которых в rhel5) это не работает.

Думаю вам бы sshd обновить

Думаю вам бы sshd обновить чтоли.

Аффтар похоже нашел и перевел

Аффтар похоже нашел и перевел хавтушку для FreeBSD 4.* ... сто лет в обед как это всё умеет стандартный sshd

см. выше

см. выше

proftpd+sftp

добавлю - в последней версии proftpd появилась поддержка sftp.

ftps != sftp

там ftps а не sftp на сколько мне известно. ftps - это ftp over ssl, sftp - отдельный протокол поверх ssh

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.

Post new comment

The content of this field is kept private and will not be shown publicly.
CAPTCHA
This question is for testing whether you are a human visitor and to prevent automated spam submissions.

Navigation

User login

Syndicate

Syndicate content