权限与密钥认证的关系
OpenSSH 对密钥相关文件的权限要求严格。StrictModes 默认开启时,家目录、.ssh 目录或 authorized_keys 的权限与属主不规范,会直接拒绝密钥认证,现场表现是“密钥没错但登不上”。反方向的危险同样存在:只要目录对同机其它用户可写,低权账号就能往 authorized_keys 里追加自己的公钥,从而以该用户(可能是 root 或运维账号)身份登录。
基本信息
| 适用平台 | Linux(OpenSSH;RHEL/CentOS/Debian/Ubuntu 通用) |
|---|---|
| 推荐权限 | 家目录 700、.ssh 700、authorized_keys 600 |
| 属主要求 | 属主为该用户,属组为其主组 |
| 关键开关 | sshd_config 中 StrictModes yes(默认值) |
| 排障日志 | /var/log/secure(RHEL 系)或 /var/log/auth.log(Debian 系) |
典型使用场景
- 批量修复:一次性把所有家目录与密钥文件权限改为标准值
- 巡检发现:用 find 扫描权限过宽的 .ssh 目录与密钥文件
- 登录排障:密钥登录失败时优先检查权限与严格模式报错
- 权限回收:账号停用或交接时清理 authorized_keys 中的历史公钥
- 安全评估:确认同机低权用户无法篡改他人的密钥配置
批量修复与核查
批量修复与核查
chmod 700 /home/*/.ssh /root/.ssh
chmod 600 /home/*/.ssh/authorized_keys /root/.ssh/authorized_keys
for h in /home/* /root; do [ -d "$h/.ssh" ] && ls -ld "$h/.ssh" "$h/.ssh/authorized_keys" 2>/dev/null; done
# 只列权限过宽的项,便于逐条处置:
find /home /root -maxdepth 3 -name '.ssh' -perm /077 -ls 2>/dev/null
chown -R user:user /home/user/.ssh # 属主与属组一并确认
awk 'NR==1{print $0}' /var/log/secure 2>/dev/null | head -1权限组合读法
| 对象与权限 | 含义 | 风险与表现 |
|---|---|---|
| .ssh 700 | 仅本人可进入 | 标准值,配合 StrictModes 可正常登录 |
| .ssh 755 或 777 | 他人可读或可写 | 可读取私钥内容或注入公钥,高危 |
| authorized_keys 600 | 仅本人可读写 | 标准值 |
| authorized_keys 644 | 他人可读 | 泄露账号可登录的公钥信息 |
| 家目录 700 | 仅本人可进入 | 过宽会连带使整个 .ssh 目录暴露 |
StrictModes yes 时权限不规范会直接拒绝认证:登录失败先看日志里是否出现 bad ownership 或 permissions,比反复重试有效得多。
落地要点
- 修复用 find 批量扫权限过宽项,比人工逐台 ls 更可靠也更快
- 家目录本身也要检查:只改 .ssh 而家目录仍为 777 时防护形同虚设
- 属主属组一起核对,权限对而属主错同样会被严格模式拒绝
- authorized_keys 内容纳入盘点:确认每条公钥都有归属人
- 把权限核查做成定时任务,输出异常清单而不是每天全量人工确认
ACL 也属于权限的一部分:getfacl 抽查一次,避免八进制权限合规但 ACL 额外放开了其他人的访问。