Skip to content

Latest commit

 

History

History
307 lines (249 loc) · 17.6 KB

Work4.md

File metadata and controls

307 lines (249 loc) · 17.6 KB

演習4. Sentinel インシデントトリガーからエンティティ属性を抽出して、Microsoft Graph API を叩いて Entra ID 情報を取得する

RESTAPI の接続方法、Microsoft Graph の活用を Challenge してみましょう

Microsft Sentinel のインシデント検知をトリガーとして、インシデントに含まれるエンティティ情報から Microsoft Graph API を叩いて、Entra ID のユーザー情報を付与してみましょう。 構成イメージは以下の通りです

image

Microsoft Graph を触ってみる

はじめに Microsoft Graph Explorer を触ってみましょう

https://learn.microsoft.com/ja-jp/graph/graph-explorer/graph-explorer-overviewhttps://developer.microsoft.com/en-us/graph/graph-explorer

image

  • 本演習ではユーザーの取得クエリーを用います
    • 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
image
  • 出来ますね!
    • Microsoft Graph を使いこなすことで、必要となる情報を取得できることが分かりました

事前準備

1. Sentinel のインシデントトリガーのロジックアプリを作成する 

これまでの演習と同様に、インシデントトリガーのロジックアプリを作成しましょう

  • Sentinel のオートメーションルールから、「インシデントトリガーを使用したプレイブック」を作成します

    image

image

2. 作成されたロジックアプリに対して、マネージド ID を有効にする

ロジックアプリが Microsoft Graph API に認証できるようにマネージド ID を有効にします

  • ロジックアプリの ID より、システム割り当て済みマネージド ID を有効にして保存します

image

3. マネージド ID に対して、Entra ID で「User.Read.All」権限を付与する

Microsoft Graph に接続するためには、Entra ID でマネージド ID に対して API のアクセス許可を与える必要があります

2024.3 現在、マネージド ID に対する権限の付与は、残念ながら Azure ポータル側からの設定に対応しておりません。
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
  • 以下手順で作成したスクリプトを実行します

3.1 Microsoft Graph への接続

$RequiredScopes = @("Directory.AccessAsUser.All", "Directory.ReadWrite.All")
Connect-MgGraph -Scopes $RequiredScopes

image

Web でコード認証 / ユーザー認証が行われます

3.2 Powershell スクリプト実行

<作成したスクリプト名>.ps1
image

3.3 Microsoft Graph から切断

Disconnect-MgGraph
image

3.4 Entra ID からエンタープライズアプリで確認する

  • 無事スクリプトが成功すれば、Entra ID から確認が出来ます
  • 「Entra ID」 -> 「エンタープライズアプリケーション」より、対象のマネージド ID を確認しましょう
  • 「アクセス許可」から、Microsoft Graph に対して、User.Read.All が付与されているかどうかを確認します

image

image

参考 マネージド ID が削除されると、自動的に Entra ID のアプリケーションからも削除されます

ロジックアプリの編集

1. Sentinel エンティティ情報を格納する

アカウントタイプのエンティティのみに抽出する

  • 後段の Microsoft.Graph に連携するため、ここでは Account 型のエンティティを抽出します
  • 標準コネクタ「Microsoft Sentinel」->「エンティティ - アカウントを取得」を接続し、Sentinel インシデントトリガーの情報から「エンティティ」の一覧をセットします
image

2. For Each 処理で JSON アレイの内容毎に処理する

For Each 処理でエンティティのアレイを分解しましょう

  • 演習3 のプロセス同様に、エンティティで抽出した情報は JSON アレイになっているため(※複数のアカウントが検出する可能性がある)、For Each 処理を行います
image
  • エンティティ情報の 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": "中田 尚志"
  }

3. Microsoft Graph に RESTAPI を送る

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 URI
https://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 を直接編集して下さい

image

  • 設定イメージ

デザイナーから編集は出来ませんが、コードビューで直編集した JSON パスが反映されます

image

image

  • テストしてみましょう

アカウント情報が出力されているインシデントがあれば、一度試してみましょう

  • UserPrincipalName は正しく拾えていますか?
  • マネージド ID 経由で Graph API を叩いて、レスポンスが返ってきますか? image

4. 後処理で使いやすいように JSON 正規化 (Parse 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 指定を複数設定しないとエラーになりますが、後段のプロセスでは読み出すことが出来なくなります。

  • この処理が行われると、以下のように処理されます
image

5. 通知を行う

あとは煮るなり焼くなり、何でもどうぞ!

  • Microsoft Graph に lookup しましたので、得られた情報を通知しましょう
    • メール通知

      image

    • Teams 通知

    • Microsoft Sentinel のインシデント情報にコメントで付与する

      • Sentinel のインシデント情報を更新する場合は、ID より「Azure ロールの割り当て」にて「Sentinelレスポンダー」ロールを付与して下さい
image image
  • ロジックアプリ側では、「インシデントにコメントを追加」から更新をかけることが出来ます image

振り返り

お疲れさまでした!

  • 本演習では以下を実践しました
    • Graph API を理解する
    • Graph API への接続方法を理解する (マネージド ID 経由)
    • ロジックアプリで Graph API の叩き方、お作法を理解する