CloudWatch Unified Data Store を使用したセキュリティ可視性ダッシュボード
Amazon CloudWatch 統合データストア は、個々のロググループ名を知らなくても、AWS サービス全体のログデータを検出、整理、クエリするための一元的な方法を提供します。これを実現するために、CloudWatch 統合データストアはファセット を使用します。ファセットとは、CloudWatch がインタラクティブなフィルタリング、グループ化、分析のために表示するログデータのフィールドです。デフォルトのファセット(例えば @data_source_name, @data_source_type、および @data_format は、設定不要ですべての Standard ログクラスのロググループで自動的に利用可能です。CloudWatch Logs Insights コンソールでは、ファセット値を選択してデータを視覚的に探索したり、クエリ内で参照して検索範囲を一致するロググループとイベントのみに効率的に絞り込んだりすることができます。
これらのファセットを通じて、CloudWatch はログをその発生元のデータソース(AWS CloudTrail や Amazon VPC Flow Logs など)によって自動的に分類するため、ロググループ全体にわたるすべての CloudTrail または VPC Flow Log のログデータをクエリできます。 @data_source_name ファセットは、ロググループの数や名前に関係なく適用されます。
CloudWatch クロスアカウントクロスリージョンログ集約を使用することで、その基盤の上にセキュリティ分析を構築できます。このガイドでは、AWS CloudFormation を通 じてサンプルのビルド済みCloudWatch ダッシュボードをデプロイする手順を説明します。このダッシュボードは CloudWatch データソースを活用して、CloudTrail および VPC Flow Logs のアクティビティをほぼリアルタイムで可視化します。また、各ウィジェットが提供する情報と、セキュリティモニタリング、インシデント調査、コンプライアンスの可視化にダッシュボードを活用する方法についても説明します。
このダッシュボードが重要な理由
セキュリティチームは、AWS アカウント全体の API アクティビティとネットワークトラフィックに対して、一元化されたほぼリアルタイムの可視性を必要としています。一元化されたダッシュボードがなければ、チームは複数のロググループにわたってクエリを手動で実行し、CloudTrail と VPC Flow Logs 間のデータを相関させ、分散したソースからセキュリティコンテキストを組み合わせなければなりません。
このダッシュボードは、いくつかの重要な課題に対応しています。
- ロググループ名への依存なし:
SOURCE logGroups() | filterIndex @data_source_nameを使用して、アカウント内のロ ググループの名前に関係なく、CloudWatch Unified Data Store のデフォルトファセットを通じて CloudTrail と VPC Flow Logs を動的に検出します。 - デュアルフォーマットのサポート: ログフォーマットの設定に基づいて、Standard(ネイティブ AWS フィールド名)または OCSF(Open Cybersecurity Schema Framework)バージョンのダッシュボードをデプロイします。
- クロスサービスの相関: CloudTrail API アクティビティと VPC Flow Log ネットワークデータを並べて表示し、セキュリティイベントを視覚的に関連付けます。
- アカウント間での移植性: 同じ CloudFormation テンプレートが、CloudTrail と VPC Flow Logs を CloudWatch Logs に送信しているすべてのアカウントで動作し、ロググループ名のパラメータ変更は不要です。
前提条件
デプロイする前に、アカウントに必要なデータソースが利用可能であることを確認してください。
aws logs list-aggregate-log-group-summaries --group-by DATA_SOURCE_NAME_AND_TYPE
出力に aws_cloudtrail および amazon_vpc のエントリが表示されるはずです。これらが欠けている場合は、以下を確認してください。
- CloudTrail は、CloudWatch Logs にログを配信するように設定されています。
- VPC Flow Logs は、少なくとも 1 つの VPC に対して CloudWatch Logs に配信するように設定されています。
ダッシュボードのデプロイ
- CloudWatch_Dashboard_CloudTrail_VPC.yaml テンプレートをダウンロードします。
- CloudFormation → スタックの作成 → 新しいリソース を使用 に移動します。
CloudWatch_Dashboard_CloudTrail_VPC.yamlテンプレートをアップロードします。- パラメータを設定します。
- DashboardName: ダッシュボードの名前(デフォルト:
CloudTrail-VPC-Dashboard)。 - LogFormat: ネイティブの AWS CloudTrail/VPC Flow Log フィールド名の場合は
Standardを、Open Cybersecurity Schema Framework の正規化フィールドの場合はOCSFを選択します。
- DashboardName: ダッシュボードの名前(デフォルト:
- スタックを確認して作成します。
CloudFormation パラメータ
| パラメータ | デフォルト | 説明 |
|---|---|---|
DashboardName | CloudTrail-VPC-Dashboard | CloudWatch ダッシュボードの名前 |
LogFormat | Standard | Standard(ネイティブ AWS フィールド)または OCSF(正規化スキーマ) |
クエリの仕組み
このダッシュボードのすべての CloudWatch Logs Insights クエリは、同じパターンを使用しています。
SOURCE logGroups() | filterIndex @data_source_name in ["aws_cloudtrail"]
| <your query logic here>
SOURCE logGroups()は、CloudWatch にアカウント内のすべてのロググループを検索するよう指示します。filterIndex @data_source_name in [...]は以下を使用します@data_source_nameデフォルトのファセットを使用して、指定したデータソースを含むロググループのみに検索を絞り込みます。CloudWatch は、すべての Standard ログクラスのロググループに対して、このファセットをデフォルトのファセットとして自動的 に提供します。カスタム設定は不要です。- CloudTrail クエリの場合、データソース名は
aws_cloudtrailです。 - VPC Flow Log クエリの場合、データソース名は
amazon_vpcです。
このアプローチにより、実際のロググループ名を知ったり設定したりする必要が一切なくなります。CloudTrail のロググループ名が aws-cloudtrail-logs、aws/cloudtrail/managementevents、または任意のカスタム名のいずれであっても、ダッシュボードは同じように動作します。
セキュリティのベストプラクティス
IAM によるダッシュボードアクセスの制限
セキュリティデータを表示する CloudWatch ダッシュボードには、ベストプラクティスとして最小権限のアクセスコントロールを適用してください。
以下は、ダッシュボードへの読み取り専用アクセスを許可し、変更を拒否する IAM ポリシーの例です。表示専用アクセスを持つべき IAM ロールまたはグループにアタッチしてください。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowDashboardReadOnly",
"Effect": "Allow",
"Action": [
"cloudwatch:GetDashboard",
"cloudwatch:ListDashboards"
],
"Resource": "arn:aws:cloudwatch::ACCOUNT_ID:dashboard/CloudTrail-VPC-Dashboard"
},
{
"Sid": "DenyDashboardModification",
"Effect": "Deny",
"Action": [
"cloudwatch:PutDashboard",
"cloudwatch:DeleteDashboards"
],
"Resource": "arn:aws:cloudwatch::ACCOUNT_ID:dashboard/CloudTrail-VPC-Dashboard"
}
]
}
ACCOUNT_ID を AWS アカウント ID に置き換え、カスタマイズした場合は CloudTrail-VPC-Dashboard を実際のダッシュボード名に置き換えてください。
ダッシュボードを管理する必要があるセキュリティオペレーシ ョンチームには、読み取りと書き込みの両方を許可する個別のポリシーを使用します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowDashboardFullAccess",
"Effect": "Allow",
"Action": [
"cloudwatch:GetDashboard",
"cloudwatch:ListDashboards",
"cloudwatch:PutDashboard",
"cloudwatch:DeleteDashboards"
],
"Resource": "arn:aws:cloudwatch::ACCOUNT_ID:dashboard/CloudTrail-VPC-Dashboard"
}
]
}
ダッシュボードのクエリには、関連するロググループに対する logs:StartQuery、logs:GetQueryResults、および logs:FilterLogEvents の権限も必要です。IAM ロールがこれらの権限を CloudTrail および VPC Flow Log のロググループにスコープして付与されていることを確認してください。
CloudWatch Alarms でダッシュボードを補完する
ダッシュボードは現在の状況を表示しますが、問題が発生した際に通知することはありません。重要なセキュリティイベントのアラートを受け取るには、CloudWatch Logs メトリクスフィルターを基盤としたCloudWatch Alarmsを設定してください。検討する価値のあるものをいくつか紹介します。
| イベント | メトリクスフィルターパターン |
|---|---|
| ルートアカウントの使用 | { $.userIdentity.type = "Root" && $.userIdentity.invokedBy NOT EXISTS && $.eventType != "AwsServiceEvent" } |
| 権限昇格 | { ($.eventName = "AttachRolePolicy") || ($.eventName = "PutRolePolicy") || ($.eventName = "CreateAccessKey") || ($.eventName = "CreateLoginProfile") } |
| コンソールログインの失敗 | { ($.eventName = "ConsoleLogin") && ($.errorMessage = "Failed authentication") } |
ローリングウィンドウ内の REJECT カウントに対してCloudWatch Logs Insights クエリベースのアラームを使用します。 | ポートスキャンやアクティブなネットワーク攻撃を検出します。 |
SNS トピックにアラームアクションをルーティングして、メール、Slack、またはインシデント管理プラットフォームを通じてセキュリティオペレーションチームに通知します。
ログ グループの暗号化と保持期間
CloudWatch Logs は、デフォルトで AWS マネージドキーを使用してすべてのログデータを保存時に暗号化します。設定は不要です。ただし、組織がコンプライアンス上の理由でカスタマーマネージド暗号化キーを必要とする場合は、KMS キーを各ロググループに関連付けることができます。これにより、CloudTrail を通じてキーのローテーション、アクセスポリシー、および監査証跡を完全に制御できます。
このテンプレートはダッシュボードのみを作成します。基盤となるロググループの作成や管理は行わないため、それらに対して暗号化や保持設定を強制することはできません。ダッシュボード用の CloudTrail および VPC Flow Log のロググループに適切な設定が適用されていることを確認してください。
- KMS 暗号化: 必要な場合は、
aws logs associate-kms-keyを使用するか、ロググループの作成時に CloudFormation を使用して、ロググループに KMS キーを関連付けます。 - 保持ポリシー: デフォルトでは、CloudWatch Logs はログデータを無期限に保持します。コンプライアンス要件とコストのバランスを取る保持ポリシーを設定してください。
追加の推奨事項
- デプロイ後に CloudFormation スタックの削除保護を有効にして、誤った削除を防ぎます。
- AWS Organizations のサービスコントロールポリシー (SCPs)を使用して、
cloudwatch:PutDashboardおよびcloudwatch:DeleteDashboardsをすべてのアカウントにわたる特定の管理者ロールに制限します。 - CloudWatch API 呼び出しに対して CloudTrail ログを有効にすることで、ダッシュボードの変更が CloudTrail の
PutDashboardイベントを通じて監査可能になります。
ダッシュボードセクションとウィジェットリファ レンス
ダッシュボードは 6 つのセクションで構成されています。以下は標準フォーマットバージョンです。OCSF バージョンには、OCSF フィールド名を使用した同等のウィジェットがあります (api.operation, src_endpoint.ip, actor.user.name、など)。
セクション 1: セキュリティの概要
このセクションでは、AWS 環境全体のセキュリティ体制を一目で確認できるビューを提供します。
| ウィジェット | タイプ | データソース | 表示内容 | 重要な理由 |
|---|---|---|---|---|
| 📈 時間経過に伴うエラー率の傾向 | Time series | CloudTrail | 時間経過に伴う API エラー数を 5 分単位のビンで集計します。 | エラーの急増は、ブルートフォース攻撃、誤設定された自動化、または侵害された認証情報を示している可能性があります。何か異常が起きている最初の指標として活用してください。 |
| 🚨 トップエラーコード (Unauthorized / Access Denied) | Table | CloudTrail | 最も頻繁に発生するアクセス拒否および不正アクセスのエラーコー ドを、エラーコード、API イベント名、アカウント、リージョン別に分類して表示します。 | どの特定の API 呼び出しがどのアカウントで拒否されているかを特定します。ここで見られるパターンは、クレデンシャルスタッフィング、権限の誤設定、またはラテラルムーブメントの試みを明らかにする可能性があります。 |
| 🥧 ユーザー ID タイプ | Pie chart | CloudTrail | ID タイプ別(IAMUser、AssumedRole、Root、FederatedUser、AWSService など)の API 呼び出しの分布です。 | 健全な環境では、ほとんどが AssumedRole と AWSService の呼び出しになるはずです。Root や IAMUser のアクティビティが目立つ場合は、調査が必要な可能性があります。 |
| 🥧 VPC フローアクション | Pie chart | VPC Flow Logs | すべての VPC フローログレコードにおける ACCEPT と REJECT アクションの比率です。 | REJECT の比率が高い場合、ポートスキャン、セキュリティグループの誤設定、またはネットワーク境界に対するアクティブな攻撃の試みを示している可能性があります。 |
| 🔐 ルートアカウントのアクティビティ | Table | CloudTrail | ルートアカウントを使用して行われた最近の API 呼び出し(イベント名、ソース IP、アカウント、リージョンを含む)です。 | ルートアカウントの使用はまれであり、十分に正当な理由があるべきです。予期しないルートアクティビティは、直ちに調査すべき優先度の高いセキュリティイベントです。 |
セクション 2: 相関セキュ リティインサイト — CloudTrail + VPC Flow Logs
このセクションでは、視覚的な相関関係を確認できるよう、API レイヤーとネットワークレイヤーのセキュリティデータを並べて表示します。
| ウィジェット | タイプ | データソース | 表示内容 | 重要な理由 |
|---|---|---|---|---|
| ⚠️ 疑わしい IP: API エラー | Table | CloudTrail | 最も多くの API エラーを生成している外部(RFC1918 以外)の IP アドレスを、アカウントとリージョン別にグループ化して表示します。 | エラー数の多い外部 IP は、不正アクセスを試みている可能性が高いです。これらをネットワークの REJECT ウィジェットと相互参照し、同じ IP がネットワーク層でもブロックされているかどうかを確認してください。 |
| ⚠️ ネットワーク REJECT のある IP | Table | VPC Flow Logs | 最も多くの REJECT アクションを持つ外部 IP アドレスを、宛先ポート別に分類して表示します。 | どの外部 IP がセキュリティグループや NACL によってブロックされているかを示します。同じ IP がこのウィジェットと API エラーウィジェットの両方に現れる場合、悪意のあるアクティビティである可能性が強く示唆されます。 |
| 🔗 相互参照: CloudTrail ログ内の外部 IP | Table (full width) | CloudTrail | API 呼び出しを行ってい るすべての外部 IP を、IP・アカウント・リージョンごとの API 呼び出し総数とエラー数とともに表示します。 | 外部 IP アクティビティの包括的なビューを提供します。API 呼び出し数が多くエラー数が少ない IP は正当なサービスの可能性があります。エラー比率が高い IP は調査が必要です。 |
| 📈 API アクティビティタイムライン | Time series | CloudTrail | 時間経過に伴う API 呼び出しの総量を 10 分単位のビンで表示します。 | 通常の API アクティビティのベースラインを確立します。ベースラインからの逸脱は、自動化された攻撃、サービスの中断、またはスクリプトを実行する侵害された認証情報を示している可能性があります。 |
| 📈 ネットワークトラフィックタイムライン | Time series (stacked) | VPC Flow Logs | 時間経過に伴うネットワークフロー数を、ACCEPT/REJECT アクション別に積み上げて表示します。 | ネットワークトラフィックのパターンと、時間経過に伴うブロックされたトラフィックの割合を可視化します。REJECT の増加傾向は、進行中の攻撃を示している可能性があります。 |