Set-AzKeyVaultAccessPolicy 的服务主体所需的 Azure AD 权限

Azure AD Permissions Needed for Service Principal for Set-AzKeyVaultAccessPolicy

Azure DevOps (ADO) 服务主体中使用的 'App registration' 执行调用 Set-AzKeyVaultAccessPolicy 的 IaC 发布管道所需的 Azure AD 权限是什么?

我正在尝试为 Microsoft.ManagedIdentity/userAssignedIdentities 添加对 Key Vault 的访问权限。

我看到的错误是: “警告:请确保您在 AD Graph 中有足够的权限来获取和列出图形对象以进行验证。否则跳过 -BypassObjectIdValidation。”

我尝试了多种 AAD 'read' 权限组合。我已恢复的当前权限是:

当我使用我的个人登录在本地进行测试时,脚本工作正常,添加了访问策略,并且 'Managed Identity' 能够访问 Key Vault 机密。我已经能够使用 -BypassObjectIdValidation 作为 ADO 中的解决方法,但这似乎是一种 hack。所有 Azure 资源都在同一个订阅中,所有对象都在同一个 Azure 租户中,所以对我来说,我应该需要使用旁路 s.

没有意义

附加信息:

深入了解 Microsoft 的源代码,我进一步确信问题出在服务主体的 AAD 权限范围内。例如,以下代码调用 Graph.

if (!this.BypassObjectIdValidation.IsPresent && ActiveDirectoryClient != null)
{
    objId = GetObjectId(this.ObjectId, this.UserPrincipalName, this.EmailAddress, this.ServicePrincipalName);
}
else if (ActiveDirectoryClient == null && objId == null)
{
    throw new Exception(Resources.ActiveDirectoryClientNull);
}

来源:https://github.com/Azure/azure-powershell/blob/a31eaed8e1d4f52752222d138436ce975b05dd5f/src/KeyVault/KeyVault/Commands/SetAzureKeyVaultAccessPolicy.cs#L519

继续深入:

adObjects = GraphClient.Objects.GetObjectsByObjectIds(new GetObjectsParameters { ObjectIds = objectIdBatch, IncludeDirectoryObjectReferences = true });

来源:https://github.com/Azure/azure-powershell/blob/a31eaed8e1d4f52752222d138436ce975b05dd5f/src/Resources/Resources/ActiveDirectory/Models/ActiveDirectoryClient.cs#L280

这是 RBAC 角色对 Key Vault 的访问控制权限。

我们的设置在订阅上提供了 Azure DevOps 服务连接主体 Contributor,这就足够了。文档证实,事实上您应该小心谁在您的 Vault 上拥有 Contributor,因为他们可以为自己提供访问策略(他们通常不能在 Azure 中这样做)。

如果你想要更少的权限,我会尝试 User Access AdministratorKey Vault Administrator.

显然问题是 'known product limitation'。 https://github.com/Azure/azure-powershell/issues/10029#issuecomment-664485033

帮助文档中大约三分之一的地方:

来源:https://docs.microsoft.com/en-us/powershell/module/az.keyvault/set-azkeyvaultaccesspolicy?view=azps-5.5.0#description

所以似乎没有可以设置的权限组合来启用 commandlet 在没有开关的情况下工作。