ForgeVision Engineer Blog

フォージビジョン エンジニア ブログ

Orca Security で検知したアラートをリソース管理者に修復方法と合わせてメール通知する

フォージビジョン Orca Security のサービスサイト がオープンしました。

ForgeVision - Orca Security サービスサイト

こんにちは、Orca Security 担当の尾谷です。

今日は、Orca Security の Webhooks を使って、検知したアラートの詳細情報をリソースの管理者に直接メールで通知する方法をご紹介します。

本手順を活用すると、普段は Orca コンソールにログインして確認する必要がある「修復方法」もメール本文に含めて担当者にお知らせすることができます。

概要

本ブログの実装でできるようになること

  • 任意のアラートを任意の担当者にオンデマンドでメール通知
  • 担当者はメール本文に記載された「修復方法を参照して対応」
  • 担当者に Orca Security にログインしてもらう手間がなくなる

利用するサービスなど

  • Orca Security

    • Orca Webhooks
    • Automations
  • AWS

    • API Gateway
    • AWS Lambda
    • Amazon Simple Email Service (SES)

動作イメージ

Orca のアラートを開き、[Open] ステータスを [In Progress] に変更します。
理由 (Reason for Update) のドロップダウンメニューを Other に変更し、Additional Info に担当者のメールアドレスを手打ちします。

すると、検知したアカウント情報、検知したリソース名、修復方法などが本文に記載されたメールが、指定したメールアドレスに届きます。

メールを受信した担当者は何が発生しているのか把握し、手順に沿って対応していくという運用が可能です。

処理イメージ

以下のような手順で処理されます。

  1. Orca Security のアラートページで、テキストボックスにメールアドレスを入力し、アラートステータスを Open から in Progress に変更する
  2. Orca Automations が in Progress のステータス変更をトリガーに Webhooks を実行する
  3. Webhooks 経由で Amazon API Gateway のエンドポイントにリクエストが送信される
  4. API Gateway の統合 Lambda がアラート名や Remediation 情報を整形する
  5. Amazon Simple Email Service (SES) でメールを送信する

AWS Lambda

Orca API にリクエストを送信したり、SNS トピックを立てたりする Lambda 関数を作成します。

ランタイムは Python 3.12 にしました。
またアーキテクチャは Arm にしました。
IAM ロールはデフォルトのままで作成しました。後ほど、ポリシーをアタッチします。

3 秒だとタイムアウトすることがあるので、6 秒にしました。

Lambda 関数のコーディング

Amazon SES でメール送信する必要があるので、boto3 の SES クライアントを作成しました。
Orca API キーを環境変数に登録したので、os もインポートしました。

import boto3
import json
import logging
import os
import re

sns_client = boto3.client('ses')
pattern = "^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$"

あと、Webhooks から届いたリクエストを確認するために、event をログ出力しておきます。
このイベントの中身を使って、E メールで送信する内容を整形します。

def lambda_handler(event, context):
    
    print(event)

    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

何をお知らせするか?選択いただけるようリストをまとめておきました。
(これが全てではありません。他にも値があります。)

Key Value
category アラートカテゴリー (Malware など)
description アラートに関する説明文
details アラートに関する詳細
recommendation 修正方法に関する概要
account_name アカウント名
asset_name リソース名
cloud_provider クラウド名 (AWS, Azure など)

data

Key Value
data.title アラート名
data.remediation_console 修復手順

configuration

Key Value
configuration.status_reason アラート更新の理由
configuration.status_justification アラート更新の理由の詳細

state

Key Value
state.alert_id アラート ID
state.risk_level リスクレベル
state.orca_score Orca スコア

修復手順

修復手順 (remediation_console) に関しては、データが配列で格納されてくるのでテキストに整形する必要があります。

    # data
    temp_data = event.get('data', "")
    # アラート名
    str_alert_name = temp_data.get('title', "")
    # 修復手順
    arr_recommendation = temp_data.get('remediation_console', "")
    str_remedeation = ""
    for r in arr_recommendation:
        temp_r = r[1:]
        temp_r = temp_r.replace(">", " ")
        str_remedeation = str_remedeation + temp_r + "\n"

理由: Other + メールアドレスがあれば担当者にメール通知

Orca の Webhooks から届いたデータに「アラート更新の理由」と「アラート更新の理由の詳細」が含まれますので、これを使って処理を分岐します。

    # configuration
    temp_configuration = event.get('configuration', "")
    if not temp_configuration:
        return {
            'function status': "finished.",
            'reason': 'event.configuration is nothing.'
        }
    # アラート更新の理由
    str_reason = temp_configuration.get('status_reason', "")
    # アラート更新の理由の詳細
    str_reason_detail = temp_configuration.get('status_justification', "")
    if str_reason == 'Other' and re.match(pattern, str_reason_detail):
        print('Reason and Reason Detail is OK!')
    else:
        return {
            'function status': "finished.",
            'reason': 'luck of reason.'
        }

Amazon API Gateway

次に、API Gateway をデプロイして、Orca Webhooks で利用するエンドポイントを取得します。
API Gateway の管理コンソールにアクセスし、[API を作成] ボタンをクリックします。

API のタイプは REST API を選択します。

API 名を入力して、[API を作成] ボタンをクリックします。

メソッドの作成

Orca のドキュメントには以下の記載があります。

Webhook は Orca 自動化で使用でき、自動化基準が満たされたときに Orca からアプリケーションにアラートをプッシュできます。 Orca は、JSON 形式の POST HTTPS リクエストを介して受信 Webhook にアラート データを送信します。

そのため、メソッドタイプは POST にして、Lambda プロキシ統合のトグルを ON にします。
先ほど作成した Lambda を指定して [メソッドを作成] ボタンをクリックします。

API Gateway ができたら、[API をデプロイ] ボタンから API Gateway を作成します。

ステージ名は任意です。ここでは、dev にしておきます。

これで、API Gateway のエンドポイントが作成されました。

Webhooks

API Gateway の準備ができたので、リクエスト元にあたる Orca の Webhooks をデプロイします。
Webhooks を利用すると、検知したアラートを外部の URL に送信できます。

Settings -> Connections -> Integrations と進み、ページ中段あたりにある Webhooks をクリックします。
以下画像のウィザードが開くので [Create] ボタンをクリックします。

名前は任意で、Trigger URL には API Gateway のエンドポイントを指定します。

Automations

Automations を設定します。
アラートのステータスが in Progress になったら通知されるようにします。
また、デバックのため [Test Now] ボタンをクリックして、唯一のアラートが検知できるように Type などでフィルタリングしておくと、テスト時にたくさん通知が届かずスムーズです。

Define Results にSend to Webhook URL を指定します。

Webhooks のデバッグ

アラートのステータスを Open -> in_Progress に変更する度に Webhooks がトリガーされます。
タイムラインで成功 / 失敗を確認できます。

まとめ

いかがでしたでしょうか。
今回は AWS サービスと連携しましたが、Orca の Webhooks を利用すると、さまざまなサードパーティのサービスと連携することができます。

他にも面白い機能ができたら公開したいと思います。

最後までお読みくださりありがとうございました。