AWS Configアグリゲータで全アカウント・全リージョンのConfigレコーダー設定が一律か確認してみた

AWS Configアグリゲータで全アカウント・全リージョンのConfigレコーダー設定が一律か確認してみた

Clock Icon2025.03.13

はじめに

AWS Configアグリゲータを使用して、全アカウントの全リージョンのConfigレコーダー設定が一律になっているかを確認しました。

以前、全リージョンでAWS Configの記録対象を「すべて」に設定し、IAMロールをサービスリンクロールに一括変更する方法について執筆しました。

https://dev.classmethod.jp/articles/update-aws-config-recorder-and-service-role-in-all-regions/

今回は、管理アカウントから、AWS Security Hubのコントロール[Config.1]が成功するように、各アカウントのConfigレコーダー設定が以下の3点を満たしているかを確認します。

  • サービスリンクロールであるAWSServiceRoleForConfigをConfigレコーダーのIAMロールとして指定する
  • 東京リージョンでは、グローバルリソース (IAM リソースなど) を含め、すべてのリソースタイプを記録する
  • 東京リージョン以外のリージョンでは、グローバルリソースを除くすべてのリソースタイプを記録する

なお、SCPでリージョンを制限している場合でも、Configアグリゲータはデータを収集します。

Configアグリゲータを作成

管理アカウントにログインし、Config アグリゲータを作成します。

cm-hirai-screenshot 2025-03-10 17.24.52

設定は以下のとおりです。

  • アグリゲータ名:test
  • ソースアカウント:組織を追加する
  • IAMロールの選択:ロールを作成する(名前の例:test-aggregator-role)
  • リージョン:ap-south-1, ca-central-1, eu-central-1, us-west-1, us-west-2, eu-north-1, eu-west-3, eu-west-2, eu-west-1, ap-northeast-3, ap-northeast-2, ap-northeast-1, sa-east-1, ap-southeast-1, ap-southeast-2, us-east-1, us-east-2(デフォルトで有効化されている全17リージョン)

cm-hirai-screenshot 2025-02-26 15.32.53

反映には最大24時間かかるため、1日待ちます。
https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/viewing-the-aggregate-dashboard.html

Configレコーダーを確認

管理アカウントからAWS CloudShellを開き、以下のコマンドを実行します。ACCOUNTSに対象の管理アカウントやメンバーアカウントを記述します。

cat << 'EOF' | bash
#!/bin/bash

# 設定
ACCOUNTS=("111111111111" "222222222222") 
CONFIG_AGGREGATOR="test"
GLOBAL_REGION="ap-northeast-1"
GLOBAL_RESOURCES=("AWS::IAM::Policy" "AWS::IAM::User" "AWS::IAM::Role" "AWS::IAM::Group")

# 色とスタイル
RED="\e[41m\e[97m"; GREEN="\e[42m\e[97m"; RESET="\e[0m"
DIVIDER="============================================================"

# リージョン一覧を取得
REGIONS=$(aws configservice describe-configuration-aggregators \
  --query "ConfigurationAggregators[?ConfigurationAggregatorName=='$CONFIG_AGGREGATOR'].OrganizationAggregationSource.AwsRegions[][]" \
  --output json | jq -r '.[]')
# 各アカウントをチェック
for ACCOUNT in "${ACCOUNTS[@]}"; do
  echo -e "\n$DIVIDER\nChecking AWS Config for Account: $ACCOUNT\n$DIVIDER"

  for REGION in $REGIONS; do
    # Config Recorderの設定を取得
    CONFIG=$(aws configservice get-aggregate-resource-config \
      --configuration-aggregator-name "$CONFIG_AGGREGATOR" \
      --resource-identifier "SourceAccountId=$ACCOUNT,SourceRegion=$REGION,ResourceId=default,ResourceType=AWS::Config::ConfigurationRecorder" \
      --region "$GLOBAL_REGION" --query "ConfigurationItem.configuration" --output text 2>/dev/null)

    # 設定が存在しない場合
    if [[ -z "$CONFIG" || "$CONFIG" == "null" ]] || ! echo "$CONFIG" | jq empty &>/dev/null; then
      echo -e "${RED}[ERROR]${RESET} $REGION: No Config Recorder found"
      continue
    fi

    # 設定値を取得
    ID=$(echo "$CONFIG" | jq -r ".Id // empty")
    ROLE=$(echo "$CONFIG" | jq -r ".RoleARN // empty")
    ALL_SUPPORTED=$(echo "$CONFIG" | jq -r ".RecordingGroup.AllSupported // false")
    INCLUDE_GLOBAL=$(echo "$CONFIG" | jq -r ".RecordingGroup.IncludeGlobalResourceTypes // false")
    EXCLUDED=$(echo "$CONFIG" | jq -r ".RecordingGroup.ExclusionByResourceTypes.ResourceTypes // [] | length")
    OVERRIDES=$(echo "$CONFIG" | jq -r ".RecordingMode.RecordingModeOverrides // []")

    # チェック
    ERRORS=()
    [[ "$ID" != "default" ]] && ERRORS+=("Config Recorder ID is not 'default'")
    [[ "$ROLE" != "arn:aws:iam::$ACCOUNT:role/aws-service-role/config.amazonaws.com/AWSServiceRoleForConfig" ]] && \
      ERRORS+=("IAM Role ARN is incorrect")
    [[ "$ALL_SUPPORTED" != "true" ]] && ERRORS+=("AllSupported is not true")
    [[ "$EXCLUDED" -ne 0 ]] && ERRORS+=("Has excluded resource types")

    # グローバルリソース設定
    if [[ "$REGION" == "$GLOBAL_REGION" && "$INCLUDE_GLOBAL" != "true" ]]; then
      ERRORS+=("IncludeGlobalResourceTypes should be true in $GLOBAL_REGION")
    elif [[ "$REGION" != "$GLOBAL_REGION" && "$INCLUDE_GLOBAL" != "false" ]]; then
      ERRORS+=("IncludeGlobalResourceTypes should be false outside $GLOBAL_REGION")
    fi

    # グローバルリソースのオーバーライド(ap-northeast-1のみ)
    if [[ "$REGION" == "$GLOBAL_REGION" ]]; then
      OVERRIDDEN=()
      for RES in "${GLOBAL_RESOURCES[@]}"; do
        if echo "$OVERRIDES" | jq -e --arg r "$RES" '.[] | select(.ResourceTypes | contains([$r]))' &>/dev/null; then
          OVERRIDDEN+=("$RES")
        fi
      done
      [[ ${#OVERRIDDEN[@]} -gt 0 ]] && ERRORS+=("Global resources have recording overrides: ${OVERRIDDEN[*]}")
    fi

    # 結果表示
    if [[ ${#ERRORS[@]} -eq 0 ]]; then
      echo -e "${GREEN}[OK]${RESET} $REGION"
    else
      echo -e "${RED}[ERROR]${RESET} $REGION"
      for ERR in "${ERRORS[@]}"; do echo "  - $ERR"; done
    fi
  done

  echo -e "\n$DIVIDER\nCheck completed for Account: $ACCOUNT\n"
done
EOF
検出結果
============================================================
Checking AWS Config for Account: 111111111111
============================================================
[OK] ap-south-1
[OK] ca-central-1
[OK] eu-central-1
[OK] us-west-1
[OK] us-west-2
[OK] eu-north-1
[OK] eu-west-3
[OK] eu-west-2
[OK] eu-west-1
[OK] ap-northeast-3
[OK] ap-northeast-2
[OK] ap-northeast-1
[OK] sa-east-1
[OK] ap-southeast-1
[OK] ap-southeast-2
[OK] us-east-1
[OK] us-east-2

============================================================
Check completed for Account: 111111111111

============================================================
Checking AWS Config for Account: 222222222222
============================================================
[OK] ap-south-1
[OK] ca-central-1
[OK] eu-central-1
[OK] us-west-1
[OK] us-west-2
[OK] eu-north-1
[OK] eu-west-3
[OK] eu-west-2
[OK] eu-west-1
[OK] ap-northeast-3
[OK] ap-northeast-2
[OK] ap-northeast-1
[OK] sa-east-1
[OK] ap-southeast-1
[OK] ap-southeast-2
[OK] us-east-1
[OK] us-east-2

============================================================
Check completed for Account: 222222222222

エラーがなければ、各アカウントのConfigレコーダー設定が以下の3点を満たしていることになります。

  • サービスリンクロールであるAWSServiceRoleForConfigをConfigレコーダーのIAMロールとして指定する
  • 東京リージョンはグローバルリソース (IAM リソースなど) を含め全てのすべてのリソースタイプ記録
  • 東京リージョン以外のリージョンは、グローバルリソースを除く全てのリソースタイプを記録

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.