Config Rule のConformance Packs(適合パック)を使ってパッケージ単位でConfig Ruleを管理する

記事タイトルとURLをコピーする

自宅にサウナが欲しいCI部2課の山﨑です。

AWS Configの1つの機能であるConfig Rulesをパッケージ化したConformance Packs(適合パック)を使ってパッケージ単位でConfig Rulesを管理する方法を検証してみました

AWS Configとは

AWS Config は、AWS リソースの設定を評価、監査、審査できるサービスです。Config では、AWS リソースの設定が継続的にモニタリングおよび記録され、望まれる設定に対する記録された設定の評価を自動的に実行できます。

※引用元:AWS Config(リソースのインベントリと変更の追跡)| AWS

AWS Config は一般的にAWSマネージドの構成管理サービスとして認知されています。具体的には「いつ、誰が、どのリソースに対して、どのような操作を行い、どのように設定が変更されたのか」といったことを記録・管理することができます。

f:id:swx-yamasaki:20210809113006p:plain
AWS Configの全体像

※Blackbeltより引用:https://d1.awsstatic.com/webinars/jp/pdf/services/20190618_AWS-Blackbelt_Config.pdf

そのほかAWS Config 自体の設定方法等については弊社ブログを御覧ください

blog.serverworks.co.jp

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 の画面で確認することができます。ルールに準拠していれば「準拠」、そうでなければ「非準拠」と表示されます。

f:id:swx-yamasaki:20210809114402p:plain
ダッシュボード

f:id:swx-yamasaki:20210809114430p:plain
Config Rules のコンソール画面

修復アクション(Remediation)

上記のチェック機能に加えて、AWS Config Rules では非準拠と判断されたリソースに対して修復アクション(Remediation)を実行することが可能です。

修復アクション(Remediation)はSystems Manager DocumentとSystems Manager Automation の機能を利用して実装されており、Config Rule に対して 1:1 で関連付けることで修復アクションを実行することが可能です。

f:id:swx-yamasaki:20210809121225p:plain

料金体系

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

f:id:swx-yamasaki:20210809120317p:plain
利用料金

※参考資料:料金 - AWS Config | AWS

AWS Config Rules Conformance Packs(適合パック) とは

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

f:id:swx-yamasaki:20210809174204p:plain
Conformance Packs(適合パック)のイメージ

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

f:id:swx-yamasaki:20210809185036p:plain
グレーアウトしており設定変更ができない
※参考:aws.amazon.com

検証

以下のパターンを検証してみました

  1. AWSマネージドのConformance Packsを適用する

  2. 自身でカスタマイズしたConformance Packsを適用する

1. AWSマネージドのConformance Packsを適用する

AWS Config の左メニューからConformance Packs(適合パック)を選択し、Deploy conformance pack を選択します。

遷移先の画面では「サンプルテンプレートを使用」を選択し、今回は Operational Best Practices for Amazon S3 を選択しました

AWSによって用意されているサンプルテンプレートについてはAWSドキュメントに記載があります。

コンフォーマンスパックのサンプルテンプレート - AWS Config

f:id:swx-yamasaki:20210809150435p:plain

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

f:id:swx-yamasaki:20210809150731p:plain

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

f:id:swx-yamasaki:20210809150600p:plain

Conformance Packs のサンプルテンプレートはGitHubで公開されているため各テンプレートを確認してみましたが、基本的には修復アクションに関する記述はなかったのでサンプルテンプレートはあくまでConfig Rule のみをデプロイするものと認識しておく必要があります。

github.com

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. 

f:id:swx-yamasaki:20210809144951p:plain

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

以下のイメージのうち⑤の矢印でSSM Automation がS3に対して設定変更処理を実行する際にはIAMロールで変更権限を付与する必要があります。

f:id:swx-yamasaki:20210809180610p:plain
修復アクションの実行までのイメージ

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

f:id:swx-yamasaki:20210809181454p:plain

また、余談ではありますが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バケットを作成しました。

f:id:swx-yamasaki:20210809172251p:plain
テスト用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

デプロイが完了したことを確認

f:id:swx-yamasaki:20210809172755p:plain

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

f:id:swx-yamasaki:20210809173107p:plain

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

f:id:swx-yamasaki:20210809173304p:plain

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

f:id:swx-yamasaki:20210809173508p:plain

まとめ

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のマネージドルール/マネージドドキュメントの処理範囲内での実装をオススメします。