Я пытаюсь зарегистрировать активность 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
.