Python용 Azure SDK 라이브러리의 권한 부여

Azure의 권한 부여는 인증된 사용자 또는 서비스가 리소스에 대해 수행할 수 있는 작업을 결정합니다. 이 문서에서는 모델, 구현, 문제 해결 및 모범 사례를 다루는 Python용 Azure SDK를 사용하여 권한 부여를 구현하는 방법을 살펴봅니다. 자세한 인증 설정은 Azure에 대한 Python 앱 인증을 참조하세요.

소개

인증(AuthN) 은 사용자 또는 서비스의 ID를 확인하고 인증(AuthZ) 은 수행할 수 있는 작업을 정의합니다. Azure에서 권한 부여는 애플리케이션 및 데이터를 보호하는 데 중요한 리소스에 대한 보안 액세스를 보장합니다. 개발자는 Python용 Azure SDK를 사용하여 강력한 권한 부여를 구현하여 리소스 관리에서 서비스별 데이터에 액세스하는 것까지 다양한 워크플로의 액세스를 제어할 수 있습니다.

Azure 권한 부여 모델

Azure는 액세스를 관리하는 여러 권한 부여 메커니즘을 제공합니다. 이러한 모델을 이해하는 것은 효과적인 액세스 제어에 필수적입니다.

Azure 역할 기반 액세스 제어

Azure RBAC(Role-Based Access Control )는 구독 또는 리소스 그룹과 같은 범위에서 ID에 역할을 할당합니다. 기본 제공 역할에는 소유자, 기여자 및 읽기 권한자가 포함되며 사용자 지정 역할은 맞춤형 권한을 허용합니다. 특정 범위에서 역할을 할당하면 ID(예: 사용자 또는 서비스)는 해당 범위 내의 모든 리소스 및 해당 자식 범위에 대한 권한을 가져옵니다. 예를 들어 구독 수준에서 기여자 역할을 할당하면 해당 구독의 모든 리소스를 관리할 수 있습니다. Azure RBAC에 대한 이해 범위를 참조하세요.

서비스별 메커니즘

일부 Azure 서비스는 고유한 권한 부여 방법을 제공합니다.

Python용 Azure SDK에서 권한 부여 사용

Python용 Azure SDK는 패키지를 통해 azure-identity 인증 및 권한 부여를 처리하기 위한 기본 제공 지원을 제공합니다. 이 클래스는 DefaultAzureCredential 다양한 환경에 맞게 조정되는 관리 ID 및 서비스 주체와 같은 다양한 인증 메커니즘을 지원합니다.

예: 리소스 그룹 나열

이 예제에서는 Python용 Azure SDK가 자격 증명을 사용하여 인증 DefaultAzureCredential하는 방법과 인증에 따라 ID가 리소스 그룹을 성공적으로 나열할 수 있는지 여부를 결정하는 방법을 보여 줍니다. ID에 구독 또는 리소스 그룹 범위에 대한 읽기 권한자 이상의 역할이 없는 경우 이 호출은 403 사용할 수 없음 오류를 반환합니다.

from azure.identity import DefaultAzureCredential
from azure.mgmt.resource import ResourceManagementClient

credential = DefaultAzureCredential()
client = ResourceManagementClient(credential, "<subscription-id>")
resource_groups = client.resource_groups.list()
for rg in resource_groups:
    print(rg.name)

Azure 구독 ID로 <subscription-id>를 교체하세요. 이 ID는 일반적으로 00000000-0000-0000-0000-000000000000 형식입니다.

범위가 있는 Microsoft Graph

Microsoft Graph에 액세스하려면 위임된 권한과 애플리케이션 권한을 모두 지원하는 Python용 공식 Microsoft Graph SDK를 사용합니다.

이 예제에서는 SDK가 자격 증명을 사용하여 필요한 권한 부여 범위 https://graph.microsoft.com/.default 로 액세스 토큰을 요청하고 Microsoft Graph 리소스에 액세스하는 방법을 보여 줍니다. 사용자 데이터를 검색하려면 적절한 애플리케이션 권한(예: User.Read.All)을 사용하여 Microsoft Entra ID에서 ID에 권한을 부여해야 합니다. 그렇지 않으면 403 사용할 수 없음으로 요청이 실패합니다.

중요합니다

앱 또는 ID에 Microsoft Entra ID에서 User.Read.All 또는 기타 필수 권한이 부여되었는지 확인합니다.

from azure.identity import DefaultAzureCredential
from msgraph.core import GraphClient

credential = DefaultAzureCredential()
client = GraphClient(credential=credential, scopes=["https://graph.microsoft.com/.default"])

response = client.get("/users")
users = response.json().get("value", [])
for user in users:
    print(user["displayName"])

Microsoft Graph를 사용하여 공식 Python 앱 빌드 자습서에서 이 SDK에 대해 자세히 알아봅니다.

권한 부여 오류 진단

권한 부여 문제로 인해 HTTP 403 사용할 수 없음 오류가 발생하는 경우가 많으며 이는 권한이 부족함을 나타냅니다. 이러한 문제를 진단하려면 다음을 수행합니다.

  • 오류 메시지 확인: 누락된 권한에 대한 자세한 내용은 응답을 검토합니다.

  • 로깅 사용: Python 로깅을 사용하여 요청 및 응답을 검사합니다.

    import logging
    logging.basicConfig(level=logging.DEBUG)
    
  • 액세스 확인: Azure CLI 또는 Azure 포털을 사용하여 역할 할당을 확인합니다.

    az role assignment list --assignee <principal-id> --scope <scope>
    

    사용자, 서비스 주체 또는 관리 ID의 개체 ID로 <principal-id>을(를) 바꾸세요. Azure 리소스 범위, 예를 들어 구독 ID, 리소스 그룹 이름 또는 리소스로 <scope>을(를) 대체합니다. 범위를 사용한 작업을 참조하세요.

작업 범위 관리

다음 예제와 같이 범위를 제공해야 하는 경우가 많습니다.

az role assignment list \
    --assignee <principal-id> \
    --scope <scope>

다음은 몇 가지 일반적인 범위 형식입니다.

범위 수준 예제 값
Subscription /subscriptions/<subscription-id>
리소스 그룹 /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>
리소스 이름 /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/<provider-namespace>/<resource-type>/<resource-name>

예를 들어 리소스 그룹 수준에서 관리 ID에 대한 모든 역할 할당을 나열하려면 다음을 수행합니다.

az role assignment list \
  --assignee 12345678-90ab-cdef-1234-567890abcdef \
  --scope /subscriptions/<subscription-id>/resourceGroups/my-resource-group

또는 구독 수준에서 다음을 수행합니다.

az role assignment list \
  --assignee 12345678-90ab-cdef-1234-567890abcdef \
  --scope /subscriptions/<subscription-id>

사용자 또는 관리 ID의 개체 ID(<principal-id>)를 검색하려면 다음을 사용합니다.

az ad user show --id <user-email> --query id
az identity show --name <identity-name> --resource-group <rg-name> --query principalId

액세스 관리

다음을 사용하여 역할 할당을 통해 액세스를 관리합니다.

  • Azure 포털: IAM(액세스 제어) 서비스 메뉴를 통해 역할을 추가합니다.

  • Azure CLI:

    az role assignment create --assignee <principal-id> --role <role-name> --scope <scope>
    

    사용자, 서비스 주체 또는 관리 ID의 개체 ID로 <principal-id>을(를) 바꾸세요. 구독 ID, 리소스 그룹 이름 또는 리소스 이름과 같은 Azure 리소스 범위로 대체 <scope> 합니다. 범위를 사용한 작업을 참조하세요.

  • ARM 템플릿: 선언적 관리에 사용합니다.

관리 ID의 경우 가상 머신과 같은 리소스와 연결된 ID에 역할을 할당합니다. Azure 포털의 액세스 확인 기능 또는 Azure CLI 사용하여 유효한 권한을 확인합니다.

서비스별 권한 부여 정보

서비스별 메커니즘 섹션에서는 일부 Azure 서비스가 고유한 권한 부여 방법을 제공한다는 것을 배웠습니다. 이 섹션에서는 언급된 세 가지 Azure 서비스에 대해 자세히 설명합니다.

Azure Storage

  • RBAC: 컨트롤 플레인 작업을 관리합니다.
  • SAS 및 ACL: Microsoft Entra 인증을 사용하여 데이터 평면 액세스를 제어합니다.

예: Microsoft Entra ID를 사용하여 Blob에 액세스

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

credential = DefaultAzureCredential()
client = BlobServiceClient(account_url="https://<account-name>.blob.core.windows.net", credential=credential)
containers = client.list_containers()
for container in containers:
    print(container.name)

Azure Storage 계정 이름으로 대체 <account-name> 합니다.

Azure Key Vault (애저 키 볼트)

일관성을 위해 레거시 액세스 정책 대신 RBAC를 사용합니다. 액세스 정책은 여전히 지원되지만 선호되지는 않습니다.

예: 비밀 검색

from azure.identity import DefaultAzureCredential
from azure.keyvault.secrets import SecretClient

credential = DefaultAzureCredential()
client = SecretClient(vault_url="https://<vault-name>.vault.azure.net", credential=credential)
secret = client.get_secret("my-secret")
print(secret.value)

<vault-name>를 Key Vault 리소스 이름으로 대체하세요.

마이크로소프트 그래프

디먼 앱의 위임된 권한 및 애플리케이션 권한에 OAuth 2.0 범위를 사용합니다. 앞의 예제와 같이 범위를 지정합니다.

모범 사례

  • 최소 권한: 참가자 대신 읽기 권한자와 같은 필요한 권한만 할당합니다.
  • RBAC 선호: 특히 Key Vault의 경우 통합 액세스 제어를 사용합니다.
  • 관리 ID 사용: 코드에서 자격 증명을 관리하지 마세요.
  • 그래프 권한 제한: 위험을 최소화하기 위해 특정 범위를 요청합니다.

다음 단계