警告:在操作之前,先打个多个会话窗口,避免操作不当,引起无法登录服务器,例如这样
背景:
1.需要搭建sftp服务器(一般服务器自带sftp服务,此处不再赘述)
2.sftp只允许访问指定目录,不能访问其他目录(重点)
在一些生产环境中,有时,用户需要传数据到服务器,但是配置ftp服务比较麻烦,此时,我们可以为用户创建sftp账户,让用户使用sftp来上传下载所需的数据。Sftp账号即为系统账号,将账户密码给用户,用户除了能登录sftp上传下载数据外,还可以访问系统中的其他目录,由此,给我们的系统带来了安全隐患,再次,我们需要配置用户只能通过sftp登录系统下载上传所需的数据。
1.创建sftp用户joshua317
useradd joshua317 echo abc123 | passwd --stdin joshua317
2.设置sftp用户joshua317的账户权限
设置sftp的账号权限需要通过修改sshd_config配置文件进行,sshd_config配置文件修改内容如下:
vi /etc/ssh/sshd_config #内容修改如下 # Subsystem sftp /usr/libexec/openssh/sftp-server #注释掉此行并添加一下行 Subsystem sftp internal-sftp Match User joshua317 #此处设置控制的用户,也可以设置为组 ChrootDirectory /home/joshua317 #允许用户访问的目录,此处我们设置为用户家目录,根据具体情况自己定义 X11Forwarding no AllowTcpForwarding no ForceCommand internal-sftp
配置完成后需要重启服务:
service sshd reload
或者
systemctl restart sshd #根据不同的操作系统选择不同命令,这里服务器版本是centos7.X
此处配置完我们用另一台机器测试登录,会出现错误,使用win系统sftp客户端(FileZilla)同样也不能正常登陆
[root@xxxxxxxxxxxxx ~]# sftp joshua317@172.17.xxx.xxx Connecting to 172.17.xxx.xxx... joshua317@172.17.xxx.xxx's password: Write failed: Broken pipe Couldn't read packet: Connection reset by peer
这是由于没有配置目录的正确权限,我们需要设置用户访问的目录的权限
3.设置允许用户访问目录的权限
重点:sftp用户访问目录需要设置所有者和所属组的权限均为root,并设置目录的权限为755,
但此目录下的文件及目录的权限我们可根据自己的需求任意设置。
chown root:root /home/joshua317/ #不要使用chown -R chmod 755 /home/joshua317/ #不要使用chmod -R #设置该sftp账号不允许登录 usermod joshua317 -s /sbin/nologin #然后重启 service sshd reload
至此,我们的sftp配置已经完成,
4.测试
使用linux测试:
使用windows客户端FileZilla测试:
5.设置用户上传文件权限
经过上面的设置后用户可正常浏览下载目录中的文件,但是用户无法上传文件。
此时需要在/home/joshua317/下建立属主属组为joshua317的目录,并给/home/joshua317下的目录设置acl权限即可。
mkdir /home/joshua317/test chown joshua317:joshua317 /home/joshua317/test chmod 755 /home/joshua317/test #查看 getfacl /home/joshua317/test
测试是否可以在/homne/joshua317/test下面创建文件或者目录
6.额外:通过用户组处理
如果又需要创建一个用户joshua318,可以继续通过匹配用户的形式,只需要进行如下操作
首先创建一个用户
#添加一个用户,指定用户组为joshua317,目录为/home/joshua317,账号不允许登录 useradd -g joshua317 -s /sbin/nologin -m joshua318 echo abc123 | passwd --stdin joshua318
调整sshd_config
vi /etc/ssh/sshd_config Match User joshua318 ChrootDirectory /home/joshua317 #重启sshd service sshd reload
但如果有很多个用户,此时就需要通过组进行匹配
vi /etc/ssh/sshd_config Match Group joshua317 ChrootDirectory /home/joshua317 #然后重启 service sshd reload
测试是否成功: