如何仅允许GitHub Secrets在main分支生效?
GitHub Actions Secrets 安全问题解答
能否通过拉取请求修改工作流窃取Secrets?
分两种场景:
- 仓库内部成员提交的PR(非fork来源):默认情况下,这类PR触发的工作流可直接访问仓库Secrets。如果有人恶意修改工作流文件,添加将Secrets发送到外部服务器、写入可下载文件等操作,就能窃取敏感信息。
- 外部用户从fork仓库提交的PR:GitHub默认限制这类工作流访问仓库Secrets,攻击者无法直接通过这种方式获取。但如果在仓库设置中开启了「允许来自fork的工作流访问仓库Secrets」,则会直接暴露风险。
能否限制Secrets仅在main分支生效?
可以,有两种可靠实现方式:
1. 在工作流中添加分支条件判断
直接在需要调用Secrets的job或step里添加分支校验,仅允许main分支执行相关操作。示例:
jobs: maven-deploy: runs-on: ubuntu-latest # 仅当触发分支为main时执行此job if: github.ref == 'refs/heads/main' steps: - uses: actions/checkout@v4 - name: Set up JDK uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' - name: Deploy to Maven Repository run: mvn deploy -Dmaven.deploy.username=${{ secrets.MAVEN_USER }} -Dmaven.deploy.password=${{ secrets.MAVEN_PWD }}
2. 使用GitHub Environments配置分支限制
创建仅允许main分支访问的环境,将Secrets存储在环境中而非仓库全局Secrets:
- 进入仓库「Settings」→「Environments」,新建环境(比如命名为
prod-deploy) - 在环境设置中,开启「Deployment branches」,选择「Only specified branches」并添加
main - 将Maven的用户名和密码存储为该环境的Secrets
- 在工作流中指定使用该环境,只有部署到这个环境时才能访问对应Secrets,示例:
jobs: maven-deploy: runs-on: ubuntu-latest environment: prod-deploy # 指定使用的环境 steps: # ... 其他前置步骤 - name: Deploy to Maven Repository run: mvn deploy -Dmaven.deploy.username=${{ secrets.MAVEN_USER }} -Dmaven.deploy.password=${{ secrets.MAVEN_PWD }}
关于Secrets的其他泄露风险
除了日志泄露,攻击者还可通过以下方式窃取Secrets:
- 修改工作流,添加将Secrets通过HTTP请求发送到外部服务器的代码
- 将Secrets写入文件后,上传到第三方存储服务
- 利用工作流的提交权限,将Secrets写入仓库文件并推送
内容的提问来源于stack exchange,提问作者JDChris100
相关产品推荐
相关产品推荐

