AllowUsers和DenyUsers优先级为DenyUsers>AllowUsers,前者为黑名单、后者为白名单;AllowUsers支持username@IP/CIDR/hostname,DenyUsers仅支持精确用户名,二者共存时同名用户必被拒绝。

AllowUsers 和 DenyUsers 的实际写法与优先级陷阱
直接在 /etc/ssh/sshd_config 里写 AllowUsers 或 DenyUsers 是最常用的做法,但容易因格式或逻辑冲突锁死自己。
-
AllowUsers支持用户名、用户名@IP、用户名@hostname 三种形式,多个条目用空格分隔,例如:AllowUsers alice bob@192.168.1.0/24 -
DenyUsers不支持 CIDR 或通配符,只认精确用户名,例如:DenyUsers guest test - 规则优先级是:
DenyUsers>AllowUsers>DenyGroups>AllowGroups。如果一个用户同时出现在DenyUsers和AllowUsers中,他一定被拒绝——哪怕你本意是“白名单为主” - 不要同时启用
AllowUsers和DenyUsers,尤其在生产环境;白名单机制更安全,也更易审计
Match 块必须放在配置文件末尾且用空行分隔
Match 是实现条件化权限控制的唯一原生方式,比如“只允许运维组从内网登录”或“某用户只能 SFTP 不能 shell”,但它对位置和格式极其敏感。
-
Match块必须写在sshd_config文件末尾,所有全局配置之后;否则会被忽略 - 每个
Match段之间必须用空行分隔,否则后续规则不生效 - 常见写法示例:
Match User deploy后接PasswordAuthentication no,表示该用户禁用密码登录;Match Group sftp-only后接ForceCommand internal-sftp实现纯 SFTP 隔离 -
Match不支持正则或模糊匹配,只支持User、Group、Host、Address四种条件,且Address只能用于客户端 IP(不是服务器监听地址)
修改后必须先验证再 reload,别直接 restart
写错一行配置就可能导致 SSH 连接中断,尤其是用 AllowUsers 锁住自己时,没有 console 访问权限就只能重装系统。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 每次改完
sshd_config,先运行sshd -t检查语法是否正确;返回Configuration file /etc/ssh/sshd_config: good才算过关 - 用
systemctl reload sshd替代restart,前者只重载配置、不中断现有连接,适合远程操作 - 永远保留一个本地终端或带串口/IPMI 的备用通道;测试新规则时,新开一个会话验证是否仍能连上,确认无误再关旧会话
- 权限相关配置(如
PubkeyAuthentication yes)依赖用户家目录下~/.ssh/authorized_keys存在且权限为600,目录权限为700,否则密钥认证会静默失败
PAM 的 access.conf 规则比 sshd_config 更灵活但更难调试
当需要“只允许 admin 组从 10.0.0.0/24 登录,其余一律拒绝”这类组合条件时,sshd_config 办不到,必须靠 PAM + /etc/security/access.conf。
- 先确认
/etc/pam.d/sshd中有这行:account required pam_access.so,且位置在pam_unix.so之后 -
/etc/security/access.conf按从上到下顺序匹配,命中即停;典型写法是先放具体允许规则,最后用- : ALL : ALL默认拒绝 - IP 段写法必须是 CIDR 格式,例如
+ : admin : 10.0.0.0/24;不能写10.0.0.*,通配符不被识别 - 调试时可临时加
loglevel=debug到 PAM 行,然后看/var/log/secure里的pam_access日志,否则失败原因完全不可见
真正难的不是写哪条指令,而是搞清“这个限制发生在认证前还是认证后”——AllowUsers 在认证前过滤,PAM access.conf 在认证后、会话建立前拦截,usermod -s /sbin/nologin 则彻底绕过 SSH 流程。选错阶段,权限就形同虚设。

















