news 2026/5/3 13:02:38

运维效率提升:一个脚本批量获取服务器所有SSH主机密钥指纹(支持ed25519, RSA, ECDSA)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
运维效率提升:一个脚本批量获取服务器所有SSH主机密钥指纹(支持ed25519, RSA, ECDSA)

服务器SSH密钥指纹自动化审计实战指南

每次接手新服务器集群时,最头疼的就是要逐台核对SSH指纹。上周我负责迁移200多台服务器,光是核对密钥就花了整整两天。直到我开发了这个自动化脚本,才把时间压缩到10分钟以内。本文将分享如何通过Shell脚本实现SSH密钥指纹的批量获取与审计,覆盖ed25519、RSA、ECDSA等多种算法,并深入解析不同哈希算法的安全选择。

1. SSH密钥指纹的核心价值与审计场景

在分布式系统管理中,SSH密钥指纹相当于服务器的"数字身份证"。当首次连接服务器时,客户端会收到一个指纹提示,要求确认是否与预期指纹匹配。这个机制能有效防止中间人攻击,确保连接的是目标服务器而非恶意主机。

典型应用场景包括:

  • 服务器迁移验证:批量迁移前后需核对指纹一致性
  • 密钥轮换审计:定期更换密钥时的完整性检查
  • 自动化部署集成:CI/CD流程中的安全校验环节
  • 资产盘点:建立服务器密钥指纹数据库

传统手动检查方式存在三大痛点:

  1. 需要逐台登录服务器执行命令
  2. 不同算法(RSA/ECDSA/ed25519)需分别处理
  3. 哈希格式(SHA256/SHA1/MD5)需要人工转换
# 典型手动检查命令示例 ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub ssh-keygen -E sha256 -lf /etc/ssh/ssh_host_rsa_key.pub

2. 全算法兼容的指纹批量采集方案

2.1 基础for循环实现

最简单的批量获取方法是用for循环遍历密钥文件:

for keyfile in /etc/ssh/*.pub; do ssh-keygen -lf "$keyfile" done

这个方案虽然简单,但存在三个明显缺陷:

  1. 无法自定义哈希算法
  2. 输出格式不统一
  3. 缺乏错误处理机制

2.2 增强版采集脚本

改进后的脚本增加了算法选择和格式化输出:

#!/bin/bash # 获取服务器所有SSH密钥指纹(支持多算法) # 用法:./ssh_fingerprint.sh [sha256|sha1|md5] HASH_ALGO=${1:-sha256} # 默认使用SHA256 echo "[SSH密钥指纹审计报告]" echo "主机名: $(hostname)" echo "审计时间: $(date)" echo "使用的哈希算法: $HASH_ALGO" echo "--------------------------------" for keyfile in /etc/ssh/*.pub; do keytype=$(grep -oP 'ssh-\w+' "$keyfile") printf "%-10s: " "${keytype^^}" ssh-keygen -E "$HASH_ALGO" -lf "$keyfile" | awk '{print $2,$4}' done

执行示例:

$ ./ssh_fingerprint.sh sha256 [SSH密钥指纹审计报告] 主机名: web-server-01 审计时间: 2023年8月15日 14:30:22 CST 使用的哈希算法: sha256 -------------------------------- SSH-ED25519: SHA256:jX9b... root@web-server-01 SSH-RSA : SHA256:pY2m... root@web-server-01 SSH-ECDSA : SHA256:wZ5q... root@web-server-01

3. 企业级部署方案

3.1 Ansible集成实现

对于大规模集群,建议使用Ansible进行分布式采集:

# ssh_fingerprint.yml - name: 收集SSH密钥指纹 hosts: all tasks: - name: 获取密钥指纹 shell: | echo "{{ inventory_hostname }}" for key in /etc/ssh/*.pub; do ssh-keygen -E sha256 -lf "$key" done register: ssh_fingerprints - name: 保存结果 local_action: module: copy content: "{{ ssh_fingerprints.stdout }}" dest: "./fingerprints/{{ inventory_hostname }}.txt"

执行命令:

ansible-playbook -i hosts ssh_fingerprint.yml

3.2 输出结果标准化

建议采用JSON格式方便后续处理:

#!/bin/bash # 生成JSON格式的指纹报告 fingerprints=() for keyfile in /etc/ssh/*.pub; do keytype=$(grep -oP 'ssh-\w+' "$keyfile") fingerprint=$(ssh-keygen -E sha256 -lf "$keyfile" | awk '{print $2}') fingerprints+=("{\"type\":\"$keytype\",\"fingerprint\":\"$fingerprint\"}") done echo "{ \"host\":\"$(hostname)\", \"timestamp\":\"$(date -Is)\", \"fingerprints\":[$(IFS=,; echo "${fingerprints[*]}")] }" > ssh_fingerprints.json

输出示例:

{ "host":"db-server-02", "timestamp":"2023-08-15T14:45:33+08:00", "fingerprints":[ {"type":"ssh-ed25519","fingerprint":"SHA256:jX9b..."}, {"type":"ssh-rsa","fingerprint":"SHA256:pY2m..."} ] }

4. 安全实践与算法选择

4.1 哈希算法安全对比

算法输出长度安全性适用场景兼容性
SHA256256位★★★★★安全要求高的生产环境
SHA1160位★★☆☆☆遗留系统(不推荐)
MD5128位★☆☆☆☆测试环境(绝对避免生产)

安全提示:MD5和SHA-1已被证明存在碰撞漏洞,在金融等敏感领域应禁止使用

4.2 密钥类型推荐

  1. ed25519(首选)

    • 密钥长度:256位
    • 优点:性能高,安全性强
    • 生成命令:ssh-keygen -t ed25519
  2. ECDSA(次选)

    • 推荐曲线:nistp384
    • 生成命令:ssh-keygen -t ecdsa -b 384
  3. RSA(兼容方案)

    • 最小长度:3072位
    • 生成命令:ssh-keygen -t rsa -b 4096

5. 异常处理与日志审计

完善的脚本应该包含错误处理和日志记录:

#!/bin/bash LOG_FILE="/var/log/ssh_audit.log" log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE" } check_key() { local keyfile=$1 if [ ! -f "$keyfile" ]; then log "错误:密钥文件 $keyfile 不存在" return 1 fi # 验证密钥格式 if ! ssh-keygen -l -f "$keyfile" &>/dev/null; then log "警告:$keyfile 不是有效的SSH公钥" return 2 fi return 0 } main() { for keyfile in /etc/ssh/*.pub; do if check_key "$keyfile"; then fingerprint=$(ssh-keygen -E sha256 -lf "$keyfile" 2>&1) log "成功获取指纹:$keyfile - $fingerprint" echo "$fingerprint" fi done } main "$@"

典型日志输出:

[2023-08-15 15:00:01] 成功获取指纹:/etc/ssh/ssh_host_ed25519_key.pub - 256 SHA256:jX9b... root@web-server-01 (ED25519) [2023-08-15 15:00:01] 警告:/etc/ssh/ssh_host_dsa_key.pub 不是有效的SSH公钥

6. 可视化报告生成

对于运维团队,可生成HTML格式的审计报告:

#!/bin/bash # 生成HTML报告 cat <<EOF > report.html <!DOCTYPE html> <html> <head> <title>SSH密钥审计报告 - $(date)</title> <style> table { border-collapse: collapse; width: 100%; } th, td { border: 1px solid #ddd; padding: 8px; text-align: left; } tr:nth-child(even) { background-color: #f2f2f2; } </style> </head> <body> <h1>SSH密钥指纹审计报告</h1> <p>生成时间: $(date)</p> <table> <tr><th>主机名</th><th>密钥类型</th><th>指纹(SHA256)</th></tr> EOF for keyfile in /etc/ssh/*.pub; do keytype=$(grep -oP 'ssh-\w+' "$keyfile") fingerprint=$(ssh-keygen -E sha256 -lf "$keyfile" | awk '{print $2}') echo "<tr><td>$(hostname)</td><td>$keytype</td><td>$fingerprint</td></tr>" >> report.html done cat <<EOF >> report.html </table> </body> </html> EOF

这个脚本会生成包含所有密钥指纹的表格,支持用浏览器直接查看和搜索。实际项目中,我通常会配合CSS框架美化输出,并添加排序和过滤功能。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/3 13:02:37

微博图片爬虫:3步实现高效批量下载的终极指南

微博图片爬虫&#xff1a;3步实现高效批量下载的终极指南 【免费下载链接】weibo-image-spider 微博图片爬虫&#xff0c;极速下载、高清原图、多种命令、简单实用。 项目地址: https://gitcode.com/gh_mirrors/we/weibo-image-spider 还在为手动保存微博图片而烦恼吗&a…

作者头像 李华
网站建设 2026/5/3 13:00:24

别再用Ctrl+U扒样式了!给wangEditor5渲染的HTML内容自动注入CSS的3种方法

告别手动复制&#xff1a;wangEditor5内容自动化样式注入的工程实践 每次从网页源代码里手动扒样式&#xff0c;就像用勺子挖隧道——理论上可行&#xff0c;但效率低得让人抓狂。对于使用wangEditor5的开发者来说&#xff0c;存储的HTML内容在前端展示时丢失样式是个老问题。本…

作者头像 李华
网站建设 2026/5/3 12:54:17

Go2rtc终极指南:彻底解决GoPro相机睡眠断流问题

Go2rtc终极指南&#xff1a;彻底解决GoPro相机睡眠断流问题 【免费下载链接】go2rtc Ultimate camera streaming application 项目地址: https://gitcode.com/GitHub_Trending/go/go2rtc Go2rtc是一款强大的跨平台摄像头流媒体应用&#xff0c;支持RTSP、WebRTC、HomeKi…

作者头像 李华
网站建设 2026/5/3 12:54:17

终极Windows风扇控制指南:5分钟让FanControl成为你的PC散热管家

终极Windows风扇控制指南&#xff1a;5分钟让FanControl成为你的PC散热管家 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Tr…

作者头像 李华