使用 Azure CLI 指派 Azure 角色

Azure 角色型存取控制 (Azure RBAC) 是您用來管理 Azure 資源存取權的授權系統。 若要授與存取權,您可以將角色指派給特定範圍的使用者、群組、服務主體或受控識別。 本文說明如何使用 Azure CLI 指派角色。

必要條件

若要指派角色,您必須擁有:

指派 Azure 角色的步驟

指派角色是由三個元素所組成:安全性主體、角色定義和範圍。

步驟1:判斷需要存取的人員

您可以將角色指派給使用者、群組、服務主體或受控識別。 若要指派角色,您可能需要指定物件的唯一識別碼。 識別碼的格式如下:11111111-1111-1111-1111-111111111111。 您可以使用 Azure 入口網站或 Azure CLI 來取得識別碼。

使用者

若為 Azure AD 使用者,請取得使用者主體名稱,例如 patlong @ contoso.com 或使用者物件識別碼。 若要取得物件識別碼,您可以使用 az ad user show

az ad user show --id "{principalName}" --query "objectId" --output tsv

群組

針對 Azure AD 群組,您需要群組物件識別碼。 若要取得物件識別碼,您可以使用 az ad group showaz ad 群組清單

az ad group show --group "{groupName}" --query "objectId" --output tsv

服務主體

針對 Azure AD 服務主體 (應用程式) 所使用的身分識別,您需要服務主體物件識別碼。 若要取得物件識別碼,您可以使用 az ad sp list。 對於服務主體,請使用物件識別碼,而 不是 應用程式識別碼。

az ad sp list --all --query "[].{displayName:displayName, objectId:objectId}" --output tsv
az ad sp list --display-name "{displayName}"

受控識別

針對系統指派或使用者指派的受控識別,您需要物件識別碼。 若要取得物件識別碼,您可以使用 az ad sp list

az ad sp list --all --filter "servicePrincipalType eq 'ManagedIdentity'"

若只要列出使用者指派的受控識別,您可以使用 az 身分識別清單

az identity list

步驟2:選取適當的角色

許可權會群組在一起成為角色。 您可以從數個 Azure 內建角色 的清單中選取,也可以使用自己的自訂角色。 最佳做法是以所需的最低許可權授與存取權,因此請避免指派更廣泛的角色。

若要列出角色並取得唯一角色識別碼,您可以使用 az 角色定義清單

az role definition list --query "[].{name:name, roleType:roleType, roleName:roleName}" --output tsv

以下說明如何列出特定角色的詳細資料。

az role definition list --name "{roleName}"

如需詳細資訊,請參閱 列出 Azure 角色定義

步驟3:識別所需的範圍

Azure 提供四個範圍層級:資源、 資源群組、訂用帳戶和 管理群組。 最佳做法是以所需的最低許可權授與存取權,因此請避免在更廣泛的範圍指派角色。 如需範圍的詳細資訊,請參閱了解範圍

資源範圍

針對資源範圍,您需要資源的資源識別碼。 您可以藉由查看 Azure 入口網站中資源的屬性來尋找資源識別碼。 資源識別碼具有下列格式。

/subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/{providerName}/{resourceType}/{resourceSubType}/{resourceName}

資源群組範圍

針對資源群組範圍,您需要資源群組的名稱。 您可以在 Azure 入口網站中的 [ 資源群組 ] 頁面上找到名稱,也可以使用 az 群組清單

az group list --query "[].{name:name}" --output tsv

訂用帳戶範圍

針對訂用帳戶範圍,您需要訂用帳戶識別碼。 您可以在 Azure 入口網站的 [訂用帳戶 ] 頁面上 找到識別碼,也可以使用 az account list

az account list --query "[].{name:name, id:id}" --output tsv

管理群組領域

針對管理群組領域,您需要管理組名。 您可以在 Azure 入口網站的 [ 管理群組 ] 頁面上找到名稱,也可以使用 [ az 帳戶管理-群組清單]。

az account management-group list --query "[].{name:name, id:id}" --output tsv

步驟4:指派角色

若要指派角色,請使用 az 角色指派 create 命令。 視範圍而定,命令通常具有下列其中一種格式。

資源範圍

az role assignment create --assignee "{assignee}" \
--role "{roleNameOrId}" \
--scope "/subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/{providerName}/{resourceType}/{resourceSubType}/{resourceName}"

資源群組範圍

az role assignment create --assignee "{assignee}" \
--role "{roleNameOrId}" \
--resource-group "{resourceGroupName}"

訂用帳戶範圍

az role assignment create --assignee "{assignee}" \
--role "{roleNameOrId}" \
--subscription "{subscriptionNameOrId}"

管理群組領域

az role assignment create --assignee "{assignee}" \
--role "{roleNameOrId}" \
--scope "/providers/Microsoft.Management/managementGroups/{managementGroupName}"

以下顯示當您將「 虛擬機器參與者 」角色指派給資源群組範圍中的使用者時的輸出範例。

{
  "canDelegate": null,
  "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Authorization/roleAssignments/{roleAssignmentId}",
  "name": "{roleAssignmentId}",
  "principalId": "{principalId}",
  "principalType": "User",
  "resourceGroup": "{resourceGroupName}",
  "roleDefinitionId": "/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/9980e02c-c2be-4d73-94e8-173b1dc7cf3c",
  "scope": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}",
  "type": "Microsoft.Authorization/roleAssignments"
}

指派角色範例

為儲存體帳戶資源範圍中的所有 blob 容器指派角色

針對名為 storage12345 的儲存體帳戶,將 儲存體 Blob 資料參與者角色指派給資源範圍中具有物件識別碼 55555555-5555-5555-5555-555555555555 的服務主體。

az role assignment create --assignee "55555555-5555-5555-5555-555555555555" \
--role "Storage Blob Data Contributor" \
--scope "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/Example-Storage-rg/providers/Microsoft.Storage/storageAccounts/storage12345"

為特定的 blob 容器資源範圍指派角色

儲存體 Blob 資料參與者角色指派給 blob 容器 -01 blob 容器之資源範圍中的物件識別碼為 55555555-5555-5555-5555-555555555555 的服務主體。

az role assignment create --assignee "55555555-5555-5555-5555-555555555555" \
--role "Storage Blob Data Contributor" \
--scope "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/Example-Storage-rg/providers/Microsoft.Storage/storageAccounts/storage12345/blobServices/default/containers/blob-container-01"

為特定虛擬網路資源範圍中的群組指派角色

針對名為 醫藥 的虛擬網路,將 虛擬機器參與者角色指派給名為22222222-2222-2222-2222-222222222222 的 王 mack」團隊 群組(名為的資源範圍)。

az role assignment create --assignee "22222222-2222-2222-2222-222222222222" \
--role "Virtual Machine Contributor" \
--scope "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/pharma-sales/providers/Microsoft.Network/virtualNetworks/pharma-sales-project-network"

為使用者指派資源群組範圍的角色

將「虛擬機器參與者」角色指派給 醫藥-sales 資源群組範圍的 patlong @ contoso.com 使用者。

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

在資源群組範圍中使用唯一角色識別碼指派使用者的角色

有幾個時候角色名稱可能會變更,例如:

  • 您正在使用自己的自訂角色,並決定變更名稱。
  • 您使用的預覽角色在名稱中有 (預覽) 。 釋放角色時,就會重新命名角色。

即使角色已重新命名,角色識別碼也不會變更。 如果您使用腳本或自動化來建立角色指派,最好使用唯一角色識別碼,而不是角色名稱。 因此,如果角色已重新命名,您的腳本可能會更有作用。

下列範例會將「虛擬機器參與者」角色指派給 醫藥-sales 資源群組範圍的 patlong @ contoso.com 使用者。

az role assignment create --assignee "patlong@contoso.com" \
--role "9980e02c-c2be-4d73-94e8-173b1dc7cf3c" \
--resource-group "pharma-sales"

為資源群組範圍中的所有 blob 容器指派角色

範例-rg 資源群組範圍中,將 儲存體 Blob 資料參與者角色指派給物件識別碼為 55555555-5555-5555-5555-555555555555 的服務主體。

az role assignment create --assignee "55555555-5555-5555-5555-555555555555" \
--role "Storage Blob Data Contributor" \
--resource-group "Example-Storage-rg"

或者,您可以使用參數指定完整的資源群組 --scope

az role assignment create --assignee "55555555-5555-5555-5555-555555555555" \
--role "Storage Blob Data Contributor" \
--scope "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/Example-Storage-rg"

在資源群組範圍中指派應用程式的角色

將「 虛擬機器參與者 」角色指派給 醫藥-sales 資源群組範圍的服務主體物件識別碼為44444444-4444-4444-4444-444444444444 的應用程式。

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

在資源群組範圍為新的服務主體指派角色

如果您建立新的服務主體,並立即嘗試將角色指派給該服務主體,在某些情況下,該角色指派可能會失敗。 例如,如果您使用腳本來建立新的受控識別,然後嘗試將角色指派給該服務主體,則角色指派可能會失敗。 此失敗的原因可能是複寫延遲。 服務主體建立在某個區域中;不過,角色指派可能發生在另一個尚未複寫服務主體的區域中。 若要解決這種情況,您應該在建立角色指派時指定主體類型。

若要指派角色,請使用 az role assign create,指定的值 --assignee-object-id ,然後將設定 --assignee-principal-typeServicePrincipal

az role assignment create --assignee-object-id "{assigneeObjectId}" \
--assignee-principal-type "{assigneePrincipalType}" \
--role "{roleNameOrId}" \
--resource-group "{resourceGroupName}" \
--scope "/subscriptions/{subscriptionId}"

下列範例會將「虛擬機器參與者」角色指派給 醫藥-sales 資源群組範圍的 msi 測試 受控識別:

az role assignment create --assignee-object-id "33333333-3333-3333-3333-333333333333" \
--assignee-principal-type "ServicePrincipal" \
--role "Virtual Machine Contributor" \
--resource-group "pharma-sales"

為訂用帳戶範圍的使用者指派角色

將「 讀取 者」角色指派給訂用帳戶範圍內的 annm @ example.com 使用者。

az role assignment create --assignee "annm@example.com" \
--role "Reader" \
--subscription "00000000-0000-0000-0000-000000000000"

為訂用帳戶範圍的群組指派角色

讀者 角色指派給訂用帳戶範圍中識別碼為22222222-2222-2222-2222-222222222222 的 王 mack」團隊 群組。

az role assignment create --assignee "22222222-2222-2222-2222-222222222222" \
--role "Reader" \
--subscription "00000000-0000-0000-0000-000000000000"

為訂用帳戶範圍內的所有 blob 容器指派角色

儲存體 Blob 資料讀取器 角色指派給訂用帳戶範圍內的 alain @ example.com 使用者。

az role assignment create --assignee "alain@example.com" \
--role "Storage Blob Data Reader" \
--scope "/subscriptions/00000000-0000-0000-0000-000000000000"

為管理群組範圍的使用者指派角色

將「 帳單讀者 」角色指派給位於管理群組範圍的 alain @ example.com 使用者。

az role assignment create --assignee "alain@example.com" \
--role "Billing Reader" \
--scope "/providers/Microsoft.Management/managementGroups/marketing-group"

下一步