【AWS小ネタ】Amazon SNSの意図しないメール購読解除を防ぐ方法 ~Outlook環境での対処~

お久しぶりです!SYCの秀高です。
今回は、AWSの監視通知を設定している中で少し気になった、Amazon SNSのメール通知における「意図しないサブスクリプション解除」について紹介します。

CloudWatchなどからメール通知を行う際、Amazon SNSを利用することも多いと思います。
設定自体はそれほど難しくありませんが、メール通知の運用方法によっては、意図せず通知が停止してしまう可能性があります。
特に、Outlook+Microsoft Defender for Office 365のSafe Linksを利用している環境では、SNSの確認URLがSafe LinksのURLへ書き換えられるため、少し工夫が必要でした。

今回は、その対処方法も含めて紹介します。

Amazon SNSのメール通知には「Unsubscribe」が付いている

Amazon SNSでメールアドレスをサブスクリプションとして登録すると、通知メールの末尾に以下のような案内が表示されます。

If you wish to stop receiving notifications from this topic,
please click or visit the link below to unsubscribe:
※実際のURLはマスクしております。

このリンクを踏んでしまうと、SNSのサブスクリプションを解除できる仕組みになっています。
個人のメールアドレスを登録している場合はあまり気にならないかもしれませんが、例えば保守担当者向けのメーリングリストをSNSに登録している場合は注意が必要です。

イメージとしては以下のような構成です。

Amazon SNS
    ↓
support@example.co.jp
    ↓
 ├ 担当者A
 ├ 担当者B
 └ 担当者C

SNSから見ると、登録されているサブスクリプションはあくまで、

support@example.co.jp

という1つのメールアドレスです。

そのため、メーリングリストのメンバーの誰かが通知メール内のUnsubscribeリンクを操作した場合、その人だけではなく、メーリングリスト自体がSNSから解除される可能性があります。
AWSからも、メールセキュリティスキャナーやスパムフィルターなどがメール内のリンクを検査することで、意図せずUnsubscribeリンクが実行される場合があることが案内されています。

参考:

回避方法は「サブスクリプション解除に認証を要求する」

この問題への対処方法として、AWSでは、

「サブスクリプション解除に認証が必要なサブスクリプション」

を作成する方法が案内されています。

通常、SNSから届いた確認メールの「Confirm subscription」をそのままクリックしても、メールアドレスの購読確認自体は可能です。
一方、AWSコンソールから認証付きでサブスクリプションを確認することで、

AuthenticateOnUnsubscribe = true

の状態にできます。
この状態にしておくことで、認証されていないユーザーが通知メール内のUnsubscribeリンクを操作しても、サブスクリプションを解除できないようにできます。
監視通知用のメーリングリストなどでは、こちらの方法で登録しておくと安心です。

Outlook+Safe Links環境では注意が必要

Outlook環境でMicrosoft Defender for Office 365のSafe Linksが有効になっている場合、メール内のURLが以下のようなURLへ書き換えられる場合があります。

https: //jpn01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fsns.ap-northeast-1.amazonaws.com%2F...

MicrosoftのSafe Linksでは、メール内のURLをSafe Links用のURLへ書き換え、リンク先を検査する仕組みがあります。



そのままリンクをコピーして貼り付けると、上図のようなエラーが表示されます。

参考:

一方、Amazon SNSで本来使用したい確認URLは以下のような形式です。

https: //sns.ap-northeast-1.amazonaws.com/confirmation.html?TopicArn=...

Outlook上で単純にリンクをコピーすると、AWSのSNS確認URLではなく、Safe LinksでラッピングされたURLが取得される場合があります。
このSafe LinksのURLをそのままAWS SNSコンソールへ貼り付けても、正常に確認できない場合があります。
そこで、PowerShellを使用してSafe LinksのURLから元のAmazon SNS URLを取り出します。

PowerShellで元のSNS URLを取り出す

PowerShellを起動し、以下のコマンドを実行します。

$SafeLink = Read-Host "Safe Links URLを貼り付けてください"; Write-Host ""; [System.Net.WebUtility]::UrlDecode(((($SafeLink -split '\?url=', 2)[1]) -split '&', 2)[0])

実行すると、以下のように入力を求められます。

Safe Links URLを貼り付けてください:

ここに、OutlookからコピーしたSafe LinksのURLを貼り付けてEnterを押します。
※この時点では、メール内の「Confirm subscription」はクリックせず、URLのコピーのみ行います。

正常に取得できると、1行空けて元のAmazon SNS URLが表示されます。

https: //sns.ap-northeast-1.amazonaws.com/confirmation.html?TopicArn=arn:aws:sns:...

このSNS確認URLを、後ほどAWS SNSコンソールで使用します。

PowerShellで何をしているのか

Safe LinksのURLには、元のURLが以下のような形式で含まれています。

?url=xxxxxxxx&data=xxxxxxxx

PowerShellでは、

  1. ?url= より後ろを取得
  2. &data= より前までを取得
  3. URLエンコードされた文字列をデコード

という処理を行っています。

AWSコンソールからサブスクリプションを確認する

元のSNS URLを取得したら、そのURLをブラウザで直接開かないようにします。

AWS公式でも、サブスクリプション解除に認証を要求する場合は、確認メール内のリンクを直接クリックせず、確認URLを使用してAWSコンソールから確認する方法が案内されています。

AWSコンソールから、

Amazon SNS
  ↓
サブスクリプション
  ↓
「保留中の確認」のサブスクリプションを選択
  ↓
「サブスクリプションの確認」

と進みます。

そこで、PowerShellで取得した元のSNS確認URLを貼り付けて、サブスクリプションを確認します。

URLの貼り付け後に「サブスクリプションが正常に確認されました。」と表示されればOKです。

すでにメールから確認してしまった場合

すでに確認メールの「Confirm subscription」を直接クリックしてサブスクリプションを作成している場合は、既存のサブスクリプションを削除し、再度作成します。

流れとしては以下です。

既存サブスクリプションを削除
        ↓
メールサブスクリプションを再作成
        ↓
確認メールを受信
        ↓
「Confirm subscription」はクリックしない
        ↓
Safe Links URLから元のSNS URLを取得
        ↓
AWS SNSコンソールから確認

まとめ

今回は、Amazon SNSのメール通知で発生する可能性のある、意図しないサブスクリプション解除とその対処方法について紹介しました。

特に、SNSの通知先としてメーリングリストを使用している場合は注意が必要です。

ポイントをまとめると以下になります。

  • SNSの通知メールにはUnsubscribeリンクが含まれる
  • メーリングリストを登録している場合、ML自体が購読解除される可能性がある
  • AWSコンソールから認証付きでサブスクリプションを確認する
  • OutlookのSafe LinksでURLが書き換えられている場合は、元のSNS URLを取得する

ちょっとした設定ですが、「監視していたはずなのに、いつの間にか通知が止まっていた」という事態を防ぐためにも、SNSのメール通知を利用する際は確認しておきたいポイントです。
最後まで読んでいただきありがとうございました!

参考