加密机密

加密密码可让您将敏感信息存储在您的组织、仓库或者仓库环境 中。

GitHub Actions 可用于 GitHub Free、GitHub Pro、组织的 GitHub Free、GitHub Team、GitHub Enterprise Cloud 和 GitHub AE。 GitHub Actions 不适用于使用旧版按仓库计划的帐户所拥有的私有仓库。 更多信息请参阅“GitHub 的产品”。

关于加密密码

机密是您在组织、仓库或者仓库环境 中创建的加密环境变量。 您创建的机密可用于 GitHub Actions 工作流程。 在机密到达 GitHub 之前,GitHub 使用 libsodium 密封盒对机密加密,并且在您于工作流程中使用它们之前一直保持加密状态。

对于存储在组织级别的密码,可以使用访问策略来控制哪些仓库可以使用组织密码。 组织级密码允许在多个仓库之间共享密码,从而减少创建重复密码的需要。 在一个位置更新组织密码还可确保更改在使用该密码的所有仓库工作流程中生效。

对于存储在环境级别的机密,您可以启用所需的审查者来控制对机密的访问。 在必要的审查者授予批准之前,工作流程作业无法访问环境机密。

命名您的密码

The following rules apply to secret names:

  • Secret names can only contain alphanumeric characters ([a-z], [A-Z], [0-9]) or underscores (_). Spaces are not allowed.

  • Secret names must not start with the GITHUB_ prefix.

  • Secret names must not start with a number.

  • Secret names are not case-sensitive.

  • Secret names must be unique at the level they are created at.. 例如,在环境级别创建的机密必须在环境中具有唯一的名称,在仓库级别创建的机密必须在该仓库中具有唯一的名称,而在组织级别创建的机密必须在该级别具有独特的名称。

    If a secret with the same name exists at multiple levels, the secret at the lower level takes precedence. For example, if an organization-level secret has the same name as a repository-level secret, then the repository-level secret takes precedence. Similarly, if an organization, repository, and environment all have a secret with the same name, the environment-level secret takes precedence.

为帮助确保 GitHub 在日志中编写密码,请勿将结构化数据用作密码的值。 例如,避免创建包含 JSON 或编码 Git blob 的密码。

访问您的密码

为使密码用于操作,必须将密码设置为工作流程文件中的输入或环境变量。 查看操作的自述文件以了解操作预期的输入和环境变量。 更多信息请参阅“GitHub Actions 的工作流程语法”。

如果您拥有编辑文件的权限,便可在工作流程文件中使用和读取加密密码。 更多信息请参阅“GitHub 上的访问权限”。

警告:GitHub 自动将密码编写到日志,但您应避免有意将密码打印到日志。

当工作流程运行排队时读取组织和仓库机密,在引用环境的作业开始时读取环境机密。

您还可以使用 REST API 管理密码。 更多信息请参阅“密码”。

限制凭据权限

生成凭据时,建议尽可能授予最低的权限。 例如,不使用个人凭据,而使用部署密钥或服务帐户。 请考虑授予只读权限(如果这是所需的全部权限)并尽可能限制访问。 生成个人访问令牌 (PAT) 时,选择所需的最小范围。

为仓库创建加密密码

要为用户帐户仓库创建密码,您必须是仓库所有者。 要为组织仓库创建密码,您必须具有管理员访问权限。

  1. 在 GitHub 上,导航到仓库的主页面。
  2. 在仓库名称下,单击 Settings(设置)仓库设置按钮
  3. 在左侧边栏中,单击 Secrets(密码)
  4. 单击 New repository secret(新仓库机密)
  5. Name(名称)输入框中键入密码的名称。
  6. 输入密码的值。
  7. 单击 Add secret(添加密码)

如果您的仓库 拥有环境机密或 可以访问父组织中的机密,则这些机密也会列入本页。

注意:具有协作员权限的用户可以使用 REST API 来管理仓库的机密。 更多信息请参阅“GitHub Actions 密码 API”。

为环境创建加密密码

要为用户帐户仓库中的环境创建密码,您必须是仓库所有者。 要为组织仓库中的环境创建密码,您必须具有管理员访问权限。

  1. 在 GitHub 上,导航到仓库的主页面。
  2. 在仓库名称下,单击 Settings(设置)仓库设置按钮
  3. 在左侧边栏中,单击 Environments(环境)
  4. 单击要向其添加机密的环境。
  5. Environment secrets(环境机密)下,单击 Add secret(添加机密)
  6. Name(名称)输入框中键入密码的名称。
  7. 输入密码的值。
  8. 单击 Add secret(添加密码)

为组织创建加密密码

在组织中创建密码时,可以使用策略来限制可以访问该密码的仓库。 例如,您可以将访问权限授予所有仓库,也可以限制仅私有仓库或指定的仓库列表拥有访问权限。

要在组织级别创建密码,必须具有管理员访问权限。

  1. 在 GitHub 上,导航到组织的主页面。
  2. 在组织名称下,单击 Settings(设置)组织设置按钮
  3. 在左侧边栏中,单击 Secrets(密码)
  4. 单击 New organization secret(新组织机密)
  5. Name(名称)输入框中键入密码的名称。
  6. 输入密码的 Value(值)
  7. Repository access(仓库访问权限)下拉列表,选择访问策略。
  8. 单击 Add secret(添加密码)

审查对组织级别密码的访问权限

您可以检查哪些访问策略正被应用于组织中的密码。

  1. 在 GitHub 上,导航到组织的主页面。
  2. 在组织名称下,单击 Settings(设置)组织设置按钮
  3. 在左侧边栏中,单击 Secrets(密码)
  4. 密码列表包括任何已配置的权限和策略。 例如: 密码列表
  5. 有关已为每个密码配置的权限的更多信息,请单击 Update(更新)

在工作流程中使用加密密码

注:除了 GITHUB_TOKEN 以外,从复刻的仓库触发工作流程时密码不会传递给运行程序。

要提供以密码作为输入或环境变量的操作,可以使用 secrets 上下文访问您在仓库中创建的密码。 更多信息请参阅“GitHub Actions 的上下文和表达式语法”和“GitHub Actions 的工作流程语法”。

steps:
  - name: Hello world action
    with: # Set the secret as an input
      super_secret: ${{ secrets.SuperSecret }}
    env: # Or as an environment variable
      super_secret: ${{ secrets.SuperSecret }}

尽可能避免使用命令行在进程之间传递密码。 命令行进程可能对其他用户可见(使用 ps 命令)或通过安全审计事件获取。 为帮助保护密码,请考虑使用环境变量 STDIN 或目标进程支持的其他机制。

如果必须在命令行中传递密码,则将它们包含在适当的引用规则中。 密码通常包含可能意外影响 shell 的特殊字符。 要转义这些特殊字符,请引用环境变量。 例如:

使用 Bash 的示例

steps:
  - shell: bash
    env:
      SUPER_SECRET: ${{ secrets.SuperSecret }}
    run: |
      example-command "$SUPER_SECRET"

使用 PowerShell 的示例

steps:
  - shell: pwsh
    env:
      SUPER_SECRET: ${{ secrets.SuperSecret }}
    run: |
      example-command "$env:SUPER_SECRET"

使用 Cmd.exe 的示例

steps:
  - shell: cmd
    env:
      SUPER_SECRET: ${{ secrets.SuperSecret }}
    run: |
      example-command "%SUPER_SECRET%"

密码的限制

最多可以每个组织存储 1,000 条机密,每个仓库存储 100 条机密,每个环境存储 100 条机密。 一个工作流程最多可以使用 100 条组织机密和 100 条仓库机密。 此外,引用环境的作业最多可以使用 100 条环境机密。

密码大小限于 64 KB。 要使用大于 64 KB 的密码,可以将加密的密码存储在仓库中,并将解密短语在 GitHub 上存储为密码。 例如,在将文件检入您在 GitHub 上的仓库之前,可以使用 gpg 在本地对您的凭据加密。 更多信息请参阅“gpg manpage”。

警告:请注意,您的密码在操作运行时不会印出。 使用此解决方法时,GitHub 不会编写日志中印出的密码。

  1. 从终端运行以下命令,以使用 gpg 和 AES256 密码算法对 my_secret.json 文件加密。

    $ gpg --symmetric --cipher-algo AES256 my_secret.json
  2. 将会提示您输入密码短语。 请记住该密码短语,因为需要在使用该密码短语作为值的 GitHub 上创建新密码。

  3. 创建包含密码短语的新密码。 例如,使用名称 LARGE_SECRET_PASSPHRASE 创建新密码,并将密码的值设为上一步所选的密码短语。

  4. 将加密的文件复制到仓库并提交。 在本例中,加密的文件是 my_secret.json.gpg

  5. 创建 shell 脚本对密码解密。 将此文件另存为 decrypt_secret.sh

    #!/bin/sh
    
    # Decrypt the file
    mkdir $HOME/secrets
    # --batch to prevent interactive command
    # --yes to assume "yes" for questions
    gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" \
    --output $HOME/secrets/my_secret.json my_secret.json.gpg
  6. 确保 shell 脚本在检入仓库之前可执行。

    $ chmod +x decrypt_secret.sh
    $ git add decrypt_secret.sh
    $ git commit -m "Add new decryption script"
    $ git push
  7. 从工作流程使用 step 调用 shell 脚本并对密码解密。 要在工作流程运行的环境中创建仓库的副本,需要使用 actions/checkout 操作。 使用与仓库根目录相关的 run 命令引用 shell 脚本。

    name: Workflows with large secrets
    
    on: push
    
    jobs:
      my-job:
        name: My Job
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v2
          - name: Decrypt large secret
            run: ./.github/scripts/decrypt_secret.sh
            env:
              LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }}
          # This command is just an example to show your secret being printed
          # Ensure you remove any print statements of your secrets. GitHub does
          # not hide secrets that use this workaround.
          - name: Test printing your secret (Remove this step in production)
            run: cat $HOME/secrets/my_secret.json
    

此文档对您有帮助吗?隐私政策

帮助我们创建出色的文档!

所有 GitHub 文档都是开源的。看到错误或不清楚的内容了吗?提交拉取请求。

做出贡献

或, 了解如何参与。