CentOS下搭建sftp服务并指定不同用户的访问目录和权限

【写在前面】

客户现在有个需求,需要创建个文件服务器,可以实现对不同用户访问不同目录,且用户拥有不同访问权限。
目前文件服务器有很多种,常见的有vsftp、samba、sftp等,为了省事,我直接采用sftp实现这个需求。
目前服务器上都安装了ssh服务,则默认就包含sftp功能,只要sshd服务器启动了,sftp功能也就可以直接使用,端口就是ssh服务设置的登录端口,默认是22。
PS:本文只是描述sftp实现需求过程,其中一些安全设置操作省略没写,如果你是搭建用来给外网用户使用,请注意安全加固问题,起码要更改ssh的端口号,设置密码复杂度,防火墙配置,限制访问的IP源地址等等。

所需实现功能:

userA用户:对/opt/sftp/userA/UploadFiles目录有读写权限,限制其只能通过sftp登录服务器,且只能在userA目录下操作
userB用户:对/opt/sftp/userB/UploadFiles目录有读写权限,限制其只能通过sftp登录服务器,且只能在userB目录下操作
userB-r用户:对/opt/sftp/userB/UploadFiles目录只有只读(下载)权限,限制其只能通过sftp登录服务器,且只能在userB目录下操做

【实现过程】

1.首先查看openssh软件版本,sftp想控制用户访问特定的文件目录功能需要4.8以上版本

# rpm -qa | grep openssh
openssh-server-5.3p1-94.el6.x86_64
openssh-5.3p1-94.el6.x86_64
openssh-clients-5.3p1-94.el6.x86_64

2.创建sftpuser组,新增sftp登录用户userA、userB、userB-r,限制用户无法ssh登录服务器

# groupadd sftpuser 
# useradd -g sftpuser -s /bin/false userA && echo "userA@123"|passwd userA --stdin
# useradd -g sftpuser -s /bin/false userB && echo "userB@123"|passwd userB --stdin
# useradd -g sftpuser -s /bin/false userB-r && echo "userB-r@123"|passwd userB-r --stdin

3.创建两个用户的登录目录,设定目录权限:

# mkdir -p /opt/sftp/{userA,userB}/UploadFiles
# chown root:root /opt/sftp/
# chown root:sftpuser /opt/sftp/{userA,userB}/
# chown userA:sftpuser /opt/sftp/userA/UploadFiles
# chown userB:sftpuser /opt/sftp/userB/UploadFiles
# chmod 755 /opt/sftp/{userA,userB}

4.修改sshd_config文件,指定不同用户登录不同目录

# vim /etc/ssh/sshd_config
注释掉下面一行:

#Subsystem sftp /usr/libexec/openssh/sftp-server

添加如下几行:

Subsystem    sftp    internal-sftp
Match User userB-r
    ChrootDirectory /opt/sftp/userB
    ForceCommand    internal-sftp
    AllowTcpForwarding no
    X11Forwarding no
Match Group sftpuser
    ChrootDirectory /opt/sftp/%u
    ForceCommand    internal-sftp
    AllowTcpForwarding no
    X11Forwarding no 
目录权限设置要点:
  • ChrootDirectory参数指定的目录,其权限及其所有的上级文件夹权限,属主必须是root,且只有属主能拥有写权限,即权限最大设置只能是755。
  • 上面之所以要创建UploadFiles目录,是因为无论userA还是userB对自己的登录目录userA和userB都只有只读权限,而通过上面第3步的权限设置,我们可以让这两个用户对自己目录下的UploadFiles拥有读写权限,而使得userB-r对UploadFiles目录只有只读权限,从而达到不同用户拥有不同的权限设定需求。
  • 上面配置中,userB-r的配置必须在sftpuser组配置之前,以后添加新的用户也是如此,否则会因为参数“/opt/sftp/%u”优先匹配/opt/sftp/userB-r目录,而实际中userB-r目录是不存在,造成登录失败。

重启sshd服务:
# service sshd restart

5.假设我们搭建的服务器ip是192.168.1.1,则测试过程如下:

测试userA用户:
# sftp userA@192.168.1.1
Connecting to 192.168.1.1...
userA@192.168.1.1's password: userA@123
sftp> ls
UploadFiles
sftp> cd UploadFiles
sftp> mkdir A
sftp> ls
A              ===========》说明userA对目录/opt/sftp/userA/UploadFiles有读写权限
测试userB用户:
# sftp userB@192.168.1.1
Connecting to 192.168.1.1...
userB@192.168.1.1's password: userB@123
sftp> ls
UploadFiles
sftp> cd UploadFiles
sftp> mkdir B
sftp> ls
B              ===========》说明userB对目录/opt/sftp/userB/UploadFiles有读写权限
测试userB-r用户:
# sftp userB-r@192.168.1.1
Connecting to 192.168.1.1...
userB-r@192.168.1.1's password: userB-r@123
sftp> ls
UploadFiles
sftp> cd UploadFiles
sftp> mkdir B-r
Couldn't create directory: Permission denied  ===========》说明userB-r对目录/opt/sftp/userB/UploadFiles没有写权限
sftp> ls
B  123
sftp> get 123                                ===========》123是事先创建好的文件,说明userB-r对目录/opt/sftp/userB/UploadFiles有读权限(下载)
Fetching /UploadFiles/123 to 123             

到此,sftp对不同用户访问不同目录,且用户拥有不同访问权限功能实现。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享