Amazon SNS でトピックのデータ保護ポリシー機能がパブリックプレビューで利用出来るようになりました

2022.09.09

いわさです。

Amazon SNS でトピックのデータ保護ポリシー機能がパブリックプレビューで利用出来るようになりました

本日はこちらの新機能を早速使ってみました。

マネージメントコンソール

まずはマネジメントコンソールで確認してみます。
既存のトピックに対してもデータ保護ポリシーのタブを確認することが出来ます。プレビューの表記がついていますね。

編集画面あるいは新規トピックの作成画面からデータ保護ポリシーの設定が出来るようになっています。

ちなみにサポートされているのはスタンダードトピックのみで FIFQ の場合だとデータ保護ポリシータブが表示されませんでした。

データ保護ポリシー

マネジメントコンソールの場合、設定モードとしてベーシックとアドバンスドが用意されています。
ベーシックモードでは GUI 上でパラメータの設定が可能です。
アドバンスドモードでは JSON で保護ポリシーを設定します。

保護ポリシーでは大きく、「拒否」と「監査」の設定を行うことが出来ます。
簡単にいうと、拒否は保護ポリシーに反していた場合はメッセージ配信を拒否します。
監査は保護ポリシーに反していた場合もメッセージを配信します。しかしメトリクスやログから保護ポリシーに反するメッセージが送信されていたことを確認することが出来ます。

ちなみにベーシックモードで設定した内容はアドバンスドモードでも JSON で反映されます。
このあたりは 他のサービスのポリシーエディターに似ていますね。

ただし、本日時点ではベーシックモードですべての項目が設定出来るわけではなく、一部オプションはアドバンスドモードを使う必要がありそうです。
監査のあたりで後述します。

拒否について

まず、データの方向の概念があります。

SNS トピックへメッセージが送信され、トピックをサブスクライブしているエンドポイントへメッセージが配信される動きとなりますが、トピックへメッセージが送信される部分をインバウンド、トピックからエンドポイントへ配信される部分をアウトバウンドと定義されています。

データを拒否する際にどちらで拒否を行うのかを定義する形です。

次に、データ識別子を設定します。

どういうデータ識別子が用意されているのかは以下をご確認ください。

データ識別子は地域や言語に依存した情報と、依存していない情報と様々なものが用意されています。
しかし、前者は本日時点では日本語圏はサポートされていなさそうです。

ただし、後者は問題なく使えると思いますので本日はこちらを使ってみましょう。

インバウンド

では先程の設定でメールアドレス、IP アドレス、AWS シークレットあたりを識別子として選択し、インバウンド設定をした状態でトピックへメッセージを発行してみましょう。

One or more data identifiers were found

すぐに拒否されましたね。
期待どおりの動きをしています。

ちなみに、メッセージ属性でも試してみたのですがこちらは対象外のようでした。

アウトバウンド

次にデータの方向をアウトバウンドに変更して試してみます。

メッセージ発行したところ、Publish自体はエラーなく成功しました。

ただし、配信先には配信されていませんでした。
トピックには配信ステータスのログ記録を行うことで CloudWatch Logs 上で配信エラー時のメッセージを確認することが出来ます。

そちらを設定のうえ確認してみたところ、該当するメッセージが確認出来ました。

{
    "notification": {
        "messageMD5Sum": "67a42539347bd5d9e9988a5c901696d8",
        "messageId": "ed67e13e-6a4d-5e34-a7f2-baaaf04ec5c2",
        "topicArn": "arn:aws:sns:ap-northeast-1:123456789012:general-topic-hogehoge",
        "timestamp": "2022-09-09 01:32:51.506"
    },
    "delivery": {
        "deliveryId": "b006a921-ffe0-5591-9fbb-f2b565e3af4d",
        "destination": "arn:aws:sqs:ap-northeast-1:123456789012:hoge-sqs",
        "providerResponse": "The topic's data protection policy prohibits this message from being delivered to arn:aws:sns:ap-northeast-1:123456789012:general-topic-hogehoge:hogehoge",
        "dwellTimeMs": 35,
        "attempts": 1,
        "statusCode": 403
    },
    "status": "FAILURE"
}

データ保護ポリシーに該当した旨がメッセージから確認出来ますね。

監査

続いて、監査について確認してみましょう。

監査も同じでデータ識別子を設定します。
データの方向については設定箇所がありませんが、アドバンスドモードを確認するとインバウンドで設定されていました。

拒否設定時にはなかったパラメータとして「サンプルレート」というものがあります。
監査ステートメントでは全てのメッセージが監査対象ではありません。一定のメッセージの割合を決めてそれらを対象に監査します。
このサンプルレートではその割合を設定しています。

そして監査結果の送信先も設定します。

まず、デフォルトで CloudWatch メトリクスへ監査検知データが送信されます。

それに加えて、CloudWatch Logs、 Kinesis Data Firehose、S3 バケットを配信先に選択することが出来ます。

CloudWatch Logs はロググループが/aws/vendedlogs/で始まっている必要がありますが、試してみたところ、本日時点ではマネジメントコンソールから設定出来ませんでした。エラーになってしまった。

そこで、今回は S3 バケットを設定しました。

ちなみに、以下によると機密データを検出したときのログと検出しなかったときのログと記録先をどちらも設定出来るようになっています。
ただし、マネジメントコンソールのベーシックモードだとひとつしか設定出来るようにはなっていません。
また、ベーシックモードで設定した後アドバンスドモードを確認してみてもFindingsDestinationしか設定されていませんでした。

本日時点ではNoFindingsDestinationを設定するにはアドバンスドモードで JSON での設定が必要そうです。

CloudWatch メトリクス

ではメッセージを送信してみたので CloudWatch メトリクスから確認してみます。

SNS に新たにMessagesWithFindings・DataProtectionOperation Auditが選択出来るようになっており、トピックごとにカウントを確認出来るようになっています。

S3

配信までタイムラグが数分ありましたが、S3 バケットへは以下の形式でログが格納されます。
バケット名意外は指定出来ないです。

ダウンロードして確認してみると、メッセージ ID やどのデータ識別子で検知されたのかまで詳細情報が確認出来ました。

% gunzip 20220909T0135Z_e0c4b283.log.gz 
% cat 20220909T0135Z_e0c4b283.log | jq
{
  "messageId": "e60a7826-970b-5240-8b65-23b20c75f262",
  "auditTimestamp": "2022-09-09T01:39:10Z",
  "callerPrincipal": "arn:aws:iam::123456789012:role/hoge",
  "resourceArn": "arn:aws:sns:ap-northeast-1:123456789012:general-topic-hogehoge",
  "dataIdentifiers": [
    {
      "name": "EmailAddress",
      "count": 1,
      "detections": [
        {
          "start": 0,
          "end": 28
        }
      ]
    }
  ]
}

さいごに

本日は Amazon SNS でトピックのデータ保護ポリシー機能がパブリックプレビューで利用出来るようになったので使ってみました。

監査を使うとどの程度特定のデータが移動されたかを把握することが出来るようになるので、ポリシーに準拠する際に役立ちそうです。
また、監査モードについては名前のとおり監査を目的としたものではありますが、AWS WAF のカウントモードのようにまずは監査モードで挙動を確認してみるというのも良いかなと思いました。

一方で SNS 設定したけど何故か配信されないみたいな時のトラブルシューティングはデータ保護ポリシーが設定されているかどうかも今後は確認したほうが良さそうですね。