スキップしてコンテンツを表示

EventBridge と Amazon SNS トピックと組み合わせて使用して、Security Hub の検出結果に関するカスタマイズされた E メール通知をセットアップする方法を教えてください。

所要時間3分
0

Amazon EventBridge と Amazon Simple Notification Service (Amazon SNS) トピックと組み合わせて使用して、AWS Security Hub のカスタマイズされた E メール通知をセットアップしたいと考えています。

簡単な説明

次の解決策では、Security Hub の通知を受信するために、Amazon SNS を使用して Amazon EventBridge を設定する方法を示しています。EventBridge ルールに基づいて、Amazon SNS はイベントが発生したときにトピックに登録されている E メールアドレスに通知を送信します。AWS Lambda 関数は、フォーマットが改善された、カスタマイズされたアラートメッセージを作成します。

解決策

Amazon SNS トピックとサブスクリプションを作成する

次の手順を実行します。

  1. Amazon SNS コンソールを開きます。
  2. ナビゲーションペインで [トピック] を選択します。
  3. [トピックを作成] を選択します。
  4. [詳細] セクションの [タイプ] で [標準] を選択します。
  5. [名前] にトピックの名前を入力します。
  6. [トピックを作成] を選択します。
  7. 作成したトピックから、[サブスクリプションの作成] を選択します。
  8. [トピック ARN] で、自動的に入力されない場合は、作成したトピックの Amazon リソースネーム (ARN) を選択します。
  9. [プロトコル] に [メール] を選択します。
  10. [エンドポイント] に SNS 通知を受信するメールアドレスを入力します。
  11. [サブスクリプションの作成] を選択します。
    重要: サブスクリプションのステータスを PendingConfirmation から Confirmed に切り替えるには、サブスクライバーに送信された確認メールでサブスクリプションを承認する必要があります。
  12. (オプション) トピックでのサブスクリプション解除アクションを防止する認証済みサブスクリプションを作成することもできます。

Lambda 関数を作成する

次の手順を実行します。

  1. Lambda コンソールを開きます。
  2. ナビゲーションペインで、[関数] を選択します。
  3. [関数の作成] を選択します。
  4. [最初から作成] を選択します。
  5. [関数名] に関数の名前を入力します。
  6. [ランタイム] を選択し、次に [Python 3.14] を選択します。
  7. [アーキテクチャ] で [x86_64] を選択します。
  8. [デフォルトの実行ロールの変更] を展開します。
  9. [実行ロール] で、[AWS ポリシーテンプレートから新しいロールを作成] を選択します。
  10. [ロール名] に、ロールの名前を入力します。
  11. [ポリシーテンプレート] で、[Amazon SNS 発行ポリシー] を選択します。
  12. [関数の作成] を選択します。
  13. [コードソース] セクションに次のコードを入力します。
import json
import boto3

sns = boto3.client('sns')

def lambda_handler(event, context):

    #Extract details from JSON event
    detailType= event["detail-type"]
    region = event["region"]
    accountId = event["account"]

    #Security Hub Insight Results
    if (detailType == "Security Hub Insight Results"):

        action = event["detail"]["actionDescription"]

        message = "Alert: %s in %s for account: %s\n Action description: %s" % (detailType, region,accountId,action)

    elif  ("Security Hub Findings" in detailType):

        finding = event["detail"]["findings"][0]
        findingTime = finding["FirstObservedAt"]
        findingType = finding["Types"][0]
        findingDescription = finding["Description"]
        remediation = finding["Remediation"]["Recommendation"]["Text"]

        #Security Hub Findings - Custom finding
        if(detailType == "Security Hub Findings - Custom"):
            complianceStatus = finding["Compliance"]["Status"]
            severity = finding["Severity"]["Label"]
            remediationUrl = finding["Remediation"]["Recommendation"]["Url"]

            message = "Alert: %s in %s for account: %s\n\nFinding regarding: [%s] %s\n Severity: %s\nDescription: %s\nFirst observed at: %s\n%s: %s" % (detailType, region, accountId, complianceStatus, findingType,
            severity, findingDescription, findingTime, remediation, remediationUrl)

        #Security Hub Findings - Imported finding
        else:
            message = "Alert: %s in %s for account: %s\n\nFinding regarding: %s\nFirst observed at: %s\nRemediation recommendation: %s" % (detailType, region, accountId, findingDescription,findingTime, remediation)

    #AWS API Call via CloudTrail finding
    elif (detailType == "AWS API Call via CloudTrail"):

        time = event["detail"]["eventTime"]
        eventName = event["detail"]["eventName"]
        requestParameters = event["detail"]["requestParameters"]

        message = "Alert: %s in %s for account: %s at time: %s\n\n Event: %s \n Request parameters: %s" % (detailType, region, accountId, time, eventName, requestParameters)


    #If the event doesn't match any of the above, return the event    
    else:
        message = str(event)

    response = sns.publish(
            TopicArn = "arn:aws:sns:eu-west-1:111122233333:your-arn",
            Message = message
            )

    return {
      'statusCode': 200,
      'body': json.dumps('Success!')
}

注: arn:aws:sns:eu-west-1:111122233333:your-arn をトピックの ARN に置き換えてください。 [デプロイ] を選択します。

EventBridge ルールを作成および設定する

次の手順を実行します。

  1. EventBridge コンソールを開きます。
  2. ナビゲーションペインで [ルール] を選択し、[ルールを作成] を選択します。
  3. ルールの [名前] を入力し、[次へ] を選択します。
  4. [作成方法] で [パターンフォームを使用する] を選択します。
  5. [イベントソース] で [AWS サービス] を選択します。
  6. [AWS サービス] で [Security Hub] を選択します。
  7. [イベントタイプ] で [すべてのイベント] を選択し、[次へ] を選択します。
    注: すべてのイベントではなく、特定のイベントに対してアラートを設定することもできます。
  8. [ターゲットタイプ] で [AWS サービス] を選択します。
  9. [ターゲットの選択] で [Lambda 関数] を選択します。
  10. [関数] で、先に作成した関数を選択し、[次へ] を選択します。
  11. [タグの設定] ページで、[次へ] を選択します。
  12. [ルールを作成] を選択します。

カスタマイズされた通知を受け取る

設定したイベントが発生すると、no-reply@sns.amazonaws.com からカスタマイズされた通知メールが届きます。

デフォルトの Security Hub イベントは、より読みやすいカスタマイズされた形式に再フォーマットされます。

Security Hub Insight 結果メッセージの例

デフォルト:

{"version": "0", "id": "ac844908-d14e-05b1-4b7b-836d85110e26", "detail-type": "Security Hub Insight Results", "source": "aws.securityhub", "account": "123456789012", "time": "2019-04-11T21:31:57Z", "region": "us-east-1", "resources": ["arn:aws:securityhub:us-east-1:123456789012:action/custom/slackMessaging"], "detail": {"actionName": "SendToSlack", "actionDescription": "Send Findings to Slack", "insightName": "5.AWS users with the most suspicious activity", "insightArn": "arn:aws:securityhub:::insight/securityhub/default/9", "resultType": "ResourceAwsIamAccessKeyUserName", "insightResults": [{"Admin": 7}, {"DenySlr_UI_User": 1}]}}

カスタマイズ済み:

アラート: アカウント 123456789012 における us-east-1 での Security Hub Insight 結果

アクションの説明: 検出結果を Slack に送信

注: ユースケースに合わせて、セキュリティ検出結果タイプごとにメッセージを編集できます。

関連情報

GuardDuty に対する EventBridge ルールを構成し、特定のサービス検出タイプに関するカスタム SNS 通知を送信する方法を教えてください

Tutorial: Use input transformer to customize what EventBridge passes to the event target (チュートリアル: 入力トランスフォーマーを使用して EventBridge がイベントターゲットに渡すものをカスタマイズする)

EventBridge ルールが Lambda 関数を呼び出さない理由を教えてください

コメントはありません

関連するコンテンツ