自宅にサウナが欲しいCI部2課の山﨑です。
AWS Configの1つの機能であるConfig Rulesをパッケージ化したConformance Packs(適合パック)を使ってパッケージ単位でConfig Rulesを管理する方法を検証してみました
AWS Configとは
AWS Config は、AWS リソースの設定を評価、監査、審査できるサービスです。Config では、AWS リソースの設定が継続的にモニタリングおよび記録され、望まれる設定に対する記録された設定の評価を自動的に実行できます。
※引用元:AWS Config(リソースのインベントリと変更の追跡)| AWS
AWS Config は一般的にAWSマネージドの構成管理サービスとして認知されています。具体的には「いつ、どのリソースに、どのような設定変更が行われたのか」といったことを記録・管理することができます。

※Blackbeltより引用:https://d1.awsstatic.com/webinars/jp/pdf/services/20190618_AWS-Blackbelt_Config.pdf
そのほかAWS Config 自体の設定方法等については弊社ブログを御覧ください
AWS Config Rulesとは
機能
構成チェック
AWS Config Rules はAWS Configで記録・管理している構成情報に対してルールを設け、ルールに準拠した構成となっているかどうかを自動でチェックします。VPC Flow Logs が有効になっているかどうか、S3バケットが公開されていないか等をチェックすることが可能です。チェックに関しては定期実行あるいはリソースの設定変更が行われたタイミングの実行のいずれかとなります。
ルールにはAWSが提供しているマネージドルールとユーザー自身で作成が可能なカスタムルールの2種類のルールを設定することが可能です。それぞれの違いについてはAWSドキュメントを御覧ください。
AWS Config マネージドルール - AWS Config
AWS Config カスタムルール - AWS Config
チェックした結果はAWS Config のダッシュボード画面やConfig Rules の画面で確認することができます。ルールに準拠していれば「準拠」、そうでなければ「非準拠」と表示されます。


修復アクション(Remediation)
上記のチェック機能に加えて、AWS Config Rules では非準拠と判断されたリソースに対して修復アクション(Remediation)を実行することが可能です。
修復アクション(Remediation)はSystems Manager DocumentとSystems Manager Automation の機能を利用して実装されており、Config Rule に対して 1:1 で関連付けることで修復アクションを実行することが可能です。

料金体系
AWS Config Rules はリリース当初は1ルールあたり2USD/月と高額でしたが、現在は非常に安価になっています。

※参考資料:料金 - AWS Config | AWS
AWS Config Rules Conformance Packs(適合パック) とは
AWS Config Rules Conformance Packs(適合パック) はConfig Rule と修復アクションをCloudFormation テンプレートを使って一括定義/一括管理することができる仕組みです。

これまでのConfig Rule でもCloudFormation StackSets を利用してConfig Rule を一括作成、横展開することはできましたがルールをグルーピングして管理することはできませんでした。その点Conformance Packs(適合パック)では例えばPCI DSS環境用、☓☓☓☓システム用のようにグルーピングしてConfig Rule と修復アクションを一括作成、横展開したりすることができるため用途に応じたルール群の作成や管理がしやすくなっています。また、Conformance Packs でデプロイしたルールはデプロイ後に変更することができないため誤ってルールを変更してしまうリスクもありません。これでOrganizations等でマルチアカウント/マルチリージョンでデプロイした後に誤って変更操作するリスクも軽減できます。

検証
以下のパターンを検証してみました
AWSマネージドのConformance Packsを適用する
自身でカスタマイズしたConformance Packsを適用する
1. AWSマネージドのConformance Packsを適用する
AWS Config の左メニューからConformance Packs(適合パック)を選択し、Deploy conformance pack を選択します。
遷移先の画面では「サンプルテンプレートを使用」を選択し、今回は Operational Best Practices for Amazon S3 を選択しました
AWSによって用意されているサンプルテンプレートについてはAWSドキュメントに記載があります。
コンフォーマンスパックのサンプルテンプレート - AWS Config

CloudFormation のスタックを確認するとconformance packのスタックがデプロイされていることが確認できます。

AWS Config のコンソール画面からデプロイされたConformance pack を確認してみるとRemediation Action の列が Not Set となっており、各Config Rule に対して修復アクションは関連付けされていないことがわかります。

Conformance Packs のサンプルテンプレートはGitHubで公開されているため各テンプレートを確認してみましたが、基本的には修復アクションに関する記述はなかったのでサンプルテンプレートはあくまでConfig Rule のみをデプロイするものと認識しておく必要があります。
2.自身でカスタマイズしたConformance Packsを適用する
先程はサンプルテンプレートを選択しましたが、自身でカスタマイズしたConformance packをデプロイしてみます。今回はS3のデフォルト暗号化が有効になっていることを確認するConfig Rule と修復アクションを記載した以下のテンプレートをデプロイしてみました。
AWSTemplateFormatVersion: 2010-09-09
Description: Enable AWS Config S3 Conformance Pack
Conditions:
GlobalServiceDeployRegion: !Equals [!Ref AWS::Region, ap-northeast-1]
Resources:
S3OperationsAutomationsExecutionRole:
Type: AWS::IAM::Role
Condition: GlobalServiceDeployRegion
Properties:
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
Service:
- ssm.amazonaws.com
Action:
- sts:AssumeRole
Path: /
RoleName: "S3OperationsAutomationsExecutionRole"
S3OperationsAutomationsExecutionPolicy:
DependsOn: S3OperationsAutomationsExecutionRole
Type: AWS::IAM::ManagedPolicy
Condition: GlobalServiceDeployRegion
Properties:
ManagedPolicyName: S3OperationsAutomationsExecutionPolicy
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- s3:PutEncryptionConfiguration
- s3:GetEncryptionConfiguration
- s3:ListBucket
- s3:GetBucketAcl
Resource:
- "*"
Roles:
- !Ref S3OperationsAutomationsExecutionRole
S3BucketServerSideEncryptionEnabled:
Type: "AWS::Config::ConfigRule"
Properties:
ConfigRuleName: S3BucketServerSideEncryptionEnabled
Description: "Checks that your Amazon S3 bucket either has S3 default encryption enabled or that the S3 bucket policy explicitly denies put-object requests without server side encryption."
Scope:
ComplianceResourceTypes:
- "AWS::S3::Bucket"
Source:
Owner: AWS
SourceIdentifier: S3_BUCKET_SERVER_SIDE_ENCRYPTION_ENABLED
S3BucketServerSideEncryptionEnabledRemediation:
DependsOn: S3BucketServerSideEncryptionEnabled
Type: 'AWS::Config::RemediationConfiguration'
Properties:
ConfigRuleName: S3BucketServerSideEncryptionEnabled
ResourceType: "AWS::S3::Bucket"
TargetId: "AWS-EnableS3BucketEncryption"
TargetType: "SSM_DOCUMENT"
TargetVersion: "1"
Parameters:
AutomationAssumeRole:
StaticValue:
Values:
- arn:aws:iam::AccountId:role/S3OperationsAutomationsExecutionRole
BucketName:
ResourceValue:
Value: "RESOURCE_ID"
SSEAlgorithm:
StaticValue:
Values:
- "AES256"
ExecutionControls:
SsmControls:
ConcurrentExecutionRatePercentage: 10
ErrorPercentage: 10
Automatic: True
MaximumAutomaticAttempts: 10
RetryAttemptSeconds: 600
デプロイしてみると以下のようなエラーとなりました。
Invalid conformance pack template provided. Errors found: [Invalid role ARN provided for auto remediation configuration, Unsupported resource type(s) provided in the template]. Fix your template and try again.

これはConformance Packs でデプロイするCloudFormationテンプレートの記述ではIAMリソースタイプはサポートされていないことが原因のエラーです。修復アクションを実行する際にSSM Automationに対して必要な権限を割り当てる必要がある場合(今回だとSSM AutomationがS3の暗号化設定を変更する権限が必要)、Comformance PacksではIAMリソースをデプロイできないためCloudFormationで予めIAMリソースを作成するテンプレートを流しておく必要があります。
以下のイメージのうち⑤の矢印でSSM Automation がS3に対して設定変更処理を実行する際にはIAMロールで変更権限を付与する必要があります。

SSM AutomationにアタッチしているIAMロールはConformance Packのコンソール画面から確認可能です。

また、余談ではありますがConformance Packs で流すテンプレートでは擬似パラメータ(${AWS::Region} 等)は使えません。
では、気を取り直して検証を進めていきます。
SSM Automation で必要なIAMロールを作成
以下のCloudFormationテンプレートを流してSSM AutomationがS3を操作するための権限を付与したIAMロールを作成します
Parameters:
S3TargetBucketNameForEnableLogging:
Description: Create IAM Role for SSM Automation
Type: String
Conditions:
GlobalServiceDeployRegion: !Equals [!Ref AWS::Region, ap-northeast-1]
Resources:
S3OperationsAutomationsExecutionRole:
Type: AWS::IAM::Role
Condition: GlobalServiceDeployRegion
Properties:
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
Service:
- ssm.amazonaws.com
Action:
- sts:AssumeRole
Path: /
RoleName: "S3OperationsAutomationsExecutionRole"
EbsRemediationPassPolicy:
DependsOn: S3OperationsAutomationsExecutionRole
Type: AWS::IAM::ManagedPolicy
Condition: GlobalServiceDeployRegion
Properties:
ManagedPolicyName: S3OperationsAutomationsExecutionPolicy
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- s3:PutEncryptionConfiguration
- s3:GetEncryptionConfiguration
- s3:ListBucket
- s3:GetBucketAcl
Resource:
- "*"
Roles:
- !Ref S3OperationsAutomationsExecutionRole
暗号化していないS3バケットを用意
修復アクションが実行されたことが分かるように予め検証用の暗号化していないS3バケットを作成しました。

Conformance Packs(適合パック)をデプロイ
以下のテンプレートをデプロイします。
AWSTemplateFormatVersion: 2010-09-09
Description: Enable AWS Config S3 Conformance Pack
Resources:
S3BucketServerSideEncryptionEnabled:
Type: "AWS::Config::ConfigRule"
Properties:
ConfigRuleName: S3BucketServerSideEncryptionEnabled
Description: "Checks that your Amazon S3 bucket either has S3 default encryption enabled or that the S3 bucket policy explicitly denies put-object requests without server side encryption."
Scope:
ComplianceResourceTypes:
- "AWS::S3::Bucket"
Source:
Owner: AWS
SourceIdentifier: S3_BUCKET_SERVER_SIDE_ENCRYPTION_ENABLED
S3BucketServerSideEncryptionEnabledRemediation:
DependsOn: S3BucketServerSideEncryptionEnabled
Type: 'AWS::Config::RemediationConfiguration'
Properties:
ConfigRuleName: S3BucketServerSideEncryptionEnabled
ResourceType: "AWS::S3::Bucket"
TargetId: "AWS-EnableS3BucketEncryption"
TargetType: "SSM_DOCUMENT"
TargetVersion: "1"
Parameters:
AutomationAssumeRole:
StaticValue:
Values:
- arn:aws:iam::AccountId:role/S3OperationsAutomationsExecutionRole
BucketName:
ResourceValue:
Value: "RESOURCE_ID"
SSEAlgorithm:
StaticValue:
Values:
- "AES256"
ExecutionControls:
SsmControls:
ConcurrentExecutionRatePercentage: 10
ErrorPercentage: 10
Automatic: True
MaximumAutomaticAttempts: 10
RetryAttemptSeconds: 600
デプロイが完了したことを確認

SSM Automationを確認するとS3のデフォルト暗号化を実行するSSMドキュメントが実行されていることが確認できます。

SSMドキュメントの実行が完了した後、S3バケットを確認すると暗号化が有効化されていました。

これらの処理完了後、Conformance Pack を確認すると「準拠」のステータスになっていることが確認できます。

まとめ
Conformance Packsの検証を通じて得た学びと感想は以下の通りです。
学び
Conformance Packs のサンプルテンプレートはConfig Rule のみをデプロイするものであるため修復アクションを実行したい場合は自身でカスタマイズしたテンプレートを使う必要がある。
Conformance Packs の実態はCloudFormation で実行するスタックだが、テンプレートに記述可能なリソースタイプや変数が通常のCloudFormationテンプレートとは異なり制限がある。
自身でカスタマイズしたテンプレートを利用する際に修復アクションでSSM Automationに割り当てる必要があるIAM権限がある場合は予めIAMリソースを作成するCloudFormationテンプレートを流しておく。
感想
AWS Config Rule を利用すること自体が初めてだったこともあってかなり苦戦しました。Conformance Packs を導入する前にまずはConfig Rule を導入して挙動等を理解することをオススメします。
Conformance Packs はコンソールではなくCloudFormationテンプレートを作成する必要があるためCloudFormationに慣れていないと設計/構築時の負荷が高いです。設計時に必要なルールと修復アクションの対応表をしっかりと整理しておくことが大切だと思いました。
Config Rules と SSM Automationで実行するSSM Document はユーザーによるカスタマイズ処理を作成することは可能ですが、それぞれ Lambda と JSON で処理を記述する必要があり負荷が高いので、まずはAWSのマネージドルール/マネージドドキュメントの処理範囲内での実装をオススメします。
山﨑 翔平 (Shohei Yamasaki) 記事一覧はコチラ
カスタマーサクセス部所属。2019年12月にインフラ未経験で入社し、AWSエンジニアとしてのキャリアを始める。2023 Japan AWS Ambassadors/2023-2024 Japan AWS Top Engineers