Azure Sentinelのインシデント・レスポンスをSlackを使ってインタラクティブに行う

こんにちは、ひろかずです

Azure Sentinelでアラート運用をしていると、対応初期に利用者に対して意図的にやっているものであるかを聞きたい場面に遭遇します
今日は、特定のアラートについて、対象ユーザーに意図して行ったかをSlackで質問し、回答をインシデントに反映する実装について一筆書きます

tl;dr的な何か

  • 特定アラート発生時に、SQSにアラート情報をエンキューする
  • SQSへのエンキューをトリガーに、SlackのBuilding Blocksを用いて、アラート元ユーザーに質問メッセージをメンションする
  • ユーザーの回答内容を受信用Logic Appに返して、Sentinelのアラートにその結果を反映する
  • Slackに通知される内容は、雰囲気こんな感じ

ざっくり構成

前提条件

工程

  1. 受信用Logic Appを作成する(1)
  2. 受信用Logic Appを作成する(2)
  3. Slackに投稿するLambdaなどをAWS環境に構成する
  4. 特定のアラートに対応するLogic Appを作成する

1. 受信用Logic Appを作成する(1)

作業の現在地

概要

  • Slackに投稿したユーザーへの問い合わせメッセージに、ユーザーが応答しない時のアクションを定義
  • 対象のアラートの重要度をCriticalに昇格させ、管理者に対応を促すメッセージをSlackに投稿
  • こんな感じのを作ります

Logic Appの作成

  • Logic App管理画面から、[+ 追加]を選択

  • サブスクリプションとリソースグループを設定
  • Logic App名を設定して、[確認および作成]を選択
    • ユーザーが応答しない時に利用するものなので、Non-UserActionという名前にしました

  • [作成]を選択

  • [リソースに移動]を選択

  • [空のロジックアプリ]を選択

トリガーを作成

  • HTTP要求の受信時コネクタを作成し、以下JSONスキーマを設定
{
    "properties": {
        "SystemAlertId": {
            "type": "string"
        }
    },
    "type": "object"
}
  • こんな感じになります

アクションを作成

  • 応答コネクタを作成し、状態コードに200と設定

  • SentinelコネクタのChange incident severityを作成
  • サブスクリプションID、リソースグループ、ワークスペースIDを設定
  • Identiferに[Alert]を設定
  • Specify alert / incidentに動的コンテンツから[SystemAlertId]を選択
    • [SystemAlertId]は、トリガーで設定したJSONのスキーマにより定義されている
  • Specify severityを[Cretical]に設定
  • こんな感じになります

  • Slackコネクタの投稿メッセージアクションを作成し、管理者に通知するチャンネルとメッセージを設定

  • [保存]を選択

  • 編集画面に戻って、トリガーで作成したHTTP要求の受信時コネクタの[HTTP POSTのURL]の値を控えておく

2. 受信用Logic Appを作成する(2)

作業の現在地

概要

  • Slackに投稿したユーザーへの問い合わせメッセージに、ユーザーから応答があった時のアクションを定義
  • 意図していると応答した場合は、アラート情報にユーザーが入力した理由をコメントとして設定し、クローズ
  • 心当たりがないと応答した場合は、アラート情報にその旨をコメントとして設定し、管理者に通知

Logic Appの作成

  • 先程と同じ手順で空のロジックアプリを作成

トリガーを作成

  • HTTP要求の受信時コネクタを作成し、以下JSONスキーマを設定
{
    "properties": {
        "SystemAlertId": {
            "type": "string"
        },
        "UserMessage": {
            "type": "string"
        },
        "UserResult": {
            "type": "integer"
        }
    },
    "type": "object"
}
  • こんな感じになります

アクションを作成

  • 応答コネクタを作成し、状態コードに200と設定

  • 制御コネクタの条件アクションを作成し、UserResultが0に等しいという条件を設定

True分岐

  • SentinelコネクタのChange incident severityを作成
  • サブスクリプションID、リソースグループ、ワークスペースIDを設定
  • Identiferに[Alert]を設定
  • Specify alert / incidentに動的コンテンツから[SystemAlertId]を選択
    • [SystemAlertId]は、トリガーで設定したJSONのスキーマにより定義されている
  • Specify severityを[Closed]に設定
  • Close reasonに[TruePositive]を選択
  • Close reason textに動的コンテンツから[UserMessage]を選択
  • こんな感じになります

False分岐

  • SentinelコネクタのAdd comment to incidentを作成
  • サブスクリプションID、リソースグループ、ワークスペースIDを設定
  • Identiferに[Alert]を設定
  • Specify alert / incidentに動的コンテンツから[SystemAlertId]を選択
  • Specify commentに、心当たりがない旨のコメントを設定
  • こんな感じになります

  • SentinelコネクタのAlert - Get incidentを作成
  • サブスクリプションID、リソースグループ、ワークスペースIDを設定
  • Specify alert / incidentに動的コンテンツから[SystemAlertId]を選択

  • Slackコネクタの投稿メッセージアクションを作成し、管理者に通知するチャンネルとメッセージを設定

  • [保存]を選択

  • 編集画面に戻って、トリガーで作成したHTTP要求の受信時コネクタの[HTTP POSTのURL]の値を控えておく

3. Slackに投稿するLambdaなどをAWS環境に構成する

作業の現在地

概要

  • Logic Appからアラート情報を受け取って、Slackに対話式でメッセージを投稿
  • ユーザーのレスポンスをLogic Appに送信
  • 72時間ユーザーのレスポンスがない場合、SystemAlertIdをLogic Appに送信

AWS環境の構成

  • 今回は、[ こちら ]のCloudFormationテンプレートを使用しました
      - 作成した受信用Logic App1,2で控えたHTTP POSTのURLを設定すること
      - CloudFormationテンプレート実行後、作成されたAPI GatewayのURLを控えておくこと

4. 特定のアラートに対応するLogic Appを作成する

作業の現在地

概要

  • Mass Shareなどの特定のアラートを分岐させる
  • 特定のアラートの場合、先程AWS環境に作成したAPI Gatewayにアラート情報を送信する
  • それ以外のアラートの場合、管理者にSlack通知する
  • 全体観は、こんな感じ

  • 制御コネクタの条件アクションを作成し、[ 前回記事 ]で作成した、"作成2"の出力が"Mass share"に等しいという条件を設定
    • 今回は、or条件として"Suspicious administrative activity"も設定

True分岐

  • 次の現在地はここです

  • データコネクタのJSONの解析アクションを作成し、コンテンツを[ 前回記事 ]で作成した、Log Analyticsの[クエリの実行と結果の一覧表示(プレビュー)]コネクタの"Entities"を選択
  • スキーマに以下JSONを貼り付け
{
    "items": {
        "properties": {
            "$id": {
                "type": "string"
            },
            "AadUserId": {
                "type": "string"
            },
            "Address": {
                "type": "string"
            },
            "AppId": {
                "type": "integer"
            },
            "InstanceName": {
                "type": "string"
            },
            "Name": {
                "type": "string"
            },
            "Type": {
                "type": "string"
            },
            "UPNSuffix": {
                "type": "string"
            }
        },
        "required": [
            "$id",
            "Type"
        ],
        "type": "object"
    },
    "type": "array"
}
  • こんな感じに設定

  • 次の現在地はここです

  • 制御コネクタの条件アクションを作成し、JSONの解析のUPNSufixがUPNの@の右側と等しいことと設定

True分岐後のTrue分岐

  • 次の現在地はここです

  • HTTPコネクタのHTTPアクションを作成
    • 方法にPOSTに設定
    • URIにAWS環境のAPI GatewayのURLを設定
    • ヘッダーにContent-Type, application/jsonを設定
    • 本文に以下JSONを設定(値は動的コンテンツに差し替えること)
{
  "AlertName": "Log AnalyticsのAlertName",
  "Description": "Log AnalyticsのDescription",
  "Name": "JSON解析のName",
  "SystemAlertId": "Log AnalyticsのSystemAlertId",
  "UPNSuffix": "JSON解析のUPNSuffix"
}
  • こんな感じに設定

True分岐後のFalse分岐

  • 条件に漏れたものは処理しないので、特に設定しない

False分岐

  • 次の現在地はここです

  • データコネクタのJSONの解析アクションを作成し、コンテンツを前回記事で作成した、Log Analyticsの[クエリの実行と結果の一覧表示(プレビュー)]コネクタの"ExtendedLinks"を選択
  • スキーマに以下JSONを貼り付け
{
    "items": {
        "properties": {
            "Category": {},
            "Href": {
                "type": "string"
            },
            "Label": {
                "type": "string"
            },
            "Type": {
                "type": "string"
            }
        },
        "required": [
            "Href",
            "Category",
            "Label",
            "Type"
        ],
        "type": "object"
    },
    "type": "array"
}
  • こんな感じに設定

  • 次の現在地はここです

  • 制御コネクタの条件アクションを作成し、JSONの解析のHrefに"alert"を含むように設定

False分岐後のTrue分岐

  • 次の現在地はここです

  • Slackコネクタの投稿メッセージアクションを作成し、チャンネル名と投稿メッセージを設定
  • こんな感じに設定

False分岐後のFalse分岐

  • 条件に漏れたものは処理しないので、特に設定しない

  • [保存]を選択

以上で、Azure SentinelのインシデントレスポンスをSlackを介してインタラクティブに行う実装は完了です

今日はここまでです
お疲れ様でした

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です