如何使用服务主体将角色分配给另一个服务主体

Jos*_*osh 6 azure-active-directory azure-devops azure-pipelines

如何授予服务主体访问权限以将角色分配给它创建的资源?


这是场景。

一世...

  • 创建了 Azure DevOps 管道
  • 创建了一个服务连接(它创建了一个服务主体并授予它对Contributor整个订阅的访问权限)。
  • AzureCLI@1使用服务连接创建了一个管道任务
  • 执行az group create …-成功- 制作资源组!
  • 执行az group deployment create …-成功- 部署了一些东西!
    • ^--(除非我将任何角色分配作为 ARM 模板的一部分)
  • 执行az role assignment create …-失败

ERROR: Insufficient privileges to complete the operation.


我尝试制作服务主体Owner而不是Contributor. 没有不同。

这让我明白(有点)原因:Azure 服务主体权限不足,无法管理其他服务主体

这让我在这里:https : //docs.microsoft.com/en-ca/azure/devops/pipelines/release/azure-rm-endpoint?view=azure-devops#failed-to-assign-contributor-role


但我有点卡住了。我我应该在活动目录中授予我的服务主体某种角色,以便它可以管理角色分配。

我发现了这个:https : //docs.microsoft.com/en-us/azure/active-directory/users-groups-roles/roles-delegate-by-task#roles-and-administrators

基于此,我似乎应该授予我的服务主体Privileged role administrator访问权限。 可怕

然后我发现了这个:https : //docs.microsoft.com/en-us/azure/role-based-access-control/custom-roles

因为我想将此服务主体限制为只能在单个订阅中灵活使用 Active Directory 权限,这在AssignableScopes属性中似乎是可能的。


但是有两件事让我停下来,这让我来到这里。

1)我对我在做什么相对不熟悉,而且我在折腾像Administrator shudder 之类的可怕的大术语。是时候咨询一些专家了!

2)这看起来很复杂。我正在执行的任务似乎应该很复杂。我只是想在 Azure 管道中部署 AKS 和容器注册表,并授予 AKS 访问注册表的权限。这就是所有文档所说的(尽管是在命令行中,而不是在管道中)。


那么,我真的应该为订阅创建一个自定义角色,该角色赋予Privileged role administrator只能分配给订阅的类型权限,然后授予我的服务主体该角色吗?

或者...我该怎么做?


编辑:

我确实尝试使用 action 创建自定义角色Microsoft.Authorization/write。它因以下错误而失败:'Microsoft.Authorization/write' does not match any of the actions supported by the providers.

但我成功地创造了一个既有行动Microsoft.Authorization/*/write又有Microsoft.Authorization/*

我的 .json 定义如下所示:

{
  "Name": "...", "Description": "...", "IsCustom": true,
  "Actions": [ "Microsoft.Authorization/*" ],
  "AssignableScopes": [
    "/subscriptions/[subscriptionid]"
  ]
}
Run Code Online (Sandbox Code Playgroud)

将角色分配给服务主体后,仍然失败,访问权限不足。我通过 本地登录az login --service-principal,尝试使用我的新权限,并收到以下消息:

The client '...' with object id '...' does not have authorization to perform action 'Microsoft.Resources/subscriptions/resourceGroups/.../Microsoft.Authorization/read' over scope '/subscriptions/.../resourceGroups/.../.../providers/Microsoft.Authorization/roleDefinitions' or the scope is invalid. If access was recently granted, please refresh your credentials.


编辑:解决方案

{
  "Name": "...", "Description": "...", "IsCustom": true,
  "Actions": [ 
    "Microsoft.Authorization/roleAssignments/read",
    "Microsoft.Authorization/roleAssignments/write"
  ],
  "AssignableScopes": [
    "/subscriptions/[subscriptionid]"
  ]
}
Run Code Online (Sandbox Code Playgroud)

这适用于az role definition create.

服务主体还需要是目录读取者,除非您通过 object-id 指定角色分配。 Azure Active Directory:使用 PowerShell 将服务主体添加到目录读取者角色

可以将其分配给服务主体,并且az当作为该服务主体执行命令时,它会成功创建角色分配。

4c7*_*b41 1

您需要授予它Microsoft.Authorization/roleAssignments/write自定义权限或所有者的内置角色。如果您希望能够对订阅中的每个资源组\资源执行此操作,则范围将是订阅,或者您可以更精细(例如特定资源组甚至资源)。

您的自定义角色链接是创建自定义角色的正确方法。

Microsoft.Authorization/roleAssignments/read编辑:OP也需要添加,对我来说,没有它它也可以工作。