GitHub Actions SSH 部署密钥

一次 GitHub Actions SSH 部署密钥"失踪"后的完整排查与重建记录(AWS EC2 实战)

记录一次真实的 GitHub Actions 部署排查过程,

重点解决:

  • SSH Key 找不到
  • 是否会影响已有 Action
  • AWS EC2 root / ec2-user 登录限制
  • 安全、可控地重建部署密钥

一、问题背景

之前项目已经通过 GitHub Actions → SSH → 服务器 实现过自动部署,但隔了一段时间后:

  • Action YAML 还在
  • Secrets 名字记得
  • SSH Key 不知道放哪了
  • 本地 ~/.ssh 目录下也找不到私钥

核心疑问:

如果重新生成 SSH Key,会不会影响服务器上已有的 GitHub Actions?


二、第一步:确认私钥是否还存在

1️⃣ 查看本地 SSH 目录

bash 复制代码
ls ~/.ssh

结果只有:

text 复制代码
authorized_keys
known_hosts

结论:

  • ❌ 本地已无任何 SSH 私钥
  • ❌ GitHub Secrets 中的私钥无法导出
  • 👉 旧 key 实际上已经无法恢复

三、关键结论:不要"找旧 key",直接新增一把

SSH 的核心机制是:

服务器通过 authorized_keys 维护一个 key 列表(白名单)
每一行 key 彼此独立,互不影响

只要做到:

  • 追加 key
  • 不删除旧 key

👉 不会影响任何已有 Action 或人工登录


四、安全重建 SSH Key(推荐做法)

1️⃣ 在本地生成新的 SSH Key(Windows 示例)

bash 复制代码
ssh-keygen -t ed25519 -C "github-action-new"

指定保存路径和文件名,例如:

text 复制代码
D:\github-action-key\id_ed25519

生成结果:

text 复制代码
id_ed25519      # 私钥(给 GitHub)
id_ed25519.pub  # 公钥(给服务器)

⚠️ 不要设置 passphrase(GitHub Actions 无法交互输入)


五、服务器端关键细节(AWS EC2 坑点)

1️⃣ AWS EC2 默认禁止 root 直登

在 EC2 上查看 rootauthorized_keys,会看到类似内容:

text 复制代码
command="Please login as ec2-user rather than root" ssh-rsa AAAA...

含义:

  • 即使 key 正确
  • 只要用 root 登录
  • 会被强制踢下线

👉 正确用户应为:ec2-user


六、最容易犯的错误(也是本次问题根因)

❌ 把 key 加到了 root,却用 ec2-user 登录

SSH 的规则是:

登录用户 使用的 authorized_keys
root /root/.ssh/authorized_keys
ec2-user /home/ec2-user/.ssh/authorized_keys

👉 用户不一致,100% 登录失败


七、正确做法:给 ec2-user 添加公钥

1️⃣ 切换到 ec2-user 的 SSH 目录

bash 复制代码
mkdir -p /home/ec2-user/.ssh

2️⃣ 追加公钥(不要删除原内容)

bash 复制代码
vi /home/ec2-user/.ssh/authorized_keys

追加一行(示例):

text 复制代码
ssh-ed25519 AAAA... github-action-new

3️⃣ 修正权限(非常重要)

bash 复制代码
chown -R ec2-user:ec2-user /home/ec2-user/.ssh
chmod 700 /home/ec2-user/.ssh
chmod 600 /home/ec2-user/.ssh/authorized_keys

八、本地验证(最重要的一步)

在本地执行:

bash 复制代码
ssh -i D:\github-action-key\id_ed25519 ec2-user@服务器IP

如果能直接登录:

text 复制代码
[ec2-user@ip-xxx ~]$

👉 说明:

  • key 生效
  • 用户正确
  • GitHub Actions 一定能连

九、GitHub Actions Secrets 配置规范

在仓库中配置:

复制代码
Settings → Secrets and variables → Actions
Secret 名称 内容
SERVER_HOST 服务器 IP / 域名
SERVER_USER ec2-user
SERVER_SSH_KEY 私钥全文

十、Action 示例(SSH 连通性测试版)

yaml 复制代码
- name: SSH Test
  uses: appleboy/ssh-action@v1.0.3
  with:
    host: ${{ secrets.SERVER_HOST }}
    username: ${{ secrets.SERVER_USER }}
    key: ${{ secrets.SERVER_SSH_KEY }}
    script: |
      echo "SSH connected"
      hostname

建议:

  • 先用 echo / hostname
  • 确认没问题再跑部署脚本

十一、最佳实践总结(强烈推荐)

✅ 1. 每个用途一把 key

text 复制代码
github-action-prod
github-action-test
manual-login

✅ 2. 不复用、不覆盖旧 key

  • 新增
  • 验证
  • 稳定后再清理

✅ 3. 永远先本地 ssh 成功,再跑 Action


十二、最终结论

  • SSH Key 丢失 ≠ 项目废了
  • 追加 key 是最安全、最低风险的恢复方式
  • AWS EC2 必须使用 ec2-user
  • 用户和 authorized_keys 不一致,是最隐蔽、也最致命的坑
相关推荐
louqle2 小时前
docker基本知识及常用命令汇总
运维·docker·容器
学烹饪的小胡桃2 小时前
【运维学习】实时性能监控工具 WGCLOUD v3.6.2 更新介绍
linux·运维·服务器·学习·工单系统
ys~~3 小时前
git学习
git·vscode·python·深度学习·学习·nlp·github
叫致寒吧3 小时前
Docker
运维·docker·容器
白露与泡影3 小时前
使用systemd,把服务装进 Linux 心脏里~
linux·运维·python
l1t4 小时前
用docker安装oracle 19c
运维·数据库·docker·oracle·容器
k***92165 小时前
【Linux】进程概念(五):详解环境变量的本质
linux·运维·服务器
专业开发者5 小时前
艾通科技(ITON Technology)借助蓝牙 ® 网状网络,构建适用于自动化控制应用的大规模设备网络
运维·物联网·自动化
KakiNakajima5 小时前
CentOS 7 x86系统安装EMQX 【kaki备忘录】
linux·运维·centos