クロスアカウントの CloudTrail ログを特定のアカウントの S3 バケットに保存する

クロスアカウントの CloudTrail ログを特定のアカウントの S3 バケットに保存する理由

AWS ブログでは AWS Organizations における組織単位のベストプラクティスについて以下のように記載しています。

AWS Organizations における組織単位のベストプラクティス | Amazon Web Services ブログ

推奨アカウント
ログアーカイブ (Log Archive) : このアカウントは環境内のすべてのアカウントから収集されたセキュリティに関連する AWS アクセスログおよび監査ログを統合します。

上記の記述のように、クロスのアカウントのアクセスログおよび監査ログを一つのアカウント下に一元保存するのが推奨されているようです。

自分の個人アカウントで作成した AWS Organizations 環境下でもログアーカイブアカウントを作成し、そのアカウント下の S3 に全ての他のアカウントの CloudTrail のログを保存しています。

今回は、クロスアカウントの環境下で特定の一つのアカウントの S3 に収集対象のアカウントの Cloudtrail のログを集約する設定をやっていきます。
ついでにログの暗号に使用する CMK もアカウント間共有してみます。
因みにここで紹介する方法は、別に AWS Organizations を利用していなくても大丈夫です。

前提条件

  • 保存する S3 バケット名は aws-cloudtrail-logs とします。
  • CloudTrail ログが保存されるパスは aws-cloudtrail-logs/AWSLogs/AWSアカウントID とします。
    • アカウント ID が 111111111111 の場合は、aws-cloudtrail-logs/AWSLogs/111111111111
  • 以下のようなアカウントをが作成されている想定です。
    アカウント ID アカウント名 備考
    999999999999 LogArchive CloudTrail ログを保管するアカウント
    111111111111 サービス A 開発環境 CloudTrail ログを保管したいアカウントその 1
    222222222222 サービス A 検証環境 CloudTrail ログを保管したいアカウントその 2

CloudTrail ログを保管するアカウント(LogArchive)側の設定

CloudTrail 証跡の作成その 1

  • CloudTrail → ダッシュボード → 証跡の作成
    • 証跡名は適当
    • 新しい S3 バケットを作成するを選択
      • [証跡ログバケット名] に適当なバケット名を入力
        • 本記事では aws-cloudtrail-logs とします。
    • AWS KMS カスタマー管理の CMK
      • 新規で作成を選択し、[AWS KMS エイリアス] を入力
        • 本記事では aws-cloudtrail-logs-key とします。
    • 残りの入力項目は適宜目的に応じたものを入力していき証跡を作成します。

S3 バケットに「CloudTrail ログを保管したいアカウント」からのアクセスを許可する

S3 のコンソールに行くと CloudTrail 作成時に指定した S3 バケット (aws-cloudtrail-logs) が作成されているので、そのバケットの [アクセス許可] から [バケットポリシー] の編集を行います。

バケットポリシー設定
・ CloudTrail ログは収集対象のアカウント ID 毎のディレクトリに保存することとします。
s3:PutObject のアクションに対する Resource にログを保管するディレクトリを追加します。

バケットポリシー設定
Copied!
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AWSCloudTrailAclCheck20150319",
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudtrail.amazonaws.com"
      },
      "Action": "s3:GetBucketAcl",
      "Resource": "arn:aws:s3:::aws-cloudtrail-logs"
    },
    {
      "Sid": "AWSCloudTrailWrite20150319",
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudtrail.amazonaws.com"
      },
      "Action": "s3:PutObject",
      "Resource": [
        "arn:aws:s3:::aws-cloudtrail-logs/AWSLogs/111111111111/*",
        "arn:aws:s3:::aws-cloudtrail-logs/AWSLogs/222222222222/*"
      ],
      "Condition": {
        "StringEquals": {
          "s3:x-amz-acl": "bucket-owner-full-control"
        }
      }
    }
  ]
}

CloudTrail ログを暗号化するための CMK を「CloudTrail ログを保管したいアカウント」が利用できるようにする

  • [Key Management Service (KMS)] → [カスタマー管理型のキー] で証跡の作成時に [AWS KMS エイリアス] に入力したエイリアス名 (aws-cloudtrail-logs-key)
    • キーポリシーの編集から、kms:GenerateDataKey* アクションの Condition に「CloudTrail ログを保管したいアカウント」の CloudTrailService の arn を追記します。
キーポリシー(一部抜粋))
Copied!
{
  "Sid": "Allow CloudTrail to encrypt logs",
  "Effect": "Allow",
  "Principal": {
    "Service": "cloudtrail.amazonaws.com"
  },
  "Action": "kms:GenerateDataKey*",
  "Resource": "*",
  "Condition": {
    "StringLike": {
      "kms:EncryptionContext:aws:cloudtrail:arn": [
        "arn:aws:cloudtrail:*:111111111111:trail/*",
        "arn:aws:cloudtrail:*:222222222222:trail/*"
      ]
    }
  }
}

CloudTrail ログを保管したいアカウント(サービス A 開発環境、サービス A 検証環境)側の設定

CloudTrail 証跡の作成その 2

  • CloudTrail → ダッシュボード → 証跡の作成
    • 証跡名は適当
    • 既存の S3 バケットを使用するを選択します。
      • [証跡ログバケット名] に CloudTrail ログを保管するアカウント (LogArchive) の CloudTrail で作成した S3 バケット名 (aws-cloudtrail-logs) を直接入力する。([参照] を押しても S3 バケット名は表示されません)
        • [プレフィックス - オプション] は未入力で大丈夫です。もし、プレフィックスを利用する場合は、S3 のバケットポリシーを編集して、CloudTrail にプレフィックスを含めたディレクトリにアクセスする許可を与えてください。
    • AWS KMS カスタマー管理の CMK
      • 既存を選択し、[AWS KMS エイリアス] にログを保管するアカウント (LogArchive) の CloudTrail で [AWS KMS エイリアス] に入力した CMK (aws-cloudtrail-logs-key) の arn を直接入力します。(オートコンプリートで表示されたりしません)
    • 残りの入力項目は適宜目的に応じたものを入力していき証跡を作成します。

動作確認

  • CloudTrail ログを保管するアカウント (LogArchive) アカウントで S3 バケットにアクセスし、アカウント毎のディレクトリに CloudTrail のログが出力されていれば OK です。

まとめ

  • 今回 AWS Organizations のクロスアカウント管理のベストプラクティスとして CloudTrail などのセキュリティーログを集約/保存するアカウントに保存するのをやってみましたが、CMK 含めいい勉強になりました。
  • 本記事では開発・検証と行った本番系以外のアカウントの CloudTrail をそれ専用アカウントに集約した形ですが、本番系だと当然、サービス A 本番アカウントと本番系の CloudTrail を集約/保存するアカウントを作成する必要があるので、AWS Organizations のアカウント作成上限に到達してしまう点は注意が必要です。事前に AWS Organizations に登録可能なアカウントの上限緩和申請しておくことをお勧めします。

参考文献