/bin/false 限制不使用ssh, Match匹配sftp属组使用ChrootDirectory限制sftp根目录(该目录必须为root用户root属组,权限最大是755,可以在该目录创建子目录并修改子目录属组来给其他用户操作)
- 操作
su -
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
vi /etc/ssh/sshd_config
#在末尾注册掉这一行
Subsystem sftp /usr/local/openssh-9.0p1/libexec/sftp-server
#然后增加
Subsystem sftp internal-sftp
#匹配到是sftp属组用户则使用ChrootDirectory切换到用户的属主目录,即限定了用户的根目录
Match group sftp
ChrootDirectory %h
#重启sshd 注意看是否成功启动了,错误了要根据异常信息修改处理后或回退后再重启sshd,否则sshd不重启下次无法再ssh
service sshd restart
# 创建sftp属组
groupadd sftp
userdel writeuser
# 指定用户的属主目录/app/sftp/writeuser用户只能sftp操作这个目录, /bin/false禁用了ssh
useradd -d /app/sftp/writeuser -m -s /bin/false -g sftp
passwd writeuser
123456
#chroot目录及所有上级目录必须是root:root且权限755(只有root能写),才能在sftp之后成功ChrootDirectory,否则会抛异常
chown root:root /app/sftp/writeuser
chmod -R 755 /app/sftp/writeuser
mkdir -p /app/sftp/writeuser/Data
chown -R writeuser:sftp /app/sftp/writeuser/Data
# Data目录属主是writeuser可以读写上传,其他用户只能读不能写,也就是其他用户只能下载
chmod -R 755 /app/sftp/writeuser/Data
userdel readuser
useradd -d /app/sftp/writeuser -m -s /bin/false -g sftp readuser
passwd readuser
123456
- sshd_config说明:
Match
引入多个条件块。块的结尾标志是另一个 Match 指令或者件结尾。
如果 Match 上指定的条件都满足,那么随后的指令将覆盖全局配置中的指令。
Match 的值是个或多个"条件-模式"对。可以的"条件"是:User, Group, Host, Address 。
只有下列指令可以在 Match 块中使用:AllowTcpForwarding, Banner,ForceCommand, GatewayPorts, GSSApiAuthentication,KbdInteractiveAuthentication, KerberosAuthentication,PasswordAuthentication, PermitOpen, PermitRootLogin,RhostsRSAAuthentication, RSAAuthentication, X11DisplayOffset,X11Forwarding, X11UseLocalHost
[root@stress101 sftp]# diff /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
132,136c132
< #Subsystem sftp /usr/libexec/openssh/sftp-server
< Subsystem sftp internal-sftp
< # sftp是组名,也可是多个组名,用空格隔开就可以
< Match group sftp
< ChrootDirectory %h
---
> Subsystem sftp /usr/libexec/openssh/sftp-server
140,141c136,137
< X11Forwarding no
< AllowTcpForwarding no
---
> # X11Forwarding no
> # AllowTcpForwarding no
144,145c140
< ForceCommand internal-sftp
< #StrictModes no
---
> StrictModes no
[root@stress101 sftp]#
-
异常
如果重启sshd失败了Directive xxx is not allowd within a Match block, 就是Match下的块中出现了不允许的指令,修改或者移动到match上方即可。 -
参考:
https://www.freebuf.com/articles/system/183983.html
https://blog.csdn.net/u014721096/article/details/78559506
https://wenku.baidu.com/view/2f2f6a7e322b3169a45177232f60ddccdb38e64a.html
https://blog.51cto.com/lookingdream/1769233