AWS関連

【AWS】CLI でCloudTrail を有効化する

今回はAWS CloudTrail (以下、CloudTrail) をAWS CLI を用いて有効化する手順について整理していきます。

ざっくりとした流れとしては、

CloudTrail にて取得するAPI 操作ログの出力先としてS3 バケットを作成し、バージョニングやバケットポリシーなどの設定を行います。

次にCloudTrail の証跡を作成し、ロギングを開始します。(けっこう簡単です)

なお、以下に説明する手順ではCloudShell を利用したコマンド操作を前提としております。

手順として CLI コマンドを掲載しておりますが、実際に操作を行う際はご自身で十分にコマンド内容を確認した上で実行するようにお願いいたします。

まずはテスト用アカウントなどで作業してみることをオススメいたします。

では、早速まいります!

事前準備

また、後で作成するS3バケットやCloudTrail の名前に使用する「アカウント名」を指定しておきます。

# アカウント名の指定(バケット名、CloudTrail名に使用)
MY_ACCOUNT_NAME="sayjoy" \
    && echo ${MY_ACCOUNT_NAME}

# 変数確認
cat << END
  # MY_ACCOUNT_NAME="sayjoy"
    MY_ACCOUNT_NAME="${MY_ACCOUNT_NAME}"
END

  • 指定する変数情報などは適宜変更を行ってください

S3バケットの作成

CloudTrail によって作成されるログ情報(証跡)を格納するためのS3バケットを作成します。

前処理
S3バケット名を指定します。

# S3バケット名の指定
S3_BUCKET_NAME="control-${MY_ACCOUNT_NAME}" \
    && echo ${S3_BUCKET_NAME}

更新処理
S3バケットを作成します。

# S3バケットの作成
aws s3 mb s3://${S3_BUCKET_NAME}

結果確認
S3バケットが存在することを確認します。

# S3バケットの存在確認
aws s3 ls | grep ${S3_BUCKET_NAME}

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

作成したS3バケットに対してバケットポリシーを設定します。

前処理
ポリシードキュメントを含む、ファイルおよび変数を準備します。

# アカウントIDの取得
ACCOUNT_ID=$( \
    aws sts get-caller-identity \
        --query Account \
        --output text \
    ) && echo ${ACCOUNT_ID}

# 作業ディレクトリの作成&移動
mkdir cloudtrail_${MY_ACCOUNT_NAME} && cd $_

# ポリシードキュメントのファイル名を指定
POLICY_DOC_NAME="S3BucketPolicy.json" \
    && echo ${POLICY_DOC_NAME}

# 現在のディレクトリ情報を取得
DIR_CURRENT_DIRECTORY=$(pwd) \
    && echo ${DIR_CURRENT_DIRECTORY}

# ポリシードキュメントのファイルパスを指定
FILE_POLICY_DOC="${DIR_CURRENT_DIRECTORY}/${POLICY_DOC_NAME}" \
    && echo ${FILE_POLICY_DOC}

# IAMポリシードキュメントの追記
cat << EOF > ${FILE_POLICY_DOC}
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AWSCloudTrailAclCheck",
            "Effect": "Allow",
            "Principal": {"Service": "cloudtrail.amazonaws.com"},
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::${S3_BUCKET_NAME}"
        },
        {
            "Sid": "AWSCloudTrailWrite",
            "Effect": "Allow",
            "Principal": {"Service": "cloudtrail.amazonaws.com"},
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::${S3_BUCKET_NAME}/AWSLogs/${ACCOUNT_ID}/*",
            "Condition": {"StringEquals": {"s3:x-amz-acl": "bucket-owner-full-control"}}
        }
    ]
}
EOF
cat ${FILE_POLICY_DOC}

# IAMポリシードキュメントのフォーマットが崩れていないか確認(何も表示されなければOK)
jsonlint -q ${FILE_POLICY_DOC}

# 変数確認
cat << END
  # S3_BUCKET_NAME="control-sayjoy"
    S3_BUCKET_NAME="${S3_BUCKET_NAME}"
  # FILE_POLICY_DOC="ポリシードキュメントのファイルパス"
    FILE_POLICY_DOC="${FILE_POLICY_DOC}"
END

更新処理
バケットポリシーを設定します。

# バケットポリシーを設定
aws s3api put-bucket-policy \
    --bucket ${S3_BUCKET_NAME} \
    --policy file://${FILE_POLICY_DOC}

結果確認
バケットポリシーを確認します。

# 設定内容の確認
aws s3api get-bucket-policy \
    --bucket ${S3_BUCKET_NAME} \
    --query Policy \
    --output text

S3バケット バージョニングの有効化

バージョニングを有効化してログファイルが削除されても復旧できるようにします。

前処理
ここでは変数の確認のみ実施します。

# 変数確認
cat << END
  # S3_BUCKET_NAME="control-sayjoy"
    S3_BUCKET_NAME="${S3_BUCKET_NAME}"
END

更新処理
バージョニングを有効化します。

# バージョニングの有効化
aws s3api put-bucket-versioning \
    --bucket ${S3_BUCKET_NAME} \
    --versioning-configuration Status=Enabled

結果確認
バージョニングの設定状況を確認します。

# バージョニング設定状況の確認
aws s3api get-bucket-versioning \
    --bucket ${S3_BUCKET_NAME}

CloudTrail の有効化(証跡の作成)

CloudTrail を有効化して、証跡を作成します。

前処理
証跡名を指定します。

# 証跡名の指定
CLOUDTRAIL_NAME="cloudtrail_${MY_ACCOUNT_NAME}" \
    && echo ${CLOUDTRAIL_NAME}

# 変数確認
cat << END
  # CLOUDTRAIL_NAME="cloudtrail_sayjoy"
    CLOUDTRAIL_NAME="${CLOUDTRAIL_NAME}"
  # S3_BUCKET_NAME="control-sayjoy"
    S3_BUCKET_NAME="${S3_BUCKET_NAME}"
END

更新処理
CloudTrail を有効化します。(証跡の作成)

# 証跡の作成
aws cloudtrail create-trail \
    --name ${CLOUDTRAIL_NAME} \
    --s3-bucket-name ${S3_BUCKET_NAME} \
    --is-multi-region-trail \
    --enable-log-file-validation \
    --include-global-service-events

  • is-multi-region-trail オプションで全リージョンのCloudTrail を有効化
  • enable-log-file-validation オプションでログファイルの整合性検証を有効化(改ざん防止)
  • include-global-service-events オプションでIAMなどのグローバルサービスからもログファイルにイベントを公開する

結果確認

# 証跡の確認
aws cloudtrail describe-trails

CloudTrail Insights の有効化

CloudTrail Insights の有効家により、異常な API アクティビティの特定に備えます。

前処理
CloudTrail Insights の有効化に必要となる、CloudTrail のARN を取得します。

# ARNの取得
CLOUDTRAIL_ARN=$(
    aws cloudtrail describe-trails \
        --query "trailList[?Name == \`${CLOUDTRAIL_NAME}\`].TrailARN" \
        --output text \
    ) && echo ${CLOUDTRAIL_ARN}

# 変数確認
cat << END
  # CLOUDTRAIL_ARN="arn:aws:cloudtrail:ap-northeast-1:999999999999:trail/cloudtrail_sayjoy"
    CLOUDTRAIL_ARN="${CLOUDTRAIL_ARN}"
END

更新処理
上で取得したARN を利用してCloudTrail Insights を有効化します。

# CloudTrail Insights の有効化
aws cloudtrail put-insight-selectors \
    --trail-name ${CLOUDTRAIL_ARN} \
    --insight-selectors '{"InsightType": "ApiCallRateInsight"}'

  • CloudTrail の"ホームリージョン"にてコマンドを実行する必要あり

結果確認
Insightsイベントセレクターの設定を確認します。

# Insightsイベントセレクターの設定状況確認
aws cloudtrail get-insight-selectors \
    --trail-name ${CLOUDTRAIL_ARN}

CloudTrail の開始(ロギングの開始)

前処理
変数のみ確認します。

# 変数確認
cat << END
  # CLOUDTRAIL_NAME="cloudtrail_sayjoy"
    CLOUDTRAIL_NAME="${CLOUDTRAIL_NAME}"
END

更新処理
ロギングを開始します。

# ログファイル配信の開始
aws cloudtrail start-logging \
    --name ${CLOUDTRAIL_NAME}

結果確認
ステータスを確認します。

# ロギングのステータス確認
aws cloudtrail get-trail-status \
    --name ${CLOUDTRAIL_NAME}

まとめ

如何だったでしょうか。

冒頭でもお伝えしたとおり、めちゃくちゃ簡単だったかと思います。

”何かあったとき”には調査などでCloudTrail がかなり重要な役割を果たしてくれることでしょう。

CloudTrail を有効化していない場合でも、デフォルトで 90日間分がAWS 側で保持されており、lookup-events コマンド にて取得が可能となっております。

が、しかし、

ログファイルのボリュームによっては lookup-events コマンドが上手くいかない場合もあるので(スロットリングエラーなどの壁がある...)、素直にCloudTrail を有効化しておいた方がいいと思います。

以上です。最後まで読んでいただきありがとうございました。