如何为手动触发的GitHub Actions工作流添加密码保护并隐藏明文
为GitHub Actions生产流水线添加密码保护的问题解决
问题描述
我们小型组织使用免费版GitHub,无法使用内置的审批功能,于是自行编写了一段验证密码的GitHub Actions代码来保护生产部署流水线。代码功能正常,但输入的密码会以明文形式出现在日志中,尝试过::mask-output::、设置环境变量等方法都没解决问题。原代码如下:
jobs: verify-password: runs-on: ubuntu-latest steps: - name: Verify password run: | set -e echo "Verifying password..." INPUT_PASSWORD_HASH=$(echo -n "${{ github.event.inputs.password }}" | sha256sum | awk '{print $1}') if [[ "$INPUT_PASSWORD_HASH" == "[REDACTED]" ]]; then echo "Password verification successful." else echo "Password verification failed." exit 1 fi
一、修复当前代码的日志泄露问题
问题根源在于直接在run命令中引用${{ github.event.inputs.password }},GitHub会将变量展开后明文记录在日志里。可以通过以下方式解决:
1. 使用环境变量+add-mask屏蔽密码
将输入密码存入环境变量,并用GitHub的::add-mask::命令标记该变量,让GitHub自动屏蔽所有出现该值的输出:
jobs: verify-password: runs-on: ubuntu-latest steps: - name: Verify password env: USER_PASSWORD: ${{ github.event.inputs.password }} VALID_PASSWORD_HASH: ${{ secrets.VALID_PASSWORD_HASH }} # 把正确的哈希值存在GitHub Secrets中 run: | set -e # 标记密码为需要屏蔽的内容 echo "::add-mask::$USER_PASSWORD" echo "Verifying password..." # 使用环境变量计算哈希,避免明文暴露 INPUT_PASSWORD_HASH=$(echo -n "$USER_PASSWORD" | sha256sum | awk '{print $1}') if [[ "$INPUT_PASSWORD_HASH" == "$VALID_PASSWORD_HASH" ]]; then echo "Password verification successful." else echo "Password verification failed." exit 1 fi
2. 额外优化:避免硬编码哈希值
把正确的密码哈希值存入GitHub Secrets(比如命名为VALID_PASSWORD_HASH),不要直接写在代码里,进一步提升安全性。
二、替代实现方式
如果不想用密码哈希验证,还有更简单安全的方案:
1. 直接验证密钥(无需哈希)
将部署密钥存入GitHub Secrets,直接比较输入值和Secrets中的值,同时屏蔽输入值:
jobs: verify-deploy-key: runs-on: ubuntu-latest steps: - name: Verify deployment key env: INPUT_KEY: ${{ github.event.inputs.deploy_key }} VALID_KEY: ${{ secrets.DEPLOY_ACCESS_KEY }} run: | set -e echo "::add-mask::$INPUT_KEY" echo "Verifying deployment key..." if [[ "$INPUT_KEY" == "$VALID_KEY" ]]; then echo "Access verified successfully." else echo "Access verification failed." exit 1 fi
2. 使用PAT验证(更安全)
让用户提供具有部署权限的GitHub Personal Access Token(PAT),通过GitHub API验证令牌的有效性和权限,比密码更安全:
jobs: verify-pat: runs-on: ubuntu-latest steps: - name: Verify PAT permissions env: USER_PAT: ${{ github.event.inputs.pat }} run: | set -e echo "::add-mask::$USER_PAT" echo "Verifying PAT..." # 调用GitHub API验证令牌 RESPONSE=$(curl -s -H "Authorization: token $USER_PAT" https://api.github.com/user) if echo "$RESPONSE" | grep -q "login"; then echo "PAT verification successful." else echo "PAT verification failed." exit 1 fi
内容的提问来源于stack exchange,提问作者Captain Condor
相关产品推荐
相关产品推荐

