Azure の マネージド ID で MS Graph API を操作する
はじめに
MS Graph API を操作する場合、ユーザーアカウントやサービスプリンシパルが必要ですが、パスワードや証明書を管理しなければならず、セキュリティ的に課題があります。ということで、Azure のマネージド ID を使ってセキュアに MS Graph API にアクセスできないか検証してみました。
検証構成
今回は Azure の仮想マシンでシステム割り当てマネージド ID を有効化して、それを使って MS Graph API にアクセスしてみます。Azure Functions 等でも同じように実現可能かと思います。
マネージド ID 有効化
仮想マシンでマネージド ID を有効化して、オブジェクト ID をコピーしておきます。
参考はこちら。
マネージド ID に MS Graph アクセス許可を設定
次にマネージド ID に MS Graph のアクセス許可を設定します。サービスプリンシパルだと Azure AD の [アプリの登録] から設定できるのですが、マネージド ID だとアプリの登録画面に出てこないので、設定ができません。なので、PowerShell で設定する必要があります。
参考ドキュメントはこちらですが、廃止予定の Azure AD PowerShell を使っているので、MS Graph PowerShell に書き換えています。この作業は仮想マシン上でなくても問題ないです。
# テナント ID と先ほどメモしたオブジェクト ID を設定
$TenantID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
$spID="25fcf274-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
# MS Graph の許可を指定、1 つのみ指定
# 複数必要の場合は「マネージド ID にアクセス許可を設定」のコマンドを繰り返し実施
$PermissionName = "User.ReadWrite.All"
# 事前に MS Graph PowerShell にログイン
Connect-MgGraph -TenantId $TenantID -Scopes Application.Read.All,AppRoleAssignment.ReadWrite.All
Import-Module Microsoft.Graph.Applications
# Microsoft Graph のサービスプリンシパルを取得
$GraphServicePrincipal = Get-MgServicePrincipal -Filter "DisplayName eq 'Microsoft Graph'" | Select-Object -first 1
# マネージド ID にアクセス許可を設定
$AppRole = $GraphServicePrincipal.AppRoles | Where-Object {$_.Value -eq $PermissionName -and $_.AllowedMemberTypes -contains "Application"}
$params = @{
PrincipalId = $spID
ResourceId = $GraphServicePrincipal.Id
AppRoleId = $AppRole.Id
}
New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $spID -BodyParameter $params
設定できると以下のようにマネージド ID のアクセス許可に表示されます。
仮想マシン上で MS Graph API を実行
仮想マシン上でマネージド ID を使って MS Graph API を実行します。残念ながら、MS Graph PowerShell では マネージド ID で直接ログインする方法はなさそうなので、一度アクセストークンを取得します。
# マネージド ID でログイン
Connect-AzAccount -identity
# トークンを取得
$accesstoken = Get-AzAccessToken -ResourceUrl "https://graph.microsoft.com/"
次にトークンを使って MS Graph API を実行します。トークンをヘッダに仕込んで、Invoke-WebRequest で直接 API を叩いてもいいんですが、パラメータ設定が面倒なので、今回は MS Graph PowerShell を使います。MS Graph PowerShell はトークンでのログインをサポートしています。
# Graph API PowerShell にトークンを使用してログイン
Connect-MgGraph -AccessToken $accesstoken.Token
あとは付与したアクセス許可に基づいてコマンド実行が可能です。
今回の例はユーザー周りの権限を与えたので、Get-MgUser などが可能です。
Discussion