#创建sftp组:
groupadd sftp
#创建一个用户sftpuser:
useradd -g sftp -s /bin/false sftpuser
#提示:
/etc/group 文件包含所有组
/etc/shadow /etc/passwd 系统存在的所有用户名
#设置sftpuser用户的密码,会要求你输入两次密码确认:
passwd sftpuser
#创建一个sftp的上传目录:
mkdir /datas/www
#修改用户sftpuser所在的目录:
usermod -d /datas/www sftpuser
#配置sshd_config:
vi /etc/ssh/sshd_config
#找到如下这行,并注释掉
#Subsystem sftp /usr/libexec/openssh/sftp-server
#添加如下几行(如果添加之后出现问题,则添加到最后)
Subsystem sftp internal-sftp #这行指定使用sftp服务使用系统自带的internal-sftp Match User sftpuser #这行用来匹配用户 ChrootDirectory /datas/www #用chroot将用户的根目录指定到/datas/www ,这样用户就只能在/datas/www下活动 AllowTcpForwarding no ForceCommand internal-sftp #指定sftp命令
为什么用 internal-sftp 而不用默认的 sftp-server,这是因为: 这是一个进程内的 sftp 服务,当用户 ChrootDirectory 的时候,将不请求任何文件; 更好的性能,不用为 sftp 再开一个进程。
#保存退出
#设定Chroot目录权限:
chown -R root:root /datas/www chmod 755 /datas/www
#建立SFTP用户登入后可写入的目录:
mkdir /datas/www/sftpuser chown -R sftpuser:sftp /datas/www/sftpuser/ chmod 755 /datas/www/sftpuser/
#重启sshd服务:
service sshd restart
#测试是否能正常登陆:
sftp -P 22122 ftpuser@127.0.0.1
#关闭SElinux:
vi /etc/sysconfig/selinux #找到如下这行 SELINUX=enforcing #修改为 SELINUX=disabled
#保存退出
#这里讨论了为什么要关闭这功能:https://www.zhihu.com/question/20559538
常见问题:
1、修改sshd_config文件后重启 sshd,报错:Directive 'UseDNS' is not allowed within a Match block
语法错误,原因未知,只需要把两段配置的位置互调就不报错了。
修改前:
Subsystem sftp internal-sftp UsePAM yes Match user sftpuser1 ForceCommand internal-sftp ChrootDirectory /data/wwwroot/user1/ UseDNS no AddressFamily inet PermitRootLogin yes SyslogFacility AUTHPRIV PasswordAuthentication yes
修改后(就是换个顺序):
UseDNS no AddressFamily inet PermitRootLogin yes SyslogFacility AUTHPRIV PasswordAuthentication yes Subsystem sftp internal-sftp UsePAM yes Match user sftpuser1 ForceCommand internal-sftp ChrootDirectory /data/wwwroot/user1/
参考资料:http://www.cnblogs.com/xjnotxj/p/6912471.html
2、如果你链接服务器的时候出现下面的提示:
> Write failed: Broken pipe
> Couldn't read packet: Connection reset by peer
这个问题的原因是ChrootDirectory的权限问题,你设定的目录必须是root用户所有,否则就会出现问题。所以请确保sftp用户根目录的所有人是root, 权限是 750 或者 755。注意以下两点原则:
-
目录开始一直往上到系统根目录为止的目录拥有者都只能是 root,用户组可以不是 root。
-
目录开始一直往上到系统根目录为止都不可以具有群组写入权限
- 上面2点一定注意,仔细检查。我就是因为这个问题,导致一直有这个问题。仔细检查配置后,解决问题。
参考资料:
https://segmentfault.com/a/1190000008578734
http://www.cnblogs.com/kgdxpr/p/3623369.html
http://blog.csdn.net/xinxin19881112/article/details/46831311