AWS環境において、Cloud One Workload SecurityとPagerDutyを連携してみた(SNS&Lambda編)

2023.09.21

こんにちは、シマです。
皆さんはCloud One Workload Security(以降C1WS)とPagerDutyは使っていますか?C1WSはトレンドマイクロ社が提供する総合サーバセキュリティサービスで、AWSの観点ではEC2を保護することができるサービスです。PagerDutyはシステムのインシデント対応を一元化できるサービスです。これらを連携することで、C1WSの各種インシデントを含めたシステム全体のインシデントをPagerDutyで管理することが可能になります。

構成

PagerDutyへのアラート送信元として対応しているサービスは様々なものがあります。AWSのサービスでいうと例えば、「Amazon CloudWatch」や「AWS Health Dashboard」、「AWS Security Hub」などがあります。しかし、2023年9月現在はC1WSについて対応はしていないため、連携方式として考えられるものは「Eメールによる連携」、「APIによる連携」のどちらかになります。今回は、「APIによる連携」を実施します。今回の構成は下図の通りです。

C1WSの機能により、Amazon SNSへイベントを転送します。Amazon SNSからLambdaを呼んで、LambdaからPagerDutyAPIを呼ぶような流れになります。

設定

0.前提

AWS環境、C1WS、PagerDutyの初期構築は済んでいるとし、本記事では各種連携に関する設定を記載します。

1.AWSとC1WS連携用IAMユーザ作成

AWSへログインし、IAMポリシーを作成します。

SNSのPublish権限の設定をします。

{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Action": [
            "sns:Publish"
         ],
         "Effect": "Allow",
         "Resource": "*"
      }
   ]
}

ポリシー名を設定して作成します。

続いて、IAMユーザを作成します。
先ほど作成したポリシーを選択して作成します。
作成したユーザのアクセスキーを作成します。
右上の「アクセスキーを作成」から作成します。
アクセスキーの作成が完了したら、後で使用するためにcsvファイルをダウンロードしておきます。

2.SNSの設定をする

C1WSに設定するSNSトピックを作成します。
タイプをスタンダードにし、名前を入力しトピックを作成します。
作成後に表示されるARNは後で利用するのでメモしておきます。

3.C1WSのイベント転送機能を設定する

C1WS管理コンソールからイベント転送の設定をします。Amazon SNSの項目で先ほど作成したIAMユーザ、SNSトピックの情報を設定し、転送するイベントの種類を選択します。今回はテストとして不正プログラム対策イベントを発行させるのでそれを選択し、保存します。

3.PagerDutyを設定する

PagerDuty Service Directory のページからServiceを作成します。
名前を入力し、Nextをクリックします。
エスカレーションポリシー、ノイズ削減については一旦デフォルトのまま設定し、Integrations設定で「Events API V2」を選択し、作成します。
作成完了後に表示される「Integration Key」はコピーしてメモしておきます。

4.Lambdaを設定する

今回APIをコールするために、requestsを使用します。しかし、Python 3.11にはAPIリクエストに使用するrequestsが含まれていないため、requests用のレイヤー作成から実施します。CloudShellにて以下のコマンドを実行し、レイヤーにアップロードするファイルを作成します。

mkdir python/ 
cd python
sudo yum -y install gcc gcc-c++ kernel-devel python-devel libxslt-devel libffi-devel openssl-devel
sudo yum -y install python-pip
pip install -t ./ requests
cd python
cd ..
zip -r Layer.zip python/

作成されたファイルをダウンロードします。

Lambdaの画面からレイヤーの作成をクリックします。
名前を入力し、先ほどダウンロードしたLayer.zipをアップロードし、ランタイムはPython3.11を指定し作成します。

続いて、Lambda関数を作成します。
関数名を入力し、ランタイムはPython3.11を選択します。
トリガーを追加をクリックし、SNSを選択し、「2.SNSの設定をする」にて作成したSNSのARNを指定します。
レイヤーの設定をするためにLayersをクリックし、レイヤーの追加をクリックします。
カスタムレイヤーから先ほど作成したレイヤーとバージョンを選択し、追加します。
Labmdaのコードソースを入力し、Deployをクリックします。
Labmdaのサンプルコードを以下に記載します。

import json
import requests

routing_key = "xxxx"

def lambda_handler(event, context):
    for record in event['Records']:
        message = json.loads(record['Sns']['Message'])

        try:
            headers = {
                'Content-Type': 'application/json',
            }
            # pagerduty command exampleを仮のデフォ値として設定
            data = {
                "payload": {
                    "summary": "Test alert",
                    "severity": "critical",
                    "source": "Alert source"
                },
                "routing_key": "xxx",
                "event_action": "trigger"
            }
            data['routing_key']=routing_key

            for msg in message:
                # --- pagerdutyとC1WSの値の紐づけを行う
                data['payload']['source']=msg['Hostname']
                data['payload']['summary']=msg['EventType']
                # ---
                data_str = json.dumps(data)
                response = requests.post('https://events.pagerduty.com/v2/enqueue', headers=headers, data=data_str)
                print(response.text)

        except Exception as e:
            print("Error Exception.")
            print(e)

    return

4行目の「routing_key = "xxxx"」のxxxxは、「3.PagerDutyを設定する」でメモをしたIntegration Keyを貼り付けて使用します。コード修正後は反映のためにDeployをクリックします。
28行目、29行目ではC1WSがSNS経由で発行するイベントを、PagerDutyのAPIが受け付ける形式に変換するために記載しています。今回は一例として、C1WSのHostnameとEventTypeをPagerDuty APIのsourceとsummaryとして紐づけをしています。実際には以下の各ドキュメントを参照の上、紐づけ部分をカスタマイズする必要があります。

JSON形式のイベント - Workload Security | Trend Micro Cloud One™ ドキュメント

API Reference | PagerDuty Developer Documentation

動作確認

C1WSの管理対象コンピュータになっているEC2上にEICARテストファイルを配置して、不正プログラムアラートを発報させます。その後、PagerDuty上でインシデントが表示されていることを確認しました。コード内の紐づけ通り、sourceとsummaryにC1WSからの値が入っていることが確認できました。

最後に

C1WSのイベントの種類毎の実際の値の紐づけについてはまだまだ検討の余地があると思いますが、まずはAWS環境でC1WSとPagerDutyを連携するところを目的として実施してみました。

本記事がどなたかのお役に立てれば幸いです。

参考にしたサイト