步骤
- 创建sftp组:
groupadd sftp
- 创建一个sftp用户mysftp并加入到创建的sftp组中,同时修改mysftp用户的密码
useradd -g sftp -s /sbin/nologin -M mysftp
passwd mysftp
-g 加入到sftp组
-s 禁止使用命令
-M 不要自动建立用户的登入目录
- 新建/data/sftp目录,并指定/data和其下文件夹分组为:root:root,并修改权限755
mkdir -p /data/sftp
chown -R root:root /data/sftp
chmod 755 /data/sftp
- 上面的目录是sftp的根目录,必须是root:root组下的,并且权限最高为755,再创建一个目录是存放文件的,该目录应该是sftp组下的,且权限为755
mkdir -p /data/sftp/mysftp
chown -R mysftp:sftp /data/sftp/mysftp
chmod 755 /data/sftp/mysftp
- 修改配置文件:# vim /etc/ssh/sshd_config
PasswordAuthentication yes (一定要改成yes,不然可能直接登陆时被拒绝)
注释掉:Subsystem sftp /usr/libexec/openssh/sftp-server
在 文件最后添加以下配置,否则可能导致sshd服务无法启动
Subsystem sftp internal-sftp
Match Group sftp 这行用来匹配sftp组的用户,如果要匹配多个组,多个组之间用逗号分割 匹配用户的话用 Match User sftpuser
ChrootDirectory /data/sftp/%u 用chroot将用户的根目录指定到/data/sftp/%u,%u代表用户名,这样用户就只能在/data/sftp/%u下活动
X11Forwarding no
AllowTcpForwarding yes
- 重启服务验证:# systemctl restart sshd.service
需要注意的问题
本来到这里就该结束的,但是我还是想说点话,这里如果你照着之前网上的搭的,你会有很多坑。
- 首先是 sshd_config配置文件中,Match Group和Match User下所指定的ChrootDirectory目录,必须是root用户root组,不然sftp根本连不上,如果连不上,请仔细检查下面这几点:
目录的权限设定有两个要点:
1、由ChrootDirectory指定的目录开始一直往上到系统根目录为止的目录拥有者都只能是root
2、由ChrootDirectory指定的目录开始一直往上到系统根目录为止都不可以具有群组写入权限
所以遵循以上两个原则
1)我们将/data/sftp/这两层目录的所有者设置为了root,所有组设置为root,并且权限为755
2)我们将/data/sftp/mysftp这层的权限设置为755,所有者mysftp,所有组sftp
-
ssh登录不了,报错:This service allows sftp connections only。有些博文让配置AllowTcpForwarding为no,但是如果你真这么配了,结果就是你连ssh都用不了,登都登不了这个机器了,而只能用sftp并且只能在特定用户的目录下活动。
-
root用户ssh登录不了,报错:Server unexpectedly closed network connection。是因为有的博文让你设置了ForceCommand internal-sftp,注释掉这个配置。