Organization内の全AWSアカウントにてAWS Configを集中ロギングで有効化する方法
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でデプロイできないためこちらの記事を参考に追加でデプロイを行う必要があります
Discussion