다음을 통해 공유


애플리케이션 역할에 관리 ID 액세스 할당

Azure 리소스에 대한 관리 ID는 Microsoft Entra ID에서 ID를 Azure 서비스에 제공합니다. 코드에 자격 증명이 없어도 작동합니다. Azure 서비스는 Microsoft Entra 인증을 지원하는 서비스를 인증하는 데 이 ID를 사용할 수 있습니다. 애플리케이션 역할은 역할 기반 액세스 제어의 형식을 제공하며 서비스에서 권한 부여 규칙을 구현할 수 있도록 합니다.

참고 항목

애플리케이션이 수신하는 토큰은 기본 인프라에 의해 캐시됩니다. 이는 관리 ID 역할에 대한 변경 내용을 처리하는 데 상당한 시간이 걸릴 수 있음을 의미합니다. 자세한 내용은 권한 부여에 관리 ID 사용 제한을 참조하세요.

이 문서에서는 Microsoft Graph PowerShell SDK를 사용하여 다른 애플리케이션에서 노출하는 애플리케이션 역할에 관리 ID를 할당하는 방법을 알아봅니다.

필수 조건

PowerShell을 사용하여 다른 애플리케이션의 앱 역할에 관리 ID 액세스 할당

예제 스크립트를 실행하려면 다음 두 가지 옵션을 사용합니다.

  • 코드 블록의 오른쪽 위 모서리에 있는 사용해 보기 단추를 사용하여 열 수 있는 Azure Cloud Shell을 사용합니다.
  • 최신 버전의 Microsoft Graph PowerShell SDK를 설치하여 로컬에서 스크립트를 실행합니다.
  1. Azure VM과 같은 Azure 리소스에서 관리 ID를 사용하도록 설정합니다.

  2. 관리 ID의 서비스 주체의 개체 ID를 찾습니다.

    시스템 할당 관리 ID의 경우 리소스 ID 페이지의 Azure Portal에서 개체 ID를 찾을 수 있습니다. 다음 PowerShell 스크립트를 사용하여 개체 ID를 찾을 수도 있습니다. 1단계에서 만든 리소스의 리소스 ID가 필요하며 이는 리소스 속성 페이지의 Azure Portal에서 사용할 수 있습니다.

    $resourceIdWithManagedIdentity = '/subscriptions/{my subscription ID}/resourceGroups/{my resource group name}/providers/Microsoft.Compute/virtualMachines/{my virtual machine name}'
    (Get-AzResource -ResourceId $resourceIdWithManagedIdentity).Identity.PrincipalId
    

    사용자 할당 관리 ID의 경우 리소스 개요 페이지의 Azure Portal에서 관리 ID의 개체 ID를 찾을 수 있습니다. 다음 PowerShell 스크립트를 사용하여 개체 ID를 찾을 수도 있습니다. 사용자 할당 관리 ID의 리소스 ID가 필요합니다.

    $userManagedIdentityResourceId = '/subscriptions/{my subscription ID}/resourceGroups/{my resource group name}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{my managed identity name}'
    (Get-AzResource -ResourceId $userManagedIdentityResourceId).Properties.PrincipalId
    
  3. 관리 ID를 통해 요청을 보낼 서비스를 나타내는 새 애플리케이션 등록을 만듭니다.

    • 관리 ID에 앱 역할 권한을 공개적으로 부여하는 API 또는 서비스에 Microsoft Entra 테넌트의 서비스 주체가 이미 있는 경우 이 단계를 건너뜁니다. 예를 들어, Microsoft Graph API에 대한 관리 ID 액세스 권한을 부여하려는 경우입니다.
  4. 서비스 애플리케이션의 서비스 주체 개체 ID를 찾습니다. Azure Portal을 사용하여 이러한 값을 확인할 수 있습니다.

    • 예를 들어, Microsoft Entra ID로 이동하여 엔터프라이즈 애플리케이션 페이지를 엽니다. 그런 다음 애플리케이션을 찾고 개체 ID를 찾습니다.
    • 다음 PowerShell 스크립트를 사용하여 표시 이름으로 서비스 주체의 개체 ID를 찾을 수도 있습니다.
    $serverServicePrincipalObjectId = (Get-MgServicePrincipal -Filter "DisplayName eq '$applicationName'").Id
    

    참고 항목

    애플리케이션의 표시 이름은 고유하지 않으므로 올바른 애플리케이션의 서비스 주체를 찾았는지 확인해야 합니다.

  5. 이전 단계에서 만든 애플리케이션에 앱 역할을 추가합니다. 해당 역할은 Azure Portal 또는 Microsoft Graph를 사용하여 만들 수 있습니다.

    • 예를 들어, Graph 탐색기에서 다음 쿼리를 실행하여 앱 역할을 추가할 수 있습니다.
    PATCH /applications/{id}/
    
    {
        "appRoles": [
            {
                "allowedMemberTypes": [
                    "User",
                    "Application"
                ],
                "description": "Read reports",
                "id": "1e250995-3081-451e-866c-0f6efef9c638",
                "displayName": "Report reader",
                "isEnabled": true,
                "value": "report.read"
            }
        ]
    }
    
  6. 관리 ID에 앱 역할을 할당합니다. 앱 역할을 할당하려면 다음 정보가 필요합니다.

    • managedIdentityObjectId: 이전 단계에서 찾은 관리 ID 서비스 주체의 엔터티 ID입니다.
    • serverServicePrincipalObjectId: 4단계에서 찾은 서버 애플리케이션의 서비스 주체의 개체 ID입니다.
    • appRoleId: 5단계에서 생성한 서버 앱에 의해 노출된 앱 역할의 ID입니다. 예에서 앱 역할 ID는 00000000-0000-0000-0000-000000000000입니다.
    • 다음 PowerShell 명령을 실행하여 역할 할당을 추가합니다.
    New-MgServicePrincipalAppRoleAssignment `
        -ServicePrincipalId $serverServicePrincipalObjectId `
        -PrincipalId $managedIdentityObjectId `
        -ResourceId $serverServicePrincipalObjectId `
        -AppRoleId $appRoleId
    

전체 예제 스크립트

이 예제 스크립트에서는 Azure 웹앱의 관리 ID를 앱 역할에 할당하는 방법을 보여 줍니다.

# Install the module.
# Install-Module Microsoft.Graph -Scope CurrentUser

# Your tenant ID (in the Azure portal, under Azure Active Directory > Overview).
$tenantID = '<tenant-id>'

# The name of your web app, which has a managed identity that should be assigned to the server app's app role.
$webAppName = '<web-app-name>'
$resourceGroupName = '<resource-group-name-containing-web-app>'

# The name of the server app that exposes the app role.
$serverApplicationName = '<server-application-name>' # For example, MyApi

# The name of the app role that the managed identity should be assigned to.
$appRoleName = '<app-role-name>' # For example, MyApi.Read.All

# Look up the web app's managed identity's object ID.
$managedIdentityObjectId = (Get-AzWebApp -ResourceGroupName $resourceGroupName -Name $webAppName).identity.principalid

Connect-MgGraph -TenantId $tenantId -Scopes 'Application.Read.All','Application.ReadWrite.All','AppRoleAssignment.ReadWrite.All','Directory.AccessAsUser.All','Directory.Read.All','Directory.ReadWrite.All'

# Look up the details about the server app's service principal and app role.
$serverServicePrincipal = (Get-MgServicePrincipal -Filter "DisplayName eq '$serverApplicationName'")
$serverServicePrincipalObjectId = $serverServicePrincipal.Id
$appRoleId = ($serverServicePrincipal.AppRoles | Where-Object {$_.Value -eq $appRoleName }).Id

# Assign the managed identity access to the app role.
New-MgServicePrincipalAppRoleAssignment `
    -ServicePrincipalId $serverServicePrincipalObjectId `
    -PrincipalId $managedIdentityObjectId `
    -ResourceId $serverServicePrincipalObjectId `
    -AppRoleId $appRoleId

CLI를 사용하여 다른 애플리케이션의 앱 역할에 관리 ID 액세스 할당

  1. Azure Virtual Machines와 같은 Azure 리소스에서 관리 ID를 사용하도록 설정합니다.

  2. 관리 ID의 서비스 주체의 개체 ID를 찾습니다.

    • 시스템 할당 관리 ID의 경우 리소스 ID 페이지의 Azure Portal에서 개체 ID를 찾을 수 있습니다.
    • 다음 스크립트를 사용하여 개체 ID를 찾을 수도 있습니다. 이전 단계에서 만든 리소스의 리소스 ID가 필요합니다. 이 ID는 리소스의 속성 페이지에 있는 Azure Portal에서 사용할 수 있습니다.
    resourceIdWithManagedIdentity="/subscriptions/{my subscription ID}/resourceGroups/{my resource group name}/providers/Microsoft.Compute/virtualMachines/{my virtual machine name}"
    
    oidForMI=$(az resource show --ids $resourceIdWithManagedIdentity --query "identity.principalId" -o tsv | tr -d '[:space:]')
    echo "object id for managed identity is: $oidForMI"
    
    • 사용자 할당 관리 ID의 경우 리소스 개요 페이지의 Azure Portal에서 관리 ID의 개체 ID를 찾을 수 있습니다. 다음 스크립트를 사용하여 개체 ID를 찾을 수도 있습니다. 사용자 할당 관리 ID의 리소스 ID가 필요합니다.
    userManagedIdentityResourceId="/subscriptions/{my subscription ID}/resourceGroups/{my resource group name}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{my managed identity name}"
    
    oidForMI=$(az resource show --id $userManagedIdentityResourceId --query "properties.principalId" -o tsv | tr -d '[:space:]')
    echo "object id for managed identity is: $oidForMI"
    
  3. 관리 ID가 요청을 보내는 서비스를 나타내는 새 애플리케이션 등록을 만듭니다.

    • 관리 ID에 앱 역할 권한을 공개적으로 부여하는 API 또는 서비스에 Microsoft Entra 테넌트의 서비스 주체가 이미 있는 경우 이 단계를 건너뜁니다.
  4. 서비스 애플리케이션의 서비스 주체 개체 ID를 찾습니다. Azure Portal을 사용하여 이러한 값을 확인할 수 있습니다.

    • Microsoft Entra ID로 이동하여 엔터프라이즈 애플리케이션 페이지를 연 다음 애플리케이션을 찾고 개체 ID를 찾습니다.
    • 다음 스크립트를 사용하여 표시 이름으로 서비스 주체의 개체 ID를 찾을 수도 있습니다.
    appName="{name for your application}"
    serverSPOID=$(az ad sp list --filter "displayName eq '$appName'" --query '[0].id' -o tsv | tr -d '[:space:]')
    echo "object id for server service principal is: $serverSPOID"
    

    참고 항목

    애플리케이션의 표시 이름은 고유하지 않으므로 올바른 애플리케이션의 서비스 주체를 찾았는지 확인해야 합니다.

    또는 애플리케이션 등록에 대한 고유한 애플리케이션 ID로 개체 ID를 찾을 수 있습니다.

    appID="{application id for your application}"
    serverSPOID=$(az ad sp list --filter "appId eq '$appID'" --query '[0].id' -o tsv | tr -d '[:space:]')
    echo "object id for server service principal is: $serverSPOID"
    
  5. 이전 단계에서 만든 애플리케이션에 앱 역할을 추가합니다. 해당 역할은 Azure Portal 또는 Microsoft Graph를 통해 만들 수 있습니다. 예를 들어 다음과 같이 앱 역할을 추가할 수 있습니다.

    {
        "allowedMemberTypes": [
            "Application"
        ],
        "displayName": "Read data from MyApi",
        "id": "0566419e-bb95-4d9d-a4f8-ed9a0f147fa6",
        "isEnabled": true,
        "description": "Allow the application to read data as itself.",
        "value": "MyApi.Read.All"
    }
    
  6. 관리 ID에 앱 역할을 할당합니다. 앱 역할을 할당하려면 다음 정보가 필요합니다.

    • managedIdentityObjectId: 2단계에서 찾은 관리 ID의 서비스 주체의 개체 ID입니다.
    • serverServicePrincipalObjectId: 4단계에서 찾은 서버 애플리케이션의 서비스 주체의 개체 ID입니다.
    • appRoleId: 5단계에서 생성한 서버 앱에 의해 노출된 앱 역할의 ID입니다. 예에서 앱 역할 ID는 00000000-0000-0000-0000-000000000000입니다.
  7. 다음 스크립트를 실행하여 역할 할당을 추가합니다. 이 기능은 Azure CLI에 직접 노출되지 않으며 여기에서는 대신 REST 명령이 사용됩니다.

    roleguid="00000000-0000-0000-0000-000000000000"
    az rest -m POST -u https://graph.microsoft.com/v1.0/servicePrincipals/$oidForMI/appRoleAssignments -b "{\"principalId\": \"$oidForMI\", \"resourceId\": \"$serverSPOID\",\"appRoleId\": \"$roleguid\"}"
    

다음 단계