为什么算指纹
authorized_keys 里每一行公钥都能算出指纹:用 ssh-keygen -lf 批量输出指纹与注释,再与团队登记的密钥台账比对,未知条目即为嫌疑对象。
注释只能作线索
公钥行尾的注释可以随意填写,攻击者常写成运维惯用的名字来降低辨识度。最终确认要靠指纹,并向私钥持有方核实,而不是依赖注释文本。
基本信息
| 指纹命令 | ssh-keygen -lf authorized_keys(输出 SHA256 指纹) |
|---|---|
| 注释字段 | 公钥行尾注释,常写机器名或人名 |
| 核对依据 | 与运维密钥台账比对 |
| 批量处理 | 遍历各用户主目录与 /etc/ssh |
| 输出格式 | 逐行编号,便于沟通与登记 |
| 权限要求 | 读取其他用户的密钥文件需 root |
典型使用场景
- 排查攻击者新增的授权公钥
- 清理离职人员遗留的密钥
- 建立密钥台账并与实际比对
- 事件收尾时确认未授权密钥已全部移除
- 对多台主机做统一核查
批量生成指纹清单
批量生成指纹清单
ssh-keygen -lf /root/.ssh/authorized_keys
awk '{print NR": "$1" "$NF}' /root/.ssh/authorized_keys | head -n 30
ssh-keygen -lf /home/deploy/.ssh/authorized_keys 2>/dev/null
find / -name authorized_keys -type f 2>/dev/null | head -n 20 # 全盘盘点
ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub输出逐列读法
| 字段 | 含义 | 正常/异常 |
|---|---|---|
| 密钥长度 | 如 256 位 | 位数过短(如 1024)说明是老密钥 |
| SHA256 指纹 | 密钥唯一标识 | 与台账核对的主要依据 |
| 注释 | 行尾说明 | 仅作线索,可以被伪造 |
| 文件路径 | 该行的来源文件 | 与用户和主机对应,便于定位 |
指纹是核对依据而不是判定本身:还要结合该密钥对应的登录记录,确认是否被实际使用过以及从哪些来源登录。
只算一个文件远远不够:各用户主目录、/etc/ssh 与 root 家目录都要过一遍,攻击者常把公钥放在不显眼的位置。
清理时的处理顺序
- 先记录指纹与原文件内容
- 把原文件备份到证据目录并计算哈希
- 删除未授权条目并通知持有方更换密钥
- 复查登录日志,确认该密钥是否被使用过
密钥核查的扩展面
- 各用户 .ssh 目录下的 authorized_keys 与 config
- 系统级 sshd_config 的 AuthorizedKeysFile 设置
- 跳板机与堡垒机上的密钥托管清单
- CI/CD 与自动化系统中的部署密钥