记录 Chrooted SFTP 用户活动

记录 Chrooted SFTP 用户活动

我一直在尝试记录 Chrooted 用户的 SFTP 活动。
到目前为止,我还没有能够为任何 chrooted 用户记录一行。对于普通用户来说,它是有效的。

我的当前设置:

在 /etc/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 用户?

答案1

你认为可以/dev/log通过绑定挂载共享的文件的假设/dev对于大多数使用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

答案2

如果你不使用 rsyslogd,而只使用 systemd 的 journald,则可以执行以下操作(来源https://wiki.archlinux.org/index.php/SFTP_chroot#Logging

(请用<OPENSSH_CHROOT_PATH>openssh 中配置的 chroot 路径替换,即:在您的情况下/home/sftp/%u:)

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

并使用以下命令绑定挂载日志套接字:

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

如果您永久需要它,请不要忘记在 /etc/fstab 中添加此绑定挂载:

在 /etc/fstab 中:

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

您现在可以使用 journalctl 查看 internal-sftp 日志记录:

# journalctl -f

相关内容