一度にたくさん来るInspectorの通知を1つにまとめてSNSに送ってみた
背景
AWSのセキュリティサービスであるInspectorを導入したものの、その通知や管理方法に悩まされていました。多くのAWSユーザーが直面する問題です。
最初は、ネット上の情報を参考にEventBridgeを使用して通知を設定してみました。しかし、この方法では脆弱性の数×インスタンス数、またはLambda関数の数だけ通知が来てしまい、非常に煩わしい状況になってしまいました。
これは明らかに効率的ではありません。そこで、この問題を解決するための独自のソリューションを開発することにしました。
一度にたくさん来る通知をどうやって処理するか
通知をまとめる方法を考える際、最初に思いついたのはDynamoDBの使用でした。しかし、コストを抑えたいので別のアプローチを模索しました。
そこで注目したのが、SNSのメトリクスがCloudWatchで取得できるという点です。これをトリガーとして使用できれば、効率的に通知をまとめることができるのではないかと考えました。
具体的には、CloudWatch Alarmを使用してLambda関数を実行する方法を採用しました。この方法により、以下のようなワークフローを実現できました:
-
Inspector FindingをまとめるLambda関数を作る
- コードをGithubから持ってくる
- ロールの設定。
デフォルトのロールに以下を追加
- AWSIoTDeviceDefenderPublishFindingsToSNSMitigationAction
- AmazonInspectorReadOnlyAccess
- 環境変数を入力する。
- AWS_REGION: Findingの対象リージョン
- LANG: サマリの言語(デフォルト:en, 日本語はjp)
- TOPIC_ARN: 実際に通知するSNSトピックのARN
-
InspectorからEventBridge経由でサブスクリプションを設定していないダミーのSNSに通知
-
CloudWatchがSNSのメトリクス(Fill関数を通したNumberOfMessagesPublished)を監視
-
Lambda関数が通知をまとめてSNSに送信
Inspector通知をまとめてSNSに送るサンプル
この方法により、大量の個別通知を1つにまとめることができ、管理が非常に楽になりました。
まとめ
このソリューションの詳細な実装方法については、GitHubリポジトリで公開しています。興味のある方は是非チェックしてみてください。(まだlambda_function.pyしか置いてないですがそのうち、Readmeを書きます)
このアプローチを採用することで、Inspectorの通知管理が大幅に改善され、セキュリティ監視の効率が向上しました。AWSのサービスを組み合わせることで、コスト効率の良い、カスタマイズされたソリューションを作成できることを実感しました。
皆さんも同様の問題に直面していたら、ぜひ参考にしてみてください。