侧边栏壁纸
博主头像
惬意小蜗牛博主等级

海内存知己,天涯若比邻!

  • 累计撰写 54 篇文章
  • 累计创建 143 个标签
  • 累计收到 55 条评论

目 录CONTENT

文章目录

centos7 创建 sftp 用户 并指定访问特定目录.md

惬意小蜗牛
2021-07-13 / 0 评论 / 0 点赞 / 1,783 阅读 / 2,742 字 / 正在检测是否收录...

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

关于 chownchmod 可参考此文献

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-rfiles 目录只有只读权限
    从而达到不同用户拥有不同的权限设定需求

  • 上面配置中,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
0

评论区