はじめに
AWSアカウントでマルチアカウントの導入が進んでいくと監査や管理を目的として、1つのAWSアカウント(管理アカウント)から複数のメンバーアカウントへクロスアカウントアクセスが必要になってきます。
CloudTrailの場合、Configアグリゲーターで抽出も可能ですが、当記事では管理アカウントからCloudTrailの証跡をクロスアカウントアクセスで取得をローカルからAWS CLIを利用し棚卸しを行います。
前提条件
- 当記事のように利用するIAMユーザーのMFA保護が有効となっている
- クロスアカウントアクセスを行うためのIAMロールがメンバーアカウントに作成されている必要がある
Require
- AWS CLI
- ローカル端末でクロスアカウントで実行するため、以下が必要
- 管理アカウントのIAMユーザーの認証情報
- メンバーアカウントのAWS CLIプロファイルの設定
流れ
-
~/.aws/config
の設定 - 環境変数へ一時認証情報を払い出す
- CloudTrail証跡一覧の取得
~/.aws/config
の設定
事前にクロスアカウントアクセスを行うためにプロファイルの設定を行います。
クロスアカウントアクセスを行うためのIAMロールがメンバーアカウントに作成されている必要があります。(当記事では手順を割愛しています)
~/.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ユーザーの一時認証情報を環境変数へ設定してください。
CloudTrail証跡一覧の取得
コード
任意の名前でスクリプトファイルを作成してください。
describe-trais-all-regions.sh
#!/bin/bash
# --------------------------------------------------------------------------------
# 1アカウントの有効な全リージョンの一覧を取得
# --------------------------------------------------------------------------------
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
やファイルへ出力し、スプレッドシートなどに貼り付けて利用します
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
実行例
./describe-all-accounts.sh | pbcopy