1. 创建一个sftp组
groupadd sftp
2. 创建一个用户名为 test 密码为 test123456 的用户
useradd –g sftp –s /bin/false test passwd test
3. 设置用户的家目录
usermod -d /var/www/html/cms/ test
4. 更改ssh配置
vim /etc/ssh/sshd_config
#找到如下这行,用#符号注释掉。 # Subsystem sftp /usr/libexec/openssh/sftp-server #限定只有sftp组的才能访问 Match Group sftp #设定属于用户组sftp的用户访问的根文件夹 (%u 用户) ChrootDirectory /var/www/html/cms/ ###强制执行这里指定的命令而忽略客户端提供的任何命令。这个命令将使用用户的登录###shell执行(shell -c)。这可以应用于 shell 、命令、子系统的完成,通常用于 Match 块中。 ###这个命令最初是在客户端通过 SSH_ORIGINAL_COMMAND 环境变量来支持的。 ForceCommand internal-sftp ###是否允许TCP转发,默认值为"yes", 禁止TCP转发并不能增强安全性,除非禁止了用户###对shell的访问,因为用户可以安装他们自己的转发器。 AllowTcpForwarding no ###是否允许进行 X11 转发。默认值是"no",设为"yes"表示允许。如果允许X11转发并且sshd(8)代理的显示区被配置为在含有通配符的地址(X11UseLocalhost)上监听。那么将可能有额外的信息被泄漏。由于使用X11转发的可能带来的风险,此指令默认值为"no"。需要注意的是,禁止X11转发并不能禁止用户转发X11通信,因为用户可以安装他们自己的转发器 X11Forwarding no
5. 设置Chroot目录权限
chown root:sftp /var/www/html/cms chmod 755 /var/www/html/cms
6. 重启sshd服务
systemctl restart sshd
问题查找:
如果sshd重启失败运行命令 (sshd -t)查看具体的错误原因。
如果客户端连接不上, 可以增加日志
###修改/etc/ssh/sshd_config 增加日志记录(追加后面的内容) Subsystem sftp /usr/libexec/openssh/sftp-server -l INFO -f local5 LogLevel INFO ###修改/etc/rsyslog.conf 文件最后增加一行 auth,authpriv.*,local5.* /var/log/sftp.log ### 重启sshd, rsyslog服务 systemctl restart sshd systemctl restart rsyslog ### 查看日志 tail -f /var/log/sftp.log
常见问题
### sshd -t /etc/ssh/sshd_config line 149: Directive 'UseDNS' is not allowed within a Match block #将UseDNS no 这天指令移到 Subsystem sftp /usr/libexec/openssh/sftp-server之前 /etc/ssh/sshd_config line 149: Subsystem 'sftp' already defined. #将Subsystem sftp internal-sftp 注释掉 ### tail -f /var/log/sftp.log Nov 1 10:16:27 iZbp195ygwh32u2aocf5j2Z sshd[24944]: fatal: bad ownership or modes for chroot directory component "/var/www/html/cms/" [postauth] # 这个目录的own需要是root,group需要是sftp组,权限755,父目录的own全部是root,权限755(检查步骤5)。