CFNでAWS Config入門 – S3バケットのロギング設定の監査

CFNでAWS Config入門 - S3バケットのロギング設定の監査

CFNでAWS Config入門 – S3バケットのロギング設定の監査

AWS Configはリソースの構成を評価、監査するサービスです。

AWS Config は、セキュリティとガバナンスのためのフルマネージド型のサービスであり、ご利用の AWS リソースのインベントリ、構成履歴、構成変更通知の機能を備えています。

AWS Config のよくある質問

本ページでは、AWS Config入門ということで、S3バケットのロギング設定の有効/無効を監査することを目標とします。

構築する環境

Diagram of introduction to AWS Config with CFN - Auditing S3 Bucket Logging Settings

AWS Configで、S3バケットのロギング設定状況を監査するルールを作成します。

3つのS3バケットを作成します。

2つは監査対象のバケットです。
それぞれロギング機能を有効化/無効化しています。

残り1つはAWS Configが動作するために使用されるバケットです。
AWSリソースの設定状況や変更状況に関するデータが保存されます。

CloudFormationテンプレートファイル

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

https://github.com/awstut-an-r/awstut-fa/tree/main/097

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

S3バケット

配信チャネル用バケット

Resources:
  ConfigBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub "${Prefix}-config"
      AccessControl: Private
Code language: YAML (yaml)

AWS Configを有効化するためには、後述の配信チャネルを作成する必要があります。
配信チャネルのパラメータの1つに、S3バケットがあります。
AWSリソースの設定状況や変更状況に関するデータの保存先として、S3バケットを使用します。

配信チャネル用バケットですが、特別な設定は不要です。

Resources:
  ConfigBucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref ConfigBucket
      PolicyDocument:
        Statement:
          - Principal:
              Service: config.amazonaws.com
            Action: s3:GetBucketAcl
            Effect: Allow
            Resource: !Sub "arn:aws:s3:::${ConfigBucket}"
            Condition:
              StringLike:
                AWS:SourceAccount: !Ref AWS::AccountId
          - Principal:
              Service: config.amazonaws.com
            Action: s3:ListBucket
            Effect: Allow
            Resource: !Sub "arn:aws:s3:::${ConfigBucket}"
            Condition:
              StringLike:
                AWS:SourceAccount: !Ref AWS::AccountId
          - Principal:
              Service: config.amazonaws.com
            Action: s3:PutObject
            Effect: Allow
            Resource: !Sub "arn:aws:s3:::${ConfigBucket}/*"
            Condition:
              StringLike:
                s3:x-amz-acl: bucket-owner-full-control
                AWS:SourceAccount: !Ref AWS::AccountId
Code language: YAML (yaml)

配信チャネルで使用するS3バケットには、AWS Configからの各種アクセスを許可する必要があります。
今回は以下のページを参考に、バケットポリシーを使用してアクセス許可を行います。

https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/s3-bucket-policy.html

プリンシパルに「config.amazonaws.com」を指定し、本バケットに対する3つの権限(s3:GetBucketAcl, s3:ListBucket, s3:PutObject)を与えます。

(参考)監査対象のバケット

Resources:
  Bucket1:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub "${Prefix}-logging-enable"
      AccessControl: Private
      LoggingConfiguration:
        DestinationBucketName: !Ref LogBucket

  Bucket2:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub "${Prefix}-logging-disable"
      AccessControl: Private
Code language: YAML (yaml)

今回の監査対象として2つのS3バケットを作成します。
一方はロギング設定を有効化し、もう一方は無効化します。

S3バケットのロギング機能については、以下のページもご確認ください。

https://awstut.com/2021/12/19/s3-server-access-log

AWS Config

AWS Configでリソースを監査するためには、以下の3つのリソースを作成します。

  • 配信チャネル
  • 設定レコーダー
  • AWS Configルール

配信チャネル

配信チャネルは、AWSリソースの設定状況や変更状況に関するデータの保存先です。

Resources:
  DeliveryChannel:
    Type: AWS::Config::DeliveryChannel
    Properties:
      Name: !Sub "${Prefix}-DeliveryChannel"
      S3BucketName: !Ref ConfigBucket
Code language: YAML (yaml)

AWS Config では、AWS リソースへの変更を継続的に記録し、通知および更新された設定状態を配信チャネルを通じて送信します。配信チャネルを管理して AWS Config から設定の更新を送信する先を制御できます。

配信チャネルの管理

S3BucketNameプロパティで、先述のバケットポリシーを定義したバケットを指定します。

設定レコーダー

設定レコーダーは、設定状況や変更状況を検出する対象リソースを指定するリソースです。

Resources:
  ConfigurationRecorder:
    Type: AWS::Config::ConfigurationRecorder
    Properties:
      Name: !Sub "${Prefix}-ConfigurationRecorder"
      RecordingGroup:
        AllSupported: false
        IncludeGlobalResourceTypes: false
        ResourceTypes:
          - AWS::S3::Bucket
      RoleARN: !Sub "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/config.amazonaws.com/${AWSServiceRoleForConfig}"
Code language: YAML (yaml)

AWS Config では、設定レコーダーを使用してリソースの設定変更を検出し、これらの変更を設定項目として取り込みます。AWS Config でリソースの設定を追跡する前に、設定レコーダーを作成する必要があります。

設定レコーダーの管理

今回はS3バケットに関する状況を検出するように設定します。

特に重要なパラメータはRoleARNプロパティです。
設定レコーダーがAWSリソースの状況を検出するために、対象のリソースにアクセスする権限を与える必要があります。
AWS公式では、サービスにリンクされたロール(service-linked role (SLR))を使用することがベストプラクティスとしています。

A service-linked role (SLR) makes setting up AWS Config easier because you don’t have to manually add the necessary permissions for Config to record the configuration of AWS services that Config supports. AWS Config uses the service-linked role named AWSServiceRoleForConfig. AWS Config uses this service-linked role to call other AWS services on your behalf. The permissions policy for this role contains read-only and write-only permissions on the AWS Config resources and read-only permissions for resources in other services that AWS Config supports.

AWS Config best practices

以下がAWS Config用のサービスにリンクされたロールです。

Resources:
  AWSServiceRoleForConfig:
    Type: AWS::IAM::ServiceLinkedRole
    DeletionPolicy: Delete
    Properties:
      AWSServiceName: config.amazonaws.com
Code language: YAML (yaml)

Typeプロパティに注目です。
通常のIAMロールの場合は「AWS::IAM::Role」を指定しますが、サービスにリンクされたロールを作成する場合は「AWS::IAM::ServiceLinkedRole」を指定します。

AWSServiceNameプロパティに「config.amazonaws.com」を指定します。

AWS Configルール

AWS Configルールは、監査内容を定義するリソースです。

Resources:
  S3BucketLoggingEnabledConfigRule:
    Type: AWS::Config::ConfigRule
    DependsOn:
      - ConfigurationRecorder
    Properties:
      ConfigRuleName: !Sub "${Prefix}-S3-Bucket-Logging-Enabled"
      Scope:
        ComplianceResourceTypes:
          - AWS::S3::Bucket
      Source:
        Owner: AWS
        SourceIdentifier: S3_BUCKET_LOGGING_ENABLED
Code language: YAML (yaml)

S3バケットのロギング設定の有効/無効を評価するように設定します。
この内容でしたら、AWSマネージドルール「s3-bucket-logging-enabled」を使用することで、目的を達成することができます。

S3 バケットに対してログ記録が有効になっているかどうか確認します。

s3-bucket-logging-enabled

AWSマネージドルールの一覧は、以下のページをご確認ください。

https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/managed-rules-by-aws-config.html

環境構築

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

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

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

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

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

  • AWS Config用バケット:fa-097-config
  • AWS Configルール:fa-097-Bucket-Logging-Enabled
  • AWS Config用ロール:AWSServiceRoleForConfig
  • 監査対象バケット1:fa-097-logging-enabled
  • 監査対象バケット2:fa-097-logging-disabled

作成されたリソースをAWS Management Consoleから確認します。
AWS Config用バケットのバケットポリシーを確認します。

Detail of Delivery Channel (S3 Bucket) of AWS Config.

CloudFormationテンプレートで定義したバケットポリシーが適用されています。

監査対象の2つのバケットを確認します。

Detail of S3 Bucket 1.
Detail of S3 Bucket 2.

それぞれロギング機能が有効化/無効化されていることがわかります。

AWS Config用ロールを確認します。

Detail of Service Linked Role(AWSServiceRoleForConfig) for AWS Config

AWS Config用のサービスにリンクされたロールを作成することで、自動的にAWSConfigServiceRolePolicyがアタッチされました。
このポリシーはサービスにリンクされたロールにのみアタッチが可能です。

AWS Configを確認します。

Detail of AWS Config 1

Recoderの項目を見ると、「Recording is on」とあります。
設定レコーダーが正常に動作していることがわかります。

General settingsの項目のAWS Config roleを見ると、「AWSServiceRoleForConfig」とあります。
先述のサービスにリンクされたロールが指定されていることがわかります。

Delivery methodの項目のS3 bucket nameを見ると、「fa-097-config」とあります。
先述のAWS Config用バケットが指定されていることがわかります。

AWS Configの詳細設定を確認します。

Detail of AWS Config 2

Resource types to recordやResource categoryの項目を見ると、「AWS S3 Bucket」が指定されています。
これでS3バケットに関するデータのみを収集するということになります。

AWS Configルールを確認します。

Detail of AWS Config 3

AWSマネージドルール「s3-bucket-logging-enabled」を使用して、S3バケットのロギング機能の有効/無効を監査するルールを作成しました。

動作確認

監査結果を確認します。

Detail of AWS Config 4
Detail of AWS Config 5

Noncompliantとして判定されたリソースに、fa-097-logging-disableが含まれています。
Compliantとして判定されたリソースに、fa-097-logging-enabledが含まれています。
この結果は2つのバケットのロギング設定と付合しています。
AWS Configを使用して、S3バケットのロギング設定の有効/無効を監査することができました。

まとめ

AWS Config入門として、S3バケットのロギング設定の有効/無効を監査する方法を確認しました。