如何在不传递敏感值的情况下用user-data注册GitHub Actions自托管Runner?
问题描述
我通过user-data执行以下命令,将EC2实例注册为GitHub Actions自托管Runner:
su - ubuntu -c './config.sh --unattended --url '${github_repo_url}' \ --pat '${github_pat}' --name '${name}' --labels '${labels}' --replace'
使用GitHub个人访问令牌(PAT)是为了避免每次注册都要手动去GitHub UI申请注册令牌,但问题是EC2实例就绪后,user-data会被公开可见,存在PAT泄露风险。另外我了解到EC2不支持基于资源的政策来限制仅特定成员访问,想知道更安全的解决方案。
可行解决方案
1. 用AWS Secrets Manager存储PAT,通过IAM角色授权EC2访问
- 操作步骤:
- 创建IAM角色并附加到EC2实例,给角色添加访问目标Secrets Manager密钥的权限策略,示例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "secretsmanager:GetSecretValue", "Resource": "arn:aws:secretsmanager:区域:账号ID:secret:github-runner-pat-xxxxxx" } ] } - 将GitHub PAT以安全字符串形式存入Secrets Manager,命名为
github-runner-pat。 - 修改user-data脚本,先拉取PAT再执行注册:
#!/bin/bash # 从Secrets Manager获取PAT GITHUB_PAT=$(aws secretsmanager get-secret-value --secret-id github-runner-pat --query SecretString --output text) # 注册自托管Runner su - ubuntu -c "./config.sh --unattended --url ${github_repo_url} --pat ${GITHUB_PAT} --name ${name} --labels ${labels} --replace" # 清理临时变量 unset GITHUB_PAT
- 创建IAM角色并附加到EC2实例,给角色添加访问目标Secrets Manager密钥的权限策略,示例:
- 核心优势:PAT不会明文出现在user-data中,仅授权的EC2实例可访问,Secrets Manager还支持自动轮换PAT,进一步降低泄露风险。
2. 使用GitHub App替代PAT
- 原理:GitHub App可生成短期、权限更精细的令牌,相比长期有效的PAT风险更低。
- 操作步骤:
- 在GitHub创建GitHub App,授予其管理自托管Runner的权限(仓库/组织级)。
- 下载App私钥,存入AWS Secrets Manager(通过IAM角色授权EC2访问)。
- 在user-data脚本中用私钥生成短期注册令牌,示例:
#!/bin/bash # 从Secrets Manager获取GitHub App私钥 APP_PRIVATE_KEY=$(aws secretsmanager get-secret-value --secret-id github-app-private-key --query SecretString --output text) # 生成JWT令牌(需提前安装jq和openssl) JWT=$(echo -n '{"iat":'$(date +%s)',"exp":'$(($(date +%s)+600))',"iss":你的APP_ID}' | openssl dgst -sha256 -sign <(echo "$APP_PRIVATE_KEY") | base64 | tr -d '\n') # 获取安装访问令牌 INSTALL_TOKEN=$(curl -s -X POST -H "Authorization: Bearer $JWT" -H "Accept: application/vnd.github.v3+json" https://api.github.com/app/installations/你的INSTALL_ID/access_tokens | jq -r '.token') # 生成Runner注册令牌 REG_TOKEN=$(curl -s -X POST -H "Authorization: token $INSTALL_TOKEN" -H "Accept: application/vnd.github.v3+json" https://api.github.com/repos/仓库所有者/仓库名/actions/runners/registration-token | jq -r '.token') # 注册Runner su - ubuntu -c "./config.sh --unattended --url ${github_repo_url} --pat ${REG_TOKEN} --name ${name} --labels ${labels} --replace" # 清理临时变量 unset APP_PRIVATE_KEY JWT INSTALL_TOKEN REG_TOKEN
- 核心优势:注册令牌默认1小时有效期,即便泄露也不会造成长期风险,且GitHub App可实现精准权限控制,避免过度授权。
3. 使用AWS Systems Manager Parameter Store(安全字符串类型)
- 操作逻辑与Secrets Manager类似:
- 创建安全字符串类型参数,存储GitHub PAT。
- 给EC2实例的IAM角色添加访问该参数的权限。
- user-data中通过命令拉取PAT:
#!/bin/bash GITHUB_PAT=$(aws ssm get-parameter --name "/github/runner/pat" --with-decryption --query Parameter.Value --output text) su - ubuntu -c "./config.sh --unattended --url ${github_repo_url} --pat ${GITHUB_PAT} --name ${name} --labels ${labels} --replace" unset GITHUB_PAT
- 核心优势:相比Secrets Manager成本更低,适合不需要自动轮换等高级功能的场景。
内容的提问来源于stack exchange,提问作者pkaramol
相关产品推荐
相关产品推荐

