チュートリアル:Windows VM のシステム割り当てマネージド ID を使用して Azure SQL にアクセスする

このチュートリアルでは、Windows 仮想マシン (VM) のシステム割り当て ID を使用して Azure SQL Database にアクセスする方法について説明します。 管理対象サービス ID は Azure によって自動的に管理され、資格情報をコードに挿入しなくても、Microsoft Entra 認証をサポートするサービスへの認証を有効にします。 以下の方法について説明します。

  • VM に Azure SQL Database へのアクセスを許可する
  • Microsoft Entra 認証を有効にする
  • VM のシステム割り当て ID を表す包含ユーザーをデータベースに作成する
  • VM ID を使用してアクセス トークンを取得し、それを使用して Azure SQL Database にクエリを実行する

前提条件

有効にする

システム割り当てマネージド ID の有効化は、1 クリックで行うことができます。 VM の作成中に有効にするか、既存の VM のプロパティで有効にすることができます。

Screenshot shows the System assigned tab for a virtual machine where you can turn on the System assigned status.

新しい VM 上でシステム割り当てマネージド ID を有効にするには:

  1. Azure ポータル

  2. システム割り当て ID を有効にして仮想マシンを作成する

アクセス権の付与

Azure SQL Database 内のデータベースに対するアクセス権を VM に付与する際は、既存の論理 SQL サーバーを使用する方法と、論理 SQL サーバーを新しく作成する方法とがあります。 Azure ポータルを使用して新しいサーバーとデータベースを作成するには、Azure SQL のクイック スタートに従います。 Azure SQL のドキュメントに、Azure CLI と Azure PowerShell を使用するクイックスタートも用意されています。

VM にデータベースへのアクセス権を付与するには次の 2 つの手順があります。

  1. サーバーに対して Microsoft Entra 認証を有効にします。
  2. VM のシステム割り当て ID を表す包含ユーザーをデータベースに作成します。

Microsoft Entra 認証を有効にする

Microsoft Entra認証を構成するには:

  1. Azure ポータルで、左側のナビゲーションから [SQL サーバー] を選択します。
  2. Microsoft Entra 認証で有効にする SQL サーバーを選択します。
  3. ブレードの [設定] セクションで [Active Directory 管理者] をクリックします。
  4. コマンド バーで、 [管理者の設定] をクリックします。
  5. サーバーの管理者になる Microsoft Entra ユーザー アカウントを選択し、[選択] をクリックします。
  6. コマンド バーで、 [保存] をクリックします。

包含ユーザーを作成する

このセクションでは、VM のシステム割り当て ID を表す包含ユーザーをデータベースに作成する方法を説明します。 このステップでは、Microsoft SQL Server Management Studio (SSMS) が必要になります。 始める前に、Microsoft Entra 統合の背景について次の記事で確認しておくことも有益です。

SQL DB には、一意のMicrosoft Entra ID 表示名が必要です。 このため、ユーザー、グループ、サービス プリンシパル (アプリケーション)、およびマネージド ID 用に有効化された VM 名などの Microsoft Entra アカウントの表示名は、Microsoft Entra 内で一意に定義する必要があります。 このようなユーザーの T-SQL の作成時に SQL DB によって Microsoft Entra 表示名がチェックされ、一意でない場合には、指定したアカウントに対する一意の Microsoft Entra 表示名を指定するように要求し、コマンドが失敗します。

包含ユーザーを作成するには:

  1. SQL Server Management Studio を起動します。

  2. [サーバーに接続] ダイアログで、 [サーバー名] フィールドにサーバーの名前を入力します。

  3. [認証] フィールドで、 [Active Directory - MFA サポートで汎用] を選択します。

  4. [ユーザー名] フィールドに、サーバー管理者として設定した Microsoft Entra アカウントの名前を入力します (例: helen@woodgroveonline.com)。

  5. [オプション] をクリックします。

  6. [データベースに接続] フィールドに、構成する非システム データベースの名前を入力します。

  7. [Connect] をクリックします。 サインイン プロセスを完了します。

  8. オブジェクト エクスプローラーで、 [データベース] フォルダーを展開します。

  9. ユーザー データベースを右クリックし、[新しいクエリ] を選択します。

  10. クエリ ウィンドウで、次の行を入力し、ツールバーの [実行] をリックします。

    注意

    次のコマンドの VMName は、前提条件のセクションでシステム割り当て ID を有効にした VM の名前です。

    CREATE USER [VMName] FROM EXTERNAL PROVIDER
    

    コマンドは正常に完了し、VM のシステム割り当て ID の包含ユーザーが作成されます。

  11. クエリ ウィンドウをクリアし、次の行を入力し、ツールバーの [実行] をリックします。

    注意

    次のコマンドの VMName は、前提条件のセクションでシステム割り当て ID を有効にした VM の名前です。

    "プリンシパル VMName に重複した表示名があります" というエラーが発生した場合は、CREATE USER ステートメントに WITH OBJECT_ID='xxx' を追加します。

    ALTER ROLE db_datareader ADD MEMBER [VMName]
    

    コマンドは正常に完了し、包含ユーザーにデータベース全体を読み取る権限が与えられます。

これで、VM 上で実行されるコードは、システム割り当てマネージド ID を使用してトークンを取得し、そのトークンを使用してサーバーへの認証を行うようになりました。

データにアクセスする

このセクションでは、VM のシステム割り当てマネージド ID を使用してアクセス トークンを取得し、それを使用して Azure SQL を呼び出す方法を説明します。 Azure SQL は Microsoft Entra 認証をネイティブにサポートするため、Azure リソースのマネージド ID を使用して取得されたアクセス トークンを直接受け入れることができます。 このメソッドでは、接続文字列に資格情報を指定する必要はありません。

Active Directory マネージド ID 認証を使用して SQL への接続を開く .NET コードの例を次に示します。 このコードは、VM のシステム割り当てマネージド ID のエンドポイントにアクセスできる VM 上で実行する必要があります。 このメソッドを使用するには、.NET Framework 4.6.2 以降または .NET Core 3.1 以降が必要です。 それに応じて AZURE-SQL-SERVERNAME と DATABASE の値を置き換え、NuGet 参照を Microsoft.Data.SqlClient ライブラリに追加します。

using Microsoft.Data.SqlClient;

try
{
//
// Open a connection to the server using Active Directory Managed Identity authentication.
//
string connectionString = "Data Source=<AZURE-SQL-SERVERNAME>; Initial Catalog=<DATABASE>; Authentication=Active Directory Managed Identity; Encrypt=True";
SqlConnection conn = new SqlConnection(connectionString);
conn.Open();

注意

SDK とともに他のプログラミング オプションを使用しながら、マネージド ID を使用できます。

または、アプリの記述と VM へのデプロイなしでエンド ツー エンドの設定をテストする簡単な方法は、PowerShell を使用することです。

  1. ポータルで [Virtual Machines] にナビゲートして Windows 仮想マシンに移動し、 [概要][接続] をクリックします。

  2. Windows VM を作成したときに追加した VM 管理者の資格情報を入力します。

  3. これで、仮想マシンを使用するリモート デスクトップ接続が作成されました。リモート セッションで PowerShell を開きます。

  4. Powershell の Invoke-WebRequest を使用して、ローカルのマネージド ID のエンドポイントに Azure SQL のアクセス トークンを取得するよう要求します。

        $response = Invoke-WebRequest -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fdatabase.windows.net%2F' -Method GET -Headers @{Metadata="true"}
    

    応答を JSON オブジェクトから PowerShell オブジェクトに変換します。

    $content = $response.Content | ConvertFrom-Json
    

    応答からアクセス トークンを抽出します。

    $AccessToken = $content.access_token
    
  5. サーバーへの接続を開きます。 AZURE-SQL-SERVERNAME と DATABASE の値を置き換えることを忘れないでください。

    $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
    $SqlConnection.ConnectionString = "Data Source = <AZURE-SQL-SERVERNAME>; Initial Catalog = <DATABASE>; Encrypt=True;"
    $SqlConnection.AccessToken = $AccessToken
    $SqlConnection.Open()
    

    次に、クエリを作成してサーバーに送信します。 TABLE の値を必ず置き換えてください。

    $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
    $SqlCmd.CommandText = "SELECT * from <TABLE>;"
    $SqlCmd.Connection = $SqlConnection
    $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
    $SqlAdapter.SelectCommand = $SqlCmd
    $DataSet = New-Object System.Data.DataSet
    $SqlAdapter.Fill($DataSet)
    

$DataSet.Tables[0] の値を調べて、クエリの結果を確認します。

Disable

VM 上でシステム割り当て ID を無効にするには、システム割り当て ID の状態を Off に設定します。

Screenshot shows the System assigned tab for a virtual machine where you can turn off the System assigned status.

次のステップ

このチュートリアルでは、システム割り当てマネージド ID を使用して Azure SQL Database にアクセスする方法について説明しました。 Azure SQL Database の詳細については、次の記事を参照してください。