チュートリアル:Windows VM のシステム割り当てマネージド ID を使用して Azure SQL にアクセスするTutorial: Use a Windows VM system-assigned managed identity to access Azure SQL

Azure リソースのマネージドID は、Azure Active Directory の機能です。Managed identities for Azure resources is a feature of Azure Active Directory. Azure リソースのマネージド ID をサポートする各 Azure サービスは、それぞれ固有のタイムラインの下で提供されます。Each of the Azure services that support managed identities for Azure resources are subject to their own timeline. ご利用のリソースに対するマネージド ID の提供状態と既知の問題をあらかじめ確認しておいてください。Make sure you review the availability status of managed identities for your resource and known issues before you begin.

このチュートリアルでは、Windows 仮想マシン (VM) のシステム割り当て ID を使用して Azure SQL サーバーにアクセスする方法について説明します。This tutorial shows you how to use a system-assigned identity for a Windows virtual machine (VM) to access an Azure SQL server. 管理対象サービス ID は Azure によって自動的に管理され、資格情報をコードに挿入しなくても、Azure AD 認証をサポートするサービスへの認証を有効にします。Managed Service Identities are automatically managed by Azure and enable you to authenticate to services that support Azure AD authentication, without needing to insert credentials into your code. 学習内容は次のとおりです。You learn how to:

  • VM に Azure SQL サーバーへのアクセスを許可します。Grant your VM access to an Azure SQL server
  • SQL サーバーに対する Azure AD 認証を有効にするEnable Azure AD authentication for the SQL server
  • VM のシステム割り当て ID を表す包含ユーザーをデータベースに作成するCreate a contained user in the database that represents the VM's system assigned identity
  • VM ID を使用してアクセス トークンを取得し、それを使用して Azure SQL サーバーにクエリを実行するGet an access token using the VM identity and use it to query an Azure SQL server

前提条件Prerequisites

VM に Azure SQL サーバー内のデータベースへのアクセス権を付与するGrant your VM access to a database in an Azure SQL server

Azure SQL Server 内のデータベースに対するアクセス権を VM に付与する際は、既存の SQL サーバーを使用する方法と、SQL サーバーを新しく作成する方法とがあります。To grant your VM access to a database in an Azure SQL Server, you can use an existing SQL server or create a new one. Azure ポータルを使用して新しいサーバーとデータベースを作成するには、Azure SQL のクイック スタートに従います。To create a new server and database using the Azure portal, follow this Azure SQL quickstart. Azure SQL のドキュメントに、Azure CLI と Azure PowerShell を使用するクイックスタートも用意されています。There are also quickstarts that use the Azure CLI and Azure PowerShell in the Azure SQL documentation.

VM にデータベースへのアクセス権を付与するには次の 2 つの手順があります。There are two steps to granting your VM access to a database:

  1. SQL サーバーに対する Azure AD 認証を有効にします。Enable Azure AD authentication for the SQL server.
  2. VM のシステム割り当て ID を表す包含ユーザーをデータベースに作成します。Create a contained user in the database that represents the VM's system-assigned identity.

SQL サーバーに対する Azure AD 認証を有効にするEnable Azure AD authentication for the SQL server

次の手順を使用して、SQL サーバーに対する Azure AD 認証を構成します。Configure Azure AD authentication for the SQL server using the following steps:

  1. Azure ポータルで、左側のナビゲーションから [SQL サーバー] を選択します。In the Azure portal, select SQL servers from the left-hand navigation.
  2. Azure AD 認証で有効にする SQL サーバーをクリックします。Click the SQL server to be enabled for Azure AD authentication.
  3. ブレードの [設定] セクションで [Active Directory 管理者] をクリックします。In the Settings section of the blade, click Active Directory admin.
  4. コマンド バーで、 [管理者の設定] をクリックします。In the command bar, click Set admin.
  5. サーバーの管理者になる Azure AD ユーザー アカウントを選択し、 [選択] をクリックします。Select an Azure AD user account to be made an administrator of the server, and click Select.
  6. コマンド バーで、 [保存] をクリックします。In the command bar, click Save.

VM のシステム割り当て ID を表す包含ユーザーをデータベースに作成するCreate a contained user in the database that represents the VM's system assigned identity

この次の手順では、Microsoft SQL Server Management Studio (SSMS) が必要になります。For this next step, you will need Microsoft SQL Server Management Studio (SSMS). 始める前に、Azure AD 統合の背景について次の記事で確認しておくことも有益です。Before beginning, it may also be helpful to review the following articles for background on Azure AD integration:

SQL DB では、一意の AAD 表示名が必要です。SQL DB requires unique AAD display names. これにより、ユーザー、グループ、サービス プリンシパル (アプリケーション)、およびマネージド ID 用に有効化された VM 名などの AAD アカウントの表示名を、AAD で一意に定義する必要があります。With this, the AAD accounts such as users, groups and Service Principals (applications) and VM names enabled for managed identity must be uniquely defined in AAD regarding their display names. SQL DB では、このようなユーザーの T-SQL の作成時に AAD 表示名がチェックされ、一意でない場合には、指定したアカウントに一意の AAD 表示名を指定するように要求するコマンドが失敗します。SQL DB checks the AAD display name during T-SQL creation of such users and if it is not unique, the command fails requesting to provide a unique AAD display name for a given account.

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

  2. [サーバーに接続] ダイアログで、 [サーバー名] フィールドに SQL サーバーの名前を入力します。In the Connect to Server dialog, Enter your SQL server name in the Server name field.

  3. [認証] フィールドで、 [Active Directory - MFA サポートで汎用] を選択します。In the Authentication field, select Active Directory - Universal with MFA support.

  4. [ユーザー名] フィールドに、サーバー管理者として設定した Azure AD アカウントの名前を入力します (例: helen@woodgroveonline.com)。In the User name field, enter the name of the Azure AD account that you set as the server administrator, for example, helen@woodgroveonline.com

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

  6. [データベースに接続] フィールドに、構成する非システム データベースの名前を入力します。In the Connect to database field, enter the name of the non-system database you want to configure.

  7. [接続] をクリックします。Click Connect. サインイン プロセスを完了します。Complete the sign-in process.

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

  9. ユーザー データベースを右クリックし、 [新しいクエリ] をクリックします。Right-click on a user database and click New query.

  10. クエリ ウィンドウで、次の行を入力し、ツールバーの [実行] をリックします。In the query window, enter the following line, and click Execute in the toolbar:

    注意

    次のコマンドの VMName は、前提条件のセクションでシステム割り当て ID を有効にした VM の名前です。VMName in the following command is the name of the VM that you enabled system assigned identity on in the prerequsites section.

    CREATE USER [VMName] FROM EXTERNAL PROVIDER
    

    コマンドは正常に完了し、VM のシステム割り当て ID の包含ユーザーが作成されます。The command should complete successfully, creating the contained user for the VM's system-assigned identity.

  11. クエリ ウィンドウをクリアし、次の行を入力し、ツールバーの [実行] をリックします。Clear the query window, enter the following line, and click Execute in the toolbar:

    注意

    次のコマンドの VMName は、前提条件のセクションでシステム割り当て ID を有効にした VM の名前です。VMName in the following command is the name of the VM that you enabled system assigned identity on in the prerequsites section.

    ALTER ROLE db_datareader ADD MEMBER [VMName]
    

    コマンドは正常に完了し、包含ユーザーにデータベース全体を読み取る権限が与えられます。The command should complete successfully, granting the contained user the ability to read the entire database.

これで、VM 上で実行されるコードは、システム割り当てマネージド ID を使用してトークンを取得し、そのトークンを使用して SQL サーバーへの認証を行うようになりました。Code running in the VM can now get a token using its system-assigned managed identity and use the token to authenticate to the SQL server.

VM のシステム割り当てマネージド ID を使用してアクセス トークンを取得し、それを使用して Azure SQL を呼び出すGet an access token using the VM's system-assigned managed identity and use it to call Azure SQL

Azure SQL は Azure AD 認証をネイティブにサポートするため、Azure リソースのマネージド ID を使用して取得されたアクセス トークンを直接受け入れることができます。Azure SQL natively supports Azure AD authentication, so it can directly accept access tokens obtained using managed identities for Azure resources. SQL への接続を作成するアクセス トークン メソッドを使用します。You use the access token method of creating a connection to SQL. これは Azure SQL の Azure AD との統合の一部であり、接続文字列に資格情報を提供することとは異なります。This is part of Azure SQL's integration with Azure AD, and is different from supplying credentials on the connection string.

アクセス トークンを使用して SQL への接続を開く .NET のコード例を次に示します。Here's a .NET code example of opening a connection to SQL using an access token. このコードは、VM のシステム割り当てマネージド ID のエンドポイントにアクセスできる VM 上で実行する必要があります。This code must run on the VM to be able to access the VM's system-assigned managed identity's endpoint. アクセス トークン メソッドを使用するには、 .NET Framework 4.6 以降が必要です。.NET Framework 4.6 or higher is required to use the access token method. AZURE-SQL-SERVERNAME と DATABASE の値を適切な値に置き換えます。Replace the values of AZURE-SQL-SERVERNAME and DATABASE accordingly. Azure SQL のリソース ID が https://database.windows.net/ であることにご注意ください。Note the resource ID for Azure SQL is https://database.windows.net/.

using System.Net;
using System.IO;
using System.Data.SqlClient;
using System.Web.Script.Serialization;

//
// Get an access token for SQL.
//
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://database.windows.net/");
request.Headers["Metadata"] = "true";
request.Method = "GET";
string accessToken = null;

try
{
    // Call managed identities for Azure resources endpoint.
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();

    // Pipe response Stream to a StreamReader and extract access token.
    StreamReader streamResponse = new StreamReader(response.GetResponseStream());
    string stringResponse = streamResponse.ReadToEnd();
    JavaScriptSerializer j = new JavaScriptSerializer();
    Dictionary<string, string> list = (Dictionary<string, string>) j.Deserialize(stringResponse, typeof(Dictionary<string, string>));
    accessToken = list["access_token"];
}
catch (Exception e)
{
    string errorText = String.Format("{0} \n\n{1}", e.Message, e.InnerException != null ? e.InnerException.Message : "Acquire token failed");
}

//
// Open a connection to the SQL server using the access token.
//
if (accessToken != null) {
    string connectionString = "Data Source=<AZURE-SQL-SERVERNAME>; Initial Catalog=<DATABASE>;";
    SqlConnection conn = new SqlConnection(connectionString);
    conn.AccessToken = accessToken;
    conn.Open();
}

または、アプリの記述と VM へのデプロイなしでエンド ツー エンドの設定をテストする簡単な方法は、PowerShell を使用することです。Alternatively, a quick way to test the end to end setup without having to write and deploy an app on the VM is using PowerShell.

  1. ポータルで [Virtual Machines] にナビゲートして Windows 仮想マシンに移動し、 [概要][接続] をクリックします。In the portal, navigate to Virtual Machines and go to your Windows virtual machine and in the Overview, click Connect.

  2. Windows VM を作成したときに追加したユーザー名パスワードを入力します。Enter in your Username and Password for which you added when you created the Windows VM.

  3. これで、仮想マシンを使用するリモート デスクトップ接続が作成されました。リモート セッションで PowerShell を開きます。Now that you have created a Remote Desktop Connection with the virtual machine, open PowerShell in the remote session.

  4. Powershell の Invoke-WebRequest を使用して、ローカルのマネージド ID のエンドポイントに Azure SQL のアクセス トークンを取得するよう要求します。Using PowerShell’s Invoke-WebRequest, make a request to the local managed identity's endpoint to get an access token for 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 オブジェクトに変換します。Convert the response from a JSON object to a PowerShell object.

    $content = $response.Content | ConvertFrom-Json
    

    応答からアクセス トークンを抽出します。Extract the access token from the response.

    $AccessToken = $content.access_token
    
  5. SQL サーバーへの接続を開きます。Open a connection to the SQL server. AZURE-SQL-SERVERNAME と DATABASE の値を置き換えることを忘れないでください。Remember to replace the values for AZURE-SQL-SERVERNAME and DATABASE.

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

    次に、クエリを作成してサーバーに送信します。Next, create and send a query to the server. TABLE の値を必ず置き換えてください。Remember to replace the value for 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] の値を調べて、クエリの結果を確認します。Examine the value of $DataSet.Tables[0] to view the results of the query.

次の手順Next steps

このチュートリアルでは、システム割り当てマネージド ID を使用して Azure SQL サーバーにアクセスする方法について説明しました。In this tutorial, you learned how to use a system-assigned managed identity to access Azure SQL server. Azure SQL Server の詳細については、以下を参照してください。To learn more about Azure SQL Server see: