当前位置: > 故障解决 > CentOS系统问题 >

Centos 7 搭建 sftp

时间:2017-09-19 01:35来源:blog.csdn.net 作者:qq_16681279的博客 举报 点击:
# ssh -V  
来查看openssh的版本,如果低于4.8p1,需要自行升级安装,不在这里具体介绍了。
1、创建sftp组
# groupadd sftp  

2、创建一个sftp用户,名为aguisftp
# useradd -g sftp -s /bin/false aguisftp
# passwd aguisftp

3、sftp组的用户的home目录统一指定到/agui/sftp下,按用户名区分,这里先新建一个mysftp目录,然后指定mysftp的home为/agui/sftp/mysftp

# mkdir -p /agui/sftp/mysftp
# usermod -d /agui/sftp/mysftp aguisftp
4、配置sshd_config
编辑 /etc/ssh/sshd_config

# vim +132 /etc/ssh/sshd_config  

**找到如下这行,并注释掉**
Subsystem      sftp    /usr/libexec/openssh/sftp-server  

添加如下几行
Subsystem       sftp    internal-sftp  
Match Group sftp  
ChrootDirectory /data/sftp 
ForceCommand    internal-sftp  
AllowTcpForwarding no  
X11Forwarding no  

**解释一下添加的几行的意思**

Subsystem       sftp    internal-sftp  
这行指定使用sftp服务使用系统自带的internal-sftp

Match Group sftp  
这行用来匹配sftp组的用户,如果要匹配多个组,多个组之间用逗号分割

当然,也可以匹配用户
Match User mysftp
这样就可以匹配用户了,多个用户名之间也是用逗号分割,但我们这里按组匹配更灵活和方便

ChrootDirectory /data/sftp/%uchroot将用户的根目录指定到/data/sftp/%u%u代表用户名,这样用户就只能在/data/sftp/%u下活动,chroot的含义,可以参考这里:http://www.ibm.com/developerworks/cn/linux/l-cn-chroot/

ForceCommand    internal-sftp  
指定sftp命令

AllowTcpForwarding no  
X11Forwarding no  
这两行,如果不希望该用户能使用端口转发的话就加上,否则删掉
5、设定Chroot目录权限
# chown root:sftp /agui/sftp
# chmod 755 /agui/sftp

错误的目录权限设定会导致在log中出现”fatal: bad ownership or modes for chroot directory XXXXXX”的内容

目录的权限设定有两个要点:
1、由ChrootDirectory指定的目录开始一直往上到系统根目录为止的目录拥有者都只能是root
2、由ChrootDirectory指定的目录开始一直往上到系统根目录为止都不可以具有群组写入权限

所以遵循以上两个原则
1)我们将/data/sftp/aguisftp的所有者设置为了root,所有组设置为sftp
2)我们将/data/sftp/aguisftp的权限设置为755,所有者root有写入权限,而所有组sftp无写入权限
6、建立SFTP用户登入后可写入的目录
照上面设置后,在重启sshd服务后,用户mysftp已经可以登录,但使用chroot指定根目录后,根应该是无法写入的,所以要新建一个目录供mysftp上传文件。这个目录所有者为aguisftp,所有组为sftp,所有者有写入权限,而所有组无写入权限

# mkdir /data/sftp/mysftp/upload  
# chown aguisftp:sftp /data/sftp/mysftp  
# chmod 755 /data/sftp/mysftp

7、重启sshd服务

# service sshd restart  

到这里,mysftp已经可以通过sftp客户端登录并可以上传文件到upload目录。
如果还是不能在此目录下上传文件,提示没有权限,检查SElinux是否关闭,可以使用如下指令关闭SElinux
修改/etc/selinux/config文件中的SELINUX="" 为 disabled ,然后重启。或者
# setenforce 0
测试:
sftp mysftp@127.0.0.1 
显示 sftp> 则sftp搭建成功

如上配置会出现没有写入权限的错误,如下

我们可以使用 root 去连接ssh服务实现 文件的上传和下载。

sftp root@127.0.0.1 

解决我们aguisftp 用户无法读写问题:

[root@VM_12_177_centos upload]# sftp aguisftp@127.0.0.1 
aguisftp@127.0.0.1's password: 
Write failed: Broken pipe
Couldn't read packet: Connection reset by peer

这个问题的原因是ChrootDirectory的权限问题,你设定的目录必须是root用户所有,否则就会出现问题。所以请确保sftp用户根目录的所有人是root, 权限是 750 或者 755。注意以下两点原则:

(1)目录开始一直往上到系统根目录为止的目录拥有者都只能是 root,用户组可以不是 root。

(2)目录开始一直往上到系统根目录为止都不可以具有群组写入权限

上面2点一定注意,仔细检查。我就是因为这个问题,导致一直有这个问题。仔细检查配置后,解决问题。

输入如下命令 :
[root@VM_12_177_centos upload]# chown -R root:root /agui/sftp
[root@VM_12_177_centos upload]# chmod 755 /agui/sftp
[root@VM_12_177_centos upload]# chown aguisftp:sftp /agui/sftp/mysftp
[root@VM_12_177_centos upload]# chmod 777 /agui/sftp/mysftp

[root@VM_12_177_centos upload]# service sshd restart
Redirecting to /bin/systemctl restart  sshd.service
[root@VM_12_177_centos upload]# sftp aguisftp@127.0.0.1 
aguisftp@127.0.0.1's password: 
Connected to 127.0.0.1.
sftp> 

问题已解决 , java 代码测试如下 :

------分隔线----------------------------
发表评论
为了和诣的生活,我关闭了评论页面,请大家到QQ群里交流吧:348944156,也欢迎关注本站微信公众号:centoscn