Amazon Web Services ブログ

Amazon S3 Express One Zone がカスタマーマネージドキーでの AWS KMS のサポートを開始

Amazon S3 Express One Zone は、高性能のシングルアベイラビリティーゾーン (AZ) S3 ストレージクラスで、AWS Key Management Service (KMS) キー (SSE-KMS) によるサーバー側の暗号化をサポートするようになりました。 S3 Express One Zone では、S3 ディレクトリバケットに保存されているすべてのオブジェクトが Amazon S3 マネージドキー (SSE-S3) を使用してデフォルトで既に暗号化されています。9 月 17 日より、AWS KMS のカスタマーマネージドキーを使用して、パフォーマンスに影響を与えずに保管中のデータを暗号化できます。この新しい暗号化機能により、S3 Express One Zone を使用する際に、コンプライアンスおよび規制要件を満たすための追加のオプションがもたらされます。S3 Express One Zone は、最も頻繁にアクセスされるデータやレイテンシーの影響を受けやすいアプリケーションに、1 桁ミリ秒単位のデータアクセスを一貫して提供するように設計されています。

S3 ディレクトリバケットでは、SSE-KMS 暗号化用にバケットごとに 1 つのカスタマーマネージドキーのみを指定できます。カスタマーマネージドキーを追加すると、それを編集して新しいキーを使用することはできません。一方、S3 汎用バケットでは、バケットのデフォルトの暗号化設定を変更することで、または S3 PUT リクエスト中に複数の KMS キーを使用できます。SSE-KMS を S3 Express One Zone で使用する場合、S3 バケットキーは常に有効になっています。S3 バケットキーは無料で、AWS KMS へのリクエスト数を最大 99% 削減し、パフォーマンスとコストの両方を最適化します。

SSE-KMS と Amazon S3 Express One Zone の併用
この新機能の実際の動作を説明するために、最初にその手順に従って Amazon S3 コンソールS3 ディレクトリバケットを作成し、アベイラビリティーゾーンとして apne1-az4 を使用します。ベース名に「s3express-kms」と入力すると、アベイラビリティーゾーン ID を含むサフィックスが自動的に追加され、最終的な名前が作成されます。次に、[Data is stored in a single Availability Zone] (データは単一のアベイラビリティーゾーンに保存されます) のチェックボックスをオンにして同意してから、[Create bucket] (バケットを作成) をクリックします。

次に、AWS コマンドラインインターフェイス (AWS CLI) を使用して、作成したバケットに暗号化を設定する手順を説明します。

SSE-KMS を AWS CLI 経由で S3 Express One Zone で使用するには、以下のポリシーに基づく AWS Identity and Access Management (IAM) ユーザーまたはロールが必要です。このポリシーでは、暗号化されたファイルを S3 ディレクトリバケットに正常にアップロードおよびダウンロードするために必要な CreateSession API 操作を行えます。

{
   "Version": "2012-10-17",
   "Statement": [
	{
	   "Effect": "Allow",
	   "Action": [
		"s3express:CreateSession"
		 ],
	   "Resource": [
		"arn:aws:s3express:*:<account>:bucket/s3express-kms--apne1-az4--x-s3"
		]
		},
	    {
		"Effect": "Allow",
		"Action": [
			"kms:Decrypt",
			"kms:GenerateDataKey"
			],
		"Resource": [
			"arn:aws:kms:*:<account>:key/<keyId>"
			]
	    }
   ]
}

PutBucketEncryption API を使用して、デフォルトのバケット暗号化を SSE-KMS に設定します。 以下は AWS CLI の例です。

aws s3api put-bucket-encryption \
--bucket s3express-kms--apne1-az4--x-s3 \
--server-side-encryption-configuration \
  '{"Rules": [{"ApplyServerSideEncryptionByDefault":\
   {"SSEAlgorithm": "aws:kms", \
    "KMSMasterKeyID": "1234abcd-12ab-34cd-56ef-1234567890ab"\
   },\
  "BucketKeyEnabled":true}]}'

この S3 ディレクトリバケットにアップロードした新しいオブジェクトは、AWS KMS キーを使用して自動的に暗号化されます。PutObject コマンドを使用して、confidential-doc.txt という名前の新しいファイルを S3 ディレクトリバケットにアップロードします。

aws s3api put-object --bucket s3express-kms--apne1-az4--x-s3 \
--key confidential-doc.txt \
--body confidential-doc.txt

前のコマンドが成功すると、次の出力が表示されます。

{
    "ETag": "\"664469eeb92c4218bbdcf92ca559d03b\"",
    "ChecksumCRC32": "0duteA==",
    "ServerSideEncryption": "aws:kms",
    "SSEKMSKeyId": "arn:aws:kms:ap-northeast-1:<accountId>:key/<keyId>",
    "BucketKeyEnabled": true
}

HeadObject コマンドでオブジェクトのプロパティを確認すると、以前に作成したキーで SSE-KMS を使用して暗号化されていることがわかります。

aws s3api head-object --bucket s3express-kms--apne1-az4--x-s3 \
--key confidential-doc.txt

すると、以下の出力が得られます。

 
{
    "AcceptRanges": "bytes",
    "LastModified": "2024-08-21T15:29:22+00:00",
    "ContentLength": 5,
    "ETag": "\"664469eeb92c4218bbdcf92ca559d03b\"",
    "ContentType": "binary/octet-stream",
    "ServerSideEncryption": "aws:kms",
    "Metadata": {},
    "SSEKMSKeyId": "arn:aws:kms:ap-northeast-1:<accountId>:key/<keyId>",
    "BucketKeyEnabled": true,
    "StorageClass": "EXPRESS_ONEZONE"
}

I download the encrypted object with GetObject:

aws s3api get-object --bucket s3express-kms--apne1-az4--x-s3 \
--key confidential-doc.txt output-confidential-doc.txt

私のセッションには必要なアクセス許可があるため、オブジェクトは自動的にダウンロードされ、復号化されます。

{
    "AcceptRanges": "bytes",
    "LastModified": "2024-08-21T15:29:22+00:00",
    "ContentLength": 5,
    "ETag": "\"664469eeb92c4218bbdcf92ca559d03b\"",
    "ContentType": "binary/octet-stream",
    "ServerSideEncryption": "aws:kms",
    "Metadata": {},
    "SSEKMSKeyId": "arn:aws:kms:ap-northeast-1:<accountId>:key/<keyId>",
    "BucketKeyEnabled": true,
    "StorageClass": "EXPRESS_ONEZONE"
}

この 2 番目のテストでは、オブジェクトをダウンロードするために必要な KMS キーアクセス許可が付与されていないポリシーを持つ別の IAM ユーザーを使用します。この試みは AccessDenied エラーが発生して失敗します。これは、SSE-KMS 暗号化が意図したとおりに機能していることを示します。

CreateSession オペレーションの呼び出し中にエラーが発生しました (AccessDenied): アクセスが拒否されました

このデモンストレーションでは、SSE-KMS がどのように S3 Express One Zone とシームレスに連携し、権限のあるユーザーの使いやすさを維持しながらセキュリティをさらに強化するかを示します。

知っておくべきこと
はじめに – AWS CLI または AWS SDK を使用して S3 Express One Zone の SSE-KMS を有効にできます。S3 ディレクトリバケットのデフォルトの暗号化設定を SSE-KMS に設定し、AWS KMS キーを指定します。存続期間中、S3 ディレクトリバケットごとに 1 つのカスタマーマネージドキーしか使用できないことに注意してください。

リージョン – カスタマーマネージドキーを使用した SSE-KMS の S3 Express One Zone サポートは、S3 Express One Zone が現在利用可能なすべての AWS リージョンで利用できます。

パフォーマンス – S3 Express One Zone で SSE-KMS を使用しても、リクエストのレイテンシーには影響しません。これまでと同じ 1 桁のミリ秒単位のデータアクセスが引き続き行えます。

料金 – 暗号化と復号化に使用されるデータキーを生成および取得するには、AWS KMS の料金をお支払いいただきます。詳細については、AWS KMS の料金ページをご覧ください。さらに、SSE-KMS と S3 Express One Zone を併用する場合、CopyObjectUploadPartCopy を除くすべてのデータプレーンオペレーションで S3 バケットキーがデフォルトで有効になり、無効にすることはできません。これにより、AWS KMS へのリクエスト数が最大 99% 削減され、パフォーマンスとコストの両方が最適化されます。

AWS CloudTrail 統合AWS CloudTrail を使用して S3 Express One Zone オブジェクトの SSE-KMS アクションを監査できます。これについては、以前のブログ投稿で詳しく説明しています。

Eli.

2024 年 9 月 19 日に更新 – CLI の例を更新して、コンソールではなく既存のバケットのデフォルト暗号化を設定しました。

原文はこちらです。