CloudTrail はすべてを見ている - API 呼び出しの記録メカニズムとフォレンジック調査の実践

CloudTrail が AWS API 呼び出しを記録する仕組み、管理イベントとデータイベントの違い、CloudTrail Lake による SQL 分析、セキュリティインシデント発生時のフォレンジック調査手法を解説します。

CloudTrail は何を記録しているのか

CloudTrail は、AWS アカウント内で実行されたほぼすべての API 呼び出しを記録するサービスです。EC2 インスタンスの起動、S3 バケットの作成、IAM ポリシーの変更、Lambda 関数のデプロイなど、AWS マネジメントコンソール、CLI、SDK、他の AWS サービスからの API 呼び出しがすべて記録されます。各イベントには、誰が (userIdentity)、いつ (eventTime)、どこから (sourceIPAddress)、何を (eventName)、どのリソースに対して (resources)、結果はどうだったか (errorCode) が記録されます。CloudTrail のイベントは 2 種類に分かれます。管理イベント (Management Events) は、リソースの作成・変更・削除などのコントロールプレーン操作です。デフォルトで記録され、過去 90 日分がコンソールから無料で閲覧できます。データイベント (Data Events) は、S3 オブジェクトの読み書き、Lambda 関数の呼び出し、DynamoDB のアイテム操作などのデータプレーン操作です。データイベントは大量に発生するため、デフォルトでは記録されず、明示的に有効化する必要があります。

CloudTrail のイベント配信の仕組み

CloudTrail のイベントは、API 呼び出しが実行されてから通常 5〜15 分以内に配信されます。リアルタイムではない点に注意が必要です。イベントの配信先は 3 つあります。第 1 に、CloudTrail コンソール (イベント履歴) です。過去 90 日分の管理イベントが無料で閲覧でき、フィルタリングや検索が可能です。第 2 に、S3 バケットです。証跡 (Trail) を作成すると、イベントが JSON 形式で S3 バケットに配信されます。S3 に保存されたログは、Athena で SQL クエリを実行して分析できます。第 3 に、CloudTrail Lake です。2022 年に導入された CloudTrail Lake は、イベントを専用のデータストアに保存し、SQL で直接クエリできるマネージドサービスです。S3 + Athena の組み合わせと比較して、セットアップが簡単で、クエリのパフォーマンスも高速です。CloudTrail のログは改ざん検知機能を備えています。ログファイルの整合性検証 (Log File Integrity Validation) を有効にすると、各ログファイルのハッシュ値がダイジェストファイルに記録され、ログが改ざんされていないことを暗号学的に検証できます。

フォレンジック調査の実践 - 不正アクセスの追跡

セキュリティインシデントが発生した際、CloudTrail は最も重要な証拠源です。たとえば、「未知の EC2 インスタンスが起動されている」というアラートを受けた場合の調査手順を示します。まず、CloudTrail で RunInstances イベントを検索し、誰がいつインスタンスを起動したかを特定します。userIdentity フィールドから、IAM ユーザー名、ロール名、アクセスキー ID が判明します。次に、そのアクセスキー ID で CloudTrail を検索し、同じ認証情報で実行された他の API 呼び出しを洗い出します。S3 バケットへのアクセス、IAM ポリシーの変更、セキュリティグループの変更など、攻撃者の行動の全体像が浮かび上がります。sourceIPAddress フィールドから、攻撃者の IP アドレスも特定できます。ただし、VPN や Tor を経由している場合は、IP アドレスだけでは攻撃者を特定できません。userAgent フィールドには、使用されたツール (AWS CLI、SDK、コンソールなど) の情報が含まれており、攻撃の手法を推定する手がかりになります。

CloudTrail で記録されないもの

CloudTrail は強力ですが、すべてを記録しているわけではありません。記録されないものを知っておくことは、セキュリティ設計上重要です。第 1 に、OS レベルの操作です。EC2 インスタンスに SSH でログインしてファイルを操作しても、CloudTrail には記録されません。OS レベルの監査には、CloudWatch Agent や AWS Systems Manager Session Manager のセッションログが必要です。第 2 に、データイベントを有効化していない場合の S3 オブジェクト操作です。S3 バケットからファイルがダウンロードされても、データイベントが無効なら記録されません。機密データを含むバケットには、必ずデータイベントを有効化してください。第 3 に、一部の読み取り専用 API です。DescribeInstances のような読み取り API は管理イベントとして記録されますが、大量に呼び出されるため、CloudTrail のコンソールでは表示が省略されることがあります。S3 に配信されたログには完全に記録されています。第 4 に、AWS 内部のサービス間通信です。AWS のサービスが内部的に他のサービスを呼び出す場合、その一部は CloudTrail に記録されません。

CloudTrail のコスト最適化

CloudTrail の管理イベントは、最初の証跡が無料です。2 つ目以降の証跡は、10 万イベントあたり 2.00 USD が課金されます。データイベントは、10 万イベントあたり 0.10 USD です。大規模な環境では、S3 のデータイベントが膨大な量になり、月額数千ドルのコストが発生することがあります。コスト最適化の方法はいくつかあります。第 1 に、データイベントの対象を絞ることです。すべての S3 バケットのデータイベントを記録するのではなく、機密データを含むバケットだけに限定します。第 2 に、CloudTrail Lake の保持期間を適切に設定することです。デフォルトの 7 年は多くのケースで過剰です。コンプライアンス要件に応じて 1 年や 3 年に短縮すれば、ストレージコストを削減できます。第 3 に、S3 に配信されたログの保持期間を S3 ライフサイクルルールで管理することです。90 日後に Glacier に移行し、1 年後に削除するルールを設定すれば、ストレージコストを大幅に削減できます。監査ログの設計と運用を体系的に学ぶには、専門書籍 (Amazon)が参考になります。