从Azure管道任务访问Microsoft.Azure.WebSites资源提供程序(Microsoft Azure应用程序服务)的服务主体

从Azure管道任务访问Microsoft.Azure.WebSites资源提供程序(Microsoft Azure应用程序服务)的服务主体,azure,azure-devops,azure-pipelines,azure-keyvault,azure-service-principal,Azure,Azure Devops,Azure Pipelines,Azure Keyvault,Azure Service Principal,我想创建一个密钥库,用于存储TLS证书。此密钥库需要可从Azure管道任务访问,该任务将检索所述证书并将其绑定到其应用程序: 默认情况下,“Microsoft.Azure.WebSites”资源提供程序(RP)无权访问模板中指定的密钥库,因此您需要在部署模板之前通过执行以下PowerShell命令对其进行授权: Login-AzureRmAccount Set-AzureRmContext -SubscriptionId AZURE_SUBSCRIPTION_ID Set-AzureRmKeyV

我想创建一个密钥库,用于存储TLS证书。此密钥库需要可从Azure管道任务访问,该任务将检索所述证书并将其绑定到其应用程序:

默认情况下,“Microsoft.Azure.WebSites”资源提供程序(RP)无权访问模板中指定的密钥库,因此您需要在部署模板之前通过执行以下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应用程序服务”的此服务主体甚至不可用于我的任务;以下内容打印空白:

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

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

当我使用参数
Set-AzKeyVault AccessPolicy-ServicePrincipalName其他服务主体进行测试时。我也犯了同样的错误

您可以使用ObjectId并在
Set-AzKeyVaultAccessPolicy
命令中添加
-BypassObjectiveValidation
参数作为解决方法。见t上的注释

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

对象id是本地目录中托管应用程序中驻留的对象id

您还可以在Azure cli任务中使用below-Az cli命令

az keyvault set-policy -n levikeyv --secret-permissions get --object-id "object-id"
对于命令
Get AzADServicePrincipal
,未返回任何结果。可能是的 与ARM连接服务关联的服务主体在Microsoft Grap中没有读取目录数据的权限

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


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

要访问“Microsoft Azure应用程序服务”(
abfa0a7c-a6b6-4736-8310-5855508787cd
)的服务主体,您需要两件事:

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


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






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

    这两项任务就绪后,您可以通过此任务向密钥库授予“Microsoft Azure应用程序服务”服务主体的权限(相应地替换为
    $env:keyVaultName
    ):


    您是否可以运行
    设置密钥保险库策略
    而不提供
    -ServicePrincipalName abfa0a7c-a6b6-4736-8310-58555087cd
    ?是的,如果我提供对象id,或者如果我使用管道自己的服务主体,它会工作:
    设置AzKeyVaultAccessPolicy-保险库名称…-ServicePrincipalName(获取AzContext).Account.Id-PermissionsToCertificates get
    是否解决了您的问题?或者您需要其他内容?我可以为与我的ARM连接服务关联的服务主体设置访问策略,但不能为与“Microsoft.Azure.WebSites”资源提供程序(RP)关联的服务主体设置访问策略,这正是我需要的。我开始怀疑这是一个广告权限问题。谢谢你的详细回复!我考虑了
    -ObjectId
    方法,但我认为此类对象ID是针对我的租户的,不会是可移植的,这与
    -ServicePrincipalName abfa0a7c-a6b6-4736-8310-58555087CD
    不同。如果我添加这些权限,我怀疑
    -ServicePrincipalName
    方法会起作用;让我试试。是的,它起作用了;非常感谢。不过,我需要的权限不仅仅是Microsoft Graph>Read目录数据。我仍在试验所需的最小集合;当我确定后,我会报告。@User14207973-你设置了什么额外的权限,我也面临着同样的问题issue@John:我需要Azure Active Directory图表中的Directory.Read.All权限,而不是Microsoft图表中的权限。更多细节请参见我的答案。
    az keyvault set-policy -n levikeyv --secret-permissions get --object-id "object-id"
    
    - 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