🆔

Azure の マネージド ID で MS Graph API を操作する

2023/04/06に公開

はじめに

MS Graph API を操作する場合、ユーザーアカウントやサービスプリンシパルが必要ですが、パスワードや証明書を管理しなければならず、セキュリティ的に課題があります。ということで、Azure のマネージド ID を使ってセキュアに MS Graph API にアクセスできないか検証してみました。

検証構成

今回は Azure の仮想マシンでシステム割り当てマネージド ID を有効化して、それを使って MS Graph API にアクセスしてみます。Azure Functions 等でも同じように実現可能かと思います。

マネージド ID 有効化

仮想マシンでマネージド ID を有効化して、オブジェクト ID をコピーしておきます。

参考はこちら。
https://learn.microsoft.com/ja-jp/azure/active-directory/managed-identities-azure-resources/qs-configure-portal-windows-vm

マネージド ID に MS Graph アクセス許可を設定

次にマネージド ID に MS Graph のアクセス許可を設定します。サービスプリンシパルだと Azure AD の [アプリの登録] から設定できるのですが、マネージド ID だとアプリの登録画面に出てこないので、設定ができません。なので、PowerShell で設定する必要があります。
参考ドキュメントはこちらですが、廃止予定の Azure AD PowerShell を使っているので、MS Graph PowerShell に書き換えています。この作業は仮想マシン上でなくても問題ないです。
https://learn.microsoft.com/en-us/azure/active-directory/develop/multi-service-web-app-access-microsoft-graph-as-app?tabs=azure-powershell%2Cprogramming-language-nodejs#grant-access-to-microsoft-graph

# テナント 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 などが可能です。

Microsoft (有志)

Discussion