1

我想创建一个存储 TLS 证书的密钥库。此密钥保管库需要可从 Azure 管道任务访问,这将检索所述证书并将其绑定到他们的应用程序。微软提到

默认情况下,“Microsoft.Azure.WebSites”资源提供程序 (RP) 无权访问模板中指定的 Key Vault,因此您需要在部署模板之前通过执行以下 PowerShell 命令对其进行授权:

Login-AzureRmAccount
Set-AzureRmContext -SubscriptionId AZURE_SUBSCRIPTION_ID
Set-AzureRmKeyVaultAccessPolicy -VaultName KEY_VAULT_NAME -ServicePrincipalName abfa0a7c-a6b6-4736-8310-5855508787cd -PermissionsToSecrets get

当我手动执行此操作时,这适用于我的密钥保管库。但是,我想将此作为我的主管道的一部分自动化。我试过定义这个任务:

- task: AzurePowerShell@5
  displayName: 'Set key vault policy'
  inputs:
    azureSubscription: …
    azurePowerShellVersion: 'LatestVersion'
    ScriptType: 'InlineScript'
    Inline: |
      Set-AzKeyVaultAccessPolicy -VaultName … -ServicePrincipalName abfa0a7c-a6b6-4736-8310-5855508787cd -PermissionsToSecrets get

但它失败了:

##[error]Operation returned an invalid status code 'Forbidden'

我还注意到“Microsoft Azure App Service”的这个服务主体甚至不适用于我的任务;以下打印一个空白:

 $azureAppServicePrincipal = Get-AzADServicePrincipal -ServicePrincipalName abfa0a7c-a6b6-4736-8310-5855508787cd
 Write-Output "azureAppServicePrincipalId = $($azureAppServicePrincipal.Id)"

有没有办法让我的管道可以访问这个服务主体?

4

2 回答 2

1

当我用参数测试时Set-AzKeyVaultAccessPolicy -ServicePrincipalName other-service-principal。我犯了同样的错误。

您可以使用 ObjectId 并在命令中添加-BypassObjectIdValidation参数作为解决方法。Set-AzKeyVaultAccessPolicy请参阅他的文件上的注释。

使用服务主体授予访问策略权限时,您必须使用 -BypassObjectIdValidation 参数。

Set-AzKeyVaultAccessPolicy -VaultName myvault -ObjectId "ObjectId" -PermissionsToSecrets get -BypassObjectIdValidation 

Object id 是 ObjectId 所在的位置Managed application in local directory

在此处输入图像描述

您还可以在 Azure CLI 任务中使用下面的 Az cli 命令

az keyvault set-policy -n levikeyv --secret-permissions get --object-id "object-id"

因为该命令Get-AzADServicePrincipal没有返回任何结果。可能是与您的 ARM 连接服务关联的服务主体Read Directory DataMicrosoft Grap中没有权限

您可以尝试转到服务主体应用程序的 Api 权限并添加适当的权限。这可能需要您的管理员同意。有关信息,请参阅此线程

在此处输入图像描述

于 2020-10-15T07:12:11.907 回答
0

Levi Lu 的回答让我走上了正确的道路,但我添加了自己的答案以澄清确切的要求。

为了能够访问“Microsoft Azure App Service”的服务主体 ( abfa0a7c-a6b6-4736-8310-5855508787cd),您需要做两件事:

  1. 您的订阅必须注册“Microsoft.Web”资源提供程序。这通常会在创建新订阅时自动注册,但有时不会。

微软网站


  1. 与您的 ARM 服务连接(您的管道在其下运行)关联的服务主体必须具有来自 Azure Active Directory Graph 的“Directory.Read.All”权限。打开您的 Azure DevOps 项目设置,单击“服务连接”,打开您的服务连接,然后单击“管理服务主体”。然后转到“API 权限”,单击“添加权限”,向下滚动并单击“Azure Active Directory Graph”、“应用程序权限”,然后添加“Directory.Read.All”。单击“授予管理员同意”。如果此按钮显示为灰色,您需要让 AAD 管理员为您执行此步骤。

管理服务主体


添加权限


目录.阅读.全部


同意


同意


重要的是,您必须从Azure Active Directory Graph中选择“Directory.Read.All”权限,尽管此 API 被标记为旧版并且处于弃用路径上。从 Microsoft Graph 中选择上述权限将不起作用。也就是说,添加两个 API 的权限并不是一个坏主意,以防需求最终从一个切换到另一个。我发现奇怪的另一件事是,该许可一旦被授予和使用,即使在被撤销后仍继续有效。为了让任务再次失败(为了测试),我需要创建一个新租户(Azure Active Directory)。

有了这两个,您可以通过此任务向您的密钥保管库授予“Microsoft Azure App Service”服务主体的权限($env:keyVaultName相应地替换):

- task: AzurePowerShell@5
  displayName: 'Grant key vault access to service principal'
  inputs:
    azureSubscription: '${{ parameters.armConnection }}'
    azurePowerShellVersion: 'LatestVersion'
    ScriptType: 'InlineScript'
    Inline: |              
    if (!(Get-AzADServicePrincipal -ServicePrincipalName abfa0a7c-a6b6-4736-8310-5855508787cd)) {
        throw "Current account cannot retrieve service principal `"abfa0a7c-a6b6-4736-8310-5855508787cd`" (Microsoft Azure App Service)."
    }
    Write-Host "Granting access to service principal `"abfa0a7c-a6b6-4736-8310-5855508787cd`" (Microsoft Azure App Service) on vault `"$($env:keyVaultName)`"..."
    Set-AzKeyVaultAccessPolicy -VaultName $env:keyVaultName -ServicePrincipalName abfa0a7c-a6b6-4736-8310-5855508787cd -PermissionsToSecrets Get,List -PermissionsToCertificates Get,List
于 2020-10-17T20:54:20.667 回答