使用 Azure 命令行接口管理基于角色的访问控制

使用基于角色的访问控制 (RBAC) 时,可以通过分配特定范围的角色,为用户、组和服务主体定义访问权限。 本文介绍如何使用 Azure 命令行界面 (CLI) 来管理访问权限。

先决条件

若要使用 Azure CLI 来管理 RBAC,必须具备以下先决条件:

  • Azure CLI 2.0。 可以通过 Azure Cloud Shell 在浏览器中使用它,也可以将其安装在 macOS、Linux 和 Windows 上,然后从命令行运行它。

列出角色

列出角色定义

若要列出所有可用的角色定义,请使用 az role definition list

az role definition list

以下示例列出了所有可用的角色定义的名称和说明:

az role definition list --output json | jq '.[] | {"roleName":.properties.roleName, "description":.properties.description}'
{
  "roleName": "API Management Service Contributor",
  "description": "Can manage service and the APIs"
}
{
  "roleName": "API Management Service Operator Role",
  "description": "Can manage service but not the APIs"
}
{
  "roleName": "API Management Service Reader Role",
  "description": "Read-only access to service and APIs"
}

...

下面的示例列出了所有内置的角色定义:

az role definition list --custom-role-only false --output json | jq '.[] | {"roleName":.properties.roleName, "description":.properties.description, "type":.properties.type}'
{
  "roleName": "API Management Service Contributor",
  "description": "Can manage service and the APIs",
  "type": "BuiltInRole"
}
{
  "roleName": "API Management Service Operator Role",
  "description": "Can manage service but not the APIs",
  "type": "BuiltInRole"
}
{
  "roleName": "API Management Service Reader Role",
  "description": "Read-only access to service and APIs",
  "type": "BuiltInRole"
}

...

列出角色定义的操作

若要列出角色定义的操作,请使用 az role definition list

az role definition list --name <role_name>

下面的示例列出了“参与者”角色定义:

az role definition list --name "Contributor"
[
  {
    "id": "/subscriptions/11111111-1111-1111-1111-111111111111/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c",
    "name": "b24988ac-6180-42a0-ab88-20f7382dd24c",
    "properties": {
      "additionalProperties": {
        "createdBy": null,
        "createdOn": "0001-01-01T08:00:00.0000000Z",
        "updatedBy": null,
        "updatedOn": "2016-12-14T02:04:45.1393855Z"
      },
      "assignableScopes": [
        "/"
      ],
      "description": "Lets you manage everything except access to resources.",
      "permissions": [
        {
          "actions": [
            "*"
          ],
          "notActions": [
            "Microsoft.Authorization/*/Delete",
            "Microsoft.Authorization/*/Write",
            "Microsoft.Authorization/elevateAccess/Action"
          ]
        }
      ],
      "roleName": "Contributor",
      "type": "BuiltInRole"
    },
    "type": "Microsoft.Authorization/roleDefinitions"
  }
]

以下示例列出了“参与者”角色的 actionsnotActions

az role definition list --name "Contributor" --output json | jq '.[] | {"actions":.properties.permissions[0].actions, "notActions":.properties.permissions[0].notActions}'
{
  "actions": [
    "*"
  ],
  "notActions": [
    "Microsoft.Authorization/*/Delete",
    "Microsoft.Authorization/*/Write",
    "Microsoft.Authorization/elevateAccess/Action"
  ]
}

以下示例列出了“虚拟机参与者”角色的 actions:

az role definition list --name "Virtual Machine Contributor" --output json | jq '.[] | .properties.permissions[0].actions'
[
  "Microsoft.Authorization/*/read",
  "Microsoft.Compute/availabilitySets/*",
  "Microsoft.Compute/locations/*",
  "Microsoft.Compute/virtualMachines/*",
  "Microsoft.Compute/virtualMachineScaleSets/*",
  "Microsoft.Insights/alertRules/*",
  "Microsoft.Network/applicationGateways/backendAddressPools/join/action",
  "Microsoft.Network/loadBalancers/backendAddressPools/join/action",

  ...

  "Microsoft.Storage/storageAccounts/listKeys/action",
  "Microsoft.Storage/storageAccounts/read"
]

列出访问权限

列出用户的角色分配

若要列出特定用户的角色分配,请使用 az role assignment list

az role assignment list --assignee <assignee>

默认情况下,只会列出局限于订阅的分配。 若要查看按资源或组来确定范围的分配,请使用 --all

以下示例列出的角色分配是直接分配给 patlong@contoso.com 用户的:

az role assignment list --all --assignee patlong@contoso.com --output json | jq '.[] | {"principalName":.properties.principalName, "roleDefinitionName":.properties.roleDefinitionName, "scope":.properties.scope}'
{
  "principalName": "patlong@contoso.com",
  "roleDefinitionName": "Backup Operator",
  "scope": "/subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/pharma-sales-projectforecast"
}
{
  "principalName": "patlong@contoso.com",
  "roleDefinitionName": "Virtual Machine Contributor",
  "scope": "/subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/pharma-sales-projectforecast"
}

列出资源组的角色分配

若要列出存在的针对资源组的角色分配,请使用 az role assignment list

az role assignment list --resource-group <resource_group>

以下示例列出 pharma-sales-projectforecast 资源组的角色分配:

az role assignment list --resource-group pharma-sales-projectforecast --output json | jq '.[] | {"roleDefinitionName":.properties.roleDefinitionName, "scope":.properties.scope}'
{
  "roleDefinitionName": "Backup Operator",
  "scope": "/subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/pharma-sales-projectforecast"
}
{
  "roleDefinitionName": "Virtual Machine Contributor",
  "scope": "/subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/pharma-sales-projectforecast"
}

...

分配访问权限

向用户分配角色

若要将角色分配给资源组范围内的用户,请使用 az role assignment create

az role assignment create --role <role> --assignee <assignee> --resource-group <resource_group>

以下示例将“虚拟机参与者”角色分配给 pharma-sales-projectforecast 资源组范围内的 patlong@contoso.com 用户:

az role assignment create --role "Virtual Machine Contributor" --assignee patlong@contoso.com --resource-group pharma-sales-projectforecast

向组分配角色

若要向组分配角色,请使用 az role assignment create

az role assignment create --role <role> --assignee-object-id <assignee_object_id> --resource-group <resource_group> --scope </subscriptions/subscription_id>

以下示例将“读者”角色分配给订阅范围内 ID 为 22222222-2222-2222-2222-222222222222 的“Ann Mack 团队”组。 若要获取组的 ID,可以使用 az ad group listaz ad group show

az role assignment create --role Reader --assignee-object-id 22222222-2222-2222-2222-222222222222 --scope /subscriptions/11111111-1111-1111-1111-111111111111

以下示例将“虚拟机参与者”角色分配给名为 pharma-sales-project-network 的虚拟网络的资源范围内 ID 为 22222222-2222-2222-2222-222222222222 的“Ann Mack 团队”组:

az role assignment create --role "Virtual Machine Contributor" --assignee-object-id 22222222-2222-2222-2222-222222222222 --scope /subscriptions/11111111-1111-1111-1111-111111111111/resourcegroups/pharma-sales-projectforecast/providers/Microsoft.Network/virtualNetworks/pharma-sales-project-network

将角色分配给应用程序

若要向应用程序分配角色,请使用 az role assignment create

az role assignment create --role <role> --assignee-object-id <assignee_object_id> --resource-group <resource_group> --scope </subscriptions/subscription_id>

以下示例将“虚拟机参与者”角色分配给 pharma-sales-projectforecast 资源组范围内对象 ID 为 44444444-4444-4444-4444-444444444444 的应用程序。 若要获取应用程序的对象 ID,可以使用 az ad app listaz ad app show

az role assignment create --role "Virtual Machine Contributor" --assignee-object-id 44444444-4444-4444-4444-444444444444 --resource-group pharma-sales-projectforecast

删除访问权限

删除角色分配

若要删除角色分配,请使用 az role assignment delete

az role assignment delete --assignee <assignee> --role <role> --resource-group <resource_group>

以下示例在 pharma-sales-projectforecast 资源组上从 patlong@contoso.com 用户删除“虚拟机参与者”角色分配:

az role assignment delete --assignee patlong@contoso.com --role "Virtual Machine Contributor" --resource-group pharma-sales-projectforecast

以下示例将“读者”角色从订阅范围内 ID 为 22222222-2222-2222-2222-222222222222 的“Ann Mack 团队”组删除。 若要获取组的 ID,可以使用 az ad group listaz ad group show

az role assignment delete --assignee 22222222-2222-2222-2222-222222222222 --role "Reader" --scope /subscriptions/11111111-1111-1111-1111-111111111111

自定义角色

列出自定义角色

若要列出可在某范围内进行分配的角色,请使用 az role definition list

下面的两个示例都列出了当前订阅中的所有自定义角色:

az role definition list --custom-role-only true --output json | jq '.[] | {"roleName":.properties.roleName, "type":.properties.type}'
az role definition list --output json | jq '.[] | if .properties.type == "CustomRole" then {"roleName":.properties.roleName, "type":.properties.type} else empty end'
{
  "roleName": "My Management Contributor",
  "type": "CustomRole"
}
{
  "roleName": "My Service Operator Role",
  "type": "CustomRole"
}
{
  "roleName": "My Service Reader Role",
  "type": "CustomRole"
}

...

创建自定义角色

若要创建自定义角色,请使用 az role definition create。 角色定义可以是 JSON 说明,也可以是包含 JSON 说明的文件的路径。

az role definition create --role-definition <role_definition>

以下示例创建名为“虚拟机操作员”的自定义角色。 该自定义角色分配访问 Microsoft.ComputeMicrosoft.StorageMicrosoft.Network 资源提供程序的所有读取操作的权限,并分配访问虚拟机启动、重启和监视操作的权限。 该自定义角色可以在两个订阅中使用。 此示例将 JSON 文件用作输入。

vmoperator.json

{
  "Name": "Virtual Machine Operator",
  "IsCustom": true,
  "Description": "Can monitor and restart virtual machines.",
  "Actions": [
    "Microsoft.Storage/*/read",
    "Microsoft.Network/*/read",
    "Microsoft.Compute/*/read",
    "Microsoft.Compute/virtualMachines/start/action",
    "Microsoft.Compute/virtualMachines/restart/action",
    "Microsoft.Authorization/*/read",
    "Microsoft.Resources/subscriptions/resourceGroups/read",
    "Microsoft.Insights/alertRules/*",
    "Microsoft.Support/*"
  ],
  "NotActions": [

  ],
  "AssignableScopes": [
    "/subscriptions/11111111-1111-1111-1111-111111111111",
    "/subscriptions/33333333-3333-3333-3333-333333333333"
  ]
}
az role definition create --role-definition ~/roles/vmoperator.json

更新自定义角色

若要更新自定义角色,请首先使用 az role definition list 检索角色定义。 然后,对角色定义做出所需更改。 最后,使用 az role definition update 保存更新的角色定义。

az role definition update --role-definition <role_definition>

以下示例将 Microsoft.Insights/diagnosticSettings/ 操作添加到“虚拟机操作员”自定义角色的“Actions”。

vmoperator.json

{
  "Name": "Virtual Machine Operator",
  "IsCustom": true,
  "Description": "Can monitor and restart virtual machines.",
  "Actions": [
    "Microsoft.Storage/*/read",
    "Microsoft.Network/*/read",
    "Microsoft.Compute/*/read",
    "Microsoft.Compute/virtualMachines/start/action",
    "Microsoft.Compute/virtualMachines/restart/action",
    "Microsoft.Authorization/*/read",
    "Microsoft.Resources/subscriptions/resourceGroups/read",
    "Microsoft.Insights/alertRules/*",
    "Microsoft.Insights/diagnosticSettings/*",
    "Microsoft.Support/*"
  ],
  "NotActions": [

  ],
  "AssignableScopes": [
    "/subscriptions/11111111-1111-1111-1111-111111111111",
    "/subscriptions/33333333-3333-3333-3333-333333333333"
  ]
}
az role definition update --role-definition ~/roles/vmoperator.json

删除自定义角色

若要删除自定义角色,请使用 az role definition delete。 若要指定要删除的角色,请使用角色名称或角色 ID。 若要确定角色 ID,请使用 az role definition list

az role definition delete --name <role_name or role_id>

以下示例删除了“虚拟机操作员”自定义角色:

az role definition delete --name "Virtual Machine Operator"

后续步骤