Amazon SNSによるメール通知で指定ドメイン以外のサブスクリプション作成を拒否するポリシーを作ってみた

2022.11.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

みなさんこんにちは、杉金です。
メールアドレスのドメイン入力間違いで大量の誤送信が発生したというニュースを見かけました。
mailの「l」が無いというものでしたが、同じ過ちを自分もやってしまいかねないなと思いました。そこで、Amazon SNSで指定ドメイン以外のメールサブスクリプション作成を拒否するIAMポリシーを作ってみました。

IAMポリシー

以下がその拒否を行うポリシーです。拒否のみのポリシーであるため、前提としてSNSのサブスクリプションを作成できる権限を持っており、追加で以下のポリシーをアタッチする想定です。制限をかけているプロトコルはメールのみですので、その他のプロトコルには影響しません。

指定ドメイン以外は拒否(1ドメイン)

ドメイン「@gmail.com」以外を拒否するポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "UnmatchMailDomain",
            "Effect": "Deny",
            "Action": "sns:Subscribe",
            "Resource": "arn:aws:sns:*:1234567891012:*",
            "Condition": {
                "StringEquals": {
                    "sns:Protocol": "email"
                },
                "StringNotLike": {
                    "sns:Endpoint": "*@gmail.com"
                }
            }
        }
    ]
}

指定ドメイン以外は拒否(2ドメイン以上)

配列を使って複数のドメインを指定します。以下の例では2つのドメインを指定していますが、ドメインを追加する場合は以下のポリシーを参考に末尾をカンマで区切って繋げていきます。(最後の要素はカンマ不要です) ポリシーのサイズ上限まで複数設定できます。試しに20ドメインぐらいやってみましたが、特に問題ありませんでした。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "UnmatchMailDomain",
            "Effect": "Deny",
            "Action": "sns:Subscribe",
            "Resource": "arn:aws:sns:*:1234567891012:*",
            "Condition": {
                "StringEquals": {
                    "sns:Protocol": "email"
                },
                "StringNotLike": {
                    "sns:Endpoint": [
                        "*@gmail.com",
                        "*@yahoo.co.jp"
                    ]
                }
            }
        }
    ]
}

誤ったサブスクリプションを発行するとどうなるか

入力を間違えてサブスクリプションを発行した場合、相手側で対応するか保留中のまま3日後の自動削除を待つしかありません。

ポリシーをアタッチするとどう拒否されるか

今回のポリシーをアタッチした上で指定ドメイン以外のサブスクリプションを作成するとどうなるか見てみましょう。まずはサブスクリプション作成の画面に移動します。

「test@gmai.com」と入力して作成しようとすると画面下部にエラーが表示され作成できないことが分かります。

指定ドメインの後ろに適当な文字列を入れてみましたが、こちらも拒否されます。

アットマークの後ろに適当に文字を入れても同様です。

末尾を1文字カットしても拒否されます。

それでは指定ドメインをちゃんと入力して作成してみましょう。(画像ではtestと入力していますが、このあと実際に使っているアドレスに変えてます)

無事作成され、自分のメールアドレスにも「Subscription Confirmation」のメールが届きました。

以上がポリシーを使ったときの拒否の動きです。

最後に

もしかしたら出来るのでは?と思い始めてみたのですが、うまく機能してくれてよかったです。フールプルーフは私の好きな考えです。仕組みで防いでくれると安心して使えますね。

参考資料