AWS Config監査でNocompliantなリソースを検出時にSNS経由でメール通知する

AWS Config監査でNocompliantなリソースを検出時にSNS経由でメール通知する

以下のページで、AWS Configから発信されたイベントデータをEventBridgeで受け取り、ルールにマッチするものだけをSNS経由でメール通知する方法を取り上げました。

あわせて読みたい
EventBridgeルールにマッチしたAWS ConfigデータをSNS経由でメール通知する 【AWS Configのリソース変更履歴データの中から、EventBridgeルールにマッチしたものだけをSNS経由でメール通知する】 以下のページで、AWS Configのリソース変更履歴デ...

これと同様の構成で、AWS Config監査において、ルールに準拠していないリソースが検出された場合、SNS経由でメール通知することができます。

具体的には、以下のAWS公式ページで、設定方法が取り上げられています。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/config-resource-non-compliant/

今回は上記の構成をCloudFormationで構築します。
具体的には、AWS ConfigにS3バケットのSSEに関するルールを設定し、これに準拠しないバケットが検出された際は、メール通知されるように設定します。

構築する環境

Diagram of email notification via SNS when Nocompliant resources are detected by AWS Config

冒頭でご紹介したページと概ね同様の構成です。

AWS Configで、S3バケットのSSEに関するルールを作成します。
SSEが無効になっているS3バケットが検出されると、非準拠リソースとしてイベントデータが生成されます。

EventBridgeルールで、上記を満たすデータを受け取った場合、SNSトピックにデータを送信します。

SNSトピックのサブスクライバーにメールアドレスを指定し、メール通知します。

CloudFormationテンプレートファイル

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

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

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

基本的には冒頭でご紹介したページと同様ですから、異なる箇所のみ取り上げます。

AWS Configルール

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

S3バケットのSSEに関するルールを設定します。
今回はマネージドルール「s3-bucket-server-side-encryption-enabled」を使用します。

https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/s3-bucket-server-side-encryption-enabled.html

Sourceプロパティにこのルールを指定します。

AWS Configルールに関する詳細につきましては、以下のページもご確認ください。

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

EventBridgeルール

Resources:
  EventsRule:
    Type: AWS::Events::Rule
    Properties:
      EventBusName: !Ref EventBusName
      EventPattern:
        source:
          - aws.config
        detail-type:
          - Config Rules Compliance Change
        detail:
          messageType:
            - ComplianceChangeNotification
          configRuleName:
            - !Ref S3BucketSSEEnabledConfigRule
          resourceType:
            - AWS::S3::Bucket
          newEvaluationResult:
            complianceType:
              - NON_COMPLIANT
      Name: !Sub "${Prefix}-EventsRule"
      State: ENABLED
      Targets:
        - Arn: !Ref TopicArn
          Id: !Ref TopicName
          InputTransformer:
            InputPathsMap:
              "awsRegion": "$.detail.awsRegion"
              "resourceId": "$.detail.resourceId"
              "awsAccountId": "$.detail.awsAccountId"
              "compliance": "$.detail.newEvaluationResult.complianceType"
              "rule": "$.detail.configRuleName"
              "time": "$.detail.newEvaluationResult.resultRecordedTime"
              "resourceType": "$.detail.resourceType"
            InputTemplate: |
              "On <time> AWS Config rule <rule> evaluated the <resourceType> with Id <resourceId> in the account <awsAccountId> region <awsRegion> as <compliance> For more details open the AWS Config console at https://console.aws.amazon.com/config/home?region=<awsRegion>#/timeline/<resourceType>/<resourceId>/configuration"
Code language: YAML (yaml)

AWS Configルールによってリソースが非準拠と判定された場合、EventBridgeにデータが送信されます。
S3バケットのSSEに関するEventBridgeルールを作成し、イベントを受信した場合は、SNSトピックにメッセージを送信するように設定します。

ポイントは2点です。

1点目はEventPatternプロパティです。
S3バケットのSSEに関するルールに、非準拠として判定された際に発生するデータパターンを指定します。
AWS公式ページで紹介されている通りに設定します。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/config-resource-non-compliant/

以下がデータのサンプルです。

{
  "version": "0",
  "id": "e1127974-86dd-69bb-649a-1416eaa3a14a",
  "detail-type": "Config Rules Compliance Change",
  "source": "aws.config",
  "account": "[account-id]",
  "time": "2022-12-02T14:39:46Z",
  "region": "ap-northeast-1",
  "resources": [],
  "detail": {
    "resourceId": "fa-104-encryption-enabled",
    "awsRegion": "ap-northeast-1",
    "awsAccountId": "[account-id]",
    "configRuleName": "fa-104-S3-Bucket-SSE-Enabled",
    "recordVersion": "1.0",
    "configRuleARN": "arn:aws:config:ap-northeast-1:[account-id]:config-rule/config-rule-yt5uxw",
    "messageType": "ComplianceChangeNotification",
    "newEvaluationResult": {
      "evaluationResultIdentifier": {
        "evaluationResultQualifier": {
          "configRuleName": "fa-104-S3-Bucket-SSE-Enabled",
          "resourceType": "AWS::S3::Bucket",
          "resourceId": "fa-104-encryption-enabled"
        },
        "orderingTimestamp": "2022-12-02T14:39:32.966Z"
      },
      "complianceType": "NON_COMPLIANT",
      "resultRecordedTime": "2022-12-02T14:39:45.721Z",
      "configRuleInvokedTime": "2022-12-02T14:39:45.437Z"
    },
    "oldEvaluationResult": {
      "evaluationResultIdentifier": {
        "evaluationResultQualifier": {
          "configRuleName": "fa-104-S3-Bucket-SSE-Enabled",
          "resourceType": "AWS::S3::Bucket",
          "resourceId": "fa-104-encryption-enabled"
        },
        "orderingTimestamp": "2022-12-02T14:33:12.486Z"
      },
      "complianceType": "COMPLIANT",
      "resultRecordedTime": "2022-12-02T14:38:39.897Z",
      "configRuleInvokedTime": "2022-12-02T14:38:29.554Z"
    },
    "notificationCreationTime": "2022-12-02T14:39:46.796Z",
    "resourceType": "AWS::S3::Bucket"
  }
}
Code language: JSON / JSON with Comments (json)

2点目はTargetsプロパティです。
SNSトピックを指定します。
デフォルトですと、SNSトピックにパブリッシュするメッセージは、上記のJSONデータとなります。
InputTransformerプロパティを設定することで、メッセージを指定することができます。
こちらもAWS公式ページで紹介されている通りに設定します。

環境構築

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

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

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

あわせて読みたい
CloudFormationのネストされたスタックで環境を構築する 【CloudFormationのネストされたスタックで環境を構築する方法】 CloudFormationにおけるネストされたスタックを検証します。 CloudFormationでは、スタックをネストす...

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

  • SNSトピック:fa-104
  • AWS Configルール:fa-104-S3-Bucket-SSE-Enabled
  • EventBridgeルール:fa-104-EventRule
  • 検証用バケット:fa-104-encryption-enabled

メールアドレスの認証

SNSトピックのサブスクライバーとしてメールアドレスを指定した場合、そのメールアドレスを認証する必要があります。
指定したメールアドレスに、以下のような認証メールが送られてきます。

Detail of SNS 1.

「Confirm subscription」を押下して、認証を進めます。

Detail of SNS 2.

上記のページが表示されて、認証が完了したことがわかります。

リソース確認

AWS Management Consoleから各リソースを確認します。
まずSNSトピックを確認します。

Detail of SNS 3.
Detail of SNS 4.
Detail of SNS 5.

正常にSNSトピックが作成されていることがわかります。

加えて、サブスクライバーとして登録したメールアドレスが登録されていることもわかります。
またこのメールアドレスのStatusの値を見ると「Confirmed」とあり、認証が完了していることもわかります。

そしてアクセスポリシーを見ると、EventBridgeから本トピックに対するメッセージのパブリッシュが許可されていることがわかります。

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

Detail of S3 1.

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

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

Detail of AWS Config 1.

AWS Configが正常に動作し、データの収集が開始されていることがわかります。

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

Detail of AWS Config 2.

SSEに関するルールが作成されています。
そして先述のS3バケットを見ると、「Compliant」とありますので、現在は準拠していることがわかります。

EventBridgeルールを確認します。

Detail of EventBridge 1.
Detail of EventBridge 2.
Detail of EventBridge 3.

EventBridgeルールが正常に作成されていることがわかります。

Targetを見ると、先ほどのSNSトピックが指定されていることがわかります。
つまりパターンを満たすイベントデータが送られた場合、SNS経由でメール通知されるということです。

Event Patternを見ると、CloudFormationテンプレート通りにパターンが定義されていることがわかります。
つまりS3バケットのSSE設定に関するAWS Configルールに準拠しないリソースが検出された場合、条件を満たすということになります。

Input transformerを見ると、メールで送る文字列のテンプレートと、埋め込むパラメータが定義されています。

動作確認

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

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

Detail of S3 2.

無効化の実施後、AWS Config側でルールの再評価を実施します。

Detail of AWS Config 3.

ルールの再評価が実施されて、検証用バケットが「Nocompliant」となりました。

Detail of AWS Config 4.

しばらく待つと、以下のメールが届きました。

Detail of SNS 6.

メールの本文は、確かにInput Transformerで指定したテンプレートに、各種パラメータが埋め込まれた文字列です。

このようにEventBridgeルールを設定することによって、AWS Configルールに非準拠なリソースが検出された際に、SNS経由でメール通知することができました。

まとめ

AWS Config監査において、ルールに準拠していないリソースが検出された場合、SNS経由でメール通知する方法をご紹介しました。