SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

Azure Arc Enabled Server が有効な環境でマネージド ID で SQL Database にアクセスしてみる

leave a comment

Azure の管理 / 運用性を Azure 外で動作している環境にも提供することができる Azure Arc Enabled Server (Azure Arc 対応サーバー) ですが、導入した環境は、Azure Active Directory にマネージド ID が登録されるため、アクセストークンを使用して Azure 上の操作が可能となります。

次の画像は AAD で Azure Arc Enabled Server を有効にしているサーバー名を検索したものですが、マネージド ID が登録されていることが確認できますね。

image

詳細については次のドキュメントに記載されています。

Azure Arc Enabled Server を導入した環境では、Azure SQL Database へのアクセスにマネージド ID を使用することができるようになり、まだ試したことがかなかったので軽く試してみました。

Hybrid Instance Metadata Service (HIMDS)

Azure 仮想マシンの場合は、Azure Instance Metadata Service (IMDS) にアクセスすることで、マネージド ID のトークンを取得することができます。

Azure Arc Enabled Server をインストールしている環境では、環境上に Azure Connected Machine エージェントが導入され、Hybrid Instance Metadata Service (HIMDS) が起動した状態となります。

HIMDS が Azure 仮想マシンの IMDS と同様の役割を実施することになり、インストールされている環境では、「Azure Hybrid Instance Metadata Service (C:\Program Files\AzureConnectedMachineAgent\himds.exe)」により、TCP : 40342 で IMDS_ENDPOINT (http://localhost:40342) / IDENTITY_ENDPOINT (http://localhost:40342/metadata/identity/oauth2/token) が起動した状態となります。

これらのエンドポイントを活用することでアクセストークンが取得できますので、取得した情報を基にして Azure のリソースにアクセスすることができます。

 

SQL Database にアクセストークンでアクセスする

アクセストークンの取得方法については、REST API を使用してアクセス トークンを取得する に記載されています。

Windows の場合は、Administrators グループまたは、Hybrid agent extension applications グループのメンバーのユーザーであれば、アクセストークンを取得することができます。

SQL Database へのアクセスについては チュートリアル:Windows VM のシステム割り当てマネージド ID を使用して Azure SQL にアクセスする に記載されています。

この二つの情報を組み合わせることで、Azure Arc Enabled Server でアクセストークンを使用した SQL Database へのアクセスを実現することができます。

最初に次のクエリを実行して、SQL Database に外部プロバイダーのユーザーを作成しておきます。

CREATE USER [VMName] FROM EXTERNAL PROVIDER

 

準備ができていれば、次のようなスクリプトで SQL Database に接続することができるはずです。(上記のユーザーは master データベースに作成した想定です)

$apiVersion = "2020-06-01"
$resource = "https://database.windows.net/"
$conString = "Server=<Server Name>.database.windows.net;database=master"

$endpoint = "{0}?resource={1}&api-version={2}" -f $env:IDENTITY_ENDPOINT,$resource,$apiVersion
$secretFile = ""
try
{
    Invoke-WebRequest -Method GET -Uri $endpoint -Headers @{Metadata='True'} -UseBasicParsing
}
catch
{
    $wwwAuthHeader = $_.Exception.Response.Headers["WWW-Authenticate"]
    if ($wwwAuthHeader -match "Basic realm=.+")
    {
        $secretFile = ($wwwAuthHeader -split "Basic realm=")[1]
    }
}
Write-Host "Secret file path: " $secretFile`n
$secret = cat -Raw $secretFile
$response = Invoke-WebRequest -Method GET -Uri $endpoint -Headers @{Metadata='True'; Authorization="Basic $secret"} -UseBasicParsing
if ($response)
{
    $token = (ConvertFrom-Json -InputObject $response.Content).access_token
}

$con = New-Object System.Data.SqlClient.SqlConnection($conString)
$con.AccessToken = $token
$con.Open()
$cmd = $con.CreateCommand()
$cmd.CommandText = "SELECT @@VERSION"
$cmd.ExecuteScalar()

 

image

 

まとめ

Azure Arc Enabled Server を使用することで、マネージド ID を使用した Azure のアクセスができるようになります。

オンプレミス (or Azure 外) から、Azure にアクセスする方法としてマネージド ID を使用し、Azure Arc Enabled Server の接続に Private Link を使用するという構成でどのようなネットワークアクセスを実現することができるかは検証してみるとよさそうですね。

Share

Written by Masayuki.Ozawa

5月 12th, 2022 at 9:46 pm

Posted in Azure Arc

Tagged with

Leave a Reply