web-dev-qa-db-ja.com

ChrootされたSFTPユーザーアクティビティのログ

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されたユーザーをログに記録するためのセットアップに何が欠けている可能性がありますか?

1
Jeppe

_/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からのすべてのメッセージを同じ場所に置くことができます。

2
anx

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
1
beneth