Bicep を使用して Azure RBAC リソースを作成する

Azure には、強力なロールベースのアクセス制御 (RBAC) システムがあります。 Azure RBAC について詳しくは、「Azure のロールベースのアクセス制御 (Azure RBAC) とは」を参照してください。Bicep を使用すると、RBAC のロールの割り当てとロールの定義をプログラムで定義できます。

ロールの割り当て

ロールの割り当てにより、プリンシパル (ユーザー、グループ、サービス プリンシパルなど) に特定の Azure リソースへのアクセス権を付与できます。

ロールの割り当てを定義するには、種類が Microsoft.Authorization/roleAssignments のリソースを作成します。 ロールの定義には、スコープ、名前、ロール定義 ID、プリンシパル ID、プリンシパルの種類などの複数のプロパティがあります。

Scope

ロールの割り当ては、アクセス権を付与する先のリソースまたはリソースのセットを定義する、特定の "スコープ" で適用されます。 詳しくは、「Azure RBAC のスコープについて」を参照してください。

ロールの割り当ては拡張リソースであり、別のリソースに適用されます。 次の例は、ストレージ アカウントと、そのストレージ アカウントをスコープにしたロールの割り当てを作成する方法を示しています。

param location string = resourceGroup().location
param storageAccountName string = 'stor${uniqueString(resourceGroup().id)}'
param storageSkuName string = 'Standard_LRS'
param roleDefinitionResourceId string
param principalId string

resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: storageAccountName
  location: location
  kind: 'StorageV2'
  sku: {
   name: storageSkuName
  }
}

resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  scope: storageAccount
  name: guid(storageAccount.id, principalId, roleDefinitionResourceId)
  properties: {
    roleDefinitionId: roleDefinitionResourceId
    principalId: principalId
    principalType: 'ServicePrincipal'
  }
}

スコープを明示的に指定しない場合、Bicep はファイルの targetScope を使用します。 次の例では、scope プロパティが指定されていないため、ロールの割り当てのスコープがサブスクリプションになります。

param roleDefinitionResourceId string
param principalId string

targetScope = 'subscription'

resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(subscription().id, principalId, roleDefinitionResourceId)
  properties: {
    roleDefinitionId: roleDefinitionResourceId
    principalId: principalId
    principalType: 'ServicePrincipal'
  }
}

ヒント

要件を満たすために必要な最小のスコープを使用してください。

たとえば、1 つのストレージ アカウントへのマネージド ID アクセスを許可する必要がある場合は、リソース グループまたはサブスクリプションのスコープではなく、ストレージ アカウントのスコープでロールの割り当てを作成することをセキュリティの面からお勧めします。

Name

ロールの割り当てのリソース名は、グローバル一意識別子 (GUID) である必要があります。

スコープが狭くても、ロールの割り当てリソース名は Microsoft Entra テナント内で一意である必要があります。

Bicep デプロイを繰り返すことができるようにするために、名前を決定的にすること、つまり、デプロイのたびに同じ名前を使用することが重要です。 スコープ、プリンシパル ID、ロール ID を組み合わせて使用する GUID を作成することをお勧めします。 次の例のように、guid() 関数を使用して、ロール割り当て名の決定的な GUID を作成することをお勧めします。

name: guid(subscription().id, principalId, roleDefinitionResourceId)

ロール定義 ID

割り当てるロールは、組み込みのロール定義またはカスタム ロール定義にすることができます。 組み込みのロール定義を使用するには、適切なロール定義 ID を見つけます。 たとえば、"共同作成者" ロールのロール定義 ID は b24988ac-6180-42a0-ab88-20f7382dd24c です。

ロール割り当てリソースを作成するときは、完全修飾リソース ID を指定する必要があります。 組み込みのロール定義 ID は、サブスクリプションスコープのリソースです。 existing リソースを使用して組み込みロールを参照し、.id プロパティを使用してその完全修飾リソース ID にアクセスすることをお勧めします。

param principalId string

@description('This is the built-in Contributor role. See https://docs.microsoft.com/azure/role-based-access-control/built-in-roles#contributor')
resource contributorRoleDefinition 'Microsoft.Authorization/roleDefinitions@2018-01-01-preview' existing = {
  scope: subscription()
  name: 'b24988ac-6180-42a0-ab88-20f7382dd24c'
}

resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(resourceGroup().id, principalId, contributorRoleDefinition.id)
  properties: {
    roleDefinitionId: contributorRoleDefinition.id
    principalId: principalId
    principalType: 'ServicePrincipal'
  }
}

プリンシパル

principalId プロパティは、プリンシパルの Microsoft Entra 識別子を表す GUID に設定する必要があります。 Microsoft Entra ID では、これはオブジェクト ID と呼ばれる場合があります。

principalType プロパティは、プリンシパルがユーザー、グループ、またはサービス プリンシパルのどれであるかを指定します。 マネージド ID はサービス プリンシパルの一形態です。

ヒント

Bicep でロールの割り当てを作成するときは、principalType プロパティを設定することが重要です。 そうしないと、特にサービス プリンシパルやマネージド ID を扱うときに、断続的なデプロイ エラーが発生する場合があります。

次の例は、ユーザー割り当てマネージド ID とロールの割り当てを作成する方法を示しています。

param location string = resourceGroup().location
param roleDefinitionResourceId string

var managedIdentityName = 'MyManagedIdentity'

resource managedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
  name: managedIdentityName
  location: location
}

resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(resourceGroup().id, managedIdentity.id, roleDefinitionResourceId)
  properties: {
    roleDefinitionId: roleDefinitionResourceId
    principalId: managedIdentity.properties.principalId
    principalType: 'ServicePrincipal'
  }
}

リソースの削除動作

Microsoft Entra ID からユーザー、グループ、サービス プリンシパル、またはマネージド ID を削除する場合、ロールの割り当てを削除することをお勧めします。 これらは自動的には削除されません。

削除されたプリンシパル ID を参照するすべてのロールの割り当てが無効になります。 ロールの割り当ての名前を別のロールの割り当てに再利用しようとすると、デプロイは失敗します。 この動作を回避するには、再作成する前に古いロールの割り当てを削除するか、新しいロールの割り当てをデプロイするときに一意の名前を使用する必要があります。 このクイックスタート テンプレートでは、Bicep モジュールにロールの割り当てを定義し、ロール割り当て名のシード値としてプリンシパル ID を使用する方法について説明します。

カスタム ロールの定義

カスタム ロール定義を使用すると、ロールの割り当てを使用してプリンシパルに割り当てることができる一連のアクセス許可を定義できます。 ロールの定義について詳しくは、「Azure ロールの定義について」を参照してください。

カスタム ロール定義を作成するには、種類が Microsoft.Authorization/roleDefinitions のリソースを定義します。 例については、「サブスクリプション レベルのデプロイを介して新しいロール定義を作成する」クイックスタートを参照してください。

割り当て可能なスコープが狭い場合でも、ロールの定義リソース名は Microsoft Entra テナント内で一意である必要があります。

Note

一部のサービスは、独自のロールの定義と割り当てを管理します。 たとえば、Azure Cosmos DB は独自の Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments および Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions リソースを保持します。 詳細については、特定のサービスのドキュメントを参照してください。