Azure Machine Learning 리소스 및 워크플로에 대한 인증 설정

적용 대상:Azure CLI ml 확장 v2(현재)Python SDK azure-ai-ml v2(현재)

Azure CLI 또는 Azure Machine Learning SDK v2에서 Azure Machine Learning 작업 영역에 대한 인증을 설정하는 방법을 알아봅니다. Azure Machine Learning 작업 영역에 대한 인증은 대부분 Microsoft Entra ID를 기반으로 합니다. 일반적으로 작업 영역에 연결할 때는 네 가지 인증 워크플로를 사용할 수 있습니다.

  • 대화형: Microsoft Entra ID의 계정을 사용하여 직접 인증하거나 인증에 사용되는 토큰을 가져옵니다. 대화형 인증은 실험과 반복 개발 중에 사용됩니다. 대화형 인증을 사용하면 사용자별 기준으로 웹 서비스와 같은 리소스에 대한 액세스를 제어할 수 있습니다.

  • 서비스 주체: Microsoft Entra ID에 서비스 주체 계정을 만들고 이를 사용하여 인증하거나 토큰을 가져옵니다. 서비스 주체는 사용자 상호 작용 없이 서비스 인증을 위해 자동화된 프로세스가 필요한 경우에 사용됩니다. 예를 들어 학습 코드가 변경될 때마다 모델을 학습시키고 테스트하는 연속 통합 및 배포 스크립트가 있습니다.

  • Azure CLI 세션: 활성 Azure CLI 세션을 사용하여 인증합니다. Machine Learning용 Azure CLI 확장(ml 확장 또는 CLI v2)은 Azure Machine Learning 작업을 위한 명령줄 도구입니다. Python 코드에 자격 증명을 저장하지 않거나 사용자에게 인증을 요청하지 않고 로컬 워크스테이션에서 Azure CLI를 통해 Azure에 로그인할 수 있습니다. 마찬가지로, 서비스 사용자 ID를 사용하여 Azure CLI를 인증하는 동시에 연속 통합 및 배포 파이프라인의 일부로 동일한 스크립트를 다시 사용할 수 있습니다.

  • 관리 ID: 컴퓨팅 인스턴스 또는 Azure Virtual Machine에서 Azure Machine Learning SDK v2를 사용하는 경우 Azure용 관리 ID를 사용할 수 있습니다. 이 워크플로를 사용하면 Python 코드에 자격 증명을 저장하거나 사용자에게 인증 프롬프트를 표시하지 않아도 VM이 관리 ID를 사용하여 작업 영역에 연결할 수 있습니다. 또한 모델을 학습시킬 때 관리 ID를 사용하여 작업 영역에 액세스하도록 Azure Machine Learning 컴퓨팅 클러스터를 구성할 수도 있습니다.

사용된 인증 워크플로에 관계없이 Azure 역할 기반 액세스 제어(Azure RBAC)는 리소스에 허용된 액세스 수준(권한 부여) 범위를 지정하는 데 사용됩니다. 예를 들어 관리 또는 자동화 프로세스는 컴퓨팅 인스턴스만들기 액세스 권한이 있지만, 사용 권한이 없고, 데이터 과학자는 사용 권한만 있고 삭제 또는 만들기 원한이 없을 수 있습니다. 자세한 내용은 Azure Machine Learning 작업 영역 액세스 관리를 참조하세요.

Microsoft Entra 조건부 액세스를 사용하여 각 인증 워크플로의 작업 영역에 대한 액세스를 추가로 제어하거나 제한할 수 있습니다. 예를 들어 관리자는 관리 디바이스에서만 작업 영역 액세스를 허용할 수 있습니다.

필수 조건

Microsoft Entra ID

작업 영역에 대한 모든 인증 워크플로는 Microsoft Entra ID를 사용합니다. 사용자가 개별 계정을 사용하여 인증하도록 하려면 사용자에게 Microsoft Entra ID의 계정이 있어야 합니다. 서비스 주체를 사용하려면 사용자가 Microsoft Entra ID에 있어야 합니다. 관리 ID는 Microsoft Entra ID의 기능이기도 합니다.

Microsoft Entra ID에 대한 자세한 내용은 Microsoft Entra 인증이란?을 참조하세요.

Microsoft Entra 계정을 만든 후 작업 영역에 대한 액세스 권한을 부여하는 방법 및 Azure Machine Learning의 기타 작업에 대한 자세한 내용은 Azure Machine Learning 작업 영역 액세스 관리를 참조하세요.

대화형 인증 사용

적용 대상: Python SDK azure-ai-ml v2(현재)

대화형 인증은 Python용 Azure Identity 패키지를 사용합니다. 대부분의 예에서는 DefaultAzureCredential을 사용하여 자격 증명에 액세스합니다. 토큰이 필요할 때 복수 ID(EnvironmentCredential, ManagedIdentityCredential, SharedTokenCacheCredential, VisualStudioCodeCredential, AzureCliCredential, AzurePowerShellCredential)를 차례로 사용하여 토큰을 요청하고 토큰을 제공하면 중지합니다. 자세한 내용은 DefaultAzureCredential 클래스 참조를 참조하세요.

다음은 DefaultAzureCredential을 사용하여 인증하는 예입니다. DefaultAzureCredential을 사용한 인증이 실패하면 대신 웹 브라우저를 통한 인증의 대체가 사용됩니다.

from azure.identity import DefaultAzureCredential, InteractiveBrowserCredential

try:
    credential = DefaultAzureCredential()
    # Check if given credential can get token successfully.
    credential.get_token("https://management.azure.com/.default")
except Exception as ex:
    # Fall back to InteractiveBrowserCredential in case DefaultAzureCredential not work
    # This will open a browser page for
    credential = InteractiveBrowserCredential()

자격 증명 개체가 만들어진 후 MLClient 클래스를 사용하여 작업 영역에 연결합니다. 예를 들어 다음 코드는 from_config() 메서드를 사용하여 연결 정보를 로드합니다.

from azure.ai.ml import MLClient
try:
    ml_client = MLClient.from_config(credential=credential)
except Exception as ex:
    # NOTE: Update following workspace information to contain
    #       your subscription ID, resource group name, and workspace name
    client_config = {
        "subscription_id": "<SUBSCRIPTION_ID>",
        "resource_group": "<RESOURCE_GROUP>",
        "workspace_name": "<AZUREML_WORKSPACE_NAME>",
    }

    # write and reload from config file
    import json, os

    config_path = "../.azureml/config.json"
    os.makedirs(os.path.dirname(config_path), exist_ok=True)
    with open(config_path, "w") as fo:
        fo.write(json.dumps(client_config))
    ml_client = MLClient.from_config(credential=credential, path=config_path)

print(ml_client)

서비스 주체 구성

SP(서비스 주체)를 사용하려면 먼저 SP를 만들어야 합니다. 그런 다음 작업 영역에 대한 액세스 권한을 부여합니다. 또한 앞에서 설명한 것처럼 Azure 역할 기반 액세스 제어(Azure RBAC)는 액세스 제어를 위해 사용되므로, SP에 부여할 액세스 권한을 결정해야 합니다.

Important

서비스 주체를 사용하는 경우 서비스 주체에 사용되는 작업에 필요한 최소 액세스 권한을 부여합니다. 예를 들어 웹 배포를 위해 액세스 토큰 읽기 목적으로만 사용되는 경우에는 서비스 주체에 소유자 또는 기여자 액세스 권한을 부여하지 않을 것입니다.

최소 권한을 부여하는 이유는 서비스 주체에 인증을 위해 암호가 사용되고, 이 암호가 자동화 스크립트의 일부로 저장될 수 있기 때문입니다. 암호가 유출되더라도 특정 작업에 필요한 최소 액세스 권한만 지정함으로써 SP 악용을 최소화할 수 있습니다.

SP를 만들고 작업 영역에 대해 액세스 권한을 부여하는 가장 쉬운 방법은 Azure CLI를 사용하는 것입니다. 서비스 주체를 만들고 여기에 작업 영역에 대한 액세스 권한을 부여하려면 다음 단계를 따르세요.

참고 항목

여기 표시된 단계를 모두 수행하려면 해당 구독에 대한 관리자여야 합니다.

  1. Azure 구독을 인증합니다.

    az login
    

    CLI가 기본 브라우저를 열 수 있는 경우, 그렇게 하고 로그인 페이지를 로드합니다. CLI가 브라우저를 열 수 없는 경우에는 사용자가 브라우저를 열고 명령줄의 지침을 따릅니다. 지침에 따라 https://aka.ms/devicelogin으로 이동하고 인증 코드를 입력합니다.

    Azure 구독이 여러 개 있으면 az account set -s <subscription name or ID> 명령을 사용하여 구독을 설정할 수 있습니다. 자세한 내용은 여러 Azure 구독 사용을 참조하세요.

    다른 인증 방법은 Azure CLI로 로그인을 참조하세요.

  2. 서비스 주체를 만듭니다. 다음 예제에서는 ml-auth라는 SP를 만듭니다.

    az ad sp create-for-rbac --json-auth --name ml-auth --role Contributor --scopes /subscriptions/<subscription id>
    

    --json-auth 매개 변수는 Azure CLI 버전 >= 2.51.0에서 사용할 수 있습니다. 이전 버전에서는 --sdk-auth를 사용하세요.

    출력은 다음과 유사한 JSON입니다. 이 문서의 다른 단계에 필요하므로 clientId, clientSecrettenantId 필드를 기록해 둡니다.

    {
        "clientId": "your-client-id",
        "clientSecret": "your-client-secret",
        "subscriptionId": "your-sub-id",
        "tenantId": "your-tenant-id",
        "activeDirectoryEndpointUrl": "https://login.microsoftonline.com",
        "resourceManagerEndpointUrl": "https://management.azure.com",
        "activeDirectoryGraphResourceId": "https://graph.windows.net",
        "sqlManagementEndpointUrl": "https://management.core.windows.net:5555",
        "galleryEndpointUrl": "https://gallery.azure.com/",
        "managementEndpointUrl": "https://management.core.windows.net"
    }
    
  3. 이전 단계에서 반환된 clientId 값을 사용하여 서비스 주체에 대한 세부 정보를 검색합니다.

    az ad sp show --id your-client-id
    

    다음 JSON은 이 명령의 출력에 대한 간단한 예제를 보여줍니다. 다음 단계에서 값이 필요하므로 objectId 필드를 기록해 둡니다.

    {
        "accountEnabled": "True",
        "addIns": [],
        "appDisplayName": "ml-auth",
        ...
        ...
        ...
        "objectId": "your-sp-object-id",
        "objectType": "ServicePrincipal"
    }
    
  4. Azure Machine Learning에서 사용하는 작업 영역 및 기타 리소스에 대한 액세스 권한을 부여하려면 다음 문서의 정보를 사용합니다.

    Important

    소유자 액세스 권한은 서비스 주체가 작업 영역에서 거의 모든 작업을 수행하도록 허용합니다. 이 문서에서는 액세스 권한을 부여하는 방법을 보여주기 위해 사용되었습니다. 프로덕션 환경에서는 의도한 역할을 수행하는 데 필요한 최소 액세스 권한을 서비스 주체에 부여하는 것이 좋습니다. 해당 시나리오에 필요한 액세스 권한이 포함된 사용자 지정 역할을 만드는 방법은 Azure Machine Learning 작업 영역 액세스 관리를 참조하세요.

관리 ID 구성

Important

관리 ID는 Azure Virtual Machine에서 Azure Machine Learning SDK를 사용할 때, Azure Machine Learning 컴퓨팅 클러스터 또는 컴퓨팅 인스턴스에서만 지원됩니다.

VM의 관리 ID

  1. VM에서 Azure 리소스에 대해 시스템에서 할당된 관리 ID를 사용하도록 설정합니다.

  2. Azure portal에서 작업영역을 선택한 다음,Access Control (IAM)를 선택합니다.

  3. 추가, 역할 할당 추가를 선택하여 역할 할당 추가 창을 엽니다.

  4. 관리 ID를 할당할 역할을 선택합니다. 예를 들어 읽기 권한자. 세부 단계에 대해서는 Azure Portal을 사용하여 Azure 역할 할당을 참조하세요.

컴퓨팅 클러스터의 관리 ID

자세한 내용은 컴퓨팅 클러스터의 관리 ID 설정을 참조하세요.

컴퓨팅 인스턴스의 관리 ID

자세한 내용은 컴퓨팅 인스턴스의 관리 ID 설정을 참조하세요.

서비스 주체 인증 사용

적용 대상: Python SDK azure-ai-ml v2(현재)

서비스 주체를 통한 인증은 Python용 Azure Identity 패키지를 사용합니다. DefaultAzureCredential 클래스는 다음 환경 변수를 찾고 서비스 주체로 인증할 때 다음 값을 사용합니다.

  • AZURE_CLIENT_ID - 서비스 주체를 만들 때 반환된 클라이언트 ID.
  • AZURE_TENANT_ID - 서비스 주체를 만들 때 반환된 테넌트 ID.
  • AZURE_CLIENT_SECRET - 서비스 주체에 대해 생성된 암호/자격 증명.

개발하는 동안 python-dotenv 패키지를 사용하여 이러한 환경 변수를 설정하는 것이 좋습니다. Python-dotenv는 .env 파일에서 환경 변수를 로드합니다. Python용 표준 .gitignore 파일은 자동으로 .env 파일을 제외하므로 개발 중에 GitHub 저장소에 체크 인하면 안 됩니다.

다음 예는 python-dotenv를 사용하여 .env 파일에서 환경 변수를 로드한 다음 DefaultAzureCredential을 사용하여 자격 증명 개체를 만드는 방법을 보여 줍니다.

from dotenv import load_dotenv

if ( os.environ['ENVIRONMENT'] == 'development'):
    print("Loading environment variables from .env file")
    load_dotenv(".env")

from azure.identity import DefaultAzureCredential

credential = DefaultAzureCredential()
# Check if given credential can get token successfully.
credential.get_token("https://management.azure.com/.default")

자격 증명 개체가 만들어진 후 MLClient 클래스를 사용하여 작업 영역에 연결합니다. 예를 들어 다음 코드는 from_config() 메서드를 사용하여 연결 정보를 로드합니다.

try:
    ml_client = MLClient.from_config(credential=credential)
except Exception as ex:
    # NOTE: Update following workspace information to contain
    #       your subscription ID, resource group name, and workspace name
    client_config = {
        "subscription_id": "<SUBSCRIPTION_ID>",
        "resource_group": "<RESOURCE_GROUP>",
        "workspace_name": "<AZUREML_WORKSPACE_NAME>",
    }

    # write and reload from config file
    import json, os

    config_path = "../.azureml/config.json"
    os.makedirs(os.path.dirname(config_path), exist_ok=True)
    with open(config_path, "w") as fo:
        fo.write(json.dumps(client_config))
    ml_client = MLClient.from_config(credential=credential, path=config_path)

print(ml_client)

또한 서비스 주체를 사용하여 Azure Machine Learning REST API에 인증을 수행할 수 있습니다. 자동화 워크플로에서 헤드리스 인증에 대한 서비스 간 호출을 허용하는 Microsoft Entra ID 클라이언트 자격 증명 권한 부여 흐름을 사용합니다.

Important

현재 ADAL(Azure Active Directory 인증 라이브러리)을 사용하여 자격 증명을 가져오는 경우 MSAL(Microsoft 인증 라이브러리)로 마이그레이션하는 것이 좋습니다. ADAL 지원은 2022년 6월 30일에 종료되었습니다.

MSAL을 사용한 인증에 대한 정보 및 샘플은 다음 문서를 참조하세요.

관리 ID 인증 사용

적용 대상: Python SDK azure-ai-ml v2(현재)

관리 ID로 인증하려면 Python용 Azure ID 패키지를 사용합니다. 관리 ID로 구성된 VM 또는 컴퓨팅 클러스터에서 작업 영역에 인증을 수행하려면 DefaultAzureCredential 클래스를 사용합니다. 이 클래스는 관리 ID가 사용되고 있는지 자동으로 검색하고 관리 ID를 사용하여 Azure 서비스에 인증합니다.

다음 예에서는 DefaultAzureCredential 클래스를 사용하여 자격 증명 개체를 만든 다음 MLClient 클래스를 사용하여 작업 영역에 연결하는 방법을 보여 줍니다.

from azure.identity import DefaultAzureCredential

credential = DefaultAzureCredential()
# Check if given credential can get token successfully.
credential.get_token("https://management.azure.com/.default")

try:
    ml_client = MLClient.from_config(credential=credential)
except Exception as ex:
    # NOTE: Update following workspace information to contain
    #       your subscription ID, resource group name, and workspace name
    client_config = {
        "subscription_id": "<SUBSCRIPTION_ID>",
        "resource_group": "<RESOURCE_GROUP>",
        "workspace_name": "<AZUREML_WORKSPACE_NAME>",
    }

    # write and reload from config file
    import json, os

    config_path = "../.azureml/config.json"
    os.makedirs(os.path.dirname(config_path), exist_ok=True)
    with open(config_path, "w") as fo:
        fo.write(json.dumps(client_config))
    ml_client = MLClient.from_config(credential=credential, path=config_path)

print(ml_client)

조건부 액세스 사용

관리자는 작업 영역에 로그인하는 사용자에 대해 Microsoft Entra 조건부 액세스 정책을 적용할 수 있습니다. 예를 들어 2단계 인증을 요구하거나, 관리 디바이스에서만 로그인을 허용할 수 있습니다. 특히 Azure Machine Learning 작업 영역에 조건부 액세스를 사용하려면 Azure Machine Learning이라는 앱에 조건부 액세스 정책을 할당합니다. 앱 ID는 0736f41a-0425-bdb5-1563eff02385입니다.

다음 단계