Azure RBAC の制限をトラブルシューティングする
この記事では、Azure ロールベースのアクセス制御 (Azure RBAC) の制限を超えた場合の一般的な解決策について説明します。
前提条件
- Azure Resource Graph クエリを実行する閲覧者ロール。
- ロール割り当てを追加または削除するロール ベースのアクセス制御管理者ロール。
- ロールの割り当てを追加、ロールの割り当てを削除、またはカスタム ロールを削除するユーザー アクセス管理者ロール。
- グループを作成するグループ管理者またはユーザー管理者ロール。
Note
この記事で使用されるクエリは、読み取りアクセス許可を持つロールの割り当てまたはカスタム ロールのみを返します。 たとえば、リソース グループ スコープでロールの割り当てを読み取るアクセス許可しかない場合、サブスクリプション スコープでのロールの割り当ては返されません。
症状 - ロールの割り当てがこれ以上作成できない
ロールを割り当てようとすると、次のエラー メッセージが表示されます。
No more role assignments can be created (code: RoleAssignmentLimitExceeded)
原因
Azure では、サブスクリプションあたり最大 4,000 個のロールの割り当てをサポートしています。 この制限には、サブスクリプション、リソース グループ、リソースのスコープでのロールの割り当てが含まれます。管理グループのスコープではありません。 [資格のあるロールの割り当て] と将来にスケジュールされたロールの割り当ては、この制限の対象にはなりません。 サブスクリプション内のロール割り当ての数を減らしてみる必要があります。
Note
4,000 のサブスクリプション当たりのロール割り当ての制限は固定されており、増やすことはできません。
ロールの割り当ての数を取得するには、Azure portal の アクセス制御 (IAM) ページのグラフをを表示します。 また、次の Azure PowerShell コマンドを使用することもできます。
$scope = "/subscriptions/<subscriptionId>"
$ras = Get-AzRoleAssignment -Scope $scope | Where-Object {$_.scope.StartsWith($scope)}
$ras.Count
解決策 1 - プリンシパル ベースのロールの割り当てをグループベースのロールの割り当てに置き換える
サブスクリプション内のロールの割り当ての数を減らすには、プリンシパル (ユーザー、サービス プリンシパル、マネージド ID) をグループに追加し、代わりにロールをグループに割り当てます。 次の手順に従って、プリンシパルの複数のロールの割り当てをグループの 1 つのロールの割り当てに置き換えることができる場所を特定します。
Azure portal にサインインし、Azure Resource Graph Explorerを開きます。
[スコープ] を選択し、クエリのスコープを設定します。
通常、テナント全体に対してクエリを実行するには、スコープを [ディレクトリ] に設定しますが、スコープを特定のサブスクリプションに絞り込むことができます。
[承認スコープの設定] を選択し、[ここ、上、下] に承認スコープを設定して、指定したスコープのすべてのリソースにクエリを実行します。
次のクエリを実行して、同じロールと同じスコープで、異なるプリンシパルに対するロールの割り当てを取得します。
このクエリは、アクティブなロールの割り当てをチェックし、Microsoft Entra Privileged Identity Management の対象となるロールの割り当てを考慮しません。 対象となるロールの割り当てを一覧表示するには、Microsoft Entra 管理センター、PowerShell、または REST API を使用できます。 詳細については、「Get-AzRoleEligibilityScheduleInstance」または「Role Eligibility Schedule Instances - List For Scope (ロールの適格性スケジュール インスタンス -スコープの一覧)」を参照してください。
ロールの割り当て条件を使用している場合、または条件でロールの割り当て管理を委任している場合は、条件クエリを使用する必要があります。 それ以外の場合は、既定のクエリを使用します。
authorizationresources | where type =~ "microsoft.authorization/roleassignments" | where id startswith "/subscriptions" | extend RoleId = tolower(tostring(properties.roleDefinitionId)) | join kind = leftouter ( authorizationresources | where type =~ "microsoft.authorization/roledefinitions" | extend RoleDefinitionName = tostring(properties.roleName) | extend RoleId = tolower(id) | project RoleDefinitionName, RoleId ) on $left.RoleId == $right.RoleId | extend principalId = tostring(properties.principalId) | extend principal_to_ra = pack(principalId, id) | summarize count_ = count(), AllPrincipals = make_set(principal_to_ra) by RoleDefinitionId = RoleId, Scope = tolower(properties.scope), RoleDefinitionName | where count_ > 1 | order by count_ desc
次は結果の例を示しています。 count_ 列は、同じロールと同じスコープで割り当てられたプリンシパルの数です。 カウントは降順に並べ替えられます。
複数のロールの割り当てをグループの 1 つのロールの割り当てに置き換える行を特定します。
行で、[詳細を表示する] を選択して、[詳細] ウィンドウを開きます。
列 説明 RoleDefinitionId 現在割り当てられているロールの ID。 範囲 ロールの割り当てのスコープ (サブスクリプション、リソース グループ、またはリソース)。 RoleDefinitionName 現在割り当てられているロールの 名前。 count_ 同じロールと同じスコープで割り当てられたプリンシパルの数。 AllPrincipals 同じロールと同じスコープで割り当てられたプリンシパル ID の一覧。 ロールとスコープを取得するには、RoleDefinitionId、RoleDefinitionName、Scope を使用します。
同じロールの割り当てを持つプリンシパル ID の一覧を取得するには、AllPrincipals を使用します。
Microsoft Entra グループを作成します。 詳細については、「Microsoft Entraグループとグループ メンバシップの管理」を参照してください。
AllPrincipals のプリンシパルをグループに追加します。
プリンシパルを一括で追加する方法については、「Microsoft Entra ID でグループ メンバーを一括追加する」を参照してください。
同じスコープで作成したグループにロールを割り当てます。 詳細については、Azure ポータルを使用した Azure ロールの割り当て を参照してください。
これで、プリンシパルベースのロールの割り当てを見つけて削除できます。
プリンシパル ID からプリンシパル名を取得します。
- Azure portal を使用するには、「ユーザーのプロファイル情報と設定を追加または更新する」を参照してください。
- PowerShell を使用するには、「Get-MgUser」を参照してください。
- Azure、CLI を使用するには、「az ad user show」を参照してください。
ロールの割り当てと同じスコープで [アクセスの制御 (IAM)] ページを開きます。
[ロールの割り当て] タブを選択します。
ロールの割り当てをフィルター処理するには、[ロール] フィルターを選択し、ロール名を選択します。
プリンシパル ベースのロールの割り当てを見つけます。
また、グループベースのロールの割り当ても表示されます。
プリンシパルベースのロールの割り当て選択して削除します。 詳細については、「Azure ロールの割り当ての削除」を参照してください。
解決策 2 - 冗長なロールの割り当てを削除する
サブスクリプション内のロールの割り当ての数を減らすには、冗長なロールの割り当てを削除します。 次の手順に従って、より低いスコープの冗長なロールの割り当てが削除される可能性がある場所を特定します。これは、上位のスコープのロール割り当てによって既にアクセス権が付与されているためです。
Azure portal にサインインし、Azure Resource Graph Explorerを開きます。
[スコープ] を選択し、クエリのスコープを設定します。
通常、テナント全体に対してクエリを実行するには、スコープを [ディレクトリ] に設定しますが、スコープを特定のサブスクリプションに絞り込むことができます。
[承認スコープの設定] を選択し、[ここ、上、下] に承認スコープを設定して、指定したスコープのすべてのリソースにクエリを実行します。
次のクエリを実行して、同じロールと同じプリンシパルで、異なるスコープでのロールの割り当てを取得します。
このクエリは、アクティブなロールの割り当てをチェックし、Microsoft Entra Privileged Identity Management の対象となるロールの割り当てを考慮しません。 対象となるロールの割り当てを一覧表示するには、Microsoft Entra 管理センター、PowerShell、または REST API を使用できます。 詳細については、「Get-AzRoleEligibilityScheduleInstance」または「Role Eligibility Schedule Instances - List For Scope (ロールの適格性スケジュール インスタンス -スコープの一覧)」を参照してください。
ロールの割り当て条件を使用している場合、または条件でロールの割り当て管理を委任している場合は、条件クエリを使用する必要があります。 それ以外の場合は、既定のクエリを使用します。
authorizationresources | where type =~ "microsoft.authorization/roleassignments" | where id startswith "/subscriptions" | extend RoleDefinitionId = tolower(tostring(properties.roleDefinitionId)) | extend PrincipalId = tolower(properties.principalId) | extend RoleDefinitionId_PrincipalId = strcat(RoleDefinitionId, "_", PrincipalId) | join kind = leftouter ( authorizationresources | where type =~ "microsoft.authorization/roledefinitions" | extend RoleDefinitionName = tostring(properties.roleName) | extend rdId = tolower(id) | project RoleDefinitionName, rdId ) on $left.RoleDefinitionId == $right.rdId | summarize count_ = count(), Scopes = make_set(tolower(properties.scope)) by RoleDefinitionId_PrincipalId,RoleDefinitionName | project RoleDefinitionId = split(RoleDefinitionId_PrincipalId, "_", 0)[0], RoleDefinitionName, PrincipalId = split(RoleDefinitionId_PrincipalId, "_", 1)[0], count_, Scopes | where count_ > 1 | order by count_ desc
次は結果の例を示しています。 count_ 列は、同じロールと同じプリンシパルを持つロールの割り当てに対する異なるスコープの数です。 カウントは降順に並べ替えられます。
列 説明 RoleDefinitionId 現在割り当てられているロールの ID。 RoleDefinitionName 現在割り当てられているロールの 名前。 PrincipalId ロールが割り当てられたプリンシパルの ID。 count_ 同じロールと同じプリンシパルを持つロールの割り当てに対する異なるスコープの数。 スコープ 同じロールと同じプリンシパルを持つロールの割り当てのスコープ。 冗長なロールの割り当てを削除する行を特定します。
行で、[詳細を表示する] を選択して、[詳細] ウィンドウを開きます。
ロールとプリンシパル を取得するには、RoleDefinitionId、RoleDefinitionName、PrincipalId を使用します。
同じロールと同じプリンシパルのスコープの一覧を取得するには Scopes を使用します。
ロールの割り当てに必要なスコープを決定します。 他のロールの割り当ては削除できます。
削除できるロール割り当てを決定するときは、「最小限の特権のベスト プラクティス」に従う必要があります。 より高いスコープでのロールの割り当てでは、必要な数よりも多くのプリンシパルへのアクセス権が付与される可能性があります。 その場合は、より高いスコープでロールの割り当てを削除する必要があります。 たとえば、低いリソース グループ スコープの仮想マシン共同作成者ロールの割り当てが必要なアクセス権を付与する場合、ユーザーはサブスクリプション スコープで仮想マシン共同作成者ロールの割り当てを必要としないことがあります。
プリンシパル ID からプリンシパル名を取得します。
- Azure portal を使用するには、「ユーザーのプロファイル情報と設定を追加または更新する」を参照してください。
- PowerShell を使用するには、「Get-MgUser」を参照してください。
- Azure、CLI を使用するには、「az ad user show」を参照してください。
削除するロールの割り当てのスコープにある [アクセスの制御 (IAM)] ページを開きます。
[ロールの割り当て] タブを選択します。
ロールの割り当てをフィルター処理するには、[ロール] フィルターを選択し、ロール名を選択します。
プリンシパルを見つけます。
ロールの割り当てを選択して削除します。 詳細については、「Azure ロールの割り当ての削除」を参照してください。
解決策 3 - 複数の組み込みロールの割り当てをカスタム ロールの割り当てに置き換える
サブスクリプション内のロールの割り当ての数を減らすには、複数の組み込みロールの割り当てを 1 つのカスタム ロールの割り当てに置き換えます。 次の手順に従って、複数の組み込みロールの割り当てを置き換えることができる場所を特定します。
Azure portal にサインインし、Azure Resource Graph Explorerを開きます。
[スコープ] を選択し、クエリのスコープを設定します。
通常、テナント全体に対してクエリを実行するには、スコープを [ディレクトリ] に設定しますが、スコープを特定のサブスクリプションに絞り込むことができます。
次のクエリを実行して、同じプリンシパルと同じスコープで、異なる組み込みロールを持つロールの割り当てを取得します。
このクエリは、アクティブなロールの割り当てをチェックし、Microsoft Entra Privileged Identity Management の対象となるロールの割り当てを考慮しません。 対象となるロールの割り当てを一覧表示するには、Microsoft Entra 管理センター、PowerShell、または REST API を使用できます。 詳細については、「Get-AzRoleEligibilityScheduleInstance」または「Role Eligibility Schedule Instances - List For Scope (ロールの適格性スケジュール インスタンス -スコープの一覧)」を参照してください。
ロールの割り当て条件を使用している場合、または条件でロールの割り当て管理を委任している場合は、条件クエリを使用する必要があります。 それ以外の場合は、既定のクエリを使用します。
AuthorizationResources | where type =~ "microsoft.authorization/roleassignments" | where id startswith "/subscriptions" | extend PrincipalId = tostring(properties.principalId) | extend Scope = tolower(properties.scope) | extend RoleDefinitionId = tolower(tostring(properties.roleDefinitionId)) | join kind = leftouter ( AuthorizationResources | where type =~ "microsoft.authorization/roledefinitions" | extend RoleName = tostring(properties.roleName) | extend RoleId = tolower(id) | extend RoleType = tostring(properties.type) | where RoleType == "BuiltInRole" | extend RoleId_RoleName = pack(RoleId, RoleName) ) on $left.RoleDefinitionId == $right.RoleId | summarize count_ = count(), AllRD = make_set(RoleId_RoleName) by PrincipalId, Scope | where count_ > 1 | order by count_ desc
次は結果の例を示しています。 count_ 列は、同じプリンシパルと同じスコープを持つさまざまな組み込みロールの割り当ての数です。 カウントは降順に並べ替えられます。
列 説明 PrincipalId 組み込みロールが割り当てられたプリンシパルの ID。 範囲 組み込みのロール割り当てのスコープ。 count_ 同じプリンシパルと同じスコープを持つ組み込みロールの割り当ての数。 AllRD 組み込みロールの ID と名前。 行で、[詳細を表示する] を選択して、[詳細] ウィンドウを開きます。
AllRD を使用して、カスタム ロールに組み合わせることができる組み込みロールを確認します。
組み込みロールのアクションとデータ アクションを一覧表示します。 詳細については、「Azure ロールの定義を一覧表示する」または「Azure 組み込みロール」を参照してください。
すべてのアクションとデータ アクションを組み込みロールとして含むカスタム ロールを作成します。 カスタム ロールを簡単に作成できるようにするには、まず、組み込みのロールのいずれかを複製します。 詳しくは、「Azure portal を使用して Azure カスタム ロールを作成または更新する」をご参照ください。
プリンシパル ID からプリンシパル名を取得します。
- Azure portal を使用するには、「ユーザーのプロファイル情報と設定を追加または更新する」を参照してください。
- PowerShell を使用するには、「Get-MgUser」を参照してください。
- Azure、CLI を使用するには、「az ad user show」を参照してください。
ロールの割り当てと同じスコープで [アクセスの制御 (IAM)] ページを開きます。
新しいカスタム ロールをプリンシパルに割り当てます。 詳細については、Azure ポータルを使用した Azure ロールの割り当て を参照してください。
これで、組み込みのロールの割り当てを削除できます。
同じスコープの [アクセス制御 (IAM)] ページで、[ロールの割り当て] タブを選びます。
プリンシパルと組み込みのロールの割り当てを見つけます。
組み込みのロールの割り当てをプリンシパルから削除します。 詳細については、「Azure ロールの割り当ての削除」を参照してください。
解決策 4 - ロールの割り当てを対象にする
サブスクリプション内のロールの割り当ての数を減らし、Microsoft Entra ID P2 を持っている場合は、永続的に割り当てるのではなく、Microsoft Entra Privileged Identity Management でロールの割り当てを対象にします。
解決策 5 - サブスクリプションを追加する
追加のサブスクリプションを追加します。
症状 - 管理グループのスコープでこれ以上ロールの割り当てを作成できない
管理グループ スコープでロールを割り当てることができません。
原因
Azure では、管理グループあたり最大 500 個のロールの割り当てをサポートしています。 この制限は、サブスクリプションごとのロール割り当ての制限とは異なります。
Note
500 の管理グループあたりのロール割り当ての制限は固定されており、増やすことはできません。
解決策
管理グループ内のロールの割り当ての数を減らしてみてください。 使用可能なオプションについては、「症状 - ロールの割り当てがこれ以上作成できない」を参照してください。 クエリが管理グループ レベルでリソースを取得するには、クエリに次の変更を加える必要があります。
Replace
| where id startswith "/subscriptions"
With
| where id startswith "/providers/Microsoft.Management/managementGroups"
現象 - これ以上ロールを定義を作成できない
新しいカスタム ロールを作成しようとすると、次のメッセージが表示されます。
Role definition limit exceeded. No more role definitions can be created (code: RoleDefinitionLimitExceeded)
原因
Azure では、ディレクトリあたり最大 5,000 個のカスタム ロールがサポートされます。 (21Vianet が運営する Microsoft Azure の場合、カスタム ロールの上限数は 2,000 個です。)
解決策
使用されていない Azure カスタム ロールを見つけて削除するには、次の手順に従います。
Azure portal にサインインし、Azure Resource Graph Explorerを開きます。
[スコープ] を選択し、クエリのスコープを [ディレクトリ] に設定します。
次のクエリを実行して、ロールの割り当てを持たないすべてのカスタム ロールを取得します。
このクエリは、アクティブなロールの割り当てをチェックし、Microsoft Entra Privileged Identity Management の対象となるカスタム ロールの割り当てを考慮しません。 対象となるカスタム ロールの割り当てを一覧表示するには、Microsoft Entra 管理センター、PowerShell、または REST API を使用します。 詳細については、「Get-AzRoleEligibilityScheduleInstance」または「Role Eligibility Schedule Instances - List For Scope (ロールの適格性スケジュール インスタンス -スコープの一覧)」を参照してください。
AuthorizationResources | where type =~ "microsoft.authorization/roledefinitions" | where tolower(properties.type) == "customrole" | extend rdId = tolower(id) | extend Scope = tolower(properties.assignableScopes) | join kind = leftouter ( AuthorizationResources | where type =~ "microsoft.authorization/roleassignments" | extend RoleId = tolower(tostring(properties.roleDefinitionId)) | summarize RoleAssignmentCount = count() by RoleId ) on $left.rdId == $right.RoleId | where isempty(RoleAssignmentCount) | project RoleDefinitionId = rdId, RoleDefinitionName = tostring(properties.roleName), Scope
次は結果の例を示しています。
列 説明 RoleDefinitionId 未使用のカスタム ロールの ID。 RoleDefinitionName 未使用のカスタム ロールの名前。 範囲 未使用のカスタム ロールに割り当て可能なスコープ。 スコープ (通常はサブスクリプション) を開き、[アクセス制御 (IAM)] ページを開きます。
[ロール] タブを選択して、すべての組み込みおよびカスタム ロールの一覧を表示します。
[種類] フィルターで [CustomRole] を選択し、カスタム ロールのみを表示します。
削除するカスタム ロールの省略記号 (...) を選択し、[削除] を選択します。