

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon SNS のセキュリティベストプラクティス
<a name="sns-security-best-practices"></a>

AWS は、Amazon SNS に多くのセキュリティ機能を提供します。独自のセキュリティポリシーのコンテキストで、これらのセキュリティ機能を確認します。

**注記**  
これらのセキュリティ機能のガイダンスは、一般的ユースケースと実装に適用されます。特定のユースケース、アーキテクチャ、脅威モデルのコンテキストで、これらのベストプラクティスを確認することをお勧めします。

## 予防的ベストプラクティス
<a name="preventative-best-practices"></a>

以下に、Amazon SNS の予防的なセキュリティに関するベストプラクティスを示します。

**Topics**
+ [トピックがパブリックアクセス可能でないようにする](#ensure-topics-not-publicly-accessible)
+ [最小特権アクセスの実装](#implement-least-privilege-access)
+ [Amazon SNS アクセスを必要とするアプリケーションと AWS サービスに IAM ロールを使用する Amazon SNS](#use-iam-roles-for-applications-aws-services-which-require-access)
+ [サーバー側の暗号化を実装する](#implement-server-side-encryption)
+ [送信時のデータの暗号化を強制する](#enforce-encryption-data-in-transit)
+ [VPC エンドポイントを使用して Amazon SNS にアクセスすることを検討する](#consider-using-vpc-endpoints-access-sns)
+ [サブスクリプションが raw http エンドポイントに配信するように設定されていないことを確認する](#http-subscription-configuration)
+ [サブスクリプション解除時に認証を適用する](#enforce-authentication-on-unsubscribe)

### トピックがパブリックアクセス可能でないようにする
<a name="ensure-topics-not-publicly-accessible"></a>

インターネット上の誰かが Amazon SNS トピックを読み書きできるように明示的に要求しない限り、トピックにパブリックにアクセスできないようにする必要があります (世界中のすべてのユーザーまたは認証された AWS ユーザーがアクセス可能）。
+ `Principal`を`""`に設定してポリシーを作成しないでください。
+ ワイルドカード (`*`) を使用しないでください。代わりに、特定のユーザーに名前を付けます。

### 最小特権アクセスの実装
<a name="implement-least-privilege-access"></a>

アクセス権限を付与する場合、アクセス権限を受け取るユーザー、アクセス許可の対象となるトピック、およびこれらのトピックに対して許可する特定の API アクションを決定します。最小権限の原則を実装することは、セキュリティリスクを軽減するために重要です。また、エラーや悪意のある意図による悪影響を減らすのにも役立ちます。

最小特権を付与するスタンダードのセキュリティアドバイスに従ってください。つまり、特定のタスクの実行に必要なアクセス権限のみを付与します。ユーザーアクセスに関連するセキュリティポリシーを組み合わせて使用することで、最小権限を実装できます。

Amazon SNS では、発行者と受信者のモデルが使用され、次の 3 種類のユーザーアカウントアクセスが必要です。
+ **管理者** - トピックの作成、変更、削除にアクセスします。管理者は、トピックポリシーも制御します。
+ **発行者** - トピックへのメッセージ送信のアクセス権限を持ちます。
+ **受信者** - トピックへの登録のアクセス権限を持ちます。

詳細については、次のセクションを参照してください。
+ [Amazon SNS での Identity and Access Management](security-iam.md)
+ [Amazon SNS API のアクセス許可: アクションとリソースのリファレンス](sns-access-policy-language-api-permissions-reference.md)

### Amazon SNS アクセスを必要とするアプリケーションと AWS サービスに IAM ロールを使用する Amazon SNS
<a name="use-iam-roles-for-applications-aws-services-which-require-access"></a>

Amazon EC2 などのアプリケーションまたは AWS サービスが Amazon SNS トピックにアクセスするには、 AWS API リクエストで有効な AWS 認証情報を使用する必要があります。これらの認証情報は自動的にローテーションされないため、 AWS 認証情報をアプリケーションまたは EC2 インスタンスに直接保存しないでください。

代わりに、IAM ロールを使用して、Amazon SNS にアクセスする必要があるアプリケーションまたはサービスの一時的な認証情報を管理することをおすすめします。ロールを使用するとき、EC2 インスタンスまたは AWS のサービス ( AWS Lambdaなど) に長期の認証情報 (ユーザー名、パスワード、アクセスキーなど) を配布する必要はありません。代わりに、ロールは、アプリケーションが他の AWS リソースを呼び出すときに使用できる一時的なアクセス許可を提供します。

詳細については、「*IAM ユーザーガイド*」の「[IAM ロール](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)」および「[ロールの一般的なシナリオ: ユーザー、アプリケーション、およびサービス](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios.html)」を参照してください。

### サーバー側の暗号化を実装する
<a name="implement-server-side-encryption"></a>

データ漏洩の問題を軽減するには、保存時の暗号化を使用して、メッセージを保存する場所とは別の場所に保存されているキーを使用してメッセージを暗号化します。サーバー側の暗号化 (SSE) は、保存時のデータ暗号化を提供します。Amazon SNS は、データを保存するときにメッセージレベルで暗号化し、アクセスするとメッセージを復号します。SSE は で管理されるキーを使用します AWS Key Management Service。リクエストが認証され、お客様がアクセス権限を持っていれば、トピックが暗号化されているかどうかに関係なく同じ方法でアクセスできます。

詳細については、「[サーバー側の暗号化を使用した Amazon SNS データの保護](sns-server-side-encryption.md)」および「[Amazon SNS 暗号化キーとコストの管理](sns-key-management.md)」を参照してください。

### 送信時のデータの暗号化を強制する
<a name="enforce-encryption-data-in-transit"></a>

HTTP を使用して送信中に暗号化されていないメッセージを公開することは可能ですが、お勧めできません。ただし、 を使用してトピックを保管中に暗号化する場合は AWS KMS、メッセージの発行に HTTPS を使用して、保管中と転送中の両方の暗号化を確保する必要があります。トピックは HTTP メッセージを自動的には拒否しませんが、セキュリティ標準を維持するには HTTPS を使用する必要があります。

AWS では、HTTP の代わりに HTTPS を使用することをお勧めします。HTTPS を使用すると、SNS トピック自体が暗号化されていなくても、メッセージは送信中に自動的に暗号化されます。HTTPS を使用しない場合、ネットワークベースの攻撃者は、中間者などの攻撃を使用して、ネットワークトラフィックを傍受したり操作することができます。

HTTPS 経由の暗号化された接続のみを実行するには、[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Boolean](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Boolean) 条件を、暗号化されていない SNS トピックに添付されている IAM ポリシーに追加します。これにより、メッセージ発行者は HTTP ではなく HTTPS を使用することになります。次の例のポリシーをガイドとして使用できます。

------
#### [ JSON ]

****  

```
{
    "Id": "ExamplePolicy",
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowPublishThroughSSLOnly",
            "Action": "SNS:Publish",
            "Effect": "Deny",
            "Resource": [
                "arn:aws:sns:us-east-1:111122223333:test-topic"
            ],
            "Condition": {
                "Bool": {
                    "aws:SecureTransport": "false"
                }
            },
            "Principal": "*"
        }
    ]
}
```

------

### VPC エンドポイントを使用して Amazon SNS にアクセスすることを検討する
<a name="consider-using-vpc-endpoints-access-sns"></a>

操作できる必要があるが、インターネットに絶対に公開してはならないトピックがある場合は、VPC エンドポイントを使用して、特定の VPC 内のホストのみにトピックアクセスを制限します。トピックポリシーを使用して、特定の VPC エンドポイントまたは特定の VPC からのトピックへのアクセスを制御できます。

Amazon SNS の VPC エンドポイントには、メッセージへのアクセスを制御するために、2 通りの方法が用意されています。
+ 特定の VPC エンドポイントを通じて許可されるリクエスト、ユーザー、またはグループを管理できます。
+ トピックポリシーを使用して、どの VPC または VPC エンドポイントがトピックにアクセスできるかを制御できます。

詳細については、「[エンドポイントの作成](sns-vpc-create-endpoint.md#sns-vpc-endpoint-create)」および「[Amazon SNS 用の VPC エンドポイントポリシーを作成する](sns-vpc-endpoint-policy.md)」を参照してください。

### サブスクリプションが raw http エンドポイントに配信するように設定されていないことを確認する
<a name="http-subscription-configuration"></a>

サブスクリプションは raw http エンドポイントに配信する設定をしないでください。エンドポイントドメイン名に配信するサブスクリプションが必ずなければいけません。例えば、エンドポイントに配信するように構成されたサブスクリプションである `http://1.2.3.4/my-path` は `http://my.domain.name/my-path` に変更する必要があります。

### サブスクリプション解除時に認証を適用する
<a name="enforce-authentication-on-unsubscribe"></a>

 E メールや SMS のサブスクリプション解除を簡単に行う場合など、認証されていないサブスクリプション解除を許可する必要がある場合を除き、トピックからのサブスクリプション解除には認証を適用する必要があります。これは、[最小特権アクセスコントロールの推奨事項](#implement-least-privilege-access)と一致しています。

 サブスクリプションの確認中に `AuthenticateOnUnsubscribe` を `True` に設定できます。Amazon SNS サブスクリプションを確認するときに `AuthenticateOnUnsubscribe` フラグを `True` に設定しないと、サブスクリプション解除のリクエストが認証されていない場合でも成功してしまう可能性があります。詳細については、「Amazon SNS API リファレンス」の「[ConfirmSubscription](https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html)」または [Amazon Q Detector Library の Python の例](https://docs.aws.amazon.com/codeguru/detector-library/python/sns-unauthenticated-unsubscribe/)を参照してください。

 たとえば、 を使用して E メールサブスクリプションを確認するには AWS CLI、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
```