設定 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 使用您的帳戶以直接驗證,或取得用於驗證的權杖。 互動式驗證會在實驗和反覆式開發法期間使用。 互動式驗證可讓您控制每個使用者對資源的存取 (例如,Web 服務)。

  • 服務主體:您會在 Microsoft Entra ID 中建立服務主體帳戶,並使用它來驗證或取得權杖。 當您需要自動化流程來向服務驗證,而不需要使用者互動時,就會使用服務主體。 例如,每次定型程式碼變更時,會定型並測試模型的持續整合和部署指令碼。

  • Azure CLI 工作階段:您可以使用使用中的 Azure CLI 工作階段進行驗證。 適用於 Machine Learning 的 Azure CLI 延伸模組 (ml 延伸模組或 CLI v2) 是使用 Azure Machine Learning 的命令列工具。 您可以透過本機工作站上的 Azure CLI 登入 Azure,而不需將認證儲存在 Python 程式碼中,或提示使用者進行驗證。 同樣地,您可以重複使用相同的指令碼做為持續整合和部署管線的一部分,同時使用服務主體身分識別來驗證 Azure CLI。

  • 受控識別:使用計算執行個體 或 Azure 虛擬機器上的 Azure Machine Learning SDK v2 時,您可以使用 Azure 的受控識別。 此工作流程可讓 VM 使用受控識別來連線到工作區,而不需要將認證儲存在 Python 程式碼中,或提示使用者進行驗證。 您也可以將 Azure Machine Learning 計算叢集設為使用受控識別,以在定型模型時,使用受控識別來存取工作區。

無論使用哪一種驗證工作流程,Azure 角色型存取控制 (Azure RBAC) 用來限定允許的資源存取層級 (授權)。 例如,管理員或自動化流程可能具有建立計算執行個體的存取權,但不能使用它,而資料科學家可以使用它,但無法刪除或建立。 如需詳細資訊,請參閱 管理 Azure Machine Learning 工作區

Microsoft Entra 條件式存取可用來進一步控制或限制每個驗證工作流程之工作區的存取權。 例如,管理員可以只允許來自受控裝置的工作區存取。

必要條件

Microsoft Entra ID

工作區的所有驗證工作流程都依賴 Microsoft Entra ID。 如果您想要讓使用者使用個別帳戶進行驗證,他們必須有 Microsoft Entra ID 中的帳戶。 如果您想要使用服務主體,則必須存在於您的 Microsoft Entra 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 身分識別套件。 大部分的範例都會使用 DefaultAzureCredential 來存取您的認證。 需要權杖時,會輪流使用多個身分識別 (EnvironmentCredentialManagedIdentityCredentialSharedTokenCacheCredentialVisualStudioCodeCredentialAzureCliCredentialAzurePowerShellCredential) 來要求,並在其中一個身分識別提供權杖時停止。 如需詳細資訊,請參閱 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 的存取權。

重要

使用服務主體時,會授與其所使用工作所需的最小存取權。 例如,如果服務主體擁有者或參與者僅用於讀取 Web 部署的存取權杖,您不會授與其存取權。

授與最小存取權的原因是,服務主體會使用密碼進行驗證,而且密碼可能會儲存為自動化指令碼的一部分。 如果密碼遭到洩漏,擁有特定工作所需的最低存取權可以將 SP 的惡意使用降至最低。

建立 SP 並將存取權授與工作區的最簡單方式是使用 Azure CLI。 若要建立服務主體,並授與對您工作區的存取權,請使用下列步驟:

注意

您必須是訂閱的管理員,才能執行下列步驟。

  1. 向您的 Azure 訂用帳戶進行驗證:

    az login
    

    如果 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。 請記下 clientIdclientSecrettenantId 欄位,因為您將在本文中的其他步驟中用到。

    {
        "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 所使用工作區和其他資源的存取權,請使用以下文章中的資訊:

    重要

    擁有者存取權可讓服務主體在您的工作區中進行幾乎任何作業。 在本文件中,使用它來示範如何授與存取權;在生產環境中,Microsoft 建議授與服務主體執行您打算使用之角色所需的最小存取權。 如需有關使用您案例所需的存取權來建立自訂角色的詳細資訊,請參閱管理 Azure Machine Learning 工作區的存取權

設定受控識別

重要

只有從 Azure 虛擬機器使用 Azure Machine Learning SDK,或使用 Azure Machine Learning 計算叢集或計算執行個體時,才支援受控識別。

使用 VM 的受控識別

  1. 在虛擬機器上為 Azure 資源啟用系統指派的受控識別

  2. Azure 入口網站,選取您的工作區,然後選取 [存取控制 (IAM)]

  3. 選取 [新增]、[新增角色指派],以開啟 [新增角色指派] 頁面。

  4. 選取您要指派受控識別的角色。 例如,讀取者。 如需詳細步驟,請參閱使用 Azure 入口網站指派 Azure 角色

具有計算叢集的受控識別

如需詳細資訊,請參閱為計算叢集設定受控識別

具有計算執行個體的受控識別

如需詳細資訊,請參閱為計算執行個體設定受控識別

使用服務主體驗證

適用於Python SDK azure-ai-ml v2 (目前)

使用服務主體進行驗證時,會使用適用於 Python 的 Azure 身分識別套件DefaultAzureCredential 類別會尋找下列環境變數,並且在驗證為服務主體時使用各種值:

  • AZURE_CLIENT_ID - 建立服務主體時傳回的用戶端識別碼。
  • AZURE_TENANT_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 用戶端認證授與流程,其允許在自動工作流程中進行無周邊驗證的服務對服務呼叫。

重要

如果您目前使用 Azure Active Directory 驗證程式庫 (ADAL) 來取得認證,建議您移轉至 Microsoft 驗證程式庫 (MSAL)。 已於 2022 年 6 月 30 日停止支援 ADAL。

如需使用 MSAL 進行驗證的資訊和範例,請參閱下列文章:

使用受控識別驗證

適用於Python SDK azure-ai-ml v2 (目前)

使用受控識別進行驗證時,會使用適用於 Python 的 Azure 身分識別套件。 若要從使用受控識別設定的 VM 或計算叢集驗證工作區,請使用 DefaultAzureCredential 類別。 此類別會自動偵測是否正在使用受控識別,並使用受控識別向 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 條件式存取原則。 例如,您可以要求雙因素驗證,或只允許從受控裝置登入。 若要特別針對 Azure Machine Learning 工作區使用條件式存取,請將條件式存取原則指派至名為 Azure Machine Learning 的應用程式。 應用程式識別碼為 0736f41a-0425-bdb5-1563eff02385

下一步