ReMember

限制SFTP用户登陆

Linux上的SSH默认携带SFTP功能,人们不需做其它配置,便可使用系统用户授权即可访问目标操作系统上的文件系统,很是方便;但有时也会带来一些安全隐患,比如要将SFTP开放给第三方使用,但不想其能登陆系统,且限制其访问,这时就需要做些额外的配置了。

默认配置

默认配置下进行SFTP连接,SSHD会额外启动一个外部子进程:

这是由于默认的Subsystem sftp配置:

通过查看 man sshd_config 可以知道,此配置项可以更改为 internal-sftp ,以额外使用 ChrootDirectory 配置来限制客户端访问的根目录。

修改配置

修改sshd_config配置文件,更改/添加以下条目:

vim /etc/ssh/sshd_config
Subsystem       sftp    internal-sftp
Match Group sftp
        X11Forwarding no
        AllowTcpForwarding no
        ChrootDirectory /data/sftproot
        ForceCommand internal-sftp

这里设置了sftp为使用内部自带sftp提供服务;Match Group sftp 表明匹配 sftp 用户组的用户使用下面的额外配置项:关闭 X11 转发,关闭 TCP 转发,限制根目录为指定目录,不允许 TTY 登陆,强制只能使用 SFTP 命令。

注意:ChrootDirectory所设置的目录需是root用户宿主的目录,否则客户端无法连接进入(见ServerFault),客户端会报错:

[[email protected] ~]# ssh [email protected]
[email protected]'s password: 
packet_write_wait: Connection to 172.16.220.226 port 22: Broken pipe
[[email protected] ~]# sftp [email protected]
[email protected]'s password: 
packet_write_wait: Connection to 172.16.220.226 port 22: Broken pipe
Couldn't read packet: Connection reset by peer

服务端会报错:

tail -f /var/log/secure
Dec 24 16:37:00 disconf sshd[21226]: Accepted password for alex from 172.16.220.220 port 50156 ssh2 Dec 24 16:37:00 disconf sshd[21226]: pam_unix(sshd:session): session opened for user alex by (uid=0) Dec 24 16:37:00 disconf sshd[21226]: fatal: bad ownership or modes for chroot directory "/home/alex" [postauth] Dec 24 16:37:00 disconf sshd[21226]: pam_unix(sshd:session): session closed for user alex

重启SSHD服务:

systemctl restart sshd

systemctl restart sshd
systemctl status sshd

这时再新建SFTP连接,便是使用内部sftp:

新建用户

以上配置是限制sftp组内的用户,故新建sftp用户组,并添加新用户进此组:

groupadd -g 579 sftp
useradd -s /sbin/nologin -c "xx sftp user" -G sftp alex
echo 123456 | passwd --stdin alex
id alex

设置chroot目录:

mkdir -p /data/sftproot/alex
chown -R alex.alex /data/sftproot/alex

 

测试

使用另一台机进行连接测试:

正常,用户只能通过SFTP进行连接操作,且限制在特定目录下。

码字很辛苦,转载请注明来自ReMember《限制SFTP用户登陆》

评论