RESTAPI の接続方法、Microsoft Graph の活用を Challenge してみましょう
Microsft Sentinel のインシデント検知をトリガーとして、インシデントに含まれるエンティティ情報から Microsoft Graph API を叩いて、Entra ID のユーザー情報を付与してみましょう。 構成イメージは以下の通りです
はじめに Microsoft Graph Explorer を触ってみましょう
- Microsoft Graph については、公式 Docs を参照下さい
- Graph エクスプローラーの使い方も参照下さい
https://learn.microsoft.com/ja-jp/graph/graph-explorer/graph-explorer-overviewhttps://developer.microsoft.com/en-us/graph/graph-explorer
- 本演習ではユーザーの取得クエリーを用います
id
もしくはUserPrincipalName
でユーザー情報を取得できます- UPN 名を入れただけの規定値クエリーでは限定的な情報のみ応答することが分かります Docs 情報
businessPhones
displayName
givenName
id
jobTitle
mail
mobilePhone
officeLocation
preferredLanguage
surname
userPrincipalName
- 部署名フィールド(
department
) を付与するにはどうしたら良いでしょうか?
GET https://graph.microsoft.com/v1.0/users/87d349ed-44d7-43e1-9a83-5f2406dee5bd?$select=displayName,givenName,postalCode,identities
- 出来ますね!
- Microsoft Graph を使いこなすことで、必要となる情報を取得できることが分かりました
これまでの演習と同様に、インシデントトリガーのロジックアプリを作成しましょう
ロジックアプリが Microsoft Graph API に認証できるようにマネージド ID を有効にします
- ロジックアプリの ID より、システム割り当て済みマネージド ID を有効にして保存します
Microsoft Graph に接続するためには、Entra ID でマネージド ID に対して API のアクセス許可を与える必要があります
2024.3 現在、マネージド ID に対する権限の付与は、残念ながら Azure ポータル側からの設定に対応しておりません。
Powershell を用いて権限を付与しましょう。
-
自PC環境で設定する方はこちら
- 手順は公式 Docs に掲載されています
- PowerShell 5.1 以上のインストール
- .NET Framework 4.7.2 以上のインストール
- PowerShellGet の最新版のアップデート
Install-Module PowerShellGet
Micosoft.Graph
モジュールのインストール
-
Azure Cloudshell の手順 (お勧め) 手順が確立しています
-
実行用の Powershell スクリプトを作ります
Web 版 VisualStudio Code はマウス右クリックで設定出来ます (例: ファイル保存は 「Ctrl + S」で保存)
PS /home/hisashi> code <スクリプト名>.ps1
- 自環境に合わせて以下 Powershell スクリプトを作成して保存します
# テナント ID と先ほどメモしたオブジェクト ID を設定
$TenantID="<自環境の Entra ID Tenant ID>"
$spID="<ロジックアプリの Managed ID>"
# MS Graph の許可を指定、1 つのみ指定
# 複数必要の場合は「マネージド ID にアクセス許可を設定」のコマンドを繰り返し実施
# 今回与える権限は Entra ID のユーザー情報 lookup なので、User.Read.All を設定
$PermissionName = "User.Read.All"
# 事前に MS Graph PowerShell にログイン
Connect-MgGraph -TenantId $TenantID -Scopes Application.Read.All,AppRoleAssignment.ReadWrite.All
# 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
- 以下手順で作成したスクリプトを実行します
$RequiredScopes = @("Directory.AccessAsUser.All", "Directory.ReadWrite.All")
Connect-MgGraph -Scopes $RequiredScopes
Web でコード認証 / ユーザー認証が行われます
<作成したスクリプト名>.ps1
Disconnect-MgGraph
- 無事スクリプトが成功すれば、Entra ID から確認が出来ます
- 「Entra ID」 -> 「エンタープライズアプリケーション」より、対象のマネージド ID を確認しましょう
- 「アクセス許可」から、Microsoft Graph に対して、
User.Read.All
が付与されているかどうかを確認します
参考 マネージド ID が削除されると、自動的に Entra ID のアプリケーションからも削除されます
アカウントタイプのエンティティのみに抽出する
- 後段の Microsoft.Graph に連携するため、ここでは
Account
型のエンティティを抽出します - 標準コネクタ「Microsoft Sentinel」->「エンティティ - アカウントを取得」を接続し、Sentinel インシデントトリガーの情報から「エンティティ」の一覧をセットします
For Each 処理でエンティティのアレイを分解しましょう
- 演習3 のプロセス同様に、エンティティで抽出した情報は JSON アレイになっているため(※複数のアカウントが検出する可能性がある)、For Each 処理を行います
- エンティティ情報の JSON アレイ分解後の JSON 情報は以下のようになります
- ADDS より連携されたユーザー情報例
{
"accountName": "中田 尚志",
"ntDomain": "ad.azurecsa",
"upnSuffix": "ad.azurecsa.net",
"sid": "S-1-5-21-3013741847-3473879986-3602106788-1108",
"aadTenantId": "63001692-0de3-4bc0-9815-4e9a04aea825",
"aadUserId": "e47aff12-1da8-45cb-95df-fc5c3db05bee",
"isDomainJoined": true,
"displayName": "中田 尚志",
"dnsDomain": "ad.azurecsa.net",
"additionalData": {
"Sources": "[\"AzureActiveDirectory\"]",
"GivenName": "尚志",
"IsDeleted": "False",
"IsEnabled": "True",
"Surname": "中田",
"TransitiveDirectoryRoles": "[\"Application Administrator\",\"Cloud Application Administrator\"]",
"UserType": "Member",
"UpnName": "hnakada@ad.azurecsa.net",
"SyncFromAad": "True",
"AliasNames": "[\"hisas\",\"hnakada\",\"中田 尚志\"]",
"UserPrincipalName": "hnakada@ad.azurecsa.net",
"MailAddress": "hnakada@ad.azurecsa.net",
"OnPremisesDistinguishedName": "CN=中田 尚志,CN=Users,DC=ad,DC=azurecsa,DC=net",
"OnPremisesSamAccountName": "hnakada",
"AccountName": "hnakada",
"DomainName": "ad.azurecsa"
},
"friendlyName": "中田 尚志",
"Type": "account",
"Name": "中田 尚志"
}
HTTP コネクタを用いて、Microsoft Graph に RESTAPI を送ります
- アカウント情報に対して、Microsoft Graph に HTTP コネクタを用いて RESTAPI を行います
- 「ビルトイン」-> 「HTTP」より、HTTP コネクタを追加します
- 「アクション」は「HTTP」を選択します
- HTTP コネクタのパラメータに Microsoft Graph 宛のパラメータを設定します
- 前述で For Each で分解された情報から
UserPrincipalName
を JSON で設定します - 上記の JSON 構造から JSON Path を考えてみましょう
@{items('For_each')?['additionalData']?['UserPrincipalName']}
になります
項目 | パラメータ設定 |
---|---|
方法 | GET |
URI | Microsoft Graph に送るRESTAPI URIhttps://graph.microsoft.com/v1.0/users/@{items('For_each')?['additionalData']?['UserPrincipalName']}?$select=displayName,userPrincipalName,mail,officeLocation,department,jobTitle |
ヘッダー | Content-Type : application/json |
認証 | マネージド ID |
マネージド ID | システムマネージド ID |
対象ユーザー | https://graph.microsoft.com/ |
- JSON Path は「動的なコンテンツ」から設定することが出来ないため、「ロジックアプリコードビュー」から直接編集します
以下画面を参考に、コードビューから HTTP コネクタの URI を直接編集して下さい
- 設定イメージ
デザイナーから編集は出来ませんが、コードビューで直編集した JSON パスが反映されます
- テストしてみましょう
アカウント情報が出力されているインシデントがあれば、一度試してみましょう
あと少し!頑張って!
- Graph API にクエリーした応答結果を、後工程で処理しやすいように JSON 正規化します
- JSON 正規化すると、「動的なコンテンツ」から選択するだけで反映出来るようになります
- アクションの追加より、「ビルトイン」-> 「データ操作」 -> 「JSON の解析」を選択します - コンテンツには、前ステップで得られた「本文(BODY)」を選択します
- スキーマの欄には、前ステップで得られたペイロード情報をサンプルとして貼り付けてスキーマ生成することが出来ますが、今回は以下を張り付けて下さい
{
"properties": {
"@@odata.context": {
"type": "string"
},
"department": {
"type": "string"
},
"displayName": {
"type": "string"
},
"jobTitle": {
"type": "string"
},
"mail": {
"type": "string"
},
"mobilePhone": {
"type": [
"string",
"null"
]
},
"officeLocation": {
"type": "string"
},
"userPrincipalName": {
"type": "string"
}
},
"type": "object"
}
JSON の正規化モジュールでは、"type" : "string" などの固定値で設定したフィールドだけ、後段のプロセスで動的なコンテンツで読み出すことが出来ます。 上記例での "mobilePhone" のように応答値が NULL になる可能性がある場合、type 指定を複数設定しないとエラーになりますが、後段のプロセスでは読み出すことが出来なくなります。
- この処理が行われると、以下のように処理されます
あとは煮るなり焼くなり、何でもどうぞ!
- Microsoft Graph に lookup しましたので、得られた情報を通知しましょう
お疲れさまでした!
- 本演習では以下を実践しました
- Graph API を理解する
- Graph API への接続方法を理解する (マネージド ID 経由)
- ロジックアプリで Graph API の叩き方、お作法を理解する