在 GitHub Actions 中使用 Azure Key Vault 对 Azure Spring Apps 进行身份验证

注意

基本、标准和企业计划将从 2025 年 3 月中旬开始弃用,停用期为 3 年。 建议转换到 Azure 容器应用。 有关详细信息,请参阅 Azure Spring Apps 停用公告

标准消耗和专用计划将于 2024 年 9 月 30 日开始弃用,并在六个月后完全关闭。 建议转换到 Azure 容器应用。

本文介绍如何通过 GitHub Actions 将 Key Vault 与 Azure Spring Apps 的 CI/CD 工作流结合使用。

密钥保管库是存储密钥的安全位置。 企业用户需要在其控制的作用域内存储 CI/CD 环境的凭据。 用于在密钥保管库中获取凭据的密钥应限制到资源作用域。 它只能访问密钥保管库作用域,不能访问整个 Azure 作用域。 它类似于只能打开保险柜的钥匙,而不是可以打开建筑物内所有门的万能钥匙。 这是一种使用一个密钥获取另一个密钥的方法,适用于 CICD 工作流。

生成凭据

若要生成用于访问密钥保管库的密钥,请在本地计算机上执行以下命令:

az ad sp create-for-rbac --role contributor --scopes /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.KeyVault/vaults/<KEY_VAULT> --json-auth

--scopes 参数指定的作用域限制了对资源的密钥访问。 它只能访问保险柜。

结果如下:

{
    "clientId": "<GUID>",
    "clientSecret": "<GUID>",
    "subscriptionId": "<GUID>",
    "tenantId": "<GUID>",
    "activeDirectoryEndpointUrl": "https://login.partner.microsoftonline.cn",
    "resourceManagerEndpointUrl": "https://management.chinacloudapi.cn/",
    "sqlManagementEndpointUrl": "https://management.core.chinacloudapi.cn:8443/",
    "galleryEndpointUrl": "https://gallery.azure.com/",
    "managementEndpointUrl": "https://management.core.chinacloudapi.cn/"
}

然后,按设置 GitHub 存储库并进行 Azure 身份验证中所述,将结果保存到 GitHub 机密。

添加凭据的访问策略

在上文中创建的凭据只能获取密钥保管库的一般信息,不能获取其存储的内容。 若要获取密钥保管库中存储的机密,需设置凭据的访问策略。

转到 Azure 门户中的“密钥保管库”仪表板,选择“访问控制”菜单,然后打开“角色分配”选项卡。为“类型”选择“应用”,并为“范围”选择 This resource 。 应看到在上一步中创建的凭据:

Azure 门户的屏幕截图,显示了“访问控制”页,其中突出显示了“角色分配”选项卡。

复制凭据名称,例如 azure-cli-2020-01-19-04-39-02。 打开“访问策略”菜单,然后选择“添加访问策略”链接 。 为“模板”选择 Secret Management,然后选择“主体” 。 将凭据名称粘贴到“主体”/“选择”输入框 :

Azure 门户的屏幕截图,显示了“添加访问策略”页,其中“主体”窗格已打开。

选择“添加访问策略”对话框中的“添加”按钮,然后选择“保存” 。

生成全作用域 Azure 凭据

这是打开建筑物内所有门的万能钥匙。 该过程类似于上一步,但这里我们要更改作用域以生成主密钥:

az ad sp create-for-rbac --role contributor --scopes /subscriptions/<SUBSCRIPTION_ID> --json-auth

同样,结果如下:

{
    "clientId": "<GUID>",
    "clientSecret": "<GUID>",
    "subscriptionId": "<GUID>",
    "tenantId": "<GUID>",
    "activeDirectoryEndpointUrl": "https://login.partner.microsoftonline.cn",
    "resourceManagerEndpointUrl": "https://management.chinacloudapi.cn/",
    "sqlManagementEndpointUrl": "https://management.core.chinacloudapi.cn:8443/",
    "galleryEndpointUrl": "https://gallery.azure.com/",
    "managementEndpointUrl": "https://management.core.chinacloudapi.cn/"
}

复制整个 JSON 字符串。 返回到“密钥保管库”仪表板。 打开“机密”菜单,然后选择“生成/导入”按钮 。 输入机密名称,如 AZURE-CREDENTIALS-FOR-SPRING。 将 JSON 凭据字符串粘贴到“值”输入框。 你可能会注意到,值输入框是单行文本字段,而不是多行文本区域。 可以在其中粘贴完整的 JSON 字符串。

Azure 门户的屏幕截图,显示了“创建机密”页。

合并 GitHub Actions 中的凭据

设置 CICD 管道执行时使用的凭据:

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: azure/login@v1
      with:
        creds: ${{ secrets.AZURE_CREDENTIALS }}           # Strong box key you generated in the first step
    - uses: Azure/get-keyvault-secrets@v1.0
      with:
        keyvault: "<Your Key Vault Name>"
        secrets: "AZURE-CREDENTIALS-FOR-SPRING"           # Master key to open all doors in the building
      id: keyvaultaction
    - uses: azure/login@v1
      with:
        creds: ${{ steps.keyvaultaction.outputs.AZURE-CREDENTIALS-FOR-SPRING }}
    - name: Azure CLI script
      uses: azure/CLI@v1
      with:
        azcliversion: 2.0.75
        inlineScript: |
          az extension add --name spring             # Spring CLI commands from here
          az spring list

后续步骤