AWS Encryption SDK のベストプラクティス - AWS Encryption SDK

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

AWS Encryption SDK のベストプラクティス

AWS Encryption SDK は、業界標準とベストプラクティスを利用して、データを簡単に保護できるように設計されています。デフォルト値では多くのベストプラクティスが選択されており、一部のプラクティスはオプションですが、実用的であるときは常に推奨されます。

最新バージョンを使用する

AWS Encryption SDK の使用を開始するときは、希望するプログラミング言語で提供されている最新バージョンを使用してください。AWS Encryption SDK を使用している場合は、できるだけ早く最新の各バージョンにアップグレードしてください。そうすると、推奨設定を使用し、新しいセキュリティプロパティを利用してデータを保護できるようになります。移行とデプロイのガイダンスなど、サポート対象バージョンの詳細については、「サポートとメンテナンス」と「AWS Encryption SDK のバージョン」を参照してください。

新しいバージョンでコード内の要素が非推奨になった場合は、できるだけ早く置き換えてください。非推奨の警告とコードコメントにより、通常は適切な代替手段が推奨されます。

大幅なアップグレードを容易にし、エラーの発生を抑えるために、一時的または移行的なリリースが提供されることがあります。これらのリリースとそれに付随するドキュメントを使用すると、本番ワークフローを中断することなくアプリケーションをアップグレードできます。

デフォルト値を使用する

AWS Encryption SDK では、ベストプラクティスがデフォルト値に組み込まれています。可能な限り、デフォルト値を使用してください。デフォルトが実用的でない場合は、署名なしのアルゴリズムスイートなどの代替手段が提供されます。上級ユーザーは、カスタムキーリング、マスターキープロバイダー、暗号化マテリアルマネージャー (CMM) などのカスタマイズも可能です。これらの上級者向けの代替手段は慎重に使用し、可能な限りセキュリティエンジニアがその代替手段を検証してください。

暗号化コンテキストを使用する

暗号化オペレーションのセキュリティを向上させるには、データを暗号化するためのすべてのリクエストに、意味のある値で暗号化コンテキストを含めます。暗号化コンテキストの使用はオプションですが、暗号化のベストプラクティスとして使用することをお勧めします。暗号化コンテキストでは、AWS Encryption SDK で認証された暗号化に追加認証データ (AAD) が提供されます。暗号化コンテキストはシークレットではありませんが、暗号化データの整合性と真正性を保護できます。

AWS Encryption SDK では、暗号化時にのみ暗号化コンテキストを指定します。AWS Encryption SDK では、復号時に、AWS Encryption SDK が返す暗号化されたメッセージのヘッダーに暗号化コンテキストが使用されます。アプリケーションでプレーンテキストのデータを返す前に、メッセージの暗号化に使用した暗号化コンテキストが、メッセージの復号化に使用した暗号化コンテキストに含まれていることを確認します。詳細については、プログラミング言語の例を参照してください。

AWS Encryption SDK では、コマンドラインインターフェイスの使用時に、暗号化コンテキストが確認されます。

ラッピングキーを保護する

AWS Encryption SDK では、プレーンテキストの各メッセージを暗号化するために一意のデータキーが生成されます。次にデータキーは、指定したラッピングキーで暗号化されます。ラッピングキーが失われたり削除されたりすると、暗号化されたデータは回復できません。キーが保護されていない場合、データが脆弱になる可能性があります。

AWS Key Management Service (AWS KMS) など、安全なキーインフラストラクチャで保護されているラッピングキーを使用してください。Raw AES キーまたは Raw RSA キーを使用する場合は、セキュリティ要件を満たすランダム性と耐久性のあるストレージのソースを使用します。ハードウェアセキュリティモジュール (HSM)、または AWS CloudHSM などの HSM を提供するサービスでラッピングキーを生成して保存することがベストプラクティスです。

キーインフラストラクチャの認可メカニズムを使用して、ラッピングキーへのアクセスを、必要とするユーザーのみに制限してください。最小特権などのベストプラクティスの原則を実装します。AWS KMS keys の使用時には、ベストプラクティスの原則を実装するキーポリシーと IAM ポリシーを使用してください。

ラッピングキーを指定する

復号化時にも暗号化時にも、明示的に ラッピングキーを指定する ことが常にベストプラクティスです。このようにすると、AWS Encryption SDK では指定したキーのみが使用されます。この方法では、意図した暗号化キーのみを使用することが保証されます。AWS KMS ラッピングキーでは、別の AWS アカウントまたはリージョンで誤ってキーを使用したり、使用許可のないキーで復号化しようとしたりすることを防いでパフォーマンスを向上させることもできます。

暗号化時には、AWS Encryption SDK によって提供されるキーリングとマスターキーのプロバイダーにより、ラッピングキーを指定することが要求されます。使用されるのは、ユーザーが指定したすべてのラッピングキーであり、またそれらのみです。RAW AES キーリング、Raw RSA キーリング、および JCEMasterKey で暗号化および復号化する場合も、ラッピングキーを指定する必要があります。

ただし、AWS KMS キーリングとマスターキーのプロバイダーで復号化するときには、ラッピングキーを指定する必要はありません。AWS Encryption SDK では、暗号化されたデータキーのメタデータからキー識別子を取得できます。ただし、ベストプラクティスとして、ラッピングキーを指定することをお勧めします。

AWS KMS ラッピングキーでの作業時にこのベストプラクティスをサポートするため、次のことをお勧めします。

  • ラッピングキーを指定する AWS KMS キーリングを使用します。暗号化および復号化を行う場合、これらのキーリングでは、指定したラッピングキーのみが使用されます。

  • AWS KMS マスターキーとマスターキーのプロバイダーを使用する場合は、AWS Encryption SDK のバージョン 1.7.x で導入された Strict モードコンストラクタを使用します。指定したラッピングキーでのみ暗号化および復号化するプロバイダーが作成されます。ラッピングキーで常に復号化するマスターキープロバイダーのコンストラクタは、バージョン 1.7.x で非推奨となり、バージョン 2.0.x で削除されました。

復号化に AWS KMS ラッピングキーを指定することが実用的でないときは、検出プロバイダーを使用できます。C 言語と JavaScript の AWS Encryption SDK では AWS KMS 検出キーリングがサポートされます。検出モードのマスターキープロバイダーは、バージョン 1.7.x 以降の Java および Python で使用できます。これらの検出プロバイダーは、AWS KMS ラッピングキーによる復号化にのみ使用され、データキーを暗号化したラッピングキーを使用するように AWS Encryption SDK に明示的に指示します。

検出プロバイダーを使用する必要がある場合は、検出フィルター機能を使用して、使用するラッピングキーを制限します。例えば、AWS KMS リージョン検出キーリングでは、特定の AWS リージョンのラッピングキーのみを使用します。特定の AWS アカウントでラッピングキーのみを使用するように、AWS KMS キーリングと AWS KMS マスターキープロバイダーを設定することもできます。また、これまでと同様に、キーポリシーと IAM ポリシーを使用して、AWS KMS ラッピングキーへのアクセスを管理してください。

デジタル署名を使用する

アルゴリズムスイートを署名とともに使用することがベストプラクティスです。デジタル署名では、メッセージ送信者がメッセージを送信する権限があることが確認され、メッセージの整合性が保護されます。AWS Encryption SDK のすべてのバージョンでは、デフォルトで署名とともにアルゴリズムスイートが使用されます。

セキュリティ要件にデジタル署名が含まれていない場合は、デジタル署名なしのアルゴリズムスイートを選択できます。ただし、あるユーザーのグループがデータを暗号化し、別のユーザーグループがそのデータを復号化する場合は特に、デジタル署名の使用をお勧めします。

キーコミットメントを使用する

キーコミットメントセキュリティ機能を使用することがベストプラクティスです。キーコミットメント では、データを暗号化した一意の データキー の ID が確認され、暗号文を復号化して複数のプレーンテキストメッセージが生成されることが防止されます。

AWS Encryption SDK では、バージョン 2.0.x 以降、キーコミットメントによる暗号化と復号化が完全にサポートされます。デフォルトでは、すべてのメッセージの暗号化と復号化はキーコミットメントで行われます。AWS Encryption SDK のバージョン 1.7.x では、キーコミットメントで暗号化テキストを復号化できます。前バージョンのユーザーでも、バージョン 2.0.x を正常にデプロイできるように設計されています。

キーコミットメントでは新しいアルゴリズムスイートおよび新しいメッセージ形式がサポートされ、キーコミットメントを使用しない暗号化テキストと比較してわずか 30 バイトだけ大きい暗号化テキストを生成できます。この設計により、パフォーマンスへの影響が最小限に抑えられるため、ほとんどのユーザーはキーコミットメントの利点を享受できます。アプリケーションでサイズとパフォーマンスに細心の注意が必要な場合は、コミットメントポリシー設定を使用してキーコミットメントを無効にするか、AWS Encryption SDK でコミットメントなしでメッセージを復号化しますが、これは必要な場合にのみ実行してください。

暗号化されたデータキーの数を制限する

復号化するメッセージ、特に信頼できないソースからのメッセージでは、暗号化されたデータキーの数を制限する ことがベストプラクティスです。多数の暗号化されたデータキーでメッセージを復号化すると、復号化できない場合に、遅延の延長、コストの拡大、アプリケーションやアカウントを共有する他のユーザーの制限が発生し、キーインフラストラクチャを使い果たす可能性があります。制限がない場合、暗号化されたメッセージには最大 65,535 (2^16 - 1) の暗号化されたデータキーを使用できます。詳細については、「暗号化されたデータキーの制限」を参照してください。

これらのベストプラクティスの基礎となる AWS Encryption SDK セキュリティ機能の詳細については、AWS セキュリティブログの「Improved client-side encryption: Explicit KeyIds and key commitment」を参照してください。