Github 操作 Keyvault 策略中的 Azure ARM 模板

Azure ARM templates in Github Actions Keyvault Policies

我有一个创建我的云资源的 .bicep 文件,其中之一是一个新的密钥库,我可以在其中存储来自不同资源的连接字符串,例如 ACR username/password、redis 连接字符串等。 .bicep 文件在 github 动作工作流程中被引用,动作 azure/arm-deploy@v1 我需要能够访问下游的秘密,但为此我需要 运行 一些更新密钥保管库策略的东西,以允许我正在使用的服务主体调用 github 操作工作流 get/list 权限。我试过使用这个:

      - name: set policies
    continue-on-error: true
    env:
      clientId: ${{ secrets.AZURE_CREDENTIALS }}
    run: |
      az keyvault set-policy -n kv-dev-lightningocr --secret-permissions get list set --spn $clientId

但 $clientId 未按预期插入,如下面的快照所示:

可以直接在 .bicep 模板中设置策略,但我对此有疑问,因为我不确定如何替换模板中 objectId 的值。

    resource keyVaultPolicies 'Microsoft.KeyVault/vaults/accessPolicies@2021-06-01-preview' = {
  name: '${keyVault.name}/add'
  properties: {
    accessPolicies: [
      {
        tenantId: subscription().tenantId
        objectId: // how to get the objectId of the service principal that calls the azure deploy action? 
        permissions: {
          keys: []
          secrets: [
            'get'
            'list'
          ]
          certificates: []
        }
      }
    ]
  }
}

我已经浏览了 Microsoft 文档,但感觉就像大海捞针,所以非常感谢对这个非常具体的问题的任何具体答案。

无法从 ARM 模板引用 Azure AD 对象除外对于与 Azure 资源相关联的那些 作为 System-Assigned IdentityUser-Assigned Identity.

参考虚拟机System-Assigned IdentityUser-Assigned Identity的例子:

"[reference(resourceId('Microsoft.Compute/virtualMachines', variables('vmName')),'2019-12-01', 'Full').identity.principalId]",

目前唯一的方法是[获取服务主体对象idPortal 或使用 Azure AD Powershell moduleaz CLIcopy the clientID from the environment variable 您为 Github Actions.

然后你可以直接粘贴到下面的二头肌模板中:

  resource keyVaultPolicies 'Microsoft.KeyVault/vaults/accessPolicies@2021-06-01-preview' = {
  name: '${keyVault.name}/add'
  properties: {
    accessPolicies: [
      {
        tenantId: subscription().tenantId
        objectId:// copied from portal, az cli,powershell or environment variable
        permissions: {
          keys: []
          secrets: [
            'get'
            'list'
          ]
          certificates: []
        }
      }
    ]
  }
}

你下面的环境变量使用方式也是错误的

name: set policies
    continue-on-error: true
    env:
      clientId: ${{ secrets.AZURE_CREDENTIALS }}
    run: |
      az keyvault set-policy -n kv-dev-lightningocr --secret-permissions get list set --spn $clientId

${{ secrets.AZURE_CREDENTIALS }} 将包含如下内容,您正在使用整个 Azure_credential 环境变量引用 clientid,这是不可能的。

  {
    "clientId": "<GUID>",
    "clientSecret": "<GUID>",
    "subscriptionId": "<GUID>",
    "tenantId": "<GUID>",
    (...)
  }

AZURE_CREDENTIALS 用作登录 Azure 的凭证变量,如下所示:

steps:
    # checkout the repo
    - uses: actions/checkout@v2
    - uses: Azure/login@v1
      with:
        creds: ${{ secrets.AZURE_CREDENTIALS }}

因此,在 Github 操作中,您还必须像下面这样对其进行硬编码:

name: set policies
    continue-on-error: true
    run: |
      az keyvault set-policy -n kv-dev-lightningocr --secret-permissions get list set --spn <ClientID>

参考:

Quickstart - Use Azure Key Vault secrets in GitHub Actions workflows | Microsoft Docs

Setting Key Vault Access Policy from Azure Pipelines