クロスアカウントで CloudTrail の証跡一覧を表にまとめる

# はじめに

AWSアカウントでマルチアカウントの導入が進んでいくと監査や管理を目的として、１つのAWSアカウント(管理アカウント)から複数のメンバーアカウントへクロスアカウントアクセスが必要になってきます。

CloudTrailの場合、Configアグリゲーターで抽出も可能ですが、当記事では管理アカウントからCloudTrailの証跡をクロスアカウントアクセスで取得をローカルからAWS CLIを利用し棚卸しを行います。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-role.html

## 前提条件

- [当記事](https://qiita.com/daisukeArk/items/e6b4a48e7e6062ff1b64)のように利用するIAMユーザーのMFA保護が有効となっている
- クロスアカウントアクセスを行うためのIAMロールがメンバーアカウントに作成されている必要がある

## Require

- AWS CLI
- ローカル端末でクロスアカウントで実行するため、以下が必要
  - 管理アカウントのIAMユーザーの認証情報
  - メンバーアカウントのAWS CLIプロファイルの設定

## 流れ

- `~/.aws/config`の設定
- 環境変数へ一時認証情報を払い出す
- CloudTrail証跡一覧の取得

## `~/.aws/config`の設定

事前にクロスアカウントアクセスを行うためにプロファイルの設定を行います。
クロスアカウントアクセスを行うためのIAMロールがメンバーアカウントに作成されている必要があります。（当記事では手順を割愛しています）

```bash:~/.aws/config
[profile cloudtrail-manager-account-a]
region = us-east-1
output = json
role_arn = arn:aws:iam::123456789012:role/cloudtrail-manager-role
credential_source = Environment

[profile cloudtrail-manager-account-b]
region = us-east-1
output = json
role_arn = arn:aws:iam::123456789012:role/cloudtrail-manager-role
credential_source = Environment
```

## 環境変数へ一時認証情報を払い出す

以下の記事を参考に管理アカウントのMFA保護されたIAMユーザーの一時認証情報を環境変数へ設定してください。

https://qiita.com/daisukeArk/items/e6b4a48e7e6062ff1b64

## CloudTrail証跡一覧の取得

### コード

任意の名前でスクリプトファイルを作成してください。

```bash:describe-trais-all-regions.sh
#!/bin/bash

# --------------------------------------------------------------------------------
# １アカウントの有効な全リージョンの一覧を取得
# --------------------------------------------------------------------------------

PROFILE_NAME=$1

TARGET_AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --profile ${PROFILE_NAME} --output text)
REGION_NAMES=$(aws ec2 describe-regions --no-all-regions --query 'Regions[].RegionName' --profile ${PROFILE_NAME} --output text)

for region_name in ${REGION_NAMES[@]}
do
    aws cloudtrail describe-trails \
        --region ${region_name} \
        --profile ${PROFILE_NAME} \
        --output text \
        --query "trailList[*].[\
            Name\
            , S3BucketName\
            , S3KeyPrefix\
            , SnsTopicName\
            , SnsTopicARN\
            , IncludeGlobalServiceEvents\
            , IsMultiRegionTrail\
            , HomeRegion\
            , TrailARN\
            , LogFileValidationEnabled\
            , CloudWatchLogsLogGroupArn\
            , CloudWatchLogsRoleArn\
            , KmsKeyId\
            , HasCustomEventSelectors\
            , HasInsightSelectors\
            , IsOrganizationTrail\
        ]" | sed "s/^/${TARGET_AWS_ACCOUNT_ID}\t${region_name}\t/"
done
```

### 実行

標準出力される結果を`pbcopy`やファイルへ出力し、スプレッドシートなどに貼り付けて利用します

```bash:describe-all-accounts.sh
#!/bin/bash

PROFILE_NAMES=(\
    "cloudtrail-manager-account-a"\
    "cloudtrail-manager-account-b"\
)

# Header出力
echo -e "AccountId\
\tRegionName\
\tName\
\tS3BucketName\
\tS3KeyPrefix\
\tSnsTopicName\
\tSnsTopicARN\
\tIncludeGlobalServiceEvents\
\tIsMultiRegionTrail\
\tHomeRegion\
\tTrailARN\
\tLogFileValidationEnabled\
\tCloudWatchLogsLogGroupArn\
\tCloudWatchLogsRoleArn\
\tKmsKeyId\
\tHasCustomEventSelectors\
\tHasInsightSelectors\
\tIsOrganizationTrail\
"

for profile_name in ${PROFILE_NAMES[@]}
do
    ./describe-trails-all-region.sh $profile_name
done
```

## 実行例

```bash
./describe-all-accounts.sh | pbcopy
```