

# 暗号化を使用して転送中のデータを保護する
<a name="UsingEncryptionInTransit"></a>

Amazon S3 は、データ転送用の HTTP プロトコルと HTTPS プロトコルの両方をサポートしています。HTTP はプレーンテキストでデータを送信し、HTTPS は Transport Layer Security (TLS) を使用してデータを暗号化することでセキュリティレイヤーを追加します。TLS は、盗聴、データ改ざん、中間者攻撃から保護します。HTTP トラフィックは受け入れられますが、ほとんどの実装では、HTTPS および TLS による転送中の暗号化を使用して、クライアントと Amazon S3 間のデータを保護します。

## TLS 1.2 および TLS 1.3 のサポート
<a name="UsingEncryptionInTransit.TLS-support"></a>

Amazon S3 は、すべての AWS リージョンのすべての API エンドポイントでの HTTPS 接続に TLS 1.2 および TLS 1.3 をサポートしています。S3 は、クライアントソフトウェアでサポートされている最も強力な TLS 保護と、アクセスしている S3 エンドポイントを自動的にネゴシエートします。AWS SDK と AWS CLI を含む現在の AWS ツール (2014 以降) は、デフォルトで自動的に TLS 1.3 になり、ユーザー側でアクションは必要ありません。TLS 1.2 との下位互換性が必要な場合は、この自動ネゴシエーションをクライアント設定で上書きして、特定の TLS バージョンを指定できます。TLS 1.3 を使用する場合、オプションでハイブリッドポスト量子キー交換 (ML-KEM) を設定して、Amazon S3 への量子耐性リクエストを行うことができます。詳細については、「[クライアントのハイブリッドポスト量子 TLS の設定](pqtls-how-to.md)」を参照してください。

**注記**  
TLS 1.3 は、Amazon S3 の AWS PrivateLink およびマルチリージョンアクセスポイントを除くすべての S3 エンドポイントでサポートされています。

## TLS 使用状況のモニタリング
<a name="UsingEncryptionInTransit.monitoring"></a>

Amazon S3 サーバーアクセスログまたは AWS CloudTrail を使用して、Amazon S3 バケットへのリクエストをモニタリングできます。どちらのログ記録オプションも、各リクエストで使用される TLS バージョンと暗号スイートを記録します。
+ **Amazon S3 サーバーアクセスログ** – サーバーアクセスログ記録には、バケットに対して行われたリクエストの詳細が記録されます。例えば、アクセスのログ情報は、セキュリティやアクセスの監査に役立ちます。詳細については、「[Amazon S3 サーバーアクセスログの形式](LogFormat.md)」を参照してください。
+ **AWS CloudTrail** – [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html) は、ユーザーやロール、AWS サービスによって実行されたアクションを記録するサービスです。Amazon S3 へのすべての API コールをイベントとしてキャプチャします。詳細については、「[Amazon S3 CloudTrail イベント](cloudtrail-logging-s3-info.md)」を参照してください。

## 転送時の暗号化の強制
<a name="UsingEncryptionInTransit.enforcement"></a>

Amazon S3 への転送中のデータの暗号化を適用することは、セキュリティのベストプラクティスです。さまざまなポリシーメカニズムを使用して、HTTPS のみの通信や特定の TLS バージョンの使用を適用できます。これには、S3 バケット ([バケットポリシー](bucket-policies.md))、[サービスコントロールポリシー](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html) (SCP)、[リソースコントロールポリシー](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html) (RCP)、[VPC エンドポイントポリシー](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-access.html)の IAM リソースベースのポリシーが含まれます。

### 転送中の暗号化を適用するためのバケットポリシーの例
<a name="UsingEncryptionInTransit.bucket-policy-example"></a>

[S3 条件キー](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazons3.html#amazons3-policy-keys) `s3:TlsVersion` を使用して、クライアントが使用する TLS バージョンに基づいて Amazon S3 バケットへのアクセスを制限できます。詳細については、「[例 6: 最小の TLS バージョンの要求](amazon-s3-policy-keys.md#example-object-tls-version)」を参照してください。

**Example `S3:TlsVersion` 条件キーを使用して TLS 1.3 を適用するバケットポリシー**  

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "DenyInsecureConnections",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket1",
        "arn:aws:s3:::amzn-s3-demo-bucket1/*"
      ],
      "Condition": {
        "NumericLessThan": {
          "s3:TlsVersion": "1.3"
        }
      }
    }
  ]
}
```

S3 バケットポリシーの `aws:SecureTransport` [グローバル条件キー](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)を使用して、リクエストが HTTPS (TLS) 経由で送信されたかどうかを確認できます。前の例とは異なり、この条件は特定の TLS バージョンをチェックしません。詳細については、「[HTTPS リクエストのみにアクセスを制限](example-bucket-policies.md#example-bucket-policies-use-case-HTTP-HTTPS-1)」を参照してください。

**Example `aws:SecureTransport` グローバル条件キーを使用して HTTPS を適用するバケットポリシー**  

```
{
    "Version":"2012-10-17",		 	 	 		 	 	 
    "Statement": [
     {
        "Sid": "RestrictToTLSRequestsOnly",		 	 	 
        "Action": "s3:*",
        "Effect": "Deny",
        "Resource": [
            "arn:aws:s3:::amzn-s3-demo-bucket1",
            "arn:aws:s3:::amzn-s3-demo-bucket1/*"
        ],
        "Condition": {
            "Bool": {
                "aws:SecureTransport": "false"
            }
        },
        "Principal": "*"
    }
  ]
}
```

**両方のキーに基づくポリシーの例と、その他の例**  
前の例の両方のタイプの条件キーを 1 つのポリシーで使用できます。詳細とその他の適用アプローチについては、AWS ストレージブログ記事の「[Amazon S3 で TLS1.2 以上を使用して転送中の暗号化を強制する](https://aws.amazon.com/blogs/storage/enforcing-encryption-in-transit-with-tls1-2-or-higher-with-amazon-s3/)」を参照してください。

# Amazon S3 でハイブリッドポスト量子 TLS を使用する
<a name="UsingEncryptionInTransit.PQ-TLS"></a>

Amazon S3 は、TLS ネットワーク暗号化プロトコル用のハイブリッドポスト量子キー交換オプションもサポートしています。この TLS オプションは、TLS 1.3 を使用して Amazon S3 エンドポイントにリクエストを行うときに使用できます。S3 が TLS セッションでサポートしている従来の暗号スイートにより、現在のテクノロジーではキー交換メカニズムに対するブルートフォース攻撃は実行不可能です。しかし、暗号に関連した量子コンピュータが将来実用的になると、TLS 鍵交換メカニズムで使用される従来の暗号スイートは、これらの攻撃の影響を受けやすくなります。現在、業界では、従来の要素とポスト量子要素を組み合わせたハイブリッドポスト量子キー交換が主流となっており、TLS 接続が従来の暗号スイートと同等以上の強度を保つことが保証されています。Amazon S3 は、現在、業界標準の IANA 仕様に準拠したハイブリッド PQ-TLS をサポートしています。

TLS 接続を介して渡されるデータの長期的な機密性に依存するアプリケーションを開発する場合は、大規模な量子コンピュータが使用可能になる前に、量子後の暗号化に移行する計画を検討する必要があります。責任共有モデルの一環として、S3 はサービスエンドポイントで量子安全暗号化を有効にします。ブラウザとアプリケーションが PQ-TLS を有効にすると、S3 は転送中のデータを保護するために可能な限り強力な設定を選択します。

**サポートされているエンドポイントタイプと AWS リージョン**

Amazon S3 のポスト量子 TLS は、すべての AWS リージョンで使用できます。各 AWS リージョンの S3 エンドポイントのリストについては、「*Amazon Web Services 全般のリファレンス*」の「[Amazon Simple Storage Service エンドポイントとクォータ](https://docs.aws.amazon.com/general/latest/gr/s3.html)」を参照してください。

**注記**  
ハイブリッドポスト量子 TLS は、Amazon S3 の AWS PrivateLink、マルチリージョンアクセスポイント、および S3 Vectors を除くすべての S3 エンドポイントでサポートされています。

## Amazon S3 でハイブリッドポスト量子 TLS を使用する
<a name="pqtls-details"></a>

ハイブリッドポスト量子 TLS をサポートするには、Amazon S3 にリクエストを行うクライアントを設定する必要があります。HTTP クライアントのテスト環境または本番稼働環境を設定するときは、次の点に注意してください。

**転送時の暗号化**

ハイブリッドポスト量子 TLS は、転送中の暗号化にのみ使用されます。これにより、クライアントから S3 エンドポイントに送信される間、データが保護されます。この新しいサポートは、デフォルトで AES-256 アルゴリズムを利用する Amazon S3 のサーバー側の暗号化と組み合わされ、転送中と保管時の両方の量子耐性暗号化を提供します。Amazon S3 のサーバー側暗号化の詳細については、「[サーバー側の暗号化によるデータの保護](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)」をご参照ください。

**サポートされているクライアント**

ハイブリッドポスト量子 TLS を使用するには、この機能をサポートするクライアントを使用する必要があります。AWSSDK とツールには、言語やランタイムによって異なる暗号化機能と設定があります。特定のツールのポスト量子暗号化の詳細については、「[ハイブリッドポスト量子 TLS の有効化](https://docs.aws.amazon.com/payment-cryptography/latest/userguide/pqtls-details.html)」を参照してください。

**注記**  
Amazon S3 へのリクエストの PQ-TLS キー交換の詳細は、AWS CloudTrail イベントまたは S3 サーバーアクセスログでは使用できません。

## ポスト量子 TLS について
<a name="pqtls-see-also"></a>

ハイブリッドポスト量子 TLS の使用の詳細については、次のリソースを参照してください。
+ ブログ記事や研究論文へのリンクなど、AWS でのポスト量子暗号の詳細については、「[AWS 用ポスト量子暗号](https://aws.amazon.com/security/post-quantum-cryptography/)」を参照してください。
+ s2n-tls の詳細については、「[新しいオープンソース TLS 実装である s2n-tls の導入](https://aws.amazon.com/blogs/security/introducing-s2n-a-new-open-source-tls-implementation/)」と「[s2n-tls の使用](https://github.com/aws/s2n-tls/tree/main/docs/usage-guide)」を参照してください。
+ AWS 共通ランタイム HTTP クライアントについては、「*AWS SDK for Java 2.x デベロッパーガイド*」の「[AWS CRT ベースの HTTP クライアントの設定](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/http-configuration-crt.html)」を参照してください。
+ 米国国立標準技術研究所 (NIST) のポスト量子暗号プロジェクトの詳細については、「[Post-Quantum Cryptography](https://csrc.nist.gov/Projects/Post-Quantum-Cryptography)」(ポスト量子暗号化) を参照してください。
+ NIST ポスト量子暗号標準化については、NIST の「[ポスト量子暗号標準化](https://csrc.nist.gov/Projects/post-quantum-cryptography/post-quantum-cryptography-standardization)」を参照してください。

# クライアントのハイブリッドポスト量子 TLS の設定
<a name="pqtls-how-to"></a>

Amazon S3 で PQ-TLS を使用するには、ポスト量子キー交換アルゴリズムをサポートするようにクライアントを設定する必要があります。また、クライアントがハイブリッドアプローチをサポートしていることを確認します。ハイブリッドアプローチは、従来の楕円曲線暗号と ML-KEM (Module-Lattice-Based キーカプセル化メカニズム) などのポスト量子アルゴリズムを組み合わせたものです。

特定の設定は、クライアントライブラリとプログラミング言語によって異なります。詳細については、「[ハイブリッドポスト量子 TLS の有効化](https://docs.aws.amazon.com/payment-cryptography/latest/userguide/pqtls-details.html)」を参照してください。

## クライアント設定の例: AWS SDK for Java 2
<a name="UsingEncryptionInTransit.PQ-TLS.configuration.java2-sdk"></a>

この手順では、AWS 共通ランタイム HTTP クライアントの Maven 依存関係を追加します。次に、ポスト量子 TLS を優先する HTTP クライアントを設定します。次に、HTTP クライアントを使用する Amazon S3 クライアントを作成します。

**注記**  
プレビューとして公開された AWS 共通ランタイム HTTP クライアントは、2023 年 2 月に一般公開されました。このリリースでは、`tlsCipherPreference` クラスと `tlsCipherPreference()` メソッドパラメータが、`postQuantumTlsEnabled()` メソッドパラメータに置き換えられました。プレビュー中にこの例を使用していた場合は、コードを更新する必要があります。

1. Maven 依存関係に AWS 共通ランタイムクライアントを追加します。利用可能な最新バージョンを使用することをお勧めします。

   例えば、このステートメントは Maven の依存関係に、AWS 共通ランタイムクライアントのバージョン `2.30.22` を追加します。

   ```
   <dependency>
       <groupId>software.amazon.awssdk</groupId>
       <artifactId>aws-crt-client</artifactId>
       <version>2.30.22</version>
   </dependency>
   ```

1. ハイブリッドポスト量子暗号スイートを有効にするには、AWS SDK for Java 2.x をプロジェクトに追加して初期化します。続いて、次の例に示すように、HTTP クライアントでハイブリッドポスト量子暗号スイートを有効にします。

   このコードでは、`postQuantumTlsEnabled()` メソッドパラメータを使用して、推奨されるハイブリッドポスト量子暗号スイートである ECDH with ML-KEM を優先する [AWS 共通ランタイム HTTP クライアント](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/http-configuration-crt.html)を設定します。次に、設定済み HTTP クライアントを使用して、Amazon S3 非同期クライアントのインスタンスである [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3AsyncClient.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3AsyncClient.html) を構築します。このコードが完了すると、`S3AsyncClient` インスタンス上のすべての [Amazon S3 API](https://docs.aws.amazon.com/AmazonS3/latest/API/) リクエストは、ハイブリッドポスト量子 TLS を使用します。
**重要**  
v2.35.11 以降、クライアントでハイブリッドポスト量子 TLS を有効にするように `.postQuantumTlsEnabled(true)` を設定する必要がなくなりました。v2.35.11 より新しいすべてのバージョンは、デフォルトでポスト量子 TLS を有効にします。

   ```
   // Configure HTTP client
   SdkAsyncHttpClient awsCrtHttpClient = AwsCrtAsyncHttpClient.builder()
             .postQuantumTlsEnabled(true)
             .build();
   
   // Create the Amazon S3 async client
   S3AsyncClient s3Async = S3AsyncClient.builder()
            .httpClient(awsCrtHttpClient)
            .build();
   ```

1. ハイブリッドポスト量子 TLS を使用して Amazon S3 の呼び出しをテストします。

   構成された Amazon S3 クライアントで Amazon S3 API オペレーションを呼び出すと、コールはハイブリッドポスト量子 TLS を使用して Amazon S3 エンドポイントに送信されます。設定をテストするには、`[ListBuckets](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html)` などの Amazon S3 API を呼び出します。

   ```
   ListBucketsResponse reponse = s3Async.listBuckets();
   ```

### ハイブリッドポスト量子 TLS 設定をテストする
<a name="pqtls-testing"></a>

Amazon S3 を呼び出すアプリケーションで、ハイブリッド暗号スイートを使用して次のテストを実行することを検討してください。
+ 負荷テストとベンチマークを実行します。ハイブリッド暗号スイートの動作は、従来のキー交換アルゴリズムとは異なります。ハンドシェイク時間が長くなるように、接続のタイムアウトを調整する必要がある場合があります。AWS Lambda 関数内で実行している場合は、実行タイムアウト設定を拡張します。
+ 別の場所からの接続を試します。要求が通過するネットワークパスによっては、ディープパケットインスペクション (DPI) を持つ中間ホスト、プロキシ、またはファイアウォールが要求をブロックしていることが検出されることがあります。これは、TLS ハンドシェイクの [ClientHello](https://tools.ietf.org/html/rfc5246#section-7.4.1.2) 部分で新しい暗号スイートを使用した場合や、大きなキー交換メッセージから発生することがあります。これらの問題を解決できない場合は、セキュリティチームまたは IT 管理者と協力して、関連する構成を更新し、新しい TLS 暗号スイートのブロックを解除してください。