🛠️

Organization内の全AWSアカウントにてAWS Configを集中ロギングで有効化する方法

2024/05/03に公開

AWS Organizationsを使って管理している全アカウントに対して一斉にAWS Configを有効化し、追加したアカウントへも自動で有効化する設定を紹介します
各アカウントにS3バケットを用意するパターンもありますが、ここではセキュリティ管理用のアカウントに要した1つのバケットに全アカウントの全リージョン分のデータを格納するようにしていきます

すでにAWS Organizationsが導入済みで、AWS Security Hubを導入したもののAWS Configの有効化ってどうすればいいの!って方が対象です

アーキテクチャ

手順

CloudFormation StackSetsで委任された管理者を登録

セキュリティ関連のリソースや権限、費用を分けるため、AWS Organizaionsの管理アカウントとは別に、セキュリティ管理用アカウントを用意します
そしてそAWS Organizaionsの管理アカウントでAWS CloudFormationのマネジメントコンソールにアクセスし、StackSetsのページにて「委任された管理者を登録」します

S3バケットを用意

セキュリティ管理用アカウントにAWS Configで使用するバケットを作成してください
デフォルトのままですが設定値はこんなところです

設定項目 設定値
バケットタイプ 汎用
オブジェクト所有者 ACL無効
ブロックパブリックアクセス パブリックアクセスをすべてブロック
バージョニング 無効

S3バケットへのアクセスを許可

作成したS3バケットをマネジメントコンソールで開き、アクセス許可のタブからバケットポリシーを設定します
AWS Configはバケットに対してGetBucketAcl、ListBucket、PutObjectを叩くためこれらの権限を付与します

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AWSConfigBucketPermissionsCheck",
            "Effect": "Allow",
            "Principal": {
                "Service": "config.amazonaws.com"
            },
            "Action": "s3:GetBucketAcl",
            "Resource": "作成したS3バケットのARN",
            "Condition": {
                "StringEquals": {
                    "AWS:SourceAccount": [
                        "Organization内のアカウントのID"
                    ]
                }
            }
        },
        {
            "Sid": "AWSConfigBucketExistenceCheck",
            "Effect": "Allow",
            "Principal": {
                "Service": "config.amazonaws.com"
            },
            "Action": "s3:ListBucket",
            "Resource": "作成したS3バケットのARN",
            "Condition": {
                "StringEquals": {
                    "AWS:SourceAccount": [
                        "Organization内のアカウントのID"
                    ]
                }
            }
        },
        {
            "Sid": "AWSConfigBucketDelivery",
            "Effect": "Allow",
            "Principal": {
                "Service": "config.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "作成したS3バケットのARN/AWSLogs/*",
            "Condition": {
                "StringEquals": {
                    "AWS:SourceAccount": [
                        "Organization内のアカウントのID"
                    ],
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        }
    ]
}

組織内のアカウントIDの配列は、AWS Organizaionsの管理アカウントでログインし、ここから取得できます

アカウントを追加した場合にはこのID配列の更新を忘れないようにしてください

StackSetを作成する

全アカウントの全リージョンに対して、作成したバケットにログを配信するAWS Configを有効化していきます
これにはCloudFormationのStackSetsを使用します
StackSetsではアカウントとリージョンを指定してCloudFormationスタックをデプロイできるサービスです

AWS CloudFormationのマネジメントコンソールにアクセスし、StackSetsのタブから「StackSetを作成」をクリックしてください

テンプレートの選択

サービスマネージドアクセス許可を選択し以下のテンプレートファイルをアップロードしてください

AWSTemplateFormatVersion: 2010-09-09
Description: Enable AWS Config with central logging and notification

Parameters:
  CentralRegion:
    Type: String
    Default: ap-northeast-1
  BucketName:
    Type: String

Conditions:
  CreateConfigSLR: !Equals [!Ref AWS::Region, !Ref CentralRegion]

Resources:
  ConfigRole:
    Condition: CreateConfigSLR
    Type: AWS::IAM::ServiceLinkedRole
    Properties:
      AWSServiceName: config.amazonaws.com

  ConfigRecorder:
    Type: AWS::Config::ConfigurationRecorder
    Properties:
      RecordingGroup:
        AllSupported: True
        IncludeGlobalResourceTypes: True
      RoleARN: !Sub "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/aws-service-role/config.amazonaws.com/AWSServiceRoleForConfig"

  ConfigDeliveryChannel:
    Type: AWS::Config::DeliveryChannel
    Properties:
      S3BucketName: !Ref BucketName

StackSetの詳細を設定

パラメータのBuecketNameには作成したS3バケットの名前を入力してください
CentralRegionで指定したリージョンでIAMのサービスロールを作成します
IAMロールはグローバルなサービスでサービスロール名は指定できないため、特定のリージョンでのみ作成しないとエラーになります

StackSetオプションの設定

実行設定はとりあえずアクティブにすることをお勧めします
StackSetの更新が連続したときに並列で処理してくれるかどうかのフラグで、今回の設定ならそんなことはなさそうですが、私は基本アクティブにしています

デプロイオプションの設定

リージョンはCentralRegionで指定したリージョンを選択します
サービスロールの作成が間に合わないことがないよう先にサービスロールの作成が行われるリージョンだけを対象にし、あとから対象リージョンを追加します

デプロイオプションは可能な限り並列処理するよう設定します

全リージョンにデプロイする

CentralRegionへのデプロイが完了したら、StackSetのマネジメントコンソールのアクションから「StackSetにスタックを追加」をクリックしてください

デプロイオプションの設定

「すべてのリージョンを追加」をクリックしてください
追加されたリージョンから無効化されたリージョンを削除してください
ここをクリックしたあとのページの中央あたりでリージョンのステータスが確認できます

ここでもデプロイオプションは可能な限り並列処理するよう設定します

上書きの指定

パラメータの上書きは不要です

以上で組織内の全アカウントの全リージョンでAWS Configが有効化できました
ただし、AWS Organizationsの管理アカウントはAWS CloudFormation StackSetsでデプロイできないためこちらの記事を参考に追加でデプロイを行う必要があります

https://zenn.dev/find/articles/647c750044d642

株式会社find | 落とし物クラウド

Discussion