在云上做自动化运维时,针对AWS环境的跳板机做公钥的批量分发与版本控制是常见需求。最好(最安全)的方案通常是结合AWS SSM与集中密钥库;最佳(综合性能与易用)方案是通过跳板机结合Git仓库与自动化脚本;最便宜的方案则是利用现有跳板机用简单的Bash脚本同步公钥并用Git做轻量版本管理。
传统逐台手动拷贝公钥不仅耗时,还难以审计与回滚。把公钥纳入版本控制,并通过自动化在跳板机或SSM上批量分发,可以做到权限审计、快速回滚、上线流水线对接,从而提升运维效率与安全性。
AWS SSM(Session Manager / Run Command)允许无SSH端口管理实例,是从安全角度的“最好”选择;但如果已有跳板机且需要集中访问控制与审计,结合跳板机做中继更灵活且成本低。综合考虑:生产环境推荐SSM+密钥库,成本敏感环境可选跳板机+Bash/Git方案。
典型流程:1)把公钥集中存入Git仓库并做版本控制;2)在跳板机或CI中拉取指定版本;3)合并/去重后写入目标主机的~/.ssh/authorized_keys;4)记录变更并可回滚。关键组件:Git仓库、跳板机(或SSM)、分发脚本、审计日志。
下面示例为一个简化脚本:从私有Git仓库拉取公钥文件并通过ssh分发到多台主机(注意需先配置跳板机免密码或代理)。
# 拉取 keys 仓库并分发
GIT_REPO="git@github.com:org/ssh-keys.git"
TMP="/tmp/ssh-keys-$$"
TARGETS=("10.0.1.10" "10.0.1.11")
git clone $GIT_REPO $TMP
cat $TMP/*.pub | sort -u > $TMP/all_keys
for h in "${TARGETS[@]}"; do
scp $TMP/all_keys jumpuser@jump.example:/tmp/all_keys
ssh -A jumpuser@jump.example "ssh $h 'mkdir -p ~/.ssh && cat /tmp/all_keys >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys'"
done
rm -rf $TMP
将每个用户的公钥作为独立文件(如 user1.pub)提交到Git仓库,提交信息记录变更理由。需要回滚时,通过git checkout或tag恢复某个版本并重新触发分发流程。可以在仓库中使用CI(如GitHub Actions)做自动触发。
把仓库加密(例如使用sops或git-crypt)以保护密钥素材,记录每次分发的Run ID或CI构建号到审计日志,并在跳板机或SSM中做会话记录。禁止在脚本中保存私钥,分发过程仅处理公钥。
若使用SSM Run Command,可避免跳板机开SSH端口。示例:在CI中使用aws cli run-command调用,将公钥直接追加到目标实例authorized_keys。

# SSM 分发示例
aws ssm send-command --document-name "AWS-RunShellScript" \
--instance-ids "i-0123456789abcdef0" \
--parameters commands="echo 'ssh-rsa AAAA... user' >> /home/ec2-user/.ssh/authorized_keys"
注意权限与并发:authorized_keys文件可能并发写入导致冲突,应先写入临时文件再原子替换;对多区域多账户场景建议用集中CI触发并对每次分发做签名。切勿在公有仓库暴露敏感用户信息。
综上,若以安全优先:推荐使用AWS SSM结合受控密钥库;以成本与兼容优先:可用跳板机+Git+Bash脚本快速实现公钥批量分发与版本控制。无论选择哪种方案,都应做到审计、加密与可回滚。