Amazon SNS のセキュリティベストプラクティス
AWS には、Amazon SNS の多くのセキュリティ機能があります。独自のセキュリティポリシーのコンテキストで、これらのセキュリティ機能を確認します。
注記
これらのセキュリティ機能のガイダンスは、一般的ユースケースと実装に適用されます。特定のユースケース、アーキテクチャ、脅威モデルのコンテキストで、これらのベストプラクティスを確認することをお勧めします。
予防的ベストプラクティス
以下に、Amazon SNS の予防的なセキュリティに関するベストプラクティスを示します。
トピック
トピックがパブリックアクセス可能でないようにする
インターネット上の誰もが Amazon SNS トピックに読み書きできるように明示的にリクエストしない限り、 トピックにパブリックアクセスできないようにする必要があります (世界中の誰でも、または認証された AWS ユーザーがアクセス可能)。
-
Principalを""に設定してポリシーを作成しないでください。 -
ワイルドカード (
*) を使用しないでください。代わりに、特定のユーザーに名前を付けます。
最小特権アクセスの実装
アクセス権限を付与する場合、アクセス権限を受け取るユーザー、アクセス許可の対象となるトピック、およびこれらのトピックに対して許可する特定の API アクションを決定します。最小権限の原則を実装することは、セキュリティリスクを軽減するために重要です。また、エラーや悪意のある意図による悪影響を減らすのにも役立ちます。
最小特権を付与するスタンダードのセキュリティアドバイスに従ってください。つまり、特定のタスクの実行に必要なアクセス権限のみを付与します。ユーザーアクセスに関連するセキュリティポリシーを組み合わせて使用することで、最小権限を実装できます。
Amazon SNS では、発行者と受信者のモデルが使用され、次の 3 種類のユーザーアカウントアクセスが必要です。
-
管理者 - トピックの作成、変更、削除にアクセスします。管理者は、トピックポリシーも制御します。
-
発行者 - トピックへのメッセージ送信のアクセス権限を持ちます。
-
受信者 - トピックへの登録のアクセス権限を持ちます。
詳細については、次のセクションを参照してください。
Amazon SNS アクセスを必要とするアプリケーションと AWS のサービスには IAM ロールを使用する。
Amazon SNS トピックにアクセスするアプリケーションまたは Amazon EC2 などの AWS のサービスには、AWS API リクエストで有効な AWS 認証情報を使用する必要があります。これらの認証情報は自動的には更新されないため、AWS 認証情報をアプリケーションまたは EC2 インスタンスに直接保存しないでください。
代わりに、IAM ロールを使用して、Amazon SNS にアクセスする必要があるアプリケーションまたはサービスの一時的な認証情報を管理することをおすすめします。ロールを使用するとき、EC2 インスタンスまたは AWS のサービス (AWS Lambda など) に長期の認証情報 (ユーザー名、パスワード、アクセスキーなど) を配布する必要はありません。代わりに、ロールは、アプリケーションが他の AWS リソースへの呼び出しを行うときに使用できる一時的なアクセス権限を提供します。
詳細については、「IAM ユーザーガイド」の「IAM ロール」および「ロールの一般的なシナリオ: ユーザー、アプリケーション、およびサービス」を参照してください。
サーバー側の暗号化を実装する
データ漏洩の問題を軽減するには、保存時の暗号化を使用して、メッセージを保存する場所とは別の場所に保存されているキーを使用してメッセージを暗号化します。サーバー側の暗号化 (SSE) は、保存時のデータ暗号化を提供します。Amazon SNS は、データを保存するときにメッセージレベルで暗号化し、アクセスするとメッセージを復号します。SSEはAWS Key Management Serviceでマネージドされているキーを使用します。リクエストが認証され、お客様がアクセス権限を持っていれば、トピックが暗号化されているかどうかに関係なく同じ方法でアクセスできます。
詳細については、「サーバー側の暗号化を使用した Amazon SNS データの保護」および「Amazon SNS 暗号化キーとコストの管理」を参照してください。
送信時のデータの暗号化を強制する
HTTP を使用して送信中に暗号化されていないメッセージを公開することは可能ですが、お勧めできません。ただし、保管時のトピックが AWS KMS で暗号化されている場合は、メッセージの発行に HTTPS を使用して、保管中と転送中の両方の暗号化を確保する必要があります。トピックは HTTP メッセージを自動的には拒否しませんが、セキュリティ標準を維持するには HTTPS を使用する必要があります。
AWS では、HTTP ではなく HTTPS を使用することをお勧めします。HTTPS を使用すると、SNS トピック自体が暗号化されていなくても、メッセージは送信中に自動的に暗号化されます。HTTPS を使用しない場合、ネットワークベースの攻撃者は、中間者などの攻撃を使用して、ネットワークトラフィックを傍受したり操作することができます。
HTTPS 経由の暗号化された接続のみを実行するには、aws:SecureTransport 条件を、暗号化されていない SNS トピックに添付されている IAM ポリシーに追加します。これにより、メッセージ発行者は HTTP ではなく HTTPS を使用することになります。次の例のポリシーをガイドとして使用できます。
VPC エンドポイントを使用して Amazon SNS にアクセスすることを検討する
操作できる必要があるが、インターネットに絶対に公開してはならないトピックがある場合は、VPC エンドポイントを使用して、特定の VPC 内のホストのみにトピックアクセスを制限します。トピックポリシーを使用して、特定の VPC エンドポイントまたは特定の VPC からのトピックへのアクセスを制御できます。
Amazon SNS の VPC エンドポイントには、メッセージへのアクセスを制御するために、2 通りの方法が用意されています。
-
特定の VPC エンドポイントを通じて許可されるリクエスト、ユーザー、またはグループを管理できます。
-
トピックポリシーを使用して、どの VPC または VPC エンドポイントがトピックにアクセスできるかを制御できます。
詳細については、「エンドポイントの作成」および「Amazon SNS 用の VPC エンドポイントポリシーを作成する」を参照してください。
サブスクリプションが raw http エンドポイントに配信するように設定されていないことを確認する
サブスクリプションは raw http エンドポイントに配信する設定をしないでください。エンドポイントドメイン名に配信するサブスクリプションが必ずなければいけません。例えば、エンドポイントに配信するように構成されたサブスクリプションである http://1.2.3.4/my-path は http://my.domain.name/my-path に変更する必要があります。
サブスクリプション解除時に認証を適用する
E メールや SMS のサブスクリプション解除を簡単に行う場合など、認証されていないサブスクリプション解除を許可する必要がある場合を除き、トピックからのサブスクリプション解除には認証を適用する必要があります。これは、最小特権アクセスコントロールの推奨事項と一致しています。
サブスクリプションの確認中に AuthenticateOnUnsubscribe を True に設定できます。Amazon SNS サブスクリプションを確認するときに AuthenticateOnUnsubscribe フラグを True に設定しないと、認証されていない場合でも、サブスクリプション解除のリクエストが成功してしまう可能性があります。詳細については、「Amazon SNS API リファレンス」の「ConfirmSubscription」または Amazon Q Detector Library の Python の例を参照してください。
たとえば、AWS CLI を使用して E メールサブスクリプションを確認するには、E メール通知の「サブスクリプションを確認」テキストからリンクをコピーします。この URL は、次の AWS CLI コマンドを呼び出すために必要な情報を提供します。
aws sns confirm-subscription --region us-west-2 \ --topic-arn sns-topic-arn \ --token token-from-subscribe-notification \ --authenticate-on-unsubscribe true
コードの説明は以下のとおりです。
-
aws-region は、トピックがある AWS リージョンです。これは、トピック ARN でも使用できます。
-
sns-topic-arn はトピックの ARN です。これは、サブスクリプション確認 URL 内の「TopicArn=」と「&Token」の間にあるテキストです。
-
token-from-subscribe-notification は、サブスクリプション確認 URL 内の「Token=」と「&Endpoint」の間にある UUID 文字列です。
URL の例を次に示します。
https://sns.us-west-2.amazonaws.com/confirmation.html?TopicArn=arn:aws:sns:us-west-2:123456789012:sns-topic&Token=a1b2c3d4e5f6789012345678901234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1&Endpoint=email@address.com