SFTP:为 chroot 用户登录到一个单独的文件

HTF*_*HTF 6 chroot sftp

我想将 SFTP 命令记录到一个单独的文件中,但它仅适用于root但不适用于 chroot 用户:

# cat /etc/ssh/sshd_config
...
Subsystem       sftp    internal-sftp -l INFO
Match Group user1
   ChrootDirectory /chroot
   ForceCommand internal-sftp -l INFO
   AllowTcpForwarding no
   X11Forwarding no
Run Code Online (Sandbox Code Playgroud)

——

根据手册页,默认工具是 AUTH

# cat /etc/rsyslog.d/sshd.conf
auth.* /var/log/sftp.log
Run Code Online (Sandbox Code Playgroud)

——

tail -F /var/log/secure /var/log/sftp.log

==> /var/log/secure <==
Dec 27 12:35:09 lab sshd[43014]: Accepted publickey for root from 192.168.1.100 port 44706 ssh2
Dec 27 12:35:09 lab sshd[43014]: pam_unix(sshd:session): session opened for user root by (uid=0)
Dec 27 12:35:09 lab sshd[43014]: subsystem request for sftp

==> /var/log/sftp.log <==
Dec 27 12:35:09 lab internal-sftp[43016]: session opened for local user root from [192.168.1.100]
Dec 27 12:35:10 lab internal-sftp[43016]: opendir "/root/"
Dec 27 12:35:10 lab internal-sftp[43016]: closedir "/root/"
Dec 27 12:35:27 lab internal-sftp[43016]: session closed for local user root from [192.168.1.100]

==> /var/log/secure <==
Dec 27 12:35:27 lab sshd[43014]: Received disconnect from 192.168.1.100: 11: disconnected by user
Dec 27 12:35:27 lab sshd[43014]: pam_unix(sshd:session): session closed for user root
Dec 27 12:35:31 lab sshd[43017]: Accepted password for user1 from 192.168.1.100 port 44708 ssh2
Dec 27 12:35:31 lab sshd[43017]: pam_unix(sshd:session): session opened for user user1 by (uid=0)
Dec 27 12:35:31 lab sshd[43019]: subsystem request for sftp
Dec 27 12:35:31 lab sshd[43020]: session opened for local user user1 from [192.168.1.100]
Dec 27 12:35:31 lab sshd[43020]: opendir "/"
Dec 27 12:35:31 lab sshd[43020]: closedir "/"
Run Code Online (Sandbox Code Playgroud)

编辑:格林威治标准时间 2013 年 12 月 30 日星期一 11:40:18

系统:CentOS 6.5

我添加了以下选项,但是事件仍然记录到 /var/log/secure 日志文件中:

# id user1
uid=501(user1) gid=501(user1) groups=501(user1)
# mkdir /chroot/dev
# cat /etc/rsyslog.d/sshd.conf
$AddUnixListenSocket /chroot/dev/log
auth.* /chroot/dev/sftp.log
# service rsyslog restart
Shutting down system logger:                               [  OK  ]
Starting system logger:                                    [  OK  ]
# ll /chroot/dev/
total 0
srw-rw-rw- 1 root   root   0 Dec 30 11:44 log
-rw------- 1 nobody nobody 0 Dec 30 11:39 sftp.log
Run Code Online (Sandbox Code Playgroud)

Eri*_*ikE 6

根据此链接,我相信您符合详细记录 chroot sftp 用户的三个标准之一:

  • 必须在 sftpd 配置中配置详细的日志记录。您似乎是使用“ForceCommand internal-sftp -l INFO”指令完成的。
  • 必须在 chrooted 目录内指定日志文件,因为 chrooted 用户没有写入 /var/log 目录的权限。
  • 必须将日志套接字添加到 rsyslogd 以方便记录到新的日志文件。

比较其他链接(例如此通用指令此 CentOS 指令),在日志路径的首选自定义目录名称、放置日志套接字配置的确切文件和日志表达式方面,发行版之间的确切配置似乎略有不同套接字配置。

[编辑] Mon Dec 30 21:50:00 GMT 2013

我目前无法访问 CentOS,但在上面 CentOS 页面的链接中发现了一个很好的指南。该链接已损坏,但我可以通过Waybackmachine访问该页面。但是,由于指南似乎有消失的危险,我现在将在下面的精彩引文中公然复制与您的问题相关的部分。希望它会对您有所帮助,但正如目前所说,我无法对您使用的发行版进行测试。

看起来你做了一些不同的事情,所以手指交叉你会在下面挖到金子。

--在Waybackmachine中bigmite.com开始引用-


chroot 配置

在此示例中,我将设置一组仅需要 SFTP 访问(无 SSH)的用户,并将文件复制到 SFTP 服务器上的文件系统。文件系统的位置将是/sftp,用户将驻留在此处下的单独文件夹中。

最初应该创建一个新组,这里称为“sftpuser”。每个需要 SFTP 访问的用户都将被放置在该组中。

sshd_config(上Debian中/etc/ssh)应当被编辑和在端部下面补充: -

Match group sftpuser
 ChrootDirectory /sftp/%u
 X11Forwarding no
 AllowTcpForwarding no
 ForceCommand internal-sftp -l VERBOSE -f LOCAL6
Run Code Online (Sandbox Code Playgroud)

这将执行以下操作:-

  1. 强制所有通过 ssh 在端口 22 上连接的用户只使用 sftp
  2. 在目录中的 chroot jail 中运行他们的 sftp 会话 /sftp/$USER
  3. 阻止 X11 转发连接的 TCP
  4. 运行内部 sftp 服务器以获取详细日志和系统日志通道名称 LOCAL6

现在应该创建一个用户,而不创建主目录和默认组sftpuser。在 ubuntu 上,您可以输入:-

(为了可读性,我添加了换行符!/E)

adduser --home / --gecos "First Test SFTP User" --group sftpuser --no-create-home
--shell /bin/false testuser1
Run Code Online (Sandbox Code Playgroud)

主目录设置为的原因/是 sftp 将 chroot 到/sftp/testuser1. 接下来需要创建用户主目录:-

mkdir /sftp/testuser1
chmod 755 /sftp/testuser1
mkdir /sftp/tstuser1/in
mkdir /sftp/testuser1/out
chown testuser1 /sftp/testuse1/in
Run Code Online (Sandbox Code Playgroud)

请注意,您设置的目录结构和权限可能因您的要求而异。应该设置用户密码,并重新启动 sshd(在 debian 上service ssh restart)。

现在应该可以使用命令行 sftp 工具将文件 sftp 传输到主机,但不应该以 user 身份通过 ssh 连接到服务器testuser1

日志记录

您将看到/var/logmessages为每个 chroot 用户生成详细的 sftp 日志记录,默认情况下,这应该转到daemon.log. 原因是 chroot 的 sftp 进程无法打开,/dev/log因为它不在 chroot 的文件系统内。

此问题有两个修复程序,具体取决于文件系统配置。

如果用户 sftp 目录 /sftp/user 在根文件系统上

您可以创建一个硬链接来模仿设备:-

mkdir /sftp/testuser1/dev
chmod 755 /sftp/testuser1/dev
ln /dev/log /sftp/testuser1/dev/log
Run Code Online (Sandbox Code Playgroud)

如果用户 sftp 目录不在根文件系统上

首先 syslog 或 rsyslog 将需要在用户文件系统中使用附加的日志记录套接字。对于我的示例/sftp是一个单独的 sftp 文件系统。

对于红帽

在 redhat syslog 上使用,所以我改变/etc/sysconfif/syslog了这一行:-

SYSLOGD_OPTIONS="-m 0"
Run Code Online (Sandbox Code Playgroud)

读:-

SYSLOGD_OPTIONS="-m 0 -a /sftp/sftp.log.socket
Run Code Online (Sandbox Code Playgroud)

最后,需要告知 syslog 守护进程将消息记录LOCAL6/var/log/sftp.log文件中,因此将以下内容添加到/etc/syslog.conf:-

# For SFTP logging
local6.*                        /var/log/sftp.log
Run Code Online (Sandbox Code Playgroud)

并且系统日志已重新启动。

对于 Ubuntu Lucid

在我创建的 Ubuntu lucid 上,/etc/rsyslog.d/sshd.conf包含:-

# Create an additional socket for some of the sshd chrooted users.
$AddUnixListenSocket /sftp/sftp.log.socket
# Log internal-sftp in a separate file
:programname, isequal, "internal-sftp" -/var/log/sftp.log
:programname, isequal, "internal-sftp" ~
Run Code Online (Sandbox Code Playgroud)

...并重新启动 rsyslogd。

为用户创建日志设备

现在对于每个用户都/dev/log device需要创建:-

mkdir /sftp/testuser1/dev
chmod 755 /sftp/testuser1/dev
ln /sftp/sftp.log.socket /sftp/testuser1/dev/log
Run Code Online (Sandbox Code Playgroud)

——结束语——