SFTP日志记录:有办法吗?

Dar*_*ein 101 ssh sftp

我想知道是否有办法记录服务器收到的命令。它可以是所有 SSH 命令,只要它包含与文件传输相关的命令的信息。

我在使用 SFTP 客户端时遇到问题,创建者要求提供日志,但我找不到任何现有日志。

我希望同时登录 CentOS 或 OS X(尽管我怀疑是否可能,但两者都相似)。

rvf*_*rvf 109

OpenSSH 4.4p1 及更高版本(应该包括 CentOS 5 的最新版本)具有内置的 SFTP 日志记录功能 - 您只需要对其进行配置。

在您的 sshd_config 中找到它(在 centos 中,文件/etc/ssh/sshd_config):

Subsystem       sftp    /usr/libexec/openssh/sftp-server
Run Code Online (Sandbox Code Playgroud)

并将其更改为:

Subsystem       sftp    /usr/libexec/openssh/sftp-server -l INFO
Run Code Online (Sandbox Code Playgroud)

INFO 只是默认情况下您所看到的详细信息的一个级别 - 它提供有关文件传输、权限更改等的详细信息。如果您需要更多信息,您可以相应地调整日志级别。各个级别(按详细顺序)是:

QUIET, FATAL, ERROR, INFO, VERBOSE, DEBUG, DEBUG1, DEBUG2, and DEBUG3
Run Code Online (Sandbox Code Playgroud)

任何超过 VERBOSE 的信息可能比您要查找的信息多,但它可能很有用。

最后重新启动 SSH 服务以更新更改(centos):

systemctl restart sshd
Run Code Online (Sandbox Code Playgroud)

  • 这取决于您的系统日志配置。使用 INFO 日志级别,大多数默认 syslog.conf 将这些条目放在 /var/log/messages 中。 (5认同)
  • 是否可以使用内部 sftp 服务器来做到这一点? (4认同)
  • 在 Ubuntu 上,这些日志默认为 `/var/log/auth.log`。将 `-f USER` 添加到该 `Subsystem` 配置行以将它们发送到 `/var/log/syslog`。 (3认同)
  • 我不知道你可以像那样登录 SFTP,这就是我需要的。它在哪里存储日志?/var/log/auth.log ? (2认同)

slm*_*slm 46

围绕 sftp-server 的日志记录的相同切换也适用于 internal-sftp。这是我的 /etc/ssh/sshd_config 中的一个示例:

Subsystem   sftp    internal-sftp -f AUTH -l INFO
Run Code Online (Sandbox Code Playgroud)

启用信息级别日志记录后,消息将开始显示在 /var/log/messages 下(至少在基于 Red Hat 的发行版下):

May 27 05:58:16 test-server sshd[20044]: User child is on pid 20049
May 27 05:58:16 test-server sshd[20049]: subsystem request for sftp by user test-user
May 27 05:58:16 test-server internal-sftp[20050]: session opened for local user test-user from [192.168.1.1]
May 27 05:58:16 test-server internal-sftp[20050]: received client version 3
May 27 05:58:16 test-server internal-sftp[20050]: realpath "."
May 27 05:58:21 test-server internal-sftp[20050]: opendir "/home/test-user/"
May 27 05:58:21 test-server internal-sftp[20050]: closedir "/home/test-user/"
May 27 05:58:21 test-server internal-sftp[20050]: lstat name "/home/test-user/upload"
May 27 05:58:21 test-server internal-sftp[20050]: realpath "/home/test-user/upload/"
May 27 05:58:21 test-server internal-sftp[20050]: stat name "/home/test-user/upload"
May 27 05:58:24 test-server internal-sftp[20050]: open "/home/test-user/upload/test-file.pdf" flags WRITE,CREATE,TRUNCATE mode 0664
May 27 05:58:25 test-server internal-sftp[20050]: close "/home/test-user/upload/test-file.pdf" bytes read 0 written 1282941
Run Code Online (Sandbox Code Playgroud)

  • 看起来你的 chroot 区域需要 `/dev/log`。类似`sudo mkdir /chrooted/area/dev`、`sudo touch /chrooted/area/dev/log`、`sudo chmod 511 /chrooted/area/dev`、`sudo chattr +i /chrooted/area/dev` , `sudo mount --bind /dev/log /chrooted/area/dev/log`。用户仍然可以对该 /dev/log 进行写访问,但由于它是一个套接字,如果他们只能访问 `sftp`,他们不会造成太大伤害。 (4认同)
  • FWIW:在 ArchLinux Wiki 中有关于如何在 chroot 环境中启用日志记录的很好的描述:https://wiki.archlinux.org/index.php/SFTP_chroot#Logging (4认同)
  • 我发现,在我的情况下,它只记录 root 的 sftp 会话,而不记录我的 chroot 用户测试。我不明白为什么,你有什么想法吗? (2认同)

小智 7

为了澄清上述评论:

如果您使用监狱(chroot 环境)配置了 sftp,则无需额外的配置工作就无法登录。chroot环境下无法写入日志,需要创建mount bind或者socket。我建议使用套接字,因为它是 syslog-ng 以及 rsyslog(也许还有更多)提供的功能。

对于那些使用 syslog-ng 的人,请查看此链接。对于那些使用 rsyslog 的人;希望有帮助