🐈

AWS CloudTrailの操作ログをS3に保存する

に公開

AWS CloudTrailの操作ログをS3に保存するための手順は以下の通りです。

1. 手順

  1. CloudTrailの設定

    1. AWS Management Console にログインします。
    2. CloudTrail コンソール に移動します。
    3. ナビゲーションペインで「トレイル」を選択し、「トレイルの作成」をクリックします。
  2. トレイルの設定

    1. トレイル名を入力します。

    2. 「S3バケット」

      セクションで、「新しいS3バケットを作成」を選択するか、既存のバケットを指定します。

      • 新しいバケットを作成する場合は、バケット名を入力します。
      • 既存のバケットを指定する場合は、リストから選択します。
    3. ログファイルのプレフィックス(オプション):S3バケット内でCloudTrailログを保存するプレフィックス(フォルダ名)を指定します。

    4. 「CloudWatch Logs」 セクションでは、CloudWatchにログを送信したい場合に設定を行います(オプション)。

  3. S3バケットポリシーの設定

    1. CloudTrail コンソール でトレイルを作成すると、必要なS3バケットポリシーが自動的に設定されます。必要に応じて、S3バケットのポリシーを確認および編集することもできます。
  4. その他の設定

    1. SNS通知(オプション):ログが配信されるたびに通知を受け取りたい場合は、SNSトピックを設定します。
    2. タグ(オプション):トレイルにタグを追加することで、管理しやすくなります。
  5. トレイルの作成

    1. すべての設定を確認し、「トレイルの作成」をクリックします。

2. S3バケットポリシーの例

CloudTrailがログをS3バケットに保存できるようにするためのバケットポリシーの例を以下に示します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AWSCloudTrailAclCheck",
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudtrail.amazonaws.com"
      },
      "Action": "s3:GetBucketAcl",
      "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME"
    },
    {
      "Sid": "AWSCloudTrailWrite",
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudtrail.amazonaws.com"
      },
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/AWSLogs/YOUR_ACCOUNT_ID/*",
      "Condition": {
        "StringEquals": {
          "s3:x-amz-acl": "bucket-owner-full-control"
        }
      }
    }
  ]
}

このバケットポリシーのYOUR_BUCKET_NAMEYOUR_ACCOUNT_IDをそれぞれあなたのS3バケット名とAWSアカウントIDに置き換えてください。

3. CDK

import * as cdk from 'aws-cdk-lib';
import { Stack, StackProps } from 'aws-cdk-lib';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as cloudtrail from 'aws-cdk-lib/aws-cloudtrail';
import * as iam from 'aws-cdk-lib/aws-iam';
import { Construct } from 'constructs';

export class MyCloudtrailProjectStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    // S3バケットの作成
    const trailBucket = new s3.Bucket(this, 'CloudTrailBucket', {
      versioned: true,
      removalPolicy: cdk.RemovalPolicy.DESTROY,  // 開発環境用。実際の環境では注意が必要。
    });

    // S3バケットポリシーの追加
    const bucketPolicy = new iam.PolicyStatement({
      actions: ['s3:GetBucketAcl'],
      resources: [trailBucket.bucketArn],
      principals: [new iam.ServicePrincipal('cloudtrail.amazonaws.com')],
    });

    trailBucket.addToResourcePolicy(bucketPolicy);

    const putObjectPolicy = new iam.PolicyStatement({
      actions: ['s3:PutObject'],
      resources: [`${trailBucket.bucketArn}/AWSLogs/${this.account}/*`],
      principals: [new iam.ServicePrincipal('cloudtrail.amazonaws.com')],
      conditions: {
        StringEquals: {
          's3:x-amz-acl': 'bucket-owner-full-control',
        },
      },
    });

    trailBucket.addToResourcePolicy(putObjectPolicy);

    // CloudTrailの作成
    new cloudtrail.Trail(this, 'CloudTrail', {
      bucket: trailBucket,
    });
  }
}

バケットポリシーの追加
const bucketPolicy = new iam.PolicyStatement({...}):CloudTrailがS3バケットのACLを取得できるようにするポリシーです。
const putObjectPolicy = new iam.PolicyStatement({...}):CloudTrailがS3バケットにログファイルを書き込むことができるようにするポリシーです。このポリシーは、特定のACLを持つオブジェクトのみを許可します。

ポリシーのバケットへの追加
trailBucket.addToResourcePolicy(bucketPolicy):バケットにACL取得のためのポリシーを追加します。
trailBucket.addToResourcePolicy(putObjectPolicy):バケットにログ書き込みのためのポリシーを追加します。

4. まとめ

これで、AWS CloudTrailの操作ログが指定したS3バケットに保存されるようになります。設定が正しく行われていれば、CloudTrailは自動的に操作ログを収集し、S3に保存します。

Discussion