PowerShell을 사용하여 애플리케이션 역할에 관리 ID 액세스 권한 할당

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

참고 항목

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

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

필수 조건

다른 애플리케이션의 앱 역할에 관리 ID 액세스 권한 할당

  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. 3단계에서 만든 애플리케이션에 앱 역할을 추가합니다. 해당 역할은 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: 2단계에서 찾은 관리 ID의 서비스 주체의 개체 ID입니다.
    • serverServicePrincipalObjectId: 4단계에서 찾은 서버 애플리케이션의 서비스 주체의 개체 ID입니다.
    • appRoleId: 5단계에서 생성한 서버 앱에 의해 노출된 앱 역할의 ID입니다. 예에서 앱 역할 ID는 0566419e-bb95-4d9d-a4f8-ed9a0f147fa6입니다.

    다음 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

다음 단계