ChrootされたユーザーによるSFTPアクティビティをログに記録しようとしています。
これまで、chrootされたユーザーの1行をログに記録することはできませんでした。通常のユーザーの場合は機能します。
私の現在の設定:
/ 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
で定義されています。
質問私は基本的に私が見つけたすべての提案を試しましたが、chrootされたユーザーをログに記録するためのセットアップに何が欠けている可能性がありますか?
_/dev/log
_がバインドマウントを介して共有できるファイルであるというあなたの仮定_/dev
_は、systemdを使用する最新のLinuxディストリビューションでは正しくありません。したがって、システムを_/dev
_をchrootにマウントしてもほとんど価値がありません。
_$ file /dev/log
/dev/log: symbolic link to /run/systemd/journal/dev-log
_
/ runはchrootではそのように利用できないため(そしてそうすべきではない)、sftp-serverが_/dev/log
_に書き込もうとすると、シンボリックリンクが壊れていると見なされます。
代わりに、input(type="imuxsock" Socket="/opt/bindmount/dev/log")
を使用して追加のソケットを作成します(これをバインドマウントして、すべてのchrootが_/dev/log
_で参照できるようにします)。
通常、chrootへの完全な_/dev
_アクセスを共有するべきではありません。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
_
つまり、他のコマンド(_git-Shell
_など)に限定して他のchrootをデプロイすると、他のプログラムが_/dev/log
_に書き込んだとしても、chrootからのすべてのメッセージを同じ場所に置くことができます。
Rsyslogdを使用せず、systemdからのジャーナルのみを使用する場合は、次の操作を実行できます(ソース 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