Microsoft Entra로 보호된 엔드포인트에 이벤트 배달

이 문서에서는 Microsoft Entra ID를 사용하여 이벤트 구독웹후크 엔드포인트 간의 연결을 보호하는 방법을 설명합니다. 데모를 위해 Azure Portal을 사용하지만 CLI, PowerShell 또는 SDK를 사용하여 이 기능을 사용하도록 설정할 수도 있습니다.

Important

보안 취약성을 해결하기 위해 2021년 3월 30일에 이벤트 구독을 만들거나 업데이트하는 과정의 일부로 추가 액세스 검사가 도입되었습니다. 구독자 클라이언트의 서비스 주체는 소유자이거나 대상 애플리케이션 서비스 주체에 할당된 역할이 있어야 합니다. 아래의 새 지침에 따라 Microsoft Entra 애플리케이션을 다시 구성합니다. Microsoft Entra 애플리케이션 및 서비스 주체에 대한 개요는 Microsoft ID 플랫폼(v2.0) 개요를 참조하세요.

시나리오

이 문서에서는 다음 두 가지 시나리오를 구현하는 방법을 자세히 설명합니다.

동일한 Microsoft Entra 테넌트에서 웹후크에 이벤트 배달

다음 다이어그램은 Event Grid 이벤트가 이벤트 구독과 동일한 테넌트의 웹후크에 전달되는 방식을 보여 줍니다.

Image that depicts secure delivery of events to a webhook that's in the same tenant.

이 섹션에는 두 개의 하위 섹션이 있습니다. 모든 시나리오 또는 관심 있는 시나리오를 모두 읽으세요.

Microsoft Entra 사용자를 사용하여 이벤트 구독 구성

이 섹션에서는 Microsoft Entra 사용자를 사용하여 이벤트 구독을 구성하는 방법을 보여줍니다.

  1. Microsoft Entra(단일 테넌트)와 함께 작동하도록 구성된 웹후크용 Microsoft Entra 애플리케이션을 만듭니다.

  2. 테넌트에서 Azure Shell을 열고 PowerShell 환경을 선택합니다.

  3. 테넌트에 연결하도록 $webhookAadTenantId 값을 수정합니다.

    • 변수:
      • $webhookAadTenantId: Azure 테넌트 ID
    $webhookAadTenantId = "[REPLACE_WITH_YOUR_TENANT_ID]"
    Connect-MgGraph -TenantId $webhookAadTenantId -Scopes "Application.ReadWrite.All, AppRoleAssignment.ReadWrite.All"
    
  4. 다음 스크립트를 열고 $webhookAppObjectId$eventSubscriptionWriterUserPrincipalName 값을 식별자로 업데이트한 다음, 스크립트를 계속 실행합니다.

    • 변수:
      • $webhookAppObjectId: 웹후크용으로 만든 Microsoft Entra 애플리케이션 ID
      • $eventSubscriptionWriterUserPrincipalName: 이벤트 구독을 만든 사용자의 Azure 사용자 계정 이름

    참고 항목

    $eventGridAppId 값을 수정할 필요가 없습니다. 이 스크립트에서 AzureEventGridSecureWebhookSubscriber$eventGridRoleName에 대해 설정됩니다. 이 스크립트를 실행하려면 Microsoft Entra 애플리케이션 관리자 역할의 멤버이거나 Microsoft Entra에서 웹후크 앱의 서비스 주체 소유자여야 합니다.

    다음 오류 메시지가 표시되면 서비스 주체로 승격해야 합니다. 보안 취약성을 해결하기 위해 2021년 3월 30일에 이벤트 구독을 만들거나 업데이트하는 과정의 일부로 추가 액세스 검사가 도입되었습니다. 구독자 클라이언트의 서비스 주체는 소유자이거나 대상 애플리케이션 서비스 주체에 할당된 역할이 있어야 합니다.

    New-MgServicePrincipalAppRoleAssignment: Error occurred while executing NewServicePrincipalAppRoleAssignment
    Code: Authorization_RequestDenied
    Message: Insufficient privileges to complete the operation.
    
  5. 포털에서 이벤트 구독을 만들 때 다음 단계를 수행합니다.

    1. 엔드포인트 유형을 웹후크로 선택합니다.

    2. 엔드포인트 URI를 지정합니다.

      Select endpoint type webhook

    3. 이벤트 구독 만들기 페이지의 위쪽에서 추가 기능 탭을 선택합니다.

    4. 추가 기능 탭에서 다음 단계를 수행합니다.

      1. Microsoft Entra 인증 사용을 선택하고 테넌트 ID 및 애플리케이션 ID를 구성합니다.

      2. 스크립트의 출력에서 Microsoft Entra 테넌트 ID를 복사하고 Microsoft Entra 테넌트 ID 필드에 입력합니다.

      3. 스크립트의 출력에서 Microsoft Entra 애플리케이션 ID를 복사하고 Microsoft Entra 애플리케이션 ID 필드에 입력합니다. 애플리케이션 ID를 사용하는 대신 Microsoft Entra 애플리케이션 ID URI를 사용할 수 있습니다. 애플리케이션 ID URI에 대한 자세한 내용은 이 문서를 참조하세요.

        Secure Webhook action

Microsoft Entra 애플리케이션을 사용하여 이벤트 구독 구성

이 섹션에서는 Microsoft Entra 애플리케이션을 사용하여 이벤트 구독을 구성하는 방법을 보여줍니다.

  1. Microsoft Entra(단일 테넌트)에서 작동하도록 구성된 Event Grid 구독 작성기용 Microsoft Entra 애플리케이션을 만듭니다.

  2. Microsoft Entra 애플리케이션의 비밀을 만들고 값을 저장합니다(나중에 이 값이 필요함).

  3. Event Grid 항목에 대한 IAM(액세스 제어) 페이지로 이동하고 Event Grid 구독 작성자 앱에 Event Grid 기여자 역할을 할당합니다. 이 단계를 통해 Azure CLI를 사용하여 Microsoft Entra 애플리케이션으로 Azure에 로그인할 때 Event Grid 리소스에 액세스할 수 있습니다.

  4. Microsoft Entra(단일 테넌트)와 함께 작동하도록 구성된 웹후크용 Microsoft Entra 애플리케이션을 만듭니다.

  5. 테넌트에서 Azure Shell을 열고 PowerShell 환경을 선택합니다.

  6. 테넌트에 연결하도록 $webhookAadTenantId 값을 수정합니다.

    • 변수:
      • $webhookAadTenantId: Azure 테넌트 ID
    $webhookAadTenantId = "[REPLACE_WITH_YOUR_TENANT_ID]"
    Connect-MgGraph -TenantId $webhookAadTenantId -Scopes "Application.ReadWrite.All, AppRoleAssignment.ReadWrite.All"
    
  7. 다음 스크립트를 열고 $webhookAppObjectId$eventSubscriptionWriterAppId 값을 식별자로 업데이트한 다음, 스크립트를 계속 실행합니다.

    • 변수:
      • $webhookAppObjectId: 웹후크용으로 만든 Microsoft Entra 애플리케이션 ID
      • $eventSubscriptionWriterAppId: Event Grid 구독 작성기 앱에 대한 Microsoft Entra 애플리케이션 ID입니다.

    참고 항목

    $eventGridAppId의 값을 수정할 필요가 없습니다. 이 스크립트에서 AzureEventGridSecureWebhookSubscriber$eventGridRoleName에 대해 설정됩니다. 이 스크립트를 실행하려면 Microsoft Entra 애플리케이션 관리자 역할의 멤버이거나 Microsoft Entra에서 웹후크 앱의 서비스 주체 소유자여야 합니다.

  8. 명령을 실행하여 Event Grid 구독 작성기 Microsoft Entra 애플리케이션으로 로그인합니다.

    az login --service-principal -u [REPLACE_WITH_EVENT_GRID_SUBSCRIPTION_WRITER_APP_ID] -p [REPLACE_WITH_EVENT_GRID_SUBSCRIPTION_WRITER_APP_SECRET_VALUE] --tenant [REPLACE_WITH_TENANT_ID]
    
  9. 명령을 실행하여 구독을 만듭니다.

    az eventgrid system-topic event-subscription create --name [REPLACE_WITH_SUBSCRIPTION_NAME] -g [REPLACE_WITH_RESOURCE_GROUP] --system-topic-name [REPLACE_WITH_SYSTEM_TOPIC] --endpoint [REPLACE_WITH_WEBHOOK_ENDPOINT] --event-delivery-schema [REPLACE_WITH_WEBHOOK_EVENT_SCHEMA] --azure-active-directory-tenant-id [REPLACE_WITH_TENANT_ID] --azure-active-directory-application-id-or-uri [REPLACE_WITH_APPLICATION_ID_FROM_SCRIPT] --endpoint-type webhook
    

    참고 항목

    이 시나리오는 시스템 항목을 사용합니다. Azure CLI를 사용하여 사용자 지정 항목 또는 도메인에 대한 구독을 만들려면 CLI 참조를 확인합니다.

  10. 모든 항목이 올바르게 구성된 경우 Event Grid 토픽에서 웹후크 구독을 성공적으로 만들 수 있습니다.

    참고 항목

    이 시점에서 Event Grid는 이제 모든 메시지의 웹후크 클라이언트에 Microsoft Entra 전달자 토큰을 배달합니다. 웹후크에서 권한 부여 토큰의 유효성을 검사해야 합니다.

다른 Microsoft Entra 테넌트에서 웹후크에 이벤트 배달

이벤트 구독과 다른 Microsoft Entra 테넌트에 있는 웹후크 엔드포인트 간의 연결을 보호하려면 이 섹션에 표시된 대로 Microsoft Entra ID 애플리케이션을 사용해야 합니다. 현재 Azure Portal에서 Microsoft Entra 사용자를 사용하여 이 연결을 보호할 수 없습니다.

Multitenant events with Microsoft Entra ID and Webhooks

다이어그램을 기반으로 다음 단계에 따라 두 테넌트를 모두 구성합니다.

테넌트 A

테넌트 A에서 다음 단계를 수행합니다.

  1. 모든 Microsoft Entra(다중 테넌트)와 함께 작동하도록 구성된 Event Grid 구독 작성기용 Microsoft Entra 애플리케이션을 만듭니다.

  2. Microsoft Entra 애플리케이션의 비밀을 만들고, 값을 저장합니다(나중에 이 값이 필요함).

  3. Event Grid 토픽에 대한 액세스 제어(IAM) 페이지로 이동합니다. Event Grid 구독 작성자의 Microsoft Entra 애플리케이션에 Event Grid 기여자 역할을 할당합니다. 이 단계를 통해 Azure CLI를 사용하여 Microsoft Entra 애플리케이션으로 Azure에 로그인할 때 애플리케이션이 Event Grid 리소스에 액세스할 수 있습니다.

테넌트 B

테넌트 B에서 다음 단계를 수행합니다.

  1. Microsoft Entra(단일 테넌트)와 함께 작동하도록 구성된 웹후크용 Microsoft Entra 애플리케이션을 만듭니다.

  2. Azure Shell을 열고 PowerShell 환경을 선택합니다.

  3. 테넌트 B에 연결하도록 $webhookAadTenantId 값을 수정합니다.

    • Variables:

      • $webhookAadTenantId: 테넌트 B의 Azure 테넌트 ID
      $webhookAadTenantId = "[REPLACE_WITH_YOUR_TENANT_ID]"
      Connect-MgGraph -TenantId $webhookAadTenantId -Scopes "Application.ReadWrite.All, AppRoleAssignment.ReadWrite.All"
      
  4. 다음 스크립트를 열고 $webhookAppObjectId$eventSubscriptionWriterAppId 값을 식별자로 업데이트한 다음, 스크립트를 계속 실행합니다.

    • 변수:
      • $webhookAppObjectId: 웹후크용으로 만든 Microsoft Entra 애플리케이션 ID

      • $eventSubscriptionWriterAppId: Event Grid 구독 작성기에 대한 Microsoft Entra 애플리케이션 ID입니다

        참고 항목

        $eventGridAppId의 값을 수정할 필요가 없습니다. 이 스크립트에서 AzureEventGridSecureWebhookSubscriber$eventGridRoleName에 대해 설정됩니다. 이 스크립트를 실행하려면 Microsoft Entra 애플리케이션 관리자 역할의 멤버이거나 Microsoft Entra에서 웹후크 앱의 서비스 주체 소유자여야 합니다.

    다음 오류 메시지가 표시되면 서비스 주체로 승격해야 합니다. 보안 취약성을 해결하기 위해 2021년 3월 30일에 이벤트 구독을 만들거나 업데이트하는 과정의 일부로 추가 액세스 검사가 도입되었습니다. 구독자 클라이언트의 서비스 주체는 소유자이거나 대상 애플리케이션 서비스 주체에 할당된 역할이 있어야 합니다.

    New-MgServicePrincipalAppRoleAssignment: Error occurred while executing NewServicePrincipalAppRoleAssignment
    Code: Authorization_RequestDenied
    Message: Insufficient privileges to complete the operation.
    

테넌트 A

테넌트 A로 돌아가서 다음 단계를 수행합니다.

  1. Azure Shell을 열고 명령을 실행하여 Event Grid 구독 작성기 Microsoft Entra 애플리케이션으로 로그인합니다.

    az login --service-principal -u [REPLACE_WITH_APP_ID] -p [REPLACE_WITH_SECRET_VALUE] --tenant [REPLACE_WITH_TENANT_ID]
    
  2. 명령을 실행하여 구독을 만듭니다.

    az eventgrid system-topic event-subscription create --name [REPLACE_WITH_SUBSCRIPTION_NAME] -g [REPLACE_WITH_RESOURCE_GROUP] --system-topic-name [REPLACE_WITH_SYSTEM_TOPIC] --endpoint [REPLACE_WITH_WEBHOOK_ENDPOINT] --event-delivery-schema [REPLACE_WITH_WEBHOOK_EVENT_SCHEMA] --azure-active-directory-tenant-id [REPLACE_WITH_TENANT_B_ID] --azure-active-directory-application-id-or-uri [REPLACE_WITH_APPLICATION_ID_FROM_SCRIPT] --endpoint-type webhook
    

    참고 항목

    이 시나리오에서는 Event Grid 시스템 토픽을 사용합니다. Azure CLI를 사용하여 사용자 지정 토픽 또는 Event Grid 도메인에 대한 구독을 만들려면 여기를 참조하세요.

  3. 모든 항목이 올바르게 구성된 경우 Event Grid 토픽에서 웹후크 구독을 성공적으로 만들 수 있습니다.

    참고 항목

    이 시점에서 Event Grid는 이제 모든 메시지의 웹후크 클라이언트에 Microsoft Entra 전달자 토큰을 배달합니다. 웹후크에서 권한 부여 토큰의 유효성을 검사해야 합니다.

다음 단계