AWS
AmazonWebServices

Amazon SESで送信元と宛先の制限をかけてみたメモ

調べたり試したりしてみたので、メモ的な。

制限するには

 もともとSESにはサンドボックスモードと言って制限がかかった状態でサービスが利用可能になる。
  参照:http://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/limits.html
 その制限をわざわざ解除申請を出して自由に利用できるようにする。

 けど、自由すぎても困って、という話。

 SESを利用する際には、SES用のIAMユーザーを払い出して利用します。
 そのIAMユーザーのポリシーを利用して幾つかの制限ができるようです。
  参照:http://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/control-user-access.html

設定

送信元制限

 特に問題なくできてしまったので、その時のポリシー例を。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1507889923000",
            "Effect": "Allow",
            "Action": [
                "ses:SendEmail",
                "ses:SendRawEmail"
            ],
            "Condition": {
                "StringLike": {
                    "ses:FromAddress": [
                        "*@example.com"
                    ]
                }
            },
            "Resource": [
                "*"
            ]
        }
    ]
}

 これで「なんちゃら@example.com」が送信元の場合に限り、IAMはSESの認証をできるようにしてくれます。
 例えば「なんちゃら@jp.xxxx.com」とかが送信元になった場合に、554 Access deniedしちゃいます。
 これが送信元制限の簡単なやり方。

送信先(宛先)制限

 送信元制限のノリで作業したらはまったので、このメモを残すことになった。
 先に参照として出したドキュメントに、「ses:Recipients」使ったらできるで、と書いてあったので、間に受けて設定してたんですが
 それが間違いでした。
 とりあえず、うまくいった例

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ses:SendEmail",
                "ses:SendRawEmail"
            ],
            "Resource": "*",
            "Condition": {
                "ForAnyValue:StringLike": {
                    "ses:Recipients": [
                        "*@example.com"
                    ]
                }
            }
        }
    ]
}

 この設定で、「*@example.com」以外にメールが送信できなくなり、先ほどの送信元制限と同様に554エラーが発行されます。
 何にはまったかというと、"ForAnyValue:StringLike" この項目。

 送信元制限の際は、「"StringLike"」でいけるんですが、サポートにお聞きしたところ、ses:Recipientsは複数の項目にまたがり値があるので
 "ForAllValues:StringLike"
 を使ってな、と。
 ドキュメントにも例でのせてるで、ってなことなので、やったんですがダメでした。
 曰く

注記
キーに複数の値が含まれる場合、設定演算子(ForAllValues:StringLike および ForAnyValue:StringLike)を使用して StringLike を修飾できます。

 なので、ダメ元で ForAnyValue:StringLike を使ったらいけたという。
 実はAllとAnyの利用の違いについては調べ切れてないんですが、やりたいことができたということなので、これにて。

両方制限したい欲張りなあなたへ

 以下の設定で実現できてます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ses:SendEmail",
                "ses:SendRawEmail"
            ],
            "Resource": "*",
            "Condition": {
                "ForAnyValue:StringLike": {
                    "ses:Recipients": [
                        "宛先アドレス"
                    ],
                    "ses:FromAddress": [
                        "送信元アドレス"
                    ]
                }
            }
        }
    ]
}

 アドレスを指定する場合はLikeじゃなくてEqualesでもいいかもしれませんね。