AWS Organizations環境でCloudTrail Lakeを試してみる

2022.04.11

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

CloudTrail のイベントに対して SQL ベースのクエリにより検索できる環境を提供する CloudTrail Lake には AWS Organizations に属する AWS アカウントのイベントを集約する機能があるので試してみました。

CloudTrail Lake のサービス概要についてはこちらのブログが参考になります


試してみた

イベントデータストアの作成

利用の前提条件として、AWS Organizations の管理アカウントで CloudTrail Lake のイベントデータストアを作成する必要があります。

以降は管理アカウントでの作業となります。

CloudTrail Lake を利用するためにはまずはイベントデータストアを作成します。

イベントデータストアの設定において「組織内のすべてのアカウントについて有効化」のチェックをして次に進みます。AWS Organizations 関連の設定はこれだけです。

なお、メンバーアカウントでは「組織内のすべてのアカウントについて有効化」は非活性になっており、選択できません。また、現状では管理アカウント以外のアカウントに委任する機能はないようです。

今回の環境ではイベントタイプと管理イベントはデフォルトの設定で作成します。

最後に確認して作成します。

作成したイベントデータレイクを確認すると「組織内のすべてのアカウントを含める」が有効になっていることが確認できました。

クエリの実行

クエリと実行結果は次のアカウント ID に置換して記載しています。

  • 管理アカウント ID:111122223333
  • メンバーアカウント ID:444455556666

始めに、特にアカウント ID を指定せずに次のクエリを実施してみます。FORM ではイベントデータストア ID を指定しています。

SELECT
    eventTime,
    eventSource,
    eventName,
    RecipientAccountId
FROM
    49d1288a-bde9-43d2-908d-xxxxxexample
WHERE
    eventTime >= '2022-04-06 16:00:00'
AND
    eventTime <= '2022-04-06 17:00:00'
ORDER BY
    eventTime ASC
LIMIT
    3

AWS CLI でクエリを実行します。

$ aws cloudtrail start-query --query-statement "SELECT eventTime, eventSource, eventName, RecipientAccountId FROM 49d1288a-bde9-43d2-908d-xxxxxexample WHERE eventTime >= '2022-04-06 16:00:00' AND eventTime <= '2022-04-06 17:00:00' ORDER BY eventTime ASC LIMIT 3"
{
    "QueryId": "a8a2cf3a-be1e-4ff0-8008-1dc3ba9dde42"
}

クエリ結果を取得した際に複数のアカウントのイベント情報が混在して出力されていることが確認できました。

$ aws cloudtrail get-query-results --event-data-store 49d1288a-bde9-43d2-908d-xxxxxexample --query-id a8a2cf3a-be1e-4ff0-8008-1dc3ba9dde42
{
    "QueryStatus": "FINISHED",
    "QueryStatistics": {
        "ResultsCount": 3,
        "TotalResultsCount": 3,
        "BytesScanned": 494146
    },
    "QueryResultRows": [
        [
            {
                "eventTime": "2022-04-06 16:01:09.000"
            },
            {
                "eventSource": "sts.amazonaws.com"
            },
            {
                "eventName": "AssumeRole"
            },
            {
                "RecipientAccountId": "111122223333"
            }
        ],
        [
            {
                "eventTime": "2022-04-06 16:04:01.000"
            },
            {
                "eventSource": "s3.amazonaws.com"
            },
            {
                "eventName": "GetBucketAcl"
            },
            {
                "RecipientAccountId": "444455556666"
            }
        ],
        [
            {
                "eventTime": "2022-04-06 16:04:01.000"
            },
            {
                "eventSource": "s3.amazonaws.com"
            },
            {
                "eventName": "GetBucketAcl"
            },
            {
                "RecipientAccountId": "444455556666"
            }
        ]
    ]
}

次に、メンバーアカウント(アカウント ID:444455556666)のみを指定して検索してみます。アカウント ID は recipientAccountId により指定します。

SELECT
    eventTime,
    eventSource,
    eventName,
    RecipientAccountId
FROM
    49d1288a-bde9-43d2-908d-xxxxxexample
WHERE
    recipientAccountId = '444455556666'
AND
    eventTime >= '2022-04-06 16:00:00'
AND
    eventTime <= '2022-04-06 17:00:00'
ORDER BY
    eventTime ASC
LIMIT
    3

クエリを実行します。

]$ aws cloudtrail start-query --query-statement "SELECT eventTime, eventSource, eventName, RecipientAccountId FROM 49d1288a-bde9-43d2-908d-xxxxxexample WHERE recipientAccountId = '444455556666' AND eventTime >= '2022-04-06 16:00:00' AND eventTime <= '2022-04-06 17:00:00' ORDER BY eventTime ASC LIMIT 3"
{
    "QueryId": "1a4e6bcc-b95f-4311-8d7e-56161b6a0fb3"
}

クエリ結果を取得したところ、指定したアカウント ID の結果のみ出力されていることが確認できました。

$ aws cloudtrail get-query-results --event-data-store 49d1288a-bde9-43d2-908d-xxxxxexample --query-id 1a4e6bcc-b95f-4311-8d7e-56161b6a0fb3
{
    "QueryStatus": "FINISHED",
    "QueryStatistics": {
        "ResultsCount": 3,
        "TotalResultsCount": 3,
        "BytesScanned": 494146
    },
    "QueryResultRows": [
        [
            {
                "eventTime": "2022-04-06 16:04:01.000"
            },
            {
                "eventSource": "s3.amazonaws.com"
            },
            {
                "eventName": "GetBucketAcl"
            },
            {
                "RecipientAccountId": "444455556666"
            }
        ],
        [
            {
                "eventTime": "2022-04-06 16:04:01.000"
            },
            {
                "eventSource": "s3.amazonaws.com"
            },
            {
                "eventName": "GetBucketAcl"
            },
            {
                "RecipientAccountId": "444455556666"
            }
        ],
        [
            {
                "eventTime": "2022-04-06 16:09:11.000"
            },
            {
                "eventSource": "s3.amazonaws.com"
            },
            {
                "eventName": "GetBucketAcl"
            },
            {
                "RecipientAccountId": "444455556666"
            }
        ]
    ]
}

以上で確認は終了です。

他にも試してみたい場合は、ユーザーガイドにクエリサンプルが掲載されており、参考になります。

Example queries - AWS CloudTrail

なお、メンバーアカウントにおいて CloudTrail Lake のイベントを検索することはできません。メンバーアカウントでは管理アカウントで作成したイベントデータストアを確認できませんでした。


CloudTrail の既存証跡の無効化について

CloudTrail Lake を利用することで AWS がデータレイクを管理してくれるため、これまではユーザーが実施していた CloudTrail イベントを保管する S3 バケットのオブジェクトロック有効化等の対策の代替にすることができます。

そのため、既存の CloudTrail 証跡を削除することも検討事項になると思いましたが、既存証跡を削除することにより次の影響があるため、慎重に判断する必要がありそうです。

  • CloudTrail Lake 有効化以前のイベントは CloudTrail Lake では検索できない
  • CloudTrail Lake では Insights イベントは収集できない
  • CloudTrail イベントが保管されている S3 と連携するサービスや製品が利用できなくなる
  • イベントデータのダウンロードができなくなる
    • クエリ結果の出力は可能


さいごに

CloudTrail Lake において「組織内のすべてのアカウントについて有効化」する機能により AWS Organizations 内のアカウントのイベント集約を試してみました。

現状では、AWS Organizations の管理アカウント以外に委任できないことと既存の CloudTrail 証跡を削除する際には慎重に判断する必要があることも分かりました。