AWS Security Hubのセキュリティ基準の検知結果を分析してみたくてCloudWatch Logsに出力してInsightで見てみた
こんにちは、臼田です。
みなさん、Security HubでAWS環境のセキュリティチェックしてますか?(挨拶
今回は長いタイトルですが、Security HubのログをCloudWatch Logsに入れる話と、入れた後分析してみる話です。
背景
AWS Security HubのAWS基礎セキュリティベストプラクティスをよく使っていますが、たくさんのAWSアカウントを集約して運用しているとそのイベント記録の傾向を確認したいなーと感じました。
検知されるFindingsには、そのイベントが初めて検出されたCreatedAt
あるいはFirstObservedAt
、更新されたUpdatedAt
あるいはLastObservedAt
が記録されていますが、イベントの変更経過についてはトラッキングできません。そのため、イベント発生毎に記録をする必要があります。
イベント自体はEventBridgeをトリガーに補足できるので、最初はそこからDynamoDBに記録しようと思いましたが、傾向を確認するのであればCloudWatch Logsに出してメトリクスフィルターでメトリクスをとったり、Logs Insightでログを確認するほうが良さそうだと思ったのでそちらにしました。(結局今回はメトリクスフィルターも使っていませんが)
この記事では出力の具体的な設定方法と、確認の簡単なクエリについて紹介します。
やってみた
今回は複数のAWSアカウントのAWS基礎セキュリティベストプラクティスを集約しているアカウント上で、すべてのAWSアカウントのすべてのリージョンのFindingsを記録していきます。
ちなみに集約設定については下記を参照してください。
まずはEventBridgeでイベントを拾い、CloudWatch Logsに出力する設定を行います。
EventBridgeルールの作成画面から作成します。今回はルール名をsecurity-hub-standards-fsbp-logging-rule
としました。
続いてイベントパターンを入力します。Security Hubのイベントはある程度ビジュアルエディタから入れていくことも可能ですが、詳細なパラメータを設定する場合にはカスタムパターンとなります。下記jsonを入力します。
{ "source": ["aws.securityhub"], "detail-type": ["Security Hub Findings - Imported"], "detail": { "findings": { "ProductFields": { "StandardsArn": ["arn:aws:securityhub:::standards/aws-foundational-security-best-practices/v/1.0.0"] } } } }
今回はAWS基礎セキュリティのベストプラクティスを対象とし、ワークフローのステータスやレコードのステータス、コンプライアンスの状況などに関係なく出力するため、ProductFields.StandardsArn
だけ指定しています。他の目的で設定する場合には他のパラメータも設定しましょう。
続いてターゲットにCloudWatch Logsを指定します。ロググループの名前はsecurity-hub-standards-fsbp-log
としました。このまま作成を完了します。
作成できたらCloudWatch Logsを眺めに行きます。
今回のアカウントではAWSアカウントを12個抱えているため、すぐにたくさんのログで埋まりました。「Logs Insightで表示」からログを確認していきましょう。
開かれた画面上のデフォルトのクエリは、直近1hのログからタイムスタンプとメッセージを20件取得するクエリとなります。実行したら約3,000件のログが確認できました。
ログを眺めていくと色々取れているのが確認できます。下に表示されたログを▼から開いたり、右カラムの「フィールド」からログフィールドからフィールドとそのパターンや実際の値が確認できます。ちなみに実際のFindingsはdetail.findings
配下に含まれていますが、ここがリストになっています。複数のイベントが1つにまとめられる懸念を感じましたが、Security Hub の EventBridge イベント形式 - AWS Security Hubには「各イベントは 1 つの結果を送信します。」とあるためその心配はなさそうです。
今回は特に下記値についての傾向を確認したいです。
- AWSアカウントID
- リージョン
- Control ID
- コンプライアンスのステータス
- レコードのステータス
- ワークフローのステータス
そのため下記クエリを実行します。
fields @timestamp, detail.findings.0.AwsAccountId AS AccountId, detail.findings.0.Region AS Region, detail.findings.0.ProductFields.ControlId AS ControlId, detail.findings.0.Compliance.Status AS Compliance, detail.findings.0.RecordState AS Record, detail.findings.0.Workflow.Status AS Workflow | limit 10000
下記のようにいい感じに抽出できたので、「結果をエクスポート」の「テーブルをダウンロード(CSV)」からダウンロードします。
ある程度のクエリはInsight上で可能ですが、残念ながら複数項目の集計と可視化は難しいので、ExcelなりSpreadsheetなりでこねこねします。クエリのたびにお金かかりますからね。
2次元の表などはこちらに軍配が上がります。下記はワークフローとコンプライアンスのステータスの関係についてピボットテーブルで確認しています。
値の取りうる状態がいろんな組み合わせがあり、挙動を理解するのが大変だなーと感じることはできましたw
まとめ
AWS Security Hubのセキュリティ基準について、CloudWatch Logsと連携してログを追ったり分析する方法について紹介しました。
いろんな目的に活用できる方法だと思うので参考にどうぞ。