ディレクトリバケットでの AWS KMS キーによるサーバー側の暗号化 (SSE-KMS) の使用
AWS KMS のセキュリティ制御は、暗号化関連のコンプライアンス要件を満たすのに役立ちます。AWS Key Management Service (AWS KMS) キーによるサーバー側の暗号化 (SSE-KMS) を使用するようにディレクトリバケットを設定し、これらの KMS キーを使用して Amazon S3 ディレクトリバケット内のデータを保護することを選択できます。SSE-KMS に関する詳細は、「AWS KMS キーによるサーバー側の暗号化 (SSE-KMS) の使用」を参照してください。
アクセス許可
AWS KMS key を使用して暗号化されたオブジェクトを Amazon S3 にアップロードまたは Amazon S3 からダウンロードするには、キーに対する kms:GenerateDataKey
および kms:Decrypt
の許可が必要です。詳細については、AWS Key Management Service デベロッパーガイドの「キーユーザーが暗号化オペレーションに KMS キーを使用することを許可する」を参照してください。マルチパートアップロードに必要な AWS KMS アクセス許可については、[マルチパートアップロード API とアクセス許可]を参照してください。
SSE-KMS のキーに関する詳細は、「AWS KMS (SSE−KMS) によるサーバー側の暗号化の指定」を参照してください。
トピック
AWS KMS keys
SSE-KMS 設定では、バケットの存続期間中、ディレクトリバケットごとに 1 つのカスタマーマネージドキーしかサポートできません。AWS マネージドキー (aws/s3
) はサポートされていません。また、SSE-KMS のカスタマーマネージドキーを指定した後は、バケットの SSE-KMS 設定のカスタマーマネージドキーを上書きすることはできません。
バケットの SSE-KMS 設定に指定したカスタマーマネージドキーは、次のように識別できます。
HeadObject
API オペレーションリクエストを実行して、レスポンス内のx-amz-server-side-encryption-aws-kms-key-id
の値を検索します。
データに新しいカスタマーマネージドキーを使用するには、新しいカスタマーマネージドキーを使用して既存のオブジェクトを新しいディレクトリバケットにコピーすることをお勧めします。
ディレクトリバケットで暗号化に AWS KMS カスタマーマネージドキーを指定する場合は、キー ID またはキー ARN のみを使用します。KMS キーのキーエイリアス形式はサポートされていません。
SSE-KMS のキーに関する詳細は、「AWS KMS keys」を参照してください。
クロスアカウント操作での SSE-KMS の使用
ディレクトリバケットのクロスアカウント操作で暗号化を使用する場合は、次の点に注意してください。
-
S3 オブジェクトへのクロスアカウントアクセスを許可する場合は、別のアカウントからのアクセスを許可するようにカスタマーマネージドキーのポリシーを設定します。
-
カスタマーマネージドキーを指定するには、完全修飾 KMS キー ARN を使用する必要があります。
Amazon S3 バケットキー
S3 バケットキーは、ディレクトリバケット内の GET
および PUT
オペレーションで常に有効になっており、無効にすることはできません。SSE-KMS で暗号化されたオブジェクトを、CopyObject、UploadPartCopy、バッチオペレーションの Copy オペレーション、または import ジョブを使用して、汎用バケットからディレクトリバケットへ、ディレクトリバケットから汎用バケットへ、またはディレクトリバケット間でコピーする場合、S3 バケットキーはサポートされません。この場合、KMS で暗号化されたオブジェクトのコピーリクエストが実行されるたびに、Amazon S3 は AWS KMS を呼び出します。
CopyObject および UploadPartCopy を除くゾーンエンドポイント (オブジェクトレベル) API オペレーションでは、CreateSession を介してリクエストを認証および承認することで低レイテンシーを実現します。バケットのデフォルトの暗号化では、必要な暗号化設定を使用することをお勧めします。CreateSession
リクエストまたは PUT
オブジェクトリクエストでは、バケットのデフォルトの暗号化を上書きしないことをお勧めします。その後、新しいオブジェクトは必要な暗号化設定で自動的に暗号化されます。SSE-KMS を使用してディレクトリバケット内の新しいオブジェクトを暗号化するには、KMS キー (特にカスタマーマネージドキー) を使用してディレクトリバケットのデフォルトの暗号化設定として SSE-KMS を指定する必要があります。その後、ゾーンエンドポイント API オペレーションのセッションが作成されると、セッション中に新しいオブジェクトが SSE-KMS および S3 バケットキーで自動的に暗号化および復号されます。ディレクトリバケットの暗号化の上書き動作の詳細については、「新しいオブジェクトのアップロードに AWS KMS を使用してサーバー側の暗号化を指定する」を参照してください。
S3 バケットキーは Amazon S3 内で期間限定で使用されるため、Amazon S3 で AWS KMS にリクエストを実行し、暗号化オペレーションを完了する必要性が軽減されます。S3 バケットキーの使用の詳細については、「Amazon S3 バケットキー」および「Amazon S3 バケットキーを使用した SSE−KMS のコストの削減」を参照してください。
SSE-KMS の要求
特定のディレクトリバケット内のすべてのオブジェクトの SSE-KMS を要求するには、バケットポリシーを使用できます。例えば、CreateSession
API オペレーションを使用して新しいオブジェクト (PutObject
、CopyObject
、および CreateMultipartUpload
) をアップロードするアクセス許可を付与する場合、CreateSession
リクエストに SSE-KMS をリクエストする x-amz-server-side-encryption-aws-kms-key-id
ヘッダーが含まれていない場合、次のバケットポリシーはすべてのユーザーに対してオブジェクトのアップロードアクセス許可 (s3express:CreateSession
) を拒否します。
{ "Version":"2012-10-17", "Id":"UploadObjectPolicy", "Statement":[{ "Sid":"DenyObjectsThatAreNotSSEKMS", "Effect":"Deny", "Principal":"*", "Action":"s3express:CreateSession", "Resource":"arn:aws:s3express:
region
:account-id
:bucket/bucket-base-name
--azid
--x-s3/*", "Condition":{ "Null":{ "s3express:x-amz-server-side-encryption-aws-kms-key-id":"true" } } } ] }
特定の AWS KMS key を使用してバケット内のオブジェクトを暗号化することを要求するには、s3express:x-amz-server-side-encryption-aws-kms-key-id
条件キーを使用できます。KMS キーを指定するには、キーの Amazon リソースネーム (ARN) を arn:aws:kms:
形式で使用する必要があります。AWS Identity and Access Management は、region
:acct-id
:key/key-id
s3express:x-amz-server-side-encryption-aws-kms-key-id
の文字列が存在するかどうかを検証しません。Amazon S3 がオブジェクトの暗号化に使用する AWS KMS キー ID とポリシーの AWS KMS キー ID は一致する必要があります。一致しない場合、Amazon S3 はリクエストを拒否します。
新しいオブジェクトのアップロードに SSE-KMS を使用する方法の詳細については、「ディレクトリバケット内の新しいオブジェクトのアップロードに AWS KMS によるサーバー側の暗号化 (SSE-KMS) を指定する」を参照してください。
ディレクトリバケットの固有条件キーの詳細なリストについては、「IAM を使用したリージョンエンドポイント API の承認」を参照してください。
暗号化コンテキスト
ディレクトリバケットの場合、暗号化コンテキストは、データに関する追加のコンテキスト情報が含まれたキーと値のペアのセットです。追加の暗号化コンテキスト値はサポートされていません。暗号化コンテキストの詳細については、「暗号化コンテキスト」を参照してください。
デフォルトでは、ディレクトリバケットで SSE-KMS を使用する場合、Amazon S3 はバケットの Amazon リソースネーム (ARN) を暗号化コンテキストペアとして使用します。
arn:aws:s3express:
region
:account-id
:bucket/bucket-base-name
--azid
--x-s3
IAM ポリシーまたは AWS KMS キーポリシーで、暗号化コンテキストとしてバケット ARN が使用されていることを確認します。
オプションで、CreateSession などのゾーンエンドポイント API リクエストで x-amz-server-side-encryption-context
ヘッダーを使用して、明示的な暗号化コンテキストペアを指定できます。このヘッダーの値は、UTF-8 Base64-encoded でエンコードされた JSON の文字列で、暗号化コンテキストをキーと値のペアとして含めます。ディレクトリバケットの場合、暗号化コンテキストはデフォルトの暗号化コンテキストであるバケット Amazon リソースネーム (ARN) と一致する必要があります。また、暗号化コンテキストは暗号化されないため、機密情報を含めないよう注意してください。
暗号化コンテキストを使用して、暗号化オペレーションを識別および分類できます。デフォルトの暗号化コンテキスト ARN 値を使用して、どのディレクトリバケット ARN がどの暗号化キーで使用されたかを確認することで、AWS CloudTrail の関連するリクエストを追跡することもできます。
CloudTrail ログファイルの requestParameters
フィールドで、ディレクトリバケットで SSE-KMS を使用する場合、暗号化コンテキスト値はバケットの ARN です。
"encryptionContext": { "aws:s3express:arn": "arn:aws:s3:::
arn:aws:s3express:
" }region
:account-id
:bucket/bucket-base-name
--azid
--x-s3
また、ディレクトリバケット内の SSE-KMS によるオブジェクト暗号化の場合、AWS KMS CloudTrail イベントはオブジェクト ARN ではなくバケット ARN をログに記録します。
AWS KMS 暗号化されたオブジェクトへのリクエストの送信
ディレクトリバケットには、HTTPS (TLS) 経由でのみアクセスできます。また、ディレクトリバケットは AWS Signature Version 4 (SigV4) を使用してリクエストに署名します。AWS KMS 暗号化されたオブジェクトのリクエストの送信の詳細については、「AWS KMS 暗号化されたオブジェクトへのリクエストの送信」を参照してください。
オブジェクトで SSE−KMS を使用している場合、GET
リクエストおよび HEAD
リクエストに対して暗号化リクエストヘッダーを送信しないでください。そうしないと、HTTP 400 Bad Request
エラーが表示されます。
ディレクトリバケットでの SSE-KMS 暗号化の監査
SSE-KMS で暗号化されたデータの AWS KMS キーの使用状況を監査するには、AWS CloudTrail ログを使用します。GenerateDataKey や Decrypt などの暗号化オペレーションに関するインサイトを得ることができます。CloudTrail は、イベント名、ユーザー名、イベントソースなど、検索をフィルタリングするための多数の属性値をサポートしています。