Conformance PacksによるConfig RuleとRemediation Configurationのパッケージ化とデプロイ

中山(順)です

本日はつい先日機能追加されたConformance Packsについて紹介します。

Introducing AWS Config Conformance Packs

Conformance Packsとは?

端的に言うと、構成の評価ルール (Config Rule) と修復アクション (Remediation Configuration) の集合をコードで定義・デプロイできる機能です。 Conformance Packsを利用することで、Organizationsのメンバーアカウントに評価ルールと修正アクションを一括でデプロイできます。 なお、Conformance PacksはYAML形式のテンプレートとして定義します。 フォーマットはCloudFormationと同じです。

やってみた

今回は単一のAWSアカウント内でConformance Packsを利用してみます。(Organizationsを利用しないパターン)

前提条件を確認

Conformance Packsを利用する為の前提条件はこちらに記載されています。

Prerequisites

前提条件は以下の通りです。

  • Configが有効化されている
  • Service-Linked Roleが作成されている
  • デプロイするテンプレートの展開やレポートの配信を行うために必要なS3バケットを作成 / バケットに対するアクセス権が付与されている

今回の記事ではConfigの有効化は割愛します。 まだ有効化されていない環境で試す場合には以下のドキュメントを参考に有効化してください。

Getting Started with AWS Config

作業の流れ

  • Service-Linked Roleの作成
  • テンプレート配置用のS3バケットの作成およびバケットポリシーの作成
  • Conformance Packの作成

Service-Linked Role

まず、利用の前提条件であるService-Linked Roleを作成します。

Step 2: Create Service-Linked Role

aws iam create-service-linked-role \
    --aws-service-name config-conforms.amazonaws.com \
    --description "my service linked role for config-conforms"
{
    "Role": {
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Action": [
                        "sts:AssumeRole"
                    ],
                    "Effect": "Allow",
                    "Principal": {
                        "Service": [
                            "config-conforms.amazonaws.com"
                        ]
                    }
                }
            ]
        },
        "RoleId": "AXXXXXXXXXXXXXXXXXXXX",
        "CreateDate": "2019-12-01T06:58:13Z",
        "RoleName": "AWSServiceRoleForConfigConforms",
        "Path": "/aws-service-role/config-conforms.amazonaws.com/",
        "Arn": "arn:aws:iam::XXXXXXXXXXXX:role/aws-service-role/config-conforms.amazonaws.com/AWSServiceRoleForConfigConforms"
    }
}

Principalがconfig-conforms.amazonaws.comであることに留意しましょう。(config.amazonaws.comではない)

テンプレート配置用のS3バケットの作成およびバケットポリシーの作成

次に、テンプレートを配置するためのS3バケットを作成します。 このS3バケットには、Conformance Packsからのアクセスを許可します。

Step 3: Provide Resource-Level Permissions

今回はS3バケットをConformance Packsと同じアカウントに作成するため、上記のドキュメントの"Same Account Same Bucket Policy"に記載されたポリシーをバケットに設定します。 ドキュメントから引用する場合、AWSアカウントIDおよびバケット名を置換してください。

ここで先ほど作成したService-Linked Roleに対して権限が付与されていることが分かると思います。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AWSConfigConformsBucketPermissionsCheck",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
            "arn:aws:iam::AccountId:role/aws-service-role/config-conforms.amazonaws.com/AWSServiceRoleForConfigConforms"
        ]
      },
      "Action": "s3:GetBucketAcl",
      "Resource": "arn:aws:s3:::delivery-bucket-name"
    },
    {
      "Sid": "AWSConfigConformsBucketDelivery",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
            "arn:aws:iam::AccountId:role/aws-service-role/config-conforms.amazonaws.com/AWSServiceRoleForConfigConforms"
        ]
      },
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::delivery-bucket-name/[optional] prefix/AWSLogs/AccountId/Config/*",
      "Condition": {
        "StringEquals": {
          "s3:x-amz-acl": "bucket-owner-full-control"
        }
      }
    },
    {
      "Sid": " AWSConfigConformsBucketReadAccess",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
            "arn:aws:iam::AccountId:role/aws-service-role/config-conforms.amazonaws.com/AWSServiceRoleForConfigConforms"
        ]
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::delivery-bucket-name/[optional] prefix/AWSLogs/AccountId/Config/*"
    }
  ]
}

Conformance Packの作成

これで前準備ができました。それではConformance Packsをデプロイしてみます。今回はマネージメントコンソールから展開します。

まず、Configのコンソールを開きます。 が、従来のConsoleにはCormance Packsのメニューがありません。 Conformance Packが現時点では新しいコンソールから利用可能です。

Note
Conformance packs are only available in the redesigned AWS Config console.

Conformance Packs

まずは、新しいコンソールに変更します。

新しいコンソールに移動したら、Conformance Packsのメニューを選択します。

移動したら、Conformance Packを作成を開始します。

まず、利用するテンプレートを選択します。 今回はS3向けのサンプルテンプレートを利用してみます。 テンプレートの書き方は後述します。

次に、Conformance Packの名前とレポートの出力先となるS3バケットを指定します。 なお、このバケットにはConformance Packのテンプレートも保存されます。

設定を確認し、展開をはじめます。

しばらく待つと展開が完了します。

このサンプルテンプレートでは6つのルールが展開されるようです。

ルールのリンクをクリックすると、Config Rulesのコンソールへ遷移します。 この際、Service-Linked Roleの権限で展開されたメッセージが上部に表示されます。

サンプルテンプレートを確認

ここで今回展開したサンプルテンプレートを確認します。

Operational Best Practices For Amazon S3

以下のYAMLはS3に出力されていたテンプレートをそのまま転記したものになります。

---
Resources:
  S3BucketPublicReadProhibited:
    Type: "AWS::Config::ConfigRule"
    Properties:
      ConfigRuleName: "S3BucketPublicReadProhibited-conformance-pack-dynp8gou7"
      Description: "Checks that your Amazon S3 buckets do not allow public read access.\
        \ The rule checks the Block Public Access settings, the bucket policy, and\
        \ the bucket access control list (ACL)."
      MaximumExecutionFrequency: "Six_Hours"
      Scope:
        ComplianceResourceTypes:
        - "AWS::S3::Bucket"
      Source:
        Owner: "AWS"
        SourceIdentifier: "S3_BUCKET_PUBLIC_READ_PROHIBITED"
  S3BucketPublicWriteProhibited:
    Type: "AWS::Config::ConfigRule"
    Properties:
      ConfigRuleName: "S3BucketPublicWriteProhibited-conformance-pack-dynp8gou7"
      Description: "Checks that your Amazon S3 buckets do not allow public write access.\
        \ The rule checks the Block Public Access settings, the bucket policy, and\
        \ the bucket access control list (ACL)."
      MaximumExecutionFrequency: "Six_Hours"
      Scope:
        ComplianceResourceTypes:
        - "AWS::S3::Bucket"
      Source:
        Owner: "AWS"
        SourceIdentifier: "S3_BUCKET_PUBLIC_WRITE_PROHIBITED"
  S3BucketReplicationEnabled:
    Type: "AWS::Config::ConfigRule"
    Properties:
      ConfigRuleName: "S3BucketReplicationEnabled-conformance-pack-dynp8gou7"
      Description: "Checks whether the Amazon S3 buckets have cross-region replication\
        \ enabled."
      Scope:
        ComplianceResourceTypes:
        - "AWS::S3::Bucket"
      Source:
        Owner: "AWS"
        SourceIdentifier: "S3_BUCKET_REPLICATION_ENABLED"
  S3BucketSSLRequestsOnly:
    Type: "AWS::Config::ConfigRule"
    Properties:
      ConfigRuleName: "S3BucketSSLRequestsOnly-conformance-pack-dynp8gou7"
      Description: "Checks whether S3 buckets have policies that require requests\
        \ to use Secure Socket Layer (SSL)."
      Scope:
        ComplianceResourceTypes:
        - "AWS::S3::Bucket"
      Source:
        Owner: "AWS"
        SourceIdentifier: "S3_BUCKET_SSL_REQUESTS_ONLY"
  ServerSideReplicationEnabled:
    Type: "AWS::Config::ConfigRule"
    Properties:
      ConfigRuleName: "ServerSideReplicationEnabled-conformance-pack-dynp8gou7"
      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"
  S3BucketLoggingEnabled:
    Type: "AWS::Config::ConfigRule"
    Properties:
      ConfigRuleName: "S3BucketLoggingEnabled-conformance-pack-dynp8gou7"
      Description: "Checks whether logging is enabled for your S3 buckets."
      Scope:
        ComplianceResourceTypes:
        - "AWS::S3::Bucket"
      Source:
        Owner: "AWS"
        SourceIdentifier: "S3_BUCKET_LOGGING_ENABLED"
AWSTemplateFormatVersion: "2010-09-09"

どう見てもCloudFormationです。ほんとうにありがとうございました。

CloudFormationのドキュメントも確認しましたが、フォーマットはCloudFormationテンプレートそのもののようです。

AWS::Config::ConfigRule

修復アクションも同様に定義可能です。

Templates With Remediation

AWS::Config::RemediationConfiguration

ってことは実体はCloudFormationなのかというと、CloudFormationでした。

まとめ

Conformance Packsを利用することで評価ルールと修正アクションの集合を定義し、複数アカウントへのデプロイが容易に行えるようになりました。 今回は単一のアカウントでの利用例をご紹介したため、すでにCloudFormationでテンプレート化している方にはメリットが薄く感じたかもしれません。

しかし、「PCI-DSSの監査に対応するためのルール」など適用したい単位でルールをパッケージ化し、AWS Configのコンソールでデプロイから評価結果の確認まで全て完結するという意味ではわかりやすさが向上したと言えると思います。

現場からは以上です。