AWS Configで非準拠リソースを検出時に修復アクションを設定する

AWS Configで非準拠リソースを検出時に修復アクションを設定する

AWS Configで非準拠リソースを検出時に修復アクションを設定する

AWS SOAの出題範囲の1つである、モニタリング、ロギング、および修復に関する内容です。

AWS Configでは、修復アクションを定義することができます。

AWS Config では、AWS Config Rules で評価されている非準拠のリソースを修復できます。

AWS Config Rules による非準拠 AWS リソースの修復

今回はS3バケットのSSEに関するAWS Configルールと修復アクションを定義して、実際の挙動を確認します。

構築する環境

Diagram of configure remediation actions when non-compliant resources are detected by AWS Config.

検証用として、SSEを有効化したS3バケットを作成します。

AWS Configで、S3バケットのSSEに関するルールと、修復アクションを作成します。
SSEが無効になっているS3バケットが検出され、非準拠と判定されると、自動的にこれを復元します。

CloudFormationテンプレートファイル

上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しています。

https://github.com/awstut-an-r/awstut-soa/tree/main/01/001

テンプレートファイルのポイント解説

本ページは、AWS Configの修復アクションに関する内容を中心に取り上げます。

AWS Configに関する基本的な事項については、以下のページをご確認ください。

あわせて読みたい
CFNでAWS Config入門 – S3バケットのロギング設定の監査 【CFNでAWS Config入門 - S3バケットのロギング設定の監査】 AWS Configはリソースの構成を評価、監査するサービスです。 AWS Config は、セキュリティとガバナンスのた...

AWS Configルール

Resources:
  S3BucketSSEEnabledConfigRule:
    Type: AWS::Config::ConfigRule
    DependsOn:
      - ConfigurationRecorder
    Properties:
      ConfigRuleName: !Sub "${Prefix}-S3-Bucket-SSE-Enabled"
      Scope:
        ComplianceResourceId: !Ref TestBucket
        ComplianceResourceTypes:
          - AWS::S3::Bucket
      Source:
        Owner: AWS
        SourceIdentifier: S3_BUCKET_SERVER_SIDE_ENCRYPTION_ENABLED
Code language: YAML (yaml)

S3バケットのSSEに関するルールを定義します。

今回は検証用ということで、監査対象とするリソースを限定します。
Scopeプロパティ内の、ComplianceResourceIdプロパティにバケット名を、ComplianceResourceTypesプロパティに「AWS::S3::Bucket」を指定することで、検証用バケットだけをルールの対象とします。

AWS Config修復アクション

Resources:
  RemediationConfiguration:
    Type: AWS::Config::RemediationConfiguration
    Properties:
      Automatic: true
      ConfigRuleName: !Ref S3BucketSSEEnabledConfigRule
      MaximumAutomaticAttempts: 5
      Parameters:
        BucketName:
          ResourceValue:
            Value: RESOURCE_ID
        SSEAlgorithm:
          StaticValue:
            Values:
              - !Ref SSEAlgorithm
        AutomationAssumeRole:
          StaticValue:
            Values:
              - !GetAtt RemediationConfigurationRole.Arn
      ResourceType: AWS::S3::Bucket
      RetryAttemptSeconds: 60
      TargetId: AWS-EnableS3BucketEncryption
      TargetType: SSM_DOCUMENT
      TargetVersion: "1"
Code language: YAML (yaml)

修復アクションはSSM Automationドキュメントを使用することで実現されます。

AWS Config では、AWS Systems Manager 自動化ドキュメントを使用して修復が適用されます。これらのドキュメントは、AWS Config Rules によって評価された非準拠の AWS リソースに対して実行されるアクションを定義します。

AWS Config Rules による非準拠 AWS リソースの修復

特徴的なパラメータを取り上げます。

Automaticプロパティは、修復アクションを自動的に実行するかどうかを設定するパラメータです。

非準拠のリソースの修復を手動で行うか、自動で行うかを選択できます。自動で行う場合は、修復アクションを AWS Config ルールに関連付けます。

AWS Config Rules による非準拠 AWS リソースの修復

今回は「true」を指定して、自動的に修復アクションを実行するように設定します。

TargetId・TargetType・TargetVersionプロパティは、実行するドキュメントに関するパラメータです。
今回はマネージドドキュメントAWS-EnableS3BucketEncryptionを実行することによって、S3バケットをSSE有効化します。
以下のページで、このドキュメントの詳細が確認できます。

https://docs.aws.amazon.com/ja_jp/systems-manager-automation-runbooks/latest/userguide/automation-aws-enableS3bucketencryption.html

MaximumAutomaticAttemptsプロパティは、自動修復の失敗回数の最大値を指定するパラメータです。
今回はデフォルト値の5回に設定します。

RetryAttemptSecondsプロパティは、自動修復を実行する最大時間に関するパラメータです。
今回はデフォルト値の60秒に設定します。

Parametersプロパティはドキュメントを実行する際に渡すパラメータです。
上記のページで示されている通り、このドキュメントを実行するためには、以下の3つのパラメータを指定する必要があります。

  • BucketName
  • SSEAlgorithm
  • AutomationAssumeRole

Parametersプロパティにこれらのパラメータを設定します。
ポイントは各パラメータに指定する値が動的/静的かという点です。

例えばBucketNameは動的な値です。
これは監査で非準拠として判定されたバケットごとに異なるためです。
動的な値の場合は、ResourceValueプロパティを使用し、内部のValueプロパティに「RESOURCE_ID」を指定します。

一方、SSEAlgorithmとAutomationAssumeRoleは静的な値です。
前者はデフォルト値の「AES256」を、後者は後述のIAMロールを固定的に指定します。
この場合はStaticValueプロパティを使用し、内部のValuesプロパティに値を設定します。

IAMロールはSSM Automationが修復アクションに必要な権限を与えるためのものです。

Resources:
  RemediationConfigurationRole:
    Type: AWS::IAM::Role
    DeletionPolicy: Delete
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Action: sts:AssumeRole
            Principal:
              Service:
                - ssm.amazonaws.com
      Policies:
        - PolicyName: S3PutSSEPolicy
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - s3:PutEncryptionConfiguration
                Resource:
                  - !Sub "arn:aws:s3:::${TestBucket}"
Code language: YAML (yaml)

今回は検証用バケットに対してSSE設定を有効化できる権限を与えます。

環境構築

CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。

CloudFormationスタックを作成し、スタック内のリソースを確認する

CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

https://awstut.com/2021/12/02/cloudformation-nested-stacks

各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。

  • AWS Configルール:soa-01-001-S3-Bucket-SSE-Enabled
  • 検証用バケット:soa-01-001-encryption-enabled

AWS Management Consoleから各リソースを確認します。
まずAWS Configルールを確認します。

Detail of AWS Config 1.

正常にルールが作成されていることがわかります。
ルールに基づく監査によって、検証用バケットが「Compliant」であることもわかります。

修復アクションが定義され、SSMドキュメントAWS-EnableS3BucketEncryptionおよびドキュメント実行用パラメータが指定されています。
検証用バケットのSSEが無効化され、監査の結果で非準拠だと判定された場合、修復アクションとしてこのドキュメントが実行されることになります。

検証用バケットを確認します。

Detail of S3 1.

確かにSSEが有効化されていることがわかります。

動作確認

準備が整いましたので、実際の動作を確認します。

S3バケットのSSE設定を無効化します。

Detail of S3 2.

SSEが無効化されました。

AWS Configの評価が変更されます。

Detail of AWS Config 2.

先ほどまで「Compliant」でしたが、SSEを無効化したことで「Nocompliant」に変化しました。

SSM Automationを確認します。

Detail of SSM 1.

確かにSSM Automationが実行されました。

SSM Automationによって、SSMドキュメントAWS-EnableS3BucketEncryptionが実行され、正常に完了したことがわかります。

改めてAWS ConfigルールおよびS3バケットを確認します。

Detail of AWS Config 3.
Detail of S3 3.

AWS Configルールのページでは、再び「Compliant」に戻りました。
そしてS3バケットのページでも、再びSSEが有効化されたことがわかります。

このことから、SSM AutomationでSSMドキュメントが実行されて、S3バケットのSSE機能が有効化されたことがわかります。

まとめ

AWS Configルールに修復アクションを定義することで、自動的にリソースを復旧させる方法を確認しました。