必须同步设置PasswordAuthentication no,否则攻击者可爆破普通用户密码后sudo提权;PermitRootLogin no仅禁root登录,不关密码认证则普通用户仍可用密码登录。

PermitRootLogin no 为什么必须配 PasswordAuthentication no
只关 PermitRootLogin no 不关 PasswordAuthentication no,等于给攻击者留了条后门:他们可以爆破普通用户密码,再用 sudo 提权。这两个开关是正交的,不是“二选一”。PermitRootLogin 控制 root 能不能登录,PasswordAuthentication 控制密码能不能用——关前者不关后者,普通用户照样能输密码登录。
常见错误包括:
-
PasswordAuthentication行被注释(# PasswordAuthentication yes),实际生效的是默认值yes - 配置文件里存在多行
PasswordAuthentication,系统取第一个未注释的值 - 改完没 reload 或 restart 服务,配置根本没加载
AllowUsers 配置错一个字母就全锁死
AllowUsers 是白名单机制,写错用户名、漏加空格、或用户还没创建,会导致所有 SSH 连接被拒——包括你正在用的那个会话。它比 PermitRootLogin 更早拦截连接请求,连登录提示都不显示。
实操要点:
- 在
/etc/ssh/sshd_config末尾添加一行:AllowUsers admin deploy(空格分隔,不要逗号) - 确保这些用户已存在:
id admin要返回用户信息 - 如果已禁用密码登录,确认每个允许用户的
~/.ssh/authorized_keys存在且权限为600 - 修改后用
sudo systemctl reload sshd(不是 restart),避免当前会话断开
Match 块必须放配置文件末尾且用空行分隔
Match 块用于条件化策略,比如“只让运维组从内网登录”或“SFTP 用户禁止 shell 访问”。但它不按顺序执行,而是按匹配优先级生效,且解析逻辑依赖位置。
典型错误:
-
Match块写在PermitRootLogin等全局配置前面,导致部分规则被忽略 - 块之间没空行,SSH 守护进程把两段当成一个块解析,报错
sshd_config line xxx: Bad Match condition -
ChrootDirectory指定路径的所有者不是root,启动时直接拒绝加载该 Match
示例(限制 sftp-only 组):
Match Group sftp-only
PasswordAuthentication no
ChrootDirectory /sftp/%u
ForceCommand internal-sftp
AllowTcpForwarding noauthorized_keys 权限不对,密钥就失效
SSH 服务对密钥文件权限极其敏感。只要 ~/.ssh 目录权限不是 700,或 authorized_keys 不是 600,就会静默跳过密钥认证,回退到密码(如果启用)或直接拒绝。
注意点:
- 用户主目录(如
/home/deploy)不能有组/其他写权限,否则整个~/.ssh树被忽略 - SELinux 启用时,
~/.ssh下文件上下文必须是ssh_home_t,否则即使权限正确也失败;可用restorecon -R ~/.ssh修复 -
sshd_config中AuthorizedKeysFile默认是.ssh/authorized_keys,别改成相对路径如./.ssh/...或绝对路径没写对
最常被忽略的是:改完权限后忘了重启 sshd,或者用 sudo su - user 切换用户时,当前 shell 的 umask 影响新生成文件的默认权限。


















