翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Amazon S3 暗号化クライアントの移行 (V2 から V3)
注記
S3 暗号化クライアントの V1 を使用している場合は、まず V2 に移行してから V3 に移行する必要があります。V1 から V2 への移行手順Amazon S3 暗号化クライアントの移行 (V1 から V2)については、「」を参照してください。
このトピックでは、Amazon Simple Storage Service (Amazon S3) 暗号化クライアントのバージョン 2 (V2) からバージョン 3 (V3) にアプリケーションを移行し、移行プロセス全体でアプリケーションの可用性を確保する方法について説明します。V3 では、セキュリティを強化し、データキーの改ざんから保護するために、キーコミットメントとコミットメントポリシーを含む AES GCM が導入されています。
移行の概要
Amazon S3 暗号化クライアントのバージョン 3 では、セキュリティを強化するためのキーコミットメントを備えた AES GCM が導入されています。この新しい暗号化アルゴリズムは、データキーの改ざんから保護し、暗号化されたデータの整合性を確保します。V3 への移行には、プロセス全体でアプリケーションの可用性とデータアクセシビリティを維持するための慎重な計画が必要です。
この移行は 2 つのフェーズから構成されます。
1. 新しいフォーマットを読み取るために既存のクライアントを更新します。まず、更新されたバージョンの AWS SDK for Ruby をアプリケーションにデプロイします。これにより、既存の V2 暗号化クライアントは、新しい V3 クライアントによって書き込まれたオブジェクトを復号できます。アプリケーションで AWS SDKs、各 SDK を個別にアップグレードする必要があります。
2. 暗号化クライアントと復号クライアントを V3 に移行します。すべての V2 暗号化クライアントが新しい形式を読み取れるようになったら、既存の暗号化クライアントと復号クライアントをそれぞれの V3 バージョンに移行できます。これには、コミットメントポリシーの設定や、新しいクライアント設定オプションを使用するためのコードの更新が含まれます。
V1 から V2 にまだ移行していない場合は、まずその移行を完了する必要があります。V1 から V2 への移行の詳細については、Amazon S3 暗号化クライアントの移行 (V1 から V2)「」を参照してください。
V3 の機能について
Amazon S3 暗号化クライアントのバージョン 3 では、コミットメントポリシーとキーコミットメント付き AES GCM の 2 つの主要なセキュリティ機能が導入されています。これらの機能を理解することは、移行戦略を計画し、暗号化されたデータのセキュリティを確保するために不可欠です。
コミットメントポリシー
コミットメントポリシーは、暗号化および復号オペレーション中に暗号化クライアントがキーコミットメントを処理する方法を制御します。キーコミットメントにより、暗号化されたデータは暗号化に使用された正確なキーでのみ復号され、特定のタイプの暗号化攻撃から保護されます。
V3 暗号化クライアントは、次の 3 つのコミットメントポリシーオプションをサポートしています。
FORBID_ENCRYPT_ALLOW_DECRYPT
このポリシーは、キーコミットメントなしでオブジェクトを暗号化し、キーコミットメントの有無にかかわらず両方のオブジェクトの復号を許可します。
-
暗号化動作: オブジェクトはV2 と同じアルゴリズムスイートを使用して、キーコミットメントなしで暗号化されます。
-
復号動作: キーコミットメントの有無にかかわらず、暗号化されたオブジェクトを復号できます。
-
セキュリティへの影響: このポリシーはキーコミットメントを強制せず、改ざんを許可する場合があります。このポリシーで暗号化されたオブジェクトは、キーコミットメントのセキュリティ保護の強化の恩恵を受けません。このポリシーは、V2 暗号化動作との互換性を維持する必要がある移行中にのみ使用してください。
-
バージョンの互換性: このポリシーで暗号化されたオブジェクトは、S3 暗号化クライアントのすべての V2 および V3 実装で読み取ることができます。
REQUIRE_ENCRYPT_ALLOW_DECRYPT
このポリシーは、キーコミットメントを使用してオブジェクトを暗号化し、キーコミットメントの有無にかかわらず、両方のオブジェクトの復号を許可します。
-
暗号化動作: オブジェクトは、キーコミットメントで AES GCM を使用してキーコミットメントで暗号化されます。
-
復号動作: キーコミットメントの有無にかかわらず暗号化されたオブジェクトを復号でき、下位互換性を提供します。
-
セキュリティへの影響: 新しいオブジェクトはキーコミットメント保護の恩恵を受けますが、キーコミットメントのない既存のオブジェクトは引き続き読み取ることができます。これにより、移行中のセキュリティと下位互換性のバランスが取れます。
-
バージョンの互換性: このポリシーで暗号化されたオブジェクトは、S3 暗号化クライアントの V3 および最新の V2 実装でのみ読み取ることができます。
REQUIRE_ENCRYPT_REQUIRE_DECRYPT
このポリシーは、キーコミットメントでオブジェクトを暗号化し、キーコミットメントで暗号化されたオブジェクトの復号のみを許可します。
-
暗号化動作: オブジェクトは、キーコミットメントで AES GCM を使用してキーコミットメントで暗号化されます。
-
復号動作: キーコミットメントで暗号化されたオブジェクトのみを復号できます。キーコミットメントなしでオブジェクトを復号しようとすると失敗します。
-
セキュリティへの影響: このポリシーは、すべてのオペレーションに主要なコミットメントを適用することで、最高レベルのセキュリティを提供します。このポリシーは、すべてのオブジェクトがキーコミットメントで再暗号化され、すべてのクライアントが V3 にアップグレードされた後にのみ使用します。
-
バージョンの互換性: このポリシーで暗号化されたオブジェクトは、S3 暗号化クライアントの V3 および最新の V2 実装でのみ読み取ることができます。このポリシーは、V2 または V1 クライアントによって暗号化されたオブジェクトの読み取りも禁止します。
注記
移行を計画するときは、 から始めREQUIRE_ENCRYPT_ALLOW_DECRYPTて下位互換性を維持しながら、新しいオブジェクトに対する主要なコミットメントのセキュリティ上の利点を得ます。すべてのオブジェクトが再暗号化され、すべてのクライアントが V3 にアップグレードされたREQUIRE_ENCRYPT_REQUIRE_DECRYPT後にのみ、 に移動します。
キーコミットメントを持つ AES GCM
AES GCM with Key Commitment (ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY) は、V3 で導入された新しい暗号化アルゴリズムであり、データキーの改ざんから保護することでセキュリティを強化します。このアルゴリズムの仕組みと適用時期を理解することは、移行を計画するために重要です。
以前のアルゴリズムとALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEYの違い
以前のバージョンの S3 暗号化クライアントでは、キーコミットメントなしで AES CBC または AES GCM を使用して、命令ファイルのデータキーを暗号化していました。 は暗号化プロセスに暗号化コミットメントALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEYを追加し、暗号化されたデータを特定のキーにバインドします。これにより、攻撃者が命令ファイル内の暗号化されたデータキーを改ざんし、クライアントが誤ったキーでデータを復号するのを防ぐことができます。
キーコミットメントがないと、攻撃者が命令ファイル内の暗号化されたデータキーを変更して別のキーに復号し、不正アクセスやデータ破損を引き起こす可能性があります。 は、暗号化されたデータキーが暗号化中に使用された元のキーにのみ復号できるようにすることで、この攻撃ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEYを防止します。
バージョンの互換性
で暗号化されたオブジェクトは、S3 暗号化クライアントの V3 実装と、V3 形式の読み取りのサポートを含む V2 の特定の移行バージョンでのみ復号ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEYできます。 V3 この移行サポートがない V2 クライアントは、 で暗号化された命令ファイルを復号できませんALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY。
警告
( REQUIRE_ENCRYPT_ALLOW_DECRYPTまたはREQUIRE_ENCRYPT_REQUIRE_DECRYPTコミットメントポリシーALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEYを使用して) で暗号化を有効にする前に、暗号化されたオブジェクトを読み取る必要があるすべてのクライアントが V3 または V3 形式をサポートする移行バージョンにアップグレードされていることを確認してください。移行サポートのない V2 クライアントが で暗号化されたオブジェクトの読み取りを試みるとALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY、復号は失敗します。
移行中、FORBID_ENCRYPT_ALLOW_DECRYPTコミットメントポリシーを使用して、V3 クライアントがキーコミットメントで暗号化されたオブジェクトを読み取れるALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEYようにしながら、 なしで暗号化を継続できます。これにより、すべてのリーダーを最初にアップグレードし、キーコミットメントによる暗号化に切り替える安全な移行パスが提供されます。
新しいフォーマットを読み取るために既存のクライアントを更新する
V3 暗号化クライアントは、V2 クライアントがデフォルトでサポートしていない暗号化アルゴリズムとキーコミットメント機能を使用します。移行の最初のステップは、V2 復号クライアントを V3 暗号化オブジェクトを読み取ることができる AWS SDK for Ruby のバージョンに更新することです。このステップを完了すると、アプリケーションの V2 クライアントは V3 暗号化クライアントによって暗号化されたオブジェクトを復号できるようになります。
V3 クライアントによって暗号化されたオブジェクト ( REQUIRE_ENCRYPT_ALLOW_DECRYPTまたはREQUIRE_ENCRYPT_REQUIRE_DECRYPTコミットメントポリシーを使用するオブジェクト) を読み取るには、バージョン 1.93.0 以降の gem aws-sdk-s3 を使用する必要があります。このバージョンには、キーコミットメントで AES GCM で暗号化されたオブジェクトの復号化のサポートが含まれています。
コマンドラインからインストールする
コマンドラインから aws-sdk-s3 gem をインストールするプロジェクトの場合は、 バージョンオプションを使用して、1.208.0 の最小バージョンがインストールされていることを確認します。
gem install aws-sdk-s3 -v '>= 1.208.0'
Gemfile の使用
Gemfile を使用して依存関係を管理するプロジェクトの場合、gem aws-sdk-s3 の最小バージョンを 1.208.0 に設定します。例えば、次のようになります。
gem 'aws-sdk-s3', '>= 1.208.0'
-
Gemfile を変更して、最小バージョンを指定します。
-
bundle update aws-sdk-s3を実行して gem を更新します。 -
バージョンを確認するには、
bundle info aws-sdk-s3を実行します。
注記
最新バージョンに更新すると、既存の V2 暗号化クライアントは V3 クライアントによって暗号化されたオブジェクトを復号できます。ただし、次のセクションで説明するように、新しいオブジェクトは V2 アルゴリズムを使用して V3 に移行するまで暗号化され続けます。
暗号化クライアントと復号クライアントを V3 に移行する
クライアントを更新して新しい暗号化形式を読み取ると、アプリケーションを V3 暗号化および復号クライアントに更新できます。次の手順では、コードを V2 から V3 に正常に移行する方法を示します。
V3 暗号化クライアントを使用するようにコードを更新する前に、前のステップに従い、gem aws-sdk-s3 バージョン 1.93.0 以降を使用していることを確認してください。
注記
AES-GCM で復号する場合は、復号されたデータの使用を開始する前に、オブジェクト全体を最後まで読み取ります。これは、オブジェクトが暗号化されてから変更されていないことを確認するためものステップです。
V3 クライアントの設定
V3 暗号化クライアントでは、キーコミットメントの動作と下位互換性を制御する新しい設定オプションが導入されています。これらのオプションを理解することは、移行を成功させるために不可欠です。
commitment_policy
commitment_policy パラメータは、暗号化および復号オペレーション中に暗号化クライアントがキーコミットメントを処理する方法を制御します。これは V3 クライアントにとって最も重要な設定オプションです。
-
:require_encrypt_allow_decrypt- キーコミットメントを使用して新しいオブジェクトを暗号化し、キーコミットメントの有無にかかわらずオブジェクトの復号を許可します。これは、既存の V2 オブジェクトとの下位互換性を維持しながら、新しいオブジェクトのセキュリティを強化するため、移行に推奨される設定です。 -
:forbid_encrypt_allow_decrypt- キーコミットメントなしで新しいオブジェクトを暗号化し (V2 アルゴリズムを使用)、キーコミットメントの有無にかかわらずオブジェクトを復号化できます。この設定は、一部のクライアントがまだ V3 暗号化オブジェクトを読み取ることができない場合など、移行中に V2 暗号化動作を維持する必要がある場合にのみ使用します。 V3 -
:require_encrypt_require_decrypt- キーコミットメントで新しいオブジェクトを暗号化し、キーコミットメントで暗号化されたオブジェクトの復号のみを許可します。この設定は、すべてのオブジェクトがキーコミットメントで再暗号化され、すべてのクライアントが V3 にアップグレードされた後にのみ使用します。
security_profile
security_profile パラメータは、古い暗号化クライアントバージョンによって書き込まれたオブジェクトの読み取りのサポートを決定します。このパラメータは、移行中に下位互換性を維持するために不可欠です。
-
:v3_and_legacy- V3 クライアントが V1 および V2 暗号化クライアントによって暗号化されたオブジェクトを復号できるようにします。移行中にこの設定を使用して、V3 クライアントが既存の暗号化されたオブジェクトをすべて読み取れるようにします。 -
:v3- V3 クライアントが V2 暗号化クライアントによって暗号化されたオブジェクトのみを復号できるようにします。すべての V1 オブジェクトを V2 形式に既に移行している場合は、この設定を使用します。 -
指定しない場合、クライアントは V3 クライアントによって暗号化されたオブジェクトのみを復号します。これは、レガシーオブジェクトが存在しない新しいアプリケーション開発にのみ使用します。
エンベロープロケーション
envelope_location パラメータは、暗号化メタデータ (暗号化されたデータキーを含む) の保存先を決定します。このパラメータは、キーコミットメントで AES GCM によって保護されるオブジェクトに影響します。
-
:metadata(デフォルト) - 暗号化メタデータを S3 オブジェクトのメタデータヘッダーに保存します。これはデフォルトの動作であり、ほとんどのユースケースに推奨されます。メタデータストレージを使用する場合、キーコミットメントを使用した AES GCM は適用されません。 -
:instruction_file- 設定可能なサフィックスを持つ別の S3 オブジェクト (指示ファイル) に暗号化メタデータを保存します。命令ファイルを使用する場合、キーコミットメントを持つ AES GCM は暗号化されたデータキーを改ざんから保護します。データキー自体のキーコミットメントによって提供される追加のセキュリティが必要な場合は、この設定を使用します。
を使用する場合:instruction_file、オプションで instruction_file_suffixパラメータを指定して、命令ファイルオブジェクトに使用されるサフィックスをカスタマイズできます。デフォルトのサフィックスは です.instruction。
各設定オプションを使用するタイミング
移行中は、次の推奨設定戦略に従います。
-
初期移行:
commitment_policy: :require_encrypt_allow_decryptと を設定しますsecurity_profile: :v3_and_legacy。これにより、V3 クライアントは既存のすべての V1 および V2 オブジェクトを復号しながら、キーコミットメントで新しいオブジェクトを暗号化できます。 -
すべてのクライアントがアップグレードされた後: キーコミットメント保護を必要とするすべてのオブジェクトを再暗号化
security_profile: :v3_and_legacyするまで、commitment_policy: :require_encrypt_allow_decryptと の使用を続けます。 -
完全な V3 適用: すべてのオブジェクトがキーコミットメントで再暗号化され、V1/V2 オブジェクトを読み取る必要がなくなった後にのみ、オプションで に切り替え
commitment_policy: :require_encrypt_require_decryptてsecurity_profileパラメータを削除できます (または、V2 オブジェクトがまだ存在する:v2場合は に設定します)。
にはenvelope_location、変更する理由が特にない限り、既存のストレージメソッド (:metadata または :instruction_file) を引き続き使用します。現在メタデータストレージを使用していて、データキーのキーコミットメントで AES GCM のセキュリティを強化する場合は、 に切り替えることができますが:instruction_file、この場合は、これらのオブジェクトを読み取るすべてのクライアントを更新する必要があることに注意してください。
暗号化クライアントと復号クライアントを V3 に移行する
クライアントを更新して新しい暗号化形式を読み取ると、アプリケーションを V3 暗号化および復号クライアントに更新できます。次の例は、コードを V2 から V3 に正常に移行する方法を示しています。
V3 暗号化クライアントの使用
移行前 (V2)
require 'aws-sdk-s3' # Create V2 encryption client with KMS client = Aws::S3::EncryptionV2::Client.new( kms_key_id: kms_key_id, key_wrap_schema: :kms_context, content_encryption_schema: :aes_gcm_no_padding, security_profile: :v2_and_legacy, commitment_policy: :forbid_encrypt_allow_decrypt ) # Encrypt and upload object client.put_object(bucket: 'my-bucket', key: 'my-object', body: 'secret data') # Download and decrypt object resp = client.get_object(bucket: 'my-bucket', key: 'my-object') decrypted_data = resp.body.read
移行中 (下位互換性がある V3)
require 'aws-sdk-s3' # Create V3 encryption client with KMS client = Aws::S3::EncryptionV3::Client.new( kms_key_id: kms_key_id, key_wrap_schema: :kms_context, content_encryption_schema: :aes_gcm_no_padding, security_profile: :v3_and_legacy, commitment_policy: :require_encrypt_allow_decrypt ) # Encrypt and upload object client.put_object(bucket: 'my-bucket', key: 'my-object', body: 'secret data') # Download and decrypt object resp = client.get_object(bucket: 'my-bucket', key: 'my-object') decrypted_data = resp.body.read
移行後 (V3)
require 'aws-sdk-s3' # Create V3 encryption client with KMS client = Aws::S3::EncryptionV3::Client.new( kms_key_id: kms_key_id, key_wrap_schema: :kms_context, content_encryption_schema: :aes_gcm_no_padding, security_profile: :v3, # Use the commitment policy (REQUIRE_ENCRYPT_REQUIRE_DECRYPT) # This encrypts with key commitment and does not decrypt V2 objects commitment_policy: :require_encrypt_require_decrypt ) # Encrypt and upload object client.put_object(bucket: 'my-bucket', key: 'my-object', body: 'secret data') # Download and decrypt object resp = client.get_object(bucket: 'my-bucket', key: 'my-object') decrypted_data = resp.body.read
V3 の主な違いは、 commitment_policyパラメータの追加です。に設定すると:require_encrypt_require_decrypt、新しいオブジェクトがキーコミットメントで暗号化され、クライアントはキーコミットメントで暗号化されたオブジェクトのみを復号するため、データキーの改ざんに対するセキュリティが強化されます。
put_object 呼び出し自体は変更されません。すべてのセキュリティ強化は、クライアントレベルで設定されます。
その他の例
このセクションでは、V2 から V3 への移行中に役立つ可能性のある特定の移行シナリオと設定オプションの追加の例を示します。
命令ファイルとメタデータストレージ
S3 暗号化クライアントは、暗号化メタデータ (暗号化されたデータキーを含む) を S3 オブジェクトのメタデータヘッダーまたは別の命令ファイルという 2 つの異なる場所に保存できます。ストレージ方法の選択は、キーコミットメント保護を備えた AES GCM のメリットを受けるオブジェクトに影響します。
メタデータストレージ (デフォルト)
デフォルトでは、暗号化クライアントは暗号化メタデータを S3 オブジェクトのメタデータヘッダーに保存します。これは、暗号化メタデータを オブジェクトに保持し、個別の命令ファイルオブジェクトを管理する必要がないため、ほとんどのユースケースで推奨されるアプローチです。
require 'aws-sdk-s3' # Create V3 encryption client with metadata storage (default) client = Aws::S3::EncryptionV3::Client.new( kms_key_id: kms_key_id, key_wrap_schema: :kms_context, content_encryption_schema: :aes_gcm_no_padding, security_profile: :v3_and_legacy, commitment_policy: :require_encrypt_allow_decrypt, envelope_location: :metadata # Explicitly set to metadata (this is the default) ) # Encrypt and upload object # Encryption metadata is stored in the object's metadata headers client.put_object(bucket: 'my-bucket', key: 'my-object',body: 'secret data')
メタデータストレージを使用する場合、キーコミットメントを持つ AES GCM は暗号化されたデータキーには適用されません。ただし、 commitment_policy: :require_encrypt_allow_decryptまたは を使用する場合でも、コンテンツの暗号化はキーコミットメントの恩恵を受けます:require_encrypt_require_decrypt。
命令ファイルストレージ
または、暗号化メタデータを命令ファイルと呼ばれる別の S3 オブジェクトに保存するように暗号化クライアントを設定することもできます。V3 で命令ファイルを使用する場合、暗号化されたデータキーはキーコミットメントで AES GCM によって保護されるため、データキーの改ざんに対するセキュリティが向上します。
require 'aws-sdk-s3' # Create V3 encryption client with instruction file storage client = Aws::S3::EncryptionV3::Client.new( kms_key_id: kms_key_id, key_wrap_schema: :kms_context, content_encryption_schema: :aes_gcm_no_padding, security_profile: :v3_and_legacy, commitment_policy: :require_encrypt_allow_decrypt, envelope_location: :instruction_file, # Store metadata in separate instruction file instruction_file_suffix: '.instruction' # Optional: customize the suffix (default is '.instruction') ) # Encrypt and upload object # Encryption metadata is stored in a separate object: 'my-object.instruction' client.put_object(bucket: 'my-bucket', key: 'my-object', body: 'secret data') # When retrieving the object, the client automatically reads the instruction file resp = client.get_object(bucket: 'my-bucket', key: 'my-object') decrypted_data = resp.body.read
を使用する場合envelope_location: :instruction_file、暗号化クライアントは 2 つの S3 オブジェクトを作成します。
-
暗号化されたデータオブジェクト (例:
my-object) -
暗号化メタデータを含む命令ファイル (例:
my-object.instruction)
instruction_file_suffix パラメータを使用すると、命令ファイルに使用されるサフィックスをカスタマイズできます。デフォルト値は .instruction です。
各ストレージ方法を使用するタイミング
-
メタデータストレージは、ほとんどのシナリオで使用します。暗号化メタデータはオブジェクトとともに移動するため、オブジェクト管理が簡素化されます。
-
オブジェクトメタデータのサイズが懸念される場合、または暗号化されたオブジェクトから暗号化メタデータを分離する必要がある場合は、命令ファイルストレージを使用します。命令ファイルを使用するには、2 つの S3 オブジェクト (暗号化されたオブジェクトとその命令ファイル) を 1 つではなく管理する必要があることに注意してください。
警告
メタデータストレージから命令ファイルストレージに変更した場合 (またはその逆)、古いストレージメソッドで暗号化された既存のオブジェクトは、新しいストレージメソッドで設定されたクライアントでは読み取れません。ストレージ方法を慎重に計画し、アプリケーション全体の一貫性を維持します。