Azure Resource Manager 템플릿을 사용하여 Azure 역할 할당

Azure RBAC(Azure 역할 기반 액세스 제어)는 Azure 리소스에 대한 액세스를 관리하는 데 사용하는 권한 부여 시스템입니다. 액세스 권한을 부여하려면 역할을 특정 범위의 사용자, 그룹, 서비스 주체 또는 관리 ID에 할당합니다. Azure PowerShell 또는 Azure CLI를 사용하는 것 외에도 RBAC 및 Azure Resource Manager 템플릿을 사용하여 역할을 할당할 수 있습니다. 템플릿은 리소스를 일관되고 반복적으로 배포해야 하는 경우 유용할 수 있습니다. 이 문서에서는 템플릿을 사용하여 역할을 할당하는 방법을 설명합니다.

참고 항목

Bicep은 Azure 리소스를 정의하기 위한 새로운 언어입니다. JSON보다 간단한 작성 환경과 IaC(Infrastructure as Code)의 품질을 개선하는 데 도움이 되는 다른 기능이 있습니다. Azure에서 IaC(Infrastructure as Code)를 처음 접하는 사람은 JSON 대신 Bicep을 사용하는 것이 좋습니다.

Bicep을 사용하여 역할 할당을 정의하는 방법에 대해 자세히 알아보려면 Bicep을 사용하여 Azure RBAC 리소스 만들기를 참조하세요. 빠른 시작 예제는 빠른 시작: Bicep을 사용하여 Azure 역할 할당을 참조하세요.

필수 조건

Azure 역할을 할당하려면 다음이 있어야 합니다.

다음 버전을 사용해야 합니다.

  • 새 서비스 사용자에게 Azure 역할을 할당할 수 있는 2018-09-01-preview 이상
  • 리소스 범위에서 Azure 역할을 할당할 수 있는 2020-04-01-preview 이상
  • 2022-04-01는 안정적인 첫 번째 버전입니다.

자세한 내용은 Azure RBAC REST API의 API 버전을 참조하세요.

개체 ID 가져오기

역할을 할당하려면 역할을 할당하려는 사용자, 그룹 또는 애플리케이션의 ID를 지정해야 합니다. ID의 형식은 11111111-1111-1111-1111-111111111111입니다. Azure Portal, Azure PowerShell 또는 Azure CLI를 사용하여 ID를 가져올 수 있습니다.

사용자

사용자의 ID를 가져오려면 AzADUser 또는 az ad user show 명령을 사용할 수 있습니다.

$objectid = (Get-AzADUser -DisplayName "{name}").id
objectid=$(az ad user show --id "{email}" --query id --output tsv)

그룹

그룹의 ID를 가져오려면 AzADGroup 또는 az ad group show 명령을 사용할 수 있습니다.

$objectid = (Get-AzADGroup -DisplayName "{name}").id
objectid=$(az ad group show --group "{name}" --query id --output tsv)

관리 ID

관리 ID의 ID를 가져오려면 Get-AzAdServiceprincipal 또는 az ad sp 명령을 사용하면 됩니다.

$objectid = (Get-AzADServicePrincipal -DisplayName <Azure resource name>).id
objectid=$(az ad sp list --display-name <Azure resource name> --query [].id --output tsv)

애플리케이션

서비스 주체의 ID(애플리케이션에서 사용하는 ID)를 가져오려면 AzADServicePrincipal 또는 az ad sp list 명령을 사용할 수 있습니다. 서비스 주체의 경우 애플리케이션 ID가 아니라 개체 ID를 사용합니다.

$objectid = (Get-AzADServicePrincipal -DisplayName "{name}").id
objectid=$(az ad sp list --display-name "{name}" --query [].id --output tsv)

Azure 역할 할당

Azure RBAC에서 액세스 권한을 부여하기 위해 역할을 할당합니다.

리소스 그룹 범위(매개 변수 없음)

다음 템플릿에서는 역할을 할당하는 기본 방법을 보여줍니다. 일부 값은 템플릿 내에서 지정됩니다. 다음 템플릿은 다음을 보여줍니다.

  • 리소스 그룹 범위에서 사용자, 그룹 또는 애플리케이션에 읽기 권한자 역할을 할당하는 방법

템플릿을 사용하려면 다음을 수행해야 합니다.

  • 새 JSON 파일을 만들고 템플릿 복사
  • <your-principal-id>를 역할을 할당할 사용자, 그룹, 관리 ID 또는 애플리케이션의 ID로 바꾸기
{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "resources": [
        {
            "type": "Microsoft.Authorization/roleAssignments",
            "apiVersion": "2022-04-01",
            "name": "[guid(resourceGroup().id)]",
            "properties": {
                "roleDefinitionId": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]",
                "principalId": "<your-principal-id>"
            }
        }
    ]
}

ExampleGroup이라는 리소스 그룹에서 배포를 시작하는 방법에 대한 예제 New-AzResourceGroupDeploymentaz deployment group create 명령은 다음과 같습니다.

New-AzResourceGroupDeployment -ResourceGroupName ExampleGroup -TemplateFile rbac-test.json
az deployment group create --resource-group ExampleGroup --template-file rbac-test.json

다음에서는 템플릿을 배포한 후 리소스 그룹에 대한 읽기 권한자 역할을 사용자에게 할당하는 예를 보여 줍니다.

Role assignment at resource group scope

리소스 그룹 또는 구독 범위

이전 템플릿은 그리 유연하지 않습니다. 다음 템플릿에서는 매개 변수를 사용하고 다양한 범위에서 사용할 수 있습니다. 다음 템플릿은 다음을 보여줍니다.

  • 리소스 그룹 또는 구독 범위에서 사용자, 그룹 또는 애플리케이션에 역할을 할당하는 방법
  • 매개 변수로 소유자, 기여자 및 읽기 권한자 역할 지정하는 방법

템플릿을 사용하려면 다음 입력을 지정해야 합니다.

  • 역할을 할당할 사용자, 그룹, 관리 ID 또는 애플리케이션의 ID
  • 역할 할당에 사용되는 고유 ID. 기본 ID를 사용할 수도 있습니다.
{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "principalId": {
            "type": "string",
            "metadata": {
                "description": "The principal to assign the role to"
            }
        },
        "builtInRoleType": {
            "type": "string",
            "allowedValues": [
                "Owner",
                "Contributor",
                "Reader"
            ],
            "metadata": {
                "description": "Built-in role to assign"
            }
        },
        "roleNameGuid": {
            "type": "string",
            "defaultValue": "[newGuid()]",
            "metadata": {
                "description": "A new GUID used to identify the role assignment"
            }
        }
    },
    "variables": {
        "Owner": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', '8e3af657-a8ff-443c-a75c-2fe8c4bcb635')]",
        "Contributor": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]",
        "Reader": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]"
    },
    "resources": [
        {
            "type": "Microsoft.Authorization/roleAssignments",
            "apiVersion": "2022-04-01",
            "name": "[parameters('roleNameGuid')]",
            "properties": {
                "roleDefinitionId": "[variables(parameters('builtInRoleType'))]",
                "principalId": "[parameters('principalId')]"
            }
        }
    ]
}

참고 항목

동일한 roleNameGuid 값이 템플릿의 각 배포에 대한 매개 변수로 제공되지 않는 한, 이 템플릿은 idempotent가 아닙니다. roleNameGuid를 제공하지 않으면 기본적으로 각 배포에 새 GUID가 생성되고 후속 배포는 Conflict: RoleAssignmentExists 오류로 인해 실패합니다.

역할 할당의 범위는 배포 수준에서 결정됩니다. 리소스 그룹 범위에서 배포를 시작하는 방법에 대한 예제 New-AzResourceGroupDeploymentaz deployment group create 명령은 다음과 같습니다.

New-AzResourceGroupDeployment -ResourceGroupName ExampleGroup -TemplateFile rbac-test.json -principalId $objectid -builtInRoleType Reader
az deployment group create --resource-group ExampleGroup --template-file rbac-test.json --parameters principalId=$objectid builtInRoleType=Reader

구독 범위에서 배포를 시작하고 위치를 지정하는 방법에 대한 예제 New-AzDeploymentaz deployment sub create 명령은 다음과 같습니다.

New-AzDeployment -Location centralus -TemplateFile rbac-test.json -principalId $objectid -builtInRoleType Reader
az deployment sub create --location centralus --template-file rbac-test.json --parameters principalId=$objectid builtInRoleType=Reader

리소스 범위

리소스 수준에서 역할을 할당해야 하는 경우 역할 할당의 scope 속성을 리소스 이름으로 설정합니다.

다음 템플릿은 다음을 보여줍니다.

  • 새 스토리지 계정을 만드는 방법
  • 스토리지 계정 범위에서 사용자, 그룹 또는 애플리케이션에 역할을 할당하는 방법
  • 매개 변수로 소유자, 기여자 및 읽기 권한자 역할 지정하는 방법

템플릿을 사용하려면 다음 입력을 지정해야 합니다.

  • 역할을 할당할 사용자, 그룹, 관리 ID 또는 애플리케이션의 ID
{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "principalId": {
            "type": "string",
            "metadata": {
                "description": "The principal to assign the role to"
            }
        },
        "builtInRoleType": {
            "type": "string",
            "allowedValues": [
                "Owner",
                "Contributor",
                "Reader"
            ],
            "metadata": {
                "description": "Built-in role to assign"
            }
        },
        "roleNameGuid": {
            "type": "string",
            "defaultValue": "[newGuid()]",
            "metadata": {
                "description": "A new GUID used to identify the role assignment"
            }
        },
        "location": {
            "type": "string",
            "defaultValue": "[resourceGroup().location]"
        }
    },
    "variables": {
        "Owner": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', '8e3af657-a8ff-443c-a75c-2fe8c4bcb635')]",
        "Contributor": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]",
        "Reader": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]",
        "storageName": "[concat('storage', uniqueString(resourceGroup().id))]"
    },
    "resources": [
        {
            "apiVersion": "2019-04-01",
            "type": "Microsoft.Storage/storageAccounts",
            "name": "[variables('storageName')]",
            "location": "[parameters('location')]",
            "sku": {
                "name": "Standard_LRS"
            },
            "kind": "Storage",
            "properties": {}
        },
        {
            "type": "Microsoft.Authorization/roleAssignments",
            "apiVersion": "2022-04-01",
            "name": "[parameters('roleNameGuid')]",
            "scope": "[concat('Microsoft.Storage/storageAccounts', '/', variables('storageName'))]",
            "dependsOn": [
                "[variables('storageName')]"
            ],
            "properties": {
                "roleDefinitionId": "[variables(parameters('builtInRoleType'))]",
                "principalId": "[parameters('principalId')]"
            }
        }
    ]
}

이전 템플릿을 배포하려면 리소스 그룹 명령을 사용합니다. 리소스 범위에서 배포를 시작하는 방법에 대한 예제 New-AzResourceGroupDeploymentaz deployment group create 명령은 다음과 같습니다.

New-AzResourceGroupDeployment -ResourceGroupName ExampleGroup -TemplateFile rbac-test.json -principalId $objectid -builtInRoleType Contributor
az deployment group create --resource-group ExampleGroup --template-file rbac-test.json --parameters principalId=$objectid builtInRoleType=Contributor

다음에서는 템플릿을 배포한 후 스토리지 계정에 대한 기여자 역할을 사용자에게 할당하는 예를 보여 줍니다.

Role assignment at resource scope

새 서비스 주체

새 서비스 주체를 만들고 해당 서비스 주체에 역할을 즉시 할당하려고 하면 경우에 따라 해당 역할 할당이 실패할 수 있습니다. 예를 들어 관리 ID를 새로 만든 다음, 동일한 Azure Resource Manager 템플릿에서 해당 서비스 주체에 역할을 할당하려고 하면 역할 할당이 실패할 수 있습니다. 이 오류가 발생하는 이유는 복제 지연 때문일 수 있습니다. 서비스 주체는 한 지역에 생성됩니다. 그러나 서비스 주체를 아직 복제하지 않은 다른 지역에서 역할 할당이 발생할 수 있습니다.

이 시나리오를 해결하려면 역할 할당을 만들 때 principalType 속성을 ServicePrincipal로 설정해야 합니다. 또한 역할 할당의 apiVersion2018-09-01-preview 이상으로 설정해야 합니다. 2022-04-01은 첫 번째 안정된 버전입니다.

다음 템플릿은 다음을 보여줍니다.

  • 새 관리 ID 서비스 주체를 만드는 방법
  • principalType을 지정하는 방법
  • 리소스 그룹 범위에서 해당 서비스 주체에 기여자 역할을 할당하는 방법

템플릿을 사용하려면 다음 입력을 지정해야 합니다.

  • 관리 ID의 기본 이름. 기본 문자열을 사용할 수도 있습니다.
{
    "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "baseName": {
            "type": "string",
            "defaultValue": "msi-test"
        }
    },
    "variables": {
        "identityName": "[concat(parameters('baseName'), '-bootstrap')]",
        "bootstrapRoleAssignmentId": "[guid(concat(resourceGroup().id, 'contributor'))]",
        "contributorRoleDefinitionId": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]"
    },
    "resources": [
        {
            "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
            "name": "[variables('identityName')]",
            "apiVersion": "2018-11-30",
            "location": "[resourceGroup().location]"
        },
        {
            "type": "Microsoft.Authorization/roleAssignments",
            "apiVersion": "2022-04-01",
            "name": "[variables('bootstrapRoleAssignmentId')]",
            "dependsOn": [
                "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('identityName'))]"
            ],
            "properties": {
                "roleDefinitionId": "[variables('contributorRoleDefinitionId')]",
                "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('identityName')), '2018-11-30').principalId]",
                "principalType": "ServicePrincipal"
            }
        }
    ]
}

리소스 그룹 범위에서 배포를 시작하는 방법에 대한 예제 New-AzResourceGroupDeploymentaz deployment group create 명령은 다음과 같습니다.

New-AzResourceGroupDeployment -ResourceGroupName ExampleGroup2 -TemplateFile rbac-test.json
az deployment group create --resource-group ExampleGroup2 --template-file rbac-test.json

다음에서는 템플릿을 배포한 후 새 관리 ID 서비스 주체에 기여자 역할을 할당하는 예를 보여 줍니다.

Role assignment for a new managed identity service principal

다음 단계