チュートリアル:Windows VM のシステム割り当てマネージド ID を使用して Azure SQL にアクセスする
Azure リソースのマネージドID は、Azure Active Directory の機能です。 Azure リソースのマネージド ID をサポートする各 Azure サービスは、それぞれ固有のタイムラインの下で提供されます。 ご利用のリソースに対するマネージド ID の提供状態と既知の問題をあらかじめ確認しておいてください。
このチュートリアルでは、Windows 仮想マシン (VM) のシステム割り当て ID を使用して Azure SQL Database にアクセスする方法について説明します。 管理対象サービス ID は Azure によって自動的に管理され、資格情報をコードに挿入しなくても、Azure AD 認証をサポートするサービスへの認証を有効にします。 学習内容は次のとおりです。
- VM に Azure SQL Database へのアクセスを許可する
- Azure AD 認証を有効にする
- VM のシステム割り当て ID を表す包含ユーザーをデータベースに作成する
- VM ID を使用してアクセス トークンを取得し、それを使用して Azure SQL Database にクエリを実行する
前提条件
- Azure リソースのマネージド ID 機能に慣れていない場合は、こちらの概要を参照してください。
- Azure アカウントをお持ちでない場合は、無料のアカウントにサインアップしてから先に進んでください。
- 必要なリソース作成およびロール管理を実行するために、お使いのアカウントには、適切な範囲 (サブスクリプションまたはリソース グループ) を対象とする "所有者" アクセス許可が必要となります。 ロールの割り当てに関するサポートが必要な場合は、Azure ロールの割り当てによる Azure サブスクリプション リソースへのアクセスの管理に関するページをご覧ください。
有効にする
システム割り当てマネージド ID の有効化は、1 クリックで行うことができます。 VM の作成中に有効にするか、既存の VM のプロパティで有効にすることができます。
新しい VM 上でシステム割り当てマネージド ID を有効にするには:
アクセス権の付与
Azure SQL Database 内のデータベースに対するアクセス権を VM に付与する際は、既存の論理 SQL サーバーを使用する方法と、論理 SQL サーバーを新しく作成する方法とがあります。 Azure ポータルを使用して新しいサーバーとデータベースを作成するには、Azure SQL のクイック スタートに従います。 Azure SQL のドキュメントに、Azure CLI と Azure PowerShell を使用するクイックスタートも用意されています。
VM にデータベースへのアクセス権を付与するには次の 2 つの手順があります。
- サーバーに対する Azure AD 認証を有効にします。
- VM のシステム割り当て ID を表す包含ユーザーをデータベースに作成します。
Azure AD 認証を有効にする
- Azure ポータルで、左側のナビゲーションから [SQL サーバー] を選択します。
- Azure AD 認証で有効にする SQL サーバーをクリックします。
- ブレードの [設定] セクションで [Active Directory 管理者] をクリックします。
- コマンド バーで、 [管理者の設定] をクリックします。
- サーバーの管理者になる Azure AD ユーザー アカウントを選択し、 [選択] をクリックします。
- コマンド バーで、 [保存] をクリックします。
包含ユーザーを作成する
このセクションでは、VM のシステム割り当て ID を表す包含ユーザーをデータベースに作成する方法を説明します。 このステップでは、Microsoft SQL Server Management Studio (SSMS) が必要になります。 始める前に、Azure AD 統合の背景について次の記事で確認しておくことも有益です。
- SQL Database と Azure Synapse Analytics を使用したユニバーサル認証 (SSMS での MFA のサポート)
- SQL Database または Azure Synapse Analytics を使用した Azure Active Directory 認証の構成と管理
SQL DB では、一意の Azure AD 表示名が必要です。 このため、ユーザー、グループ、サービス プリンシパル (アプリケーション)、およびマネージド ID 用に有効化された VM 名などの Azure AD アカウントの表示名は、Azure AD 内で一意に定義する必要があります。 SQL DB では、このようなユーザーの T-SQL の作成時に Azure AD 表示名がチェックされ、一意でない場合には、指定したアカウントに一意の Azure AD 表示名を指定するように要求するコマンドが失敗します。
包含ユーザーを作成するには:
SQL Server Management Studio を起動します。
[サーバーに接続] ダイアログで、 [サーバー名] フィールドにサーバーの名前を入力します。
[認証] フィールドで、 [Active Directory - MFA サポートで汎用] を選択します。
[ユーザー名] フィールドに、サーバー管理者として設定した Azure AD アカウントの名前を入力します (例: helen@woodgroveonline.com)。
[オプション] をクリックします。
[データベースに接続] フィールドに、構成する非システム データベースの名前を入力します。
[Connect] をクリックします。 サインイン プロセスを完了します。
オブジェクト エクスプローラーで、 [データベース] フォルダーを展開します。
ユーザー データベースを右クリックし、 [新しいクエリ] をクリックします。
クエリ ウィンドウで、次の行を入力し、ツールバーの [実行] をリックします。
注意
次のコマンドの
VMName
は、前提条件のセクションでシステム割り当て ID を有効にした VM の名前です。CREATE USER [VMName] FROM EXTERNAL PROVIDER
コマンドは正常に完了し、VM のシステム割り当て ID の包含ユーザーが作成されます。
クエリ ウィンドウをクリアし、次の行を入力し、ツールバーの [実行] をリックします。
注意
次のコマンドの
VMName
は、前提条件のセクションでシステム割り当て ID を有効にした VM の名前です。ALTER ROLE db_datareader ADD MEMBER [VMName]
コマンドは正常に完了し、包含ユーザーにデータベース全体を読み取る権限が与えられます。
これで、VM 上で実行されるコードは、システム割り当てマネージド ID を使用してトークンを取得し、そのトークンを使用してサーバーへの認証を行うようになりました。
データにアクセスする
このセクションでは、VM のシステム割り当てマネージド ID を使用してアクセス トークンを取得し、それを使用して Azure SQL を呼び出す方法を説明します。 Azure SQL は Azure AD 認証をネイティブにサポートするため、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 Direcotry 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 を使用することです。
ポータルで [Virtual Machines] にナビゲートして Windows 仮想マシンに移動し、 [概要] の [接続] をクリックします。
Windows VM を作成したときに追加したユーザー名とパスワードを入力します。
これで、仮想マシンを使用するリモート デスクトップ接続が作成されました。リモート セッションで PowerShell を開きます。
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
サーバーへの接続を開きます。 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 に設定します。
次のステップ
このチュートリアルでは、システム割り当てマネージド ID を使用して Azure SQL Database にアクセスする方法について説明しました。 Azure SQL Database の詳細については、次の記事を参照してください。