【Azure】マネージドID に API アクセス許可の設定を行う

# はじめに

マネージドAPI に対してアクセス許可の設定をしたいシーンがありました。
いろいろ試してみたので、備忘録として記事に残します。

# 環境

- macOS: `15.0.1`
- PowerShell: `7.4.0`
- **Microsoft Graph PowerShell SDK**: `2.24.0`

# マネージドID では Azure Portal で API アクセス許可の設定を行うことができない

Entra ID 上の [アプリ登録] から作成したアプリには ポータル上からアクセス許可の設定ができますが、マネージドID では設定ができません。

- Entra ID 上の [アプリ登録] から作成したアプリ
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513223/635a97b3-cec6-616d-72d8-a82774c223a2.png)

    
- マネージドID として作成したアプリ
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513223/1d2bfb16-aada-0e61-c8bb-85cc5997ac4b.png)
    

マネージドID に API アクセス許可の設定を行うには、PowerShell などのコマンドを利用して割り当てる必要があります。

今回はこのマネージドID に対して権限を付与していきます。

# API アクセス許可を設定するためのパラメータを取得する

今回は [Office 365 マネージメントアクティビティ API](https://learn.microsoft.com/ja-jp/office/office-365-management-api/) に対してのアクセス許可を設定したいと思います。

API の情報として、下記の値が必要になります。

1. アクセス許可の設定を行うアプリケーションの名前: `serverApplicationName`
2. 割り当てるアプリロールの名前: `appRoleNames`

確認方法は、[アプリ登録] から作成したアプリページに移動し、[API アクセス許可] > [アクセス許可の追加] のページで確認することができます。

（もしかしたらドキュメントにまとまっているかもですが、見つけられませんでした。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513223/e3bea347-f06d-88d0-e95b-9b507dbb7ac0.png)

# API アクセス許可の割り当て

[MS”公式ドキュメント](https://learn.microsoft.com/en-us/entra/identity-platform/multi-service-web-app-access-microsoft-graph-as-app?tabs=azure-powershell%2Cprogramming-language-nodejs#grant-access-to-microsoft-graph) を参考に作成しています。
`TenantId`と`managedIdentityObjectId` の環境に合わせて変更してください。

```powershell: RoleAssignment.ps1
# 前提：下記モジュールがインストールされていること
# Install-Module Microsoft.Graph -Scope CurrentUser

# テナントID
$TenantId = "<your tenant id>"

# マネージド ID のオブジェクト ID
$managedIdentityObjectId = "<your object id of managed identity>"

# アクセス許可を行う API の名前
$serverApplicationName = "Office 365 Management APIs"

# マネージド ID に割り当てるアプリロールの名前
$appRoleNames = @("ActivityFeed.ReadDlp", "ServiceHealth.Read", "ActivityFeed.Read")

# Microsoft Graph に接続
Connect-MgGraph -TenantId $TenantId -Scopes 'Application.Read.All','AppRoleAssignment.ReadWrite.All'

# アクセス許可をするの API のサービスプリンシパルとアプリロールを取得
$serverServicePrincipal = (Get-MgServicePrincipal -Filter "DisplayName eq '$serverApplicationName'")
Write-Output "serverServicePricipal: $serverServicePrincipal"
$serverServicePrincipalObjectId = $serverServicePrincipal.Id
Write-Output "serverServicePrincipalObjectId: $serverServicePrincipalObjectId"

foreach ($appRoleName in $appRoleNames) {
	# アプリロールの取得
	$appRoleId = ($serverServicePrincipal.AppRoles | Where-Object {$_.Value -eq $appRoleName }).Id
	Write-Output "appRoleId: $appRoleId"
	
	# マネージド ID へのアプリロール割り当て
	New-MgServicePrincipalAppRoleAssignment `
		-ServicePrincipalId $managedIdentityObjectId `
		-PrincipalId $managedIdentityObjectId `
		-ResourceId $serverServicePrincipalObjectId `
		-AppRoleId $appRoleId
}
```

# API アクセス許可の設定確認

スクリプト実行後に マネージド ID として作成したアプリケーションのアクセス許可を確認すると、問題なく設定できていることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513223/7591f7b7-b2b9-c4a0-5612-d75350c7aedd.png)


# さいごに

今回はマネージド ID に API アクセス許可の設定を行う方法をまとめました。
例では、「 Office 365 マネージメントアクティビティ API 」のロールを付与しましたが、他のサービスでも同様にできると思います。
誰かの役に立てば幸いです。

# 参考

https://zenn.dev/microsoft/articles/ae0bf38eebfa48

https://learn.microsoft.com/en-us/entra/identity-platform/multi-service-web-app-access-microsoft-graph-as-app?tabs=azure-powershell%2Cprogramming-language-nodejs#grant-access-to-microsoft-graph

https://learn.microsoft.com/ja-jp/office/office-365-management-api/troubleshooting-the-office-365-management-activity-api#get-an-access-token