sftp直接使用系统的sshd服务,无需额外安装软件,配置也比较简单。
一、添加用户
添加一个sftp用户,不设置家目录,指定不能登录的shell,然后设置登录密码
useradd -M -s /sbin/nologin mysftp
passwd mysftp
二、新建一个工作目录
为sftp选择/新建一个工作目录,目录的所有上级目录属主必须为root,且不能为777的权限
mkdir -p /mnt/sftp/mysftp
chown root:root /mnt/sftp
chown 755 /mnt/sftp
chown mysftp:mysftp /mnt/ftp/mysftp
目录/mnt/sftp用于给用户进行chroot,而mysftp真正有权限写的目录是/mnt/sftp/mysftp,由于Linux的安全机制此处看起来有一些复杂
三、修改sshd配置文件
修改最好前先备份一下配置文件
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
将原有的sftp配置注释掉,然后在配置文件的最后加上下面的部分
#在配置文件中找到这一行注释掉
#Subsystem sftp /usr/lib/openssh/sftp-server
#文件最后加上下面这几行
Subsystem sftp internal-sftp
Match User mysftp
ChrootDirectory /mnt/ftp
AllowTcpForwarding no
X11Forwarding no
ForceCommand internal-sftp
四、重启sshd生效
systemctl restart sshd
五、遇到的一些问题和Tips
-
sftp登录不成功,如何排查?
查看检查sshd的日志,根据报错修复。根据sshd版本不同,日志可能存在下面几个文件中。
grep sshd /var/log/messages less /var/log/journal/sshd.service.log less /var/log/auth.log
-
由于sftp使用的sshd服务,默认使用22端口,想要换一个端口?
可以在sshd_config配置文件中增加一个端口监听,让sshd同时监听多个端口。记得将Port=22这行注释掉哦,这样就不会影响原来的ssh服务。
Port 22 #将原有的这一行注释取消,下面另外加一行 Port 38812
-
如果登录的时候还没有提示输入密码,就直接提示证书认证失败了
在sshd_config中针对mysftp用户增加一行配置(步骤三),允许使用密码登陆
PasswordAuthentication yes
-
上传的文件权限变少了?
原来上传的文件权限是755,上传后变成了750,可以通过设置sftp的umask来解决,增加一个-u参数指定,如下
Subsystem sftp internal-sftp -u 000
-
日志报错 bad ownership or modes for chroot directory
检查为sftp设置的工作目录(ChrootDirectory),目录本身及所有上级目录属主必须是root,所有不能有777的权限