Azure Machine Learning のリソースとワークフローの認証を設定する

適用対象:Azure CLI ml extension v2 (現行)Python SDK azure-ai-ml v2 (現行)

Azure CLI または Azure Machine Learning SDK v2 から Azure Machine Learning ワークスペースへの認証を設定する方法について説明します。 お使いの Azure Machine Learning ワークスペースには、多くの場合、Microsoft Entra ID を使用して認証されます。 ワークスペースに接続するときに使用できる認証ワークフローには、一般に次の 4 つがあります。

  • インタラクティブ: Microsoft Entra ID でアカウントを使用して、直接認証するか、認証に使用されるトークンを取得します。 対話型認証は、"実験および反復開発" 時に使用します。 対話型認証では、(Web サービスなどの) リソースへのアクセスを、ユーザーごとに制御できます。

  • サービス プリンシパル: 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 Machine Learning SDK v2 を "コンピューティング インスタンス" または "Azure 仮想マシン" で使用する場合は、Azure のマネージド ID を使用できます。 このワークフローでは、Python コードに資格情報を保存したり、ユーザーに認証を求めずに、マネージド ID を使用して VM をワークスペースに接続したりすることが許可されます。 "モデルのトレーニング時" に、Azure Machine Learning コンピューティング クラスターをマネージド ID を使用してワークスペースにアクセスするように構成することもできます。

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 (EnvironmentCredentialManagedIdentityCredentialSharedTokenCacheCredentialVisualStudioCodeCredentialAzureCliCredentialAzurePowerShellCredential) を使用してトークンを要求し、トークンが提供されると停止します。 詳細については、DefaultAzureCredential クラスのリファレンスを参照してください。

次のコードは、DefaultAzureCredential を使って認証を行う例です。 DefaultAzureCredential を使用した認証が失敗した場合は、Web ブラウザーからの認証のフォールバックが代わりに使用されます。

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 を作成する必要があります。 次に、お使いのワークスペースへのアクセス権を 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> コマンドを使用してサブスクリプションを設定できます。 詳しくは、「Use multiple Azure subscriptions (複数の 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 によって使用されるワークスペースやその他のリソースへのアクセス権を付与するには、次の記事の情報を使用します。

    重要

    所有者アクセスを使用すると、サービス プリンシパルは、ワークスペースでほぼすべての操作を実行できます。 このドキュメントでは、アクセス権を付与する方法を説明するために使用されています。運用環境では、目的のロールを実行するために必要な最小限のアクセス権をサービス プリンシパルに付与することをお勧めします。 自分のシナリオに必要なアクセス権を持つカスタム ロールの作成に関する情報については、「Azure Machine Learning ワークスペースへのアクセスの管理」を参照してください。

マネージド ID の構成

重要

マネージド ID は、Azure Machine Learning SDK を Azure Virtual Machine、Azure Machine Learning のコンピューティング クラスターまたはコンピューティング インスタンスから使用する場合にのみサポートされます。

VM でのマネージド ID

  1. VM 上の Azure リソースに対して、システムで割り当てられたマネージド ID を有効にしてください

  2. Azure portal でワークスペースを選択し、 [Access Control (IAM)](アクセス制御 (IAM)) をクリックします。

  3. [Add](追加)[Add Role Assignment](ロールの割り当ての追加) を順にクリックし、 [Add role assignmen](ロールの割り当ての追加) ページを開きます。

  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 のクライアント資格情報付与フローを使用します。これにより、自動化されたワークフローでヘッドレス認証に対するサービス間の呼び出しが許可されます。

重要

資格情報を取得するために Azure Active Directory 認証ライブラリ (ADAL) を現在使用している場合は、Microsoft Authentication Library (MSAL) に移行することをお勧めします。 ADAL のサポートは、2022 年 6 月 30 日に終了しました。

MSAL での認証の詳細とサンプルについては、次の記事を参照してください。

マネージド ID 認証を使用する

適用対象: Python SDK azure-ai-ml v2 (現行)

マネージド ID を使用した認証では、Python 用の Azure Identity パッケージが使用されます。 マネージド 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 要素認証を要求したり、マネージド デバイスからのサインインのみを許可したりできます。 次に示すのは、条件付きアクセスに使うアプリ ID です。

アプリケーション ID 名前 Note
d7304df8-741f-47d3-9bc2-df0e24e2071f Azure Machine Learning Workbench Web アプリ Azure Machine Learning スタジオ
cb2ff863-7f30-4ced-ab89-a00194bcf6d9 Azure AI Studio アプリ Azure AI Studio

サービス プリンシパルを確認する

条件付きアクセス ポリシーを追加する前に、Azure portal[エンタープライズ アプリケーション] セクションにアプリケーション ID の一覧が表示されていることを確認します。

重要

このセクションの手順を実行するには、Microsoft Entra ID P2 が必要です。 詳しくは、「Microsoft Entra ライセンス」をご覧ください。

  1. ポータルの上部にある検索フィールドで「エンタープライズ アプリケーション」を検索し、エンタープライズ アプリケーションのエントリを選びます。

    'エンタープライズ アプリケーション' を検索している Azure portal の検索フィールドのスクリーンショット。

  2. [エンタープライズ アプリケーション] の [アプリケーションの名前またはオブジェクト ID で検索します] フィールドを使って、条件付きアクセスで使うエントリを検索します。 エントリが表示される場合、アプリケーション ID に対するサービス プリンシパルは既に存在します。 このセクションの残りの手順をスキップして、「条件付きアクセスを追加する」セクションに進んでください。

    重要

    フィルターは、[アプリケーション ID の先頭文字列] だけにする必要があります。 存在する可能性がある他のフィルターをすべて削除します。

    一致する結果がないエンタープライズ アプリケーション検索のスクリーンショット。

  3. エントリが表示されない場合は、次の Azure PowerShell コマンドレットを使って、アプリケーション ID 用のサービス プリンシパルを作ります。

    New-AzAdServicePrincipal -ApplicationId "application-ID"
    

    たとえば、New-AzADServicePrincipal -ApplicationId "d7304df8-741f-47d3-9bc2-df0e24e2071f" のようにします。

  4. サービス プリンシパルを作成した後、[エンタープライズ アプリケーション] に戻って、アプリケーション ID が見つかることを確認します。 ID の一覧は、「条件付きアクセスを使用する」セクションで確認できます。

条件付きアクセスを追加する

条件付きアクセスを使うには、アプリケーション ID に条件付きアクセス ポリシーを割り当てます。 アプリケーションが条件付きアクセスに表示されない場合は、「サービス プリンシパルを確認する」セクションの手順のようにします。

次のステップ