Sensitive Data#

让你在 CI Job 中运行的程序能访问一些敏感数据, 例如登录密钥, 数据库密码等是非常常见的需求. GitHub Action 中对敏感信息的管理的核心是 secrets Context. 你可以在网站里定义 secrets, 然后用 Context 将这些 secrets 传递给 environment variable 所使用. 详情请参考 Security Guide

这里要注意的一点是, 凡是被定义为 secrets 的值, 一旦在 log 中出现这些值, GitHub Action 会自动将其 mask 掉. 非常人性化.

但是这里也会有个小坑, 例如你把你的内部系统的网址设为了敏感信息, 如果你在 log 中打印了你的网址信息, 希望开发者能点击跳转, 这时 GitHub Action 就会将其 mask 掉. 但这是开发者自己的错, 既然将这个值视为 secret, 你就不应该将他打印出来.

这里还有小技巧. 如果有的 secret 是你用户 ID, 电话号码, SSN 之类的信息, 但你确实有将其打印出来进行辨别的需求, 这时你可以将其设为 Secret, 但是在打印的时候只打印前三位或后四位.

Sample Workflow Definition#

 1# ------------------------------------------------------------------------------
 2# Demonstrate how to use sensitive data in GitHub Actions
 3#
 4# Reference:
 5#
 6# - Security hardening for GitHub Actions: https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions
 7# ------------------------------------------------------------------------------
 8name: 01_08_sensitive_data
 9
10on:
11  workflow_dispatch:
12
13jobs:
14  build:
15    runs-on: ubuntu-latest
16    steps:
17      - name: build
18        run: |
19          echo masked secret:
20          echo "${{ secrets.DUMMY_SSN }}"
21          echo first four digits:
22          echo "${{ secrets.DUMMY_SSN }}" | awk '{print substr($0,0,4)}'

Sample Workflow Run#

masked secret:
***
first four digits:
1234