新增用户组及用户

进入root用户权限下进行操作

mkdir -pv /opt/ftpsite/{admin,user1,user2}
#新增用户组
groupadd sftpadmins
groupadd sftpusers
#[useradd](https://www.runoob.com/linux/linux-comm-useradd.html)新增用户admin,属于用户组sftpadmins
#账号的shell使用 /sbin/nologin ,此时无法SSH登陆系统
useradd -g sftpadmins -s /sbin/nologin -d /opt/ftpsite/ admin
passwd admin
admin
##新增用户user1、user2,属于用户组sftpusers
useradd -g sftpusers -s /sbin/nologin -d /opt/ftpsite/ user1
passwd user1
user1

useradd -g sftpusers -s /sbin/nologin -d /opt/ftpsite/ user2
passwd user2
user2

配置sshd_config

vim /etc/ssh/sshd_config

加入以下字段

Port 35021 #默认ssh端口号为22,生产环境中建议改成五位数的端口 
Subsystem sftp internal-sftp  #指定使用sftp服务使用系统自带的internal-sftp
#配置用户组sftpadmins
Match Group sftpadmins
    ChrootDirectory %h #用户通过sftp登录后就把根目录切换到它自己的家目录
    ForceCommand internal-sftp #指定sftp流程,此方法性能更优
    AllowTcpForwarding no #禁止[TCP](https://www.cnblogs.com/zqifa/p/ssh-2.html)转发
    X11Forwarding no #禁止X11转发
#配置用户组sftpusers
Match Group sftpusers
    ChrootDirectory %h
    ForceCommand internal-sftp
    AllowTcpForwarding no
    X11Forwarding no

更改配置后重启sshd服务

service sshd restart

测试1:用户只能sftp登录,不能ssh

#sftp登录成功
root@ubuntu:~# sftp -oPort=35021 admin@192.168.211.131
admin@192.168.211.131's password: 
Connected to 192.168.211.131.

root@ubuntu:~# sftp -oPort=35021 user1@192.168.211.131
user1@192.168.211.131's password: 
Connected to 192.168.211.131.

root@ubuntu:~# sftp -oPort=35021 user2@192.168.211.131
user2@192.168.211.131's password: 
Connected to 192.168.211.131.

#ssh登录失败
root@ubuntu:~# ssh -oPort=35021 admin@192.168.211.131
admin@192.168.211.131's password: 
This service allows sftp connections only.
Connection to 192.168.211.131 closed.

root@ubuntu:~# ssh -oPort=35021 user1@192.168.211.131
user1@192.168.211.131's password: 
This service allows sftp connections only.
Connection to 192.168.211.131 closed.

root@ubuntu:~# ssh -oPort=35021 user2@192.168.211.131
user2@192.168.211.131's password: 
This service allows sftp connections only.
Connection to 192.168.211.131 closed.

测试2

更改端口号后原端口号22不可用

root@ubuntu:/# sftp -oPort=22 user2@192.168.211.132
ssh: connect to host 192.168.211.132 port 22: Connection refused
Couldn't read packet: Connection reset by peer
root@ubuntu:/# ssh -oPort=22 user2@192.168.211.132
ssh: connect to host 192.168.211.132 port 22: Connection refused

修改用户权限

#chown设置[所属用户](https://www.runoob.com/linux/linux-comm-chown.html)
#chmod设置[权限](https://www.runoob.com/linux/linux-comm-chmod.html)
chown -R admin:sftpadmins /opt/ftpsite/admin
chmod 700 /opt/ftpsite/admin #只能自己访问所属目录
chown -R user1:sftpusers /opt/ftpsite/user1
chmod 750 /opt/ftpsite/user1 #同组也能访问,但不能写
chown -R user2:sftpusers /opt/ftpsite/user2
chmod 755 /opt/ftpsite/user2 #不同组也可访问,但不能写

测试3:admin用户功能

root@ubuntu:~# sftp -oPort=35021 admin@192.168.211.131
admin@192.168.211.131's password: 
Connected to 192.168.211.131.
sftp> cd admin
sftp> ls
admin.txt  
#在所属目录下测试文件上传
sftp> put -r /home/pwn/Desktop/upload.txt /admin
Uploading /home/pwn/Desktop/upload.txt to /admin/upload.txt
/home/pwn/Desktop/upload.txt                  100%   21     0.0KB/s   00:00    
sftp> ls
admin.txt    upload.txt 
#在所属目录下测试文件下载
sftp> get admin.txt /home/pwn/Desktop 
Fetching /admin/admin.txt to /home/pwn/Desktop/admin.txt
/admin/admin.txt                              100%   15     0.0KB/s   00:00    
#访问user1文件夹,无读写权限
sftp> cd ../user1
sftp> ls
remote readdir("/user1"): Permission denied  
#访问user2并测试文件上传、下载
#只能读不能写
sftp> cd ../user2
sftp> ls
user2.txt  
sftp> put -r /opt/ftpsite/admin/upload.txt /user2
Uploading /opt/ftpsite/admin/upload.txt to /user2/upload.txt
remote open("/user2/upload.txt"): Permission denied
sftp> get user2.txt /opt/ftpsite/admin
Fetching /user2/user2.txt to /opt/ftpsite/admin/user2.txt
/user2/user2.txt                     100%   15     0.0KB/s   00:00   


测试4:user2用户功能

root@ubuntu:~# sftp -oPort=35021 user2@192.168.211.131
user2@192.168.211.131's password: 
Connected to 192.168.211.131.
#访问admin,没有读写权限
sftp> cd ../admin
sftp> ls
remote readdir("/admin"): Permission denied
#访问user1并测试文件上传、下载
#只能读不能写
sftp> put -r /opt/ftpsite/user2/user2.txt /user1
Uploading /opt/ftpsite/user2/user2.txt to /user1/user2.txt
remote open("/user1/user2.txt"): Permission denied 
sftp> get user1.txt /user2.txt
Fetching /user1/user1.txt to /user2.txt
/user1/user1.txt                     100%   13     0.0KB/s   00:00    

user1用户功能不再赘述

其他

可使用chgrp 命令变更文件与目录的所属群组,而chown一次只能设置一个文件拥有者

需求:实现以下功能

模仿系统管理员和普通用户:admin和user两个用户组,能否实现admin组用户可以读写sftp根目录下所有文件,而user组用户只能对自己的目录只读。
分析:涉及到多个文件隶属于一个用户组,需要使用ACL命令
首先chmod给出基本权限

chmod 770 /opt/ftpsite/admin #只能自己读写所属目录
chmod 500 /opt/ftpsite/user1 #只能自己读所属目录
chmod 500 /opt/ftpsite/admin #只能自己读所属目录

查看当前文件所属及权限

root@ubuntu:/opt/ftpsite# ll
总用量 20
drwxr-xr-x 5 root  root       4096 95 09:12 ./
drwxr-xr-x 3 root  root       4096 95 08:31 ../
drwxrwx--- 2 admin sftpadmins 4096 95 20:12 admin/
dr-x------ 2 user1 sftpusers  4096 95 19:57 user1/
dr-x------ 2 user2 sftpusers  4096 95 19:58 user2/

接下来进行ACL权限管理,使用setfacl命令
可以对每一个文件或目录设置更精确的文件权限

#临时开启根分区 ACL 权限
mount -o remount,acl / 
#设置sftpadmins组在user1、user2的权限为rwx
setfacl -m g:sftpadmins:rwx /opt/ftpsite/user1
setfacl -m g:sftpadmins:rwx /opt/ftpsite/user2

#使用getfacl命令查看目录的acl权限
root@ubuntu:/# getfacl /opt/ftpsite/user1
getfacl: 从绝对路径名尾部去除" / "字符。
# file: opt/ftpsite/user1  #这三行为所属组信息
# owner: user1
# group: sftpusers
user::r-x                 #这六行为相应acl权限信息
user:admin:rwx
group::---
group:sftpadmins:rwx 
mask::rwx
other::---

root@ubuntu:/# getfacl /opt/ftpsite/user2
getfacl: 从绝对路径名尾部去除" / "字符。
# file: opt/ftpsite/user2
# owner: user2
# group: sftpusers
user::r-x
user:admin:rwx
group::---
group:sftpadmins:rwx 
mask::rwx
other::---

测试功能

#admin可访问user1、user2
root@ubuntu:/# sftp -oPort=35021 admin@192.168.211.132
admin@192.168.211.132's password: 
Connected to 192.168.211.132.
sftp> cd user1
sftp> ls
user1.txt  
sftp> cd ../user2
sftp> ls
user2.txt  
#user2不可以访问admin、user1
root@ubuntu:/# sftp -oPort=35021 user2@192.168.211.132
user2@192.168.211.132's password: 
Connected to 192.168.211.132.
sftp> cd ../user1
sftp> ls
remote readdir("/user1"): Permission denied
sftp> cd ../user1
sftp> ls
remote readdir("/user1"): Permission denied

参考博客

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐