Bicep을 사용하여 Azure RBAC 리소스 만들기

Azure에는 강력한 RBAC(역할 기반 액세스 제어) 시스템이 있습니다. Azure RBAC에 대한 자세한 내용은 Azure RBAC(Azure 역할 기반 액세스 제어)란 무엇인가요?를 참조하세요. Bicep을 사용하여 RBAC 역할 할당 및 역할 정의를 프로그래밍 방식으로 정의할 수 있습니다.

역할 할당

역할 할당을 사용하면 특정 Azure 리소스에 대한 보안 주체(예: 사용자, 그룹 또는 서비스 주체) 액세스 권한을 부여할 수 있습니다.

역할 할당을 정의하려면 형식이 Microsoft.Authorization/roleAssignments인 리소스를 만듭니다. 역할 정의에는 범위, 이름, 역할 정의 ID, 주체 ID, 주체 형식을 비롯한 여러 속성이 있습니다.

범위

역할 할당은 액세스 권한을 부여할 리소스 또는 리소스 집합을 정의하는 특정 범위에 적용됩니다. 자세한 내용은 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'
  }
}

요구 사항을 충족하는 데 필요한 가장 작은 범위를 사용합니다.

예를 들어, 단일 스토리지 계정에 관리 ID 액세스 권한을 부여해야 하는 경우 보안상 리소스 그룹 또는 구독 범위가 아니라 스토리지 계정 범위에서 역할 할당을 만드는 것이 좋습니다.

이름

역할 할당의 리소스 이름은 GUID(Globally Unique IDentifier)이어야 합니다.

역할 할당 리소스 이름은 범위가 더 좁은 경우에도 Microsoft Entra 테넌트 내에서 고유해야 합니다.

Bicep 배포가 반복 가능하려면 이름이 결정적이어야 합니다. 즉, 배포할 때마다 동일한 이름을 사용하는 것이 중요합니다. 범위, 주체 ID, 역할 ID를 함께 사용하는 GUID를 만드는 것이 좋습니다. 다음 예와 같이 역할 할당 이름에 대한 결정적 GUID를 만드는 데 도움이 되도록 guid() 함수를 사용하는 것이 좋습니다.

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

역할 정의 ID

할당하는 역할은 기본 제공 역할 정의 또는 사용자 지정 역할 정의일 수 있습니다. 기본 제공 역할 정의를 사용하려면 적절한 역할 정의 ID를 찾습니다. 예를 들어, Contributor 역할에는 b24988ac-6180-42a0-ab88-20f7382dd24c의 역할 정의 ID가 있습니다.

역할 할당 리소스를 만드는 경우 정규화된 리소스 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 테넌트 내에서 고유해야 합니다.

참고 항목

일부 서비스는 고유한 역할 정의와 할당을 관리합니다. 예를 들어, Azure Cosmos DB는 고유한 Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignmentsMicrosoft.DocumentDB/databaseAccounts/sqlRoleDefinitions 리소스를 유지 관리합니다. 자세한 내용은 특정 서비스의 설명서를 참조하세요.