centos7 创建 sftp 用户,并指定访问特定目录
所需实现功能:
userA
用户: 对/home/sftp/userA/files
目录有读写权限,限制其只能通过sftp登录服务器,且只能在userA
目录下操作
userB
用户: 对/home/sftp/userB/files
目录有读写权限,限制其只能通过sftp
登录服务器,且只能在userB
目录下操作
userB-r
用户: 对/home/sftp/userB/files
目录只有只读(下载)权限,限制其只能通过sftp
登录服务器,且只能在userB
目录下操做
查看主机 ssh
服务
检查本机是否安装
ssh
服务[root@snycloud ~]# systemctl status sshd ● sshd.service - OpenSSH server daemon Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled) Active: active (running) since 三 2021-03-24 17:55:59 CST; 10min ago Docs: man:sshd(8) man:sshd_config(5) Main PID: 996 (sshd) Tasks: 1 Memory: 5.6M CGroup: /system.slice/sshd.service └─996 /usr/sbin/sshd -D 3月 24 17:55:59 snycloud systemd[1]: Starting OpenSSH server daemon... 3月 24 17:55:59 snycloud sshd[996]: Server listening on 0.0.0.0 port 22. 3月 24 17:55:59 snycloud sshd[996]: Server listening on :: port 22. 3月 24 17:55:59 snycloud systemd[1]: Started OpenSSH server daemon. 3月 24 17:56:21 snycloud sshd[1615]: Connection closed by 192.168.2.31 port 57865 [preauth] 3月 24 17:56:21 snycloud sshd[1617]: Accepted publickey for root from 192.168.2.31 port 57869 ssh2: RSA SHA256:qkqeGDy+x5D1oLBVuUItOXkU+LTw/FTYrG5yHHFRW8Y 3月 24 17:56:37 snycloud sshd[1635]: Accepted publickey for root from 192.168.2.31 port 57887 ssh2: RSA SHA256:qkqeGDy+x5D1oLBVuUItOXkU+LTw/FTYrG5yHHFRW8Y 3月 24 17:59:09 snycloud sshd[1661]: Accepted publickey for root from 192.168.2.31 port 58164 ssh2: RSA SHA256:qkqeGDy+x5D1oLBVuUItOXkU+LTw/FTYrG5yHHFRW8Y [root@snycloud ~]#
如上情况说明已安装
ssh
并且正在运行
1. 创建 sftpuser
组
groupadd sftpuser
2. 创建 SFTP
统一目录
mkdir -p /home/sftp/
chown -R root:root /home/sftp #设置目录拥有者为 root 和 root 用户组
chmod -R 755 /home/sftp #设置目录权限拥有者7,组为5,其他为5,即拥有者为rwx,拥有组rwx,其他r-x
3. 添加用户并设置默认目录及禁止登陆
相关知识请见 知识字典
3-1). 添加 userA
用户,设置默认目录并授权
# 创建 SFTP 子目录 userA 给 userA 使用
# 同时创建 userA 可操作目录 files
mkdir -p /home/sftp/userA/files
# 添加用户,指定用户组、默认目录、禁止登陆、设置密码
useradd -g sftpuser -d /home/sftp/userA -M -s /sbin/nologin userA
passwd userA
# 输入两次密码完成设置密码
# 给 userA 目录授权
chown root:sftpuser /home/sftp/userA/
# 给用户可操作目录目录授权
chown -R userA:sftpuser /home/sftp/userA/files/ #设置拥有者为用户 userA、用户组 sftpuser
chmod -R 755 /home/sftp/userA/ #设置目录权限拥有者7,组为5,其他为5,即拥有者为rwx,拥有组rwx,其他r-x
3-2). 添加 userB
用户,设置默认目录并授权
# 创建 SFTP 子目录 userB 给 userB 使用
# 同时创建 userB 可操作目录 files
mkdir -p /home/sftp/userB/files
# 添加用户,指定用户组、默认目录、禁止登陆、设置密码
useradd -g sftpuser -d /home/sftp/userB -M -s /sbin/nologin userB
passwd userB
# 输入两次密码完成设置密码
# 给 userB 目录授权
chown root:sftpuser /home/sftp/userB/
# 给用户可操作目录目录授权
chown -R userB:sftpuser /home/sftp/userB/files/ #设置拥有者为用户 userB、用户组 sftpuser
chmod -R 755 /home/sftp/userB/ #设置目录权限拥有者7,组为5,其他为5,即拥有者为rwx,拥有组rwx,其他r-x
3-3). 添加 userB-r
用户,设置默认目录并授权
# 添加用户,指定用户组、默认目录、禁止登陆、设置密码
useradd -g sftpuser -d /home/sftp/userB -M -s /sbin/nologin userB-r
passwd userB-r
# 输入两次密码完成设置密码
【注意 : 因为 3-2 中已经设置 /home/sftp/userB 权限,此处不需在设置权限了 /home/sftp/userB 目录除了 userB 其他任何用户均为只读权限】
4. 修改 sshd_config
文件,指定不同用户登录不同目录
vi /etc/ssh/sshd_config
# 注释掉下面一行
# Subsystem sftp /usr/libexec/openssh/sftp-server
# 在文件最末尾添加以下内容
# 以下代码块新加入,请一定要放在文件末尾处,否则root用户无法ssh登录 !!!
# 以下代码块新加入,请一定要放在文件末尾处,否则root用户无法ssh登录 !!!
# 以下代码块新加入,请一定要放在文件末尾处,否则root用户无法ssh登录 !!!
Subsystem sftp internal-sftp # 新加入
Match User userB-r
ChrootDirectory /home/sftp/userB
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
Match Group sftpuser
X11Forwarding no
AllowTcpForwarding no
ChrootDirectory /home/sftp/%u
ForceCommand internal-sftp
Subsystem sftp internal-sftp
这行指定使用sftp
服务使用系统自带的 `internal-sftp
Match Group sftpuser
这行用来匹配sftpuser
组的用户,如果要匹配多个组,多个组之间用逗号分割当然,也可以匹配用户
Match User userA
这样就可以匹配用户了,多个用户名之间也是用逗号分割,但我们这里按组匹配更灵活和方便
ChrootDirectory /home/sftp/%u
将用户的根目录指定到/home/sftp/%u
,%u
代表用户名,这样用户就只能在/home/sftp/%u
下活动
ForceCommand internal-sftp
指定sftp
命令
AllowTcpForwarding no
X11Forwarding no
这两行,如果不希望该用户能使用端口转发的话就加上,否则删掉
目录权限设置要点
ChrootDirectory
用户的根目录指定参数
其权限及其所有的上级文件夹权限,属主必须是root
且只有属主能拥有写权限,即权限最大设置只能是755
上面之所以要创建
files
目录,是因为无论userA
还是userB
对自己的登录目录/home/sftp/userA
和/home/sftp/userB
都只有只读权限,而通过
chown -R userA:sftpuser /home/sftp/{userA,userB}/files/
chmod -R 755 /home/sftp/{userA,userB}/
的权限设置,我们可以让这两个用户对自己目录下的files拥有读写权限
从而使得userB-r
对files
目录只有只读权限
从而达到不同用户拥有不同的权限设定需求上面配置中,
userB-r
的配置必须在
Match Group sftpuser
组配置之前,否则会因为参数/home/sftp/%u
优先匹配/home/sftp/userB-r
目录
而实际中userB-r
目录是不存在,造成登录失败同理也就是说,创建的用户有以用户名命名的目录时,不需要单独配置
Match User userB-r
这项,如果没有以用户名命名的目录时则必须配置Match User userB-r
这项,并且必须配置在Match Group sftpuser
组配置之前
原因是如果不单独配置Match User userB-r
的话在 sftp 登录时会默认根据/home/sftp/%u
去找/home/sftp/userB-r
这个目录,但实际是不存在的,则无法登录成功
5. 重启 ssh
服务配置更新生效
service sshd restart
或
systemctl restart sshd
6. 验证 SFTP
配置
[root@snycloud ~]# sftp userA@127.0.0.1
The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.
ECDSA key fingerprint is SHA256:Y47XuXSZKWgiIa4XJ/+2zACOakEjvgc9Y09dNmOAk8o.
ECDSA key fingerprint is MD5:2b:ae:14:87:fa:19:4c:34:fc:0f:6c:47:47:97:e4:90.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '127.0.0.1' (ECDSA) to the list of known hosts.
userA@127.0.0.1's password:
Connected to 127.0.0.1.
sftp> ls
files
sftp> cd files/
7. 知识字典
添加用户命令格式
# 同时创建目录
useradd -g [组名] -d [默认跟路径] -s /sbin/nologin [用户名]
或
useradd -g [组名] -d [默认跟路径] -s /bin/false [用户名]
# 不创建目录
useradd -g [组名] -d [默认跟路径] -M -s /sbin/nologin [用户名]
或
useradd -g [组名] -d [默认跟路径] -M -s /bin/false [用户名]
参数说明
-g
新建用户的分组
-d
用户根目录
-M
不生成目录 (当-d
中的目录已存在时使用,如不存在需要同时创建目录,则不需带此参数)
-s
禁止用户使用ssh
登录禁止用户
SSH
登录-s /bin/false
或-s /sbin/nologin
都可以
-s /bin/false
什么也不做只是返回一个错误状态,然后立即退出,用户会无法登录,并且不会有任何提示。-s /sbin/nologin
会礼貌的向用户显示一条类似
“ This account is currently not available. ”
信息,并拒绝用户登录
删除用户命令格式
userdel [-r] [用户名]
# -r 用于彻底删除,用户HOME目录下的档案会被移除
# 在其他位置上的档案也将一一找出并删除,比如路径/var/mail/用户名 下的邮件
临时关闭用户
在
/etc/shadow
文件中属于该用户的行的第二个字段(密码)前面加上星号就可以了。想恢复该用户,去掉星号即可。
或者使用如下命令关闭用户账号passwd [用户名] –l
重新释放
passwd [用户名] –u
##### 从组中删除用户
> 编辑 /etc/group 找到 组名 那一行,删除 用户名 或者用命令
```powershell
gpasswd -d [用户名] [组名]
显示用户信息
id [用户名]
一键删除本文中的用户
userdel -r userA && gpasswd -d userA sftpuser
userdel -r userB && gpasswd -d userB sftpuser
userdel -r userB-r && gpasswd -d userB-r sftpuser
8. 常见问题
1). sftp
用户登录失败
[root@snycloud ~]# sftp userA@127.0.0.1
The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.
ECDSA key fingerprint is SHA256:Y47XuXSZKWgiIa4XJ/+2zACOakEjvgc9Y09dNmOAk8o.
ECDSA key fingerprint is MD5:2b:ae:14:87:fa:19:4c:34:fc:0f:6c:47:47:97:e4:90.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '127.0.0.1' (ECDSA) to the list of known hosts.
userA@127.0.0.1's password:
packet_write_wait: Connection to 127.0.0.1 port 22: Broken pipe
Couldn't read packet: Connection reset by peer
分析:
sftp
根目录所有者问题
解决方案:sftp
根目录所有者设置为root
用户chown -R root:root /home/sftp #设置目录拥有者为 root 和 root 用户组
2). sftp
子目录无法创建文件夹和文件(写入权限)
分析:没有写入权限
解决方案:添加写入权限chown -R root:sftpuser /home/sftp/userA/ chown -R userA:sftpuser /home/sftp/userA/files/ #设置拥有者为用户userA、用户组 sftpuser chmod -R 755 /home/sftp/userA/ #设置目录权限拥有者7,组为5,其他为5,即拥有者为rwx,拥有组rwx,其他r-x
3).
sftp
使用用户名密码无法登录分析:配置文件配置问题
解决方案:/ect/ssh/sshd_config
中密码登录设置项设置为yes
PasswordAuthentication yes
评论区