Назад | Перейти на главную страницу

Ведение журнала активности пользователей по протоколу Chrooted SFTP

Я пытаюсь зарегистрировать активность SFTP пользователем Chrooted.
Мне пока не удалось зарегистрировать ни одной строчки ни для одного пользователя chrooted. Для обычных пользователей работает.

Мои текущие настройки:

/ и т.д. / ssh / sshd_config:

Subsystem sftp internal-sftp -f AUTH -l VERBOSE

ClientAliveInterval 180
PasswordAuthentication no

Match Group sftpclients
ChrootDirectory /home/sftp/%u
AllowTCPForwarding no
X11Forwarding no
ForceCommand internal-sftp -f AUTH -l VERBOSE

/etc/rsyslog.conf:

$AddUnixListenSocket        /home/sftp.log.socket
$AddUnixListenSocket        /home/sftp/dev/log.socket
$AddUnixListenSocket        /home/sftp/user1/dev/log.socket
$AddUnixListenSocket        /home/sftp/user2/dev/log.socket

:programname, isequal, "internal-sftp" -/var/log/sftp2.log
:programname, isequal, "internal-sftp" ~

/etc/rsyslog.d/sftp.conf:

 input(type="imuxsock" Socket="/home/sftp/log2.socket" CreatePath="on")
 if $programname == 'internal-sftp' then /var/log/sftp3.log

У каждого пользователя есть каталог // dev /, привязанный к / dev: mount --bind /dev /home/sftp/<user>/dev а также сокеты, определенные в rsyslog.conf / sftp.conf

Вопрос Я пробовал практически все найденные мной предложения, чего мне может не хватать в моих настройках для регистрации пользователей с chrooted?

Если вы не используете rsyslogd и используете только journald из systemd, вы можете сделать следующее (источник https://wiki.archlinux.org/index.php/SFTP_chroot#Logging)

(Пожалуйста, замените <OPENSSH_CHROOT_PATH> с chroot-путем, настроенным в openssh, то есть: в вашем случае: /home/sftp/%u)

# mkdir /<OPENSSH_CHROOT_PATH>/dev
# chmod 755 /<OPENSSH_CHROOT_PATH>/dev
# touch /<OPENSSH_CHROOT_PATH>/dev/log

И привязать гнездо journald с помощью:

# mount --bind /run/systemd/journal/dev-log /<OPENSSH_CHROOT_PATH>/dev/log

И если он вам нужен постоянно, не забудьте добавить это bind-mount в свой / etc / fstab с помощью:

/ и т.д. / fstab:

(…)
/run/systemd/journal/dev-log /<OPENSSH_CHROOT_PATH>/dev/log none bind   0   0
(…)

Теперь вы можете увидеть ведение журнала внутреннего sftp с помощью journalctl:

# journalctl -f

Ваше предположение, что /dev/log это файл, к которому можно предоставить общий доступ через привязку /dev неверно для большинства современных дистрибутивов Linux, использующих systemd. Поэтому монтаж ваших систем /dev в ваш chroot не имеет большого значения.

$ file /dev/log
/dev/log: symbolic link to /run/systemd/journal/dev-log

Поскольку / run недоступен в chroot (и не должно быть), sftp-сервер пытается писать на /dev/log будет считать, что это неработающая символическая ссылка.

Вместо этого используйте input(type="imuxsock" Socket="/opt/bindmount/dev/log") для создания дополнительного сокета (который затем можно привязать к монтированию, чтобы все chroot видели его в /dev/log).

Обычно вы не должны делиться полным /dev доступ к chroot в любом случае, весь смысл chroot ограничивает поверхность атаки.


Бонус: вы можете написать свой /etc/rsyslog.d/10-sftp.conf такой конфиг (фильтр по "имени хоста", которое вы можете выбрать произвольно)

input(type="imuxsock" Socket="/opt/bindmount/dev/log", HostName="sftp")
if $hostname == 'sftp' then /var/log/sftp.log
&stop

Это означает, что если вы развертываете другие chroot-файлы, ограниченные другими командами (такими как git-shell), вы все равно можете хранить все сообщения от chroot в одном месте, даже если другие программы пишут в /dev/log.