Security HubアラートをAmazon Q Developer in chat(旧称: AWS Chatbot)で自動通知してみた
こんにちは!製造ビジネステクノロジー部の小林です。
前回の記事では、SecurityHubの通知をAWS Lambda + Webhook経由でSlackチャンネルに送信する実装をご紹介しました。今回は通知先にSlackチャンネルを追加する方法として、Lambda + Amazon Q Developer in chat applications (旧称: AWS Chatbot) を使用する方法をご紹介します。
Amazon Q Developer in chat applicationsとは?
Amazon Q Developer in chat applicationsは、AWS管理タスクをチャットアプリケーション内から直接実行できるAWSのサービスです。Slack、Microsoft Teamsなどのチャットプラットフォーム内からAWSリソースを監視・管理できるため、運用効率の向上やインシデント対応時間の短縮が期待できます。
詳細については下記の記事をご参照ください。
アーキテクチャ比較
前回の構成
Security Hub → EventBridge → Lambda → Slack Webhook URL → Slackチャンネル
今回の構成
Security Hub → EventBridge → Lambda → SNS → Amazon Q Developer in chat applications → Slackチャンネル
今回はWebhook URLをParameter Storeに保存する手順が不要になり、よりシンプルな構成になります。
やってみた
まずはAmazon Q Developer in chat applicationsの設定を行います。
「チャットクライアントを設定」→「Slack」→「クライアントを設定」を選択します。
ワークスペースを設定して、「許可をする」を選択します。
クライアントが作成できました!続いてチャンネルの設定で通知を送信するチャンネルを選択します。
設定名とチャンネルの設定を行います。
IAMロールの設定で、「既存のロールを使用する」または「テンプレートから新しいロールを作成」を選択します。
この設定画面では、Amazon Q Developer in chat applicationsのセキュリティ機能である「チャネルロール」と「ガードレール」を構成します。これらの設定は、Slackチャンネルから実行できるAWSアクションを適切に制限することができます。
- チャネルロール
- Slackチャンネルから実行されるAWSコマンドに対して、どのような権限を付与するかを定義するIAMロールです。
- ガードレール
- チャネルから実行できるAWSコマンドに対する追加の制限を設定する機能です。
- チャネルロールで許可された操作の中でも、さらに制限をかけることができます。
SNSトピックの設定で、Security Hubからの通知を受け取るSNSトピックを選択します。
「設定」ボタンをクリックして完了します。
以上でAmazon Q Developer in chat applicationsの設定は完了です!
Lambdaの実装内容
Amazon Q Developer in chat applicationsと連携するためのLambda関数は以下のように実装します。
import { SNSClient, PublishCommand } from '@aws-sdk/client-sns';
const snsClient = new SNSClient({});
export const handler = async (event: any): Promise<void> => {
const findings = event.detail.findings;
if (!findings || findings.length === 0) return;
const topicArn = process.env.TOPIC_ARN;
for (const finding of findings) {
try {
// Amazon Q Developer in chat applications用のEventBridge形式メッセージを作成
const chatbotMessage = {
version: "0",
id: finding.Id || `finding-${Date.now()}`,
"detail-type": "Security Hub Findings - Imported",
source: "aws.securityhub",
account: finding.AwsAccountId || event.account,
time: new Date().toISOString(),
region: finding.Region || event.region,
resources: finding.Resources ? finding.Resources.map((r: any) => r.Id) : [],
detail: {
findings: [finding]
}
};
await snsClient.send(new PublishCommand({
TopicArn: topicArn,
Subject: `Security Alert:開発環境 ${finding.Title.substring(0, 80)}`,
Message: JSON.stringify(chatbotMessage)
}));
} catch (error) {
console.error('Error sending SNS message:', error);
}
}
};
ハマりポイント
過去の記事で実装したLambda関数では、SNSトピックへ送信するメッセージを単純なテキスト形式で設定していました。しかし、Amazon Q Developer in chat applicationsと連携する場合、この方法では通知が届かないという問題に直面しました。
動作しない例
下記のようなプレーンテキスト形式では通知が届きませんでした。
await snsClient.send(new PublishCommand({
TopicArn: topicArn,
Subject: `Security Alert:開発環境 ${finding.Title.substring(0, 90)}`,
Message: `Severity: ${finding.Severity.Label}\nResource: ${finding.Resources[0]?.Id || 'Unknown'}`
}));
解決策
SNSトピックへ通知するメッセージで、EventBridge形式のJSONオブジェクトを作成し、それをJSON.stringify()でシリアライズしました。この形式に変更することで、Security Hubのアラートが正しくSlackチャンネルに通知されるようになりました。
動作確認
設定が正しく機能しているか確認するため、下記の手順でテストを実施しました。
テスト手順
- Security Hubコンソールにアクセスし、重要度「MEDIUM」以上の検出結果を選択
- 選択したアラートのワークフローステータスを「通知済み」に変更
- アラートを手動で通知
結果
テスト実行後、SlackチャンネルにSecurity Hubアラート通知がAmazon Qアプリを介して届きました!
通知は見やすく整形され、重要な情報が一目でわかるようになっています。
おわりに
今回ご紹介したAmazon Q Developer in chat applicationsを使用したSlack連携によって、チームが日常的に目にするコミュニケーションツール上でセキュリティアラートを受け取ることができるようになります。Lambda関数を使用したWebhook実装と比較して、簡易的に実装できました。
さらに、Amazon Q Developer in chat applicationsを使用することで、通知を受け取るだけでなく、Slackチャンネル内から直接AWSリソースに対してコマンドを実行することも可能になります。
皆様のAWS環境のセキュリティ向上に少しでもお役に立てれば幸いです。