Python용 Azure SDK를 사용하여 Azure 리소스에 Azure 호스팅 앱 인증

Azure 앱 Service, Azure Virtual Machines 또는 Azure Container Instances와 같은 서비스를 사용하여 Azure에서 앱을 호스트하는 경우 Azure 리소스에 앱을 인증하는 데 권장되는 방법은 관리 ID를 사용하는 것입니다.

관리 ID는 비밀 키나 다른 애플리케이션 비밀을 사용할 필요 없이 다른 Azure 리소스에 연결할 수 있도록 앱에 대한 ID를 제공합니다. 내부적으로 Azure는 앱의 ID와 연결이 허용되는 리소스를 알고 있습니다. Azure는 이 정보를 사용하여 애플리케이션 비밀을 관리할 필요 없이 앱이 다른 Azure 리소스에 연결할 수 있도록 허용하는 Microsoft Entra 토큰을 자동으로 가져옵니다.

관리 ID 유형

두 가지 종류의 관리 ID가 있습니다.

  • 시스템 할당 관리 ID - 이 형식의 관리 ID는 Azure 리소스에 의해 제공되며 Azure 리소스에 직접 연결됩니다. Azure 리소스에서 관리 ID를 사용하도록 설정하면 해당 리소스에 대해 시스템이 할당한 관리 ID를 가져오게 됩니다. 시스템 할당 관리 ID는 연결된 Azure 리소스의 수명 주기에 연결됩니다. 리소스가 삭제되면 Azure에서 자동으로 ID를 삭제합니다. 코드를 호스트하는 Azure 리소스에 대해 관리 ID를 사용하도록 설정하기만 하면 되므로 이 방법은 가장 쉬운 유형의 관리 ID입니다.
  • 사용자 할당 관리 ID - 독립 실행형 Azure 리소스로 관리 ID를 만들 수도 있습니다. 이 방법은 솔루션에 동일한 ID와 동일한 권한을 모두 공유해야 하는 여러 Azure 리소스에서 실행되는 여러 워크로드가 있는 경우에 가장 자주 사용됩니다. 예를 들어 솔루션에 동일한 Azure 리소스 집합에 대한 액세스가 필요한 여러 App Service 및 가상 머신 인스턴스에서 실행되는 구성 요소가 있는 경우 해당 리소스에서 사용되는 사용자 할당 관리 ID가 적합합니다.

이 문서에서는 앱에 대해 시스템 할당 관리 ID를 사용하도록 설정하고 사용하는 단계를 설명합니다. 사용자 할당 관리 ID를 사용해야 하는 경우 사용자 할당 관리 ID 관리 문서를 참조하여 사용자 할당 관리 ID를 만드는 방법을 알아봅니다.

1 - 앱을 호스팅하는 Azure 리소스에서 관리 ID 사용

첫 번째 단계는 앱을 호스팅하는 Azure 리소스에서 관리 ID를 사용하도록 설정하는 것입니다. 예를 들어 Azure 앱 Service를 사용하여 Django 애플리케이션을 호스팅하는 경우 앱을 호스팅하는 App Service 웹앱에 대한 관리 ID를 사용하도록 설정해야 합니다. 가상 머신을 사용하여 앱을 호스트하는 경우 VM에서 관리 ID를 사용하도록 설정합니다.

Azure Portal 또는 Azure CLI를 사용하여 Azure 리소스에 관리 ID를 사용할 수 있습니다.

Azure CLI 명령은 Azure Cloud Shell에서 실행하거나 Azure CLI가 설치된 워크스테이션에서 실행할 수 있습니다.

Azure 리소스에 대한 관리 ID를 사용하도록 설정하는 데 사용되는 Azure CLI 명령은 az <command-group> identity --resource-group <resource-group-name> --name <resource-name> 형식입니다. 널리 사용되는 Azure 서비스에 대한 특정 명령은 다음과 같습니다.

az webapp identity assign --resource-group <resource-group-name> -name <web-app-name>

출력은 다음과 같이 표시됩니다.

{
  "principalId": "99999999-9999-9999-9999-999999999999",
  "tenantId": "33333333-3333-3333-3333-333333333333",
  "type": "SystemAssigned",
  "userAssignedIdentities": null
}

principalId 값은 관리 ID의 고유 ID입니다. 다음 단계에서 이러한 값이 필요하므로 이 출력의 복사본을 보관합니다.

2 - 관리 ID에 역할 할당

다음으로, 앱에 필요한 역할(권한)을 결정하고 Azure에서 해당 역할에 관리 ID를 할당해야 합니다. 관리 ID에는 리소스, 리소스 그룹 또는 구독 범위에서 역할을 할당할 수 있습니다. 이 예제에서는 대부분의 애플리케이션이 모든 Azure 리소스를 단일 리소스 그룹으로 그룹화하기 때문에 리소스 그룹 범위에서 역할을 할당하는 방법을 보여 줍니다.

관리 ID에는 az role assignment create 명령을 사용하여 Azure의 역할이 할당됩니다. 담당자의 경우 1단계에서 복사한 항목을 사용합니다 principalId .

az role assignment create --assignee {managedIdentityprincipalId} \
    --scope /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName} \
    --role "{roleName}" 

서비스 주체를 할당할 수 있는 역할 이름을 가져오려면 az role definition list 명령을 사용합니다.

az role definition list \
    --query "sort_by([].{roleName:roleName, description:description}, &roleName)" \
    --output table

예를 들어 ID가 있는 구독의 msdocs-python-sdk-auth-example 리소스 그룹에 있는 모든 스토리지 계정의 99999999-9999-9999-9999-999999999999 Azure Storage Blob 컨테이너 및 데이터에 대한 읽기, 쓰기 및 삭제 액세스 권한이 있는 관리 ID11111111-1111-1111-1111-111111111111를 허용하려면 다음 명령을 사용하여 애플리케이션 서비스 주체를 Storage Blob 데이터 기여자 역할에 할당합니다.

az role assignment create --assignee 99999999-9999-9999-9999-999999999999 \
    --scope /subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/msdocs-python-sdk-auth-example \
    --role "Storage Blob Data Contributor"

Azure CLI를 사용하여 리소스 또는 구독 수준에서 권한을 할당하는 방법에 대한 자세한 내용은 Azure CLI를 사용하여 Azure 역할 할당 문서를 참조하세요.

3 - 애플리케이션에 DefaultAzureCredential 구현

코드가 Azure에서 실행되고 앱이 호스트 DefaultAzureCredential 되는 Azure 리소스에서 관리 ID를 사용하도록 설정된 경우 다음 순서대로 사용할 자격 증명이 결정됩니다.

  1. 환경 변수AZURE_CLIENT_IDAZURE_TENANT_ID에 정의된 대로 환경의 서비스 주체를 확인하고(선택 사항) 중 하나 AZURE_CLIENT_SECRET 또는 AZURE_CLIENT_CERTIFICATE_PATH (선택 사항) AZURE_CLIENT_CERTIFICATE_PASSWORD
  2. 사용자가 할당한 관리 ID에 대한 키워드(keyword) 매개 변수를 확인합니다. 매개 변수에서 클라이언트 ID를 지정하여 사용자 할당 관리 ID managed_identity_client_id 를 전달할 수 있습니다.
  3. AZURE_CLIENT_ID 사용자 할당 관리 ID의 클라이언트 ID에 대한 환경 변수를 확인합니다.
  4. 사용하도록 설정된 경우 Azure 리소스에 대해 시스템 할당 관리 ID를 사용합니다.

키워드(keyword) 매개 변수True를 설정하여 자격 증명에서 관리 ID를 제외할 exclude_managed_identity_credential 수 있습니다.

이 문서에서는 Azure 앱 Service 웹앱에 시스템 할당 관리 ID를 사용하므로 환경에서 관리 ID를 구성하거나 매개 변수로 전달할 필요가 없습니다. 다음 단계에서 DefaultAzureCredential는 .

먼저 애플리케이션에 azure.identity 패키지를 추가합니다.

pip install azure-identity

다음으로, 앱에서 Azure SDK 클라이언트 개체를 만드는 Python 코드의 경우 다음을 수행합니다.

  1. 모듈에서 DefaultAzureCredential 클래스를 azure.identity 가져옵니다.
  2. DefaultAzureCredential 개체를 만듭니다.
  3. 개체를 DefaultAzureCredential Azure SDK 클라이언트 개체 생성자에 전달합니다.

이러한 단계의 예는 다음 코드 세그먼트에 나와 있습니다.

from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient

# Acquire a credential object
token_credential = DefaultAzureCredential()

blob_service_client = BlobServiceClient(
        account_url="https://<my_account_name>.blob.core.windows.net",
        credential=token_credential)

Python용 Azure SDK 인증 개요 문서에서 DefaultAzureCredential 설명한 대로 여러 인증 방법을 지원하고 런타임에 사용되는 인증 방법을 결정합니다. 이 방법의 이점은 앱이 환경별 코드를 구현하지 않고도 다양한 환경에서 다양한 인증 방법을 사용할 수 있다는 것입니다. 로컬 개발 DefaultAzureCredential 중에 워크스테이션에서 위의 코드를 실행하는 경우 환경 설정에 따라 결정된 애플리케이션 서비스 주체 또는 개발자 도구 자격 증명을 사용하여 다른 Azure 리소스로 인증합니다. 따라서 동일한 코드를 사용하여 로컬 개발 중 및 Azure에 배포하는 동안 Azure 리소스에 앱을 인증할 수 있습니다.