こんにちは、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 に担当者のメールアドレスを手打ちします。
すると、検知したアカウント情報、検知したリソース名、修復方法などが本文に記載されたメールが、指定したメールアドレスに届きます。
メールを受信した担当者は何が発生しているのか把握し、手順に沿って対応していくという運用が可能です。
処理イメージ
以下のような手順で処理されます。
- Orca Security のアラートページで、テキストボックスにメールアドレスを入力し、アラートステータスを Open から in Progress に変更する
- Orca Automations が in Progress のステータス変更をトリガーに Webhooks を実行する
- Webhooks 経由で Amazon API Gateway のエンドポイントにリクエストが送信される
- API Gateway の統合 Lambda がアラート名や Remediation 情報を整形する
- 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 を利用すると、さまざまなサードパーティのサービスと連携することができます。
他にも面白い機能ができたら公開したいと思います。
最後までお読みくださりありがとうございました。