直接检查未授权ssh密钥需比对“谁该有”与“谁实际有”,覆盖所有authorized_keys文件(含root及非标路径),提取公钥sha256指纹比对可信清单,并校验属主、权限(应为600/644)、.ssh目录权限(≤755且无组/其他写入)。

直接检查未授权的 SSH 密钥,核心是比对“谁该有密钥”和“谁实际有密钥”。不能只看文件是否存在,而要结合用户身份、密钥来源、权限设置和内容可信度综合判断。
定位所有 authorized_keys 文件
系统中可能有多个用户的密钥文件,需全覆盖扫描:
- 用 find 找出所有非空的 authorized_keys(含 authorized_keys2):
find /home -path '*/.ssh/authorized_keys*' -type f -size +0c 2>/dev/null - 别漏掉 root 和系统账户:
find /root /etc/ssh /var/lib -path '*/.ssh/authorized_keys*' -type f -size +0c 2>/dev/null - 若使用了非标准路径(如通过 AuthorizedKeysCommand 配置),需同步检查 sshd_config 中相关配置项
提取并分析公钥指纹与来源
单看密钥内容无法判断是否授权,需生成指纹并与可信清单比对:
- 对每个 authorized_keys 文件,逐行提取公钥并计算 SHA256 指纹:
ssh-keygen -lf /dev/stdin /dev/null | awk '{print $2}' - 记录每条密钥所属用户、文件路径、添加时间(可用 stat -c '%y %n' $file 查看)
- 重点标记:无对应注释(# 开头说明)、指纹不在运维备案库中、属于已离职/停用账户的密钥
检查密钥文件权限与归属异常
权限宽松或归属错误本身即为风险信号:
- authorized_keys 必须属主可读写,且不能被组或其他人修改:
stat -c '%U:%G %a %n' ~/.ssh/authorized_keys 2>/dev/null —— 正常应为 user:user 600 或 644 - .ssh 目录权限不能大于 755,且不能被组/其他用户写入
- 发现 .ssh 目录属主是 root 但用户是普通账户,或权限为 777,需立即告警
自动化脚本示例(轻量实用版)
以下脚本可保存为 check_unauth_keys.sh,运行后输出可疑条目:
#!/bin/bash
echo "=== SSH未授权密钥检查报告 $(date) ==="
while IFS= read -r file; do
[[ -z "$file" ]] && continue
owner=$(stat -c '%U' "$file" 2>/dev/null)
perm=$(stat -c '%a' "$file" 2>/dev/null)
if [[ "$perm" != "600" && "$perm" != "644" ]]; then
echo "[权限异常] $file (owner:$owner, perm:$perm)"
fi
while IFS= read -r line; do
[[ -z "$line" || "$line" =~ ^[[:space:]]*# ]] && continue
fp=$(ssh-keygen -lf /dev/stdin /dev/null | awk '{print $2}' | tr -d '\n')
[[ -n "$fp" ]] && echo "[密钥指纹] $owner @ $file → $fp"
done /dev/null)
运行前确保系统已安装 openssh-client,脚本不修改任何文件,仅作只读检查。











