You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不传递敏感值的情况下用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访问

  • 操作步骤:
    1. 创建IAM角色并附加到EC2实例,给角色添加访问目标Secrets Manager密钥的权限策略,示例:
      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": "secretsmanager:GetSecretValue",
                  "Resource": "arn:aws:secretsmanager:区域:账号ID:secret:github-runner-pat-xxxxxx"
              }
          ]
      }
      
    2. 将GitHub PAT以安全字符串形式存入Secrets Manager,命名为github-runner-pat。
    3. 修改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
      
  • 核心优势:PAT不会明文出现在user-data中,仅授权的EC2实例可访问,Secrets Manager还支持自动轮换PAT,进一步降低泄露风险。

2. 使用GitHub App替代PAT

  • 原理:GitHub App可生成短期、权限更精细的令牌,相比长期有效的PAT风险更低。
  • 操作步骤:
    1. 在GitHub创建GitHub App,授予其管理自托管Runner的权限(仓库/组织级)。
    2. 下载App私钥,存入AWS Secrets Manager(通过IAM角色授权EC2访问)。
    3. 在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类似:
    1. 创建安全字符串类型参数,存储GitHub PAT。
    2. 给EC2实例的IAM角色添加访问该参数的权限。
    3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 22:05:23