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

时间:2019-09-15 23:30:15

标签: azure-devops azure-active-directory 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 Service principal insufficient permissions to manage other service principals

谁在这里带领我: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

因为我想将此服务主体限制为只能在单个订阅内发挥作用的目录权限,这在AssignableScopes属性中似乎是可能的。


但是有两件事让我停顿了一下,这把我带到了这里。

1)我对自己的工作相对不熟悉,并且正在使用诸如Administrator shudder 之类的可怕术语。是时候咨询一些专家了!

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


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

或者...我该怎么做?


编辑:

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

但是我成功创建了一个具有动作Microsoft.Authorization/*/writeMicrosoft.Authorization/*

的动作

我的.json定义如下:

{
  "Name": "...", "Description": "...", "IsCustom": true,
  "Actions": [ "Microsoft.Authorization/*" ],
  "AssignableScopes": [
    "/subscriptions/[subscriptionid]"
  ]
}

在将角色分配给服务主体后,它仍然因访问不足而失败。我通过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]"
  ]
}

这与az role definition create一起使用。

除非您通过object-id指定角色分配,否则服务主体还必须是Directory Reader。 Azure Active Directory: Add Service Principal to Directory Readers Role with PowerShell

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

1 个答案:

答案 0 :(得分:0)

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

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

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