Amazon Web Services ブログ

AWS CLI を使用した既存の Amazon S3 オブジェクトの暗号化



業界のプロトコル、政府の規制、組織内部のセキュリティ標準が変化する中、保存データの暗号化がますます必要とされています。暗号化は、不正アクセスやその他のセキュリティリスクから保存データを保護するためのものです。

Amazon S3 のデフォルトの暗号化を使用しても、バケット内の新しいオブジェクトを自動で暗号化できます。しかし、デフォルトの暗号化では、同じバケット内の既存のオブジェクトの暗号は変更されません。暗号化が必要な既存のオブジェクトが Amazon S3 バケットにある場合や、使用しているサーバー側の暗号化 (SSE) 設定を変更したい場合があります。S3 バケット内の既存のオブジェクトを暗号化する最も簡単な方法について、お客様から質問されることがよくあります。

この投稿では、コピーオブジェクト API を使用する際に考慮すべき重要事項について説明します。次に、AWS コマンドラインインターフェイス (AWS CLI) を使用して、データを安全に保つためにバケット内の既存のオブジェクトを暗号化する例をご紹介します。さらに、プレフィックスまたはバケット内のすべての S3 オブジェクトを暗号化する例も示します。最後に、コピーと暗号化に関する一般的な質問について回答します。

前提条件

この投稿で説明しているコマンドを実行するには、次のものが必要です。

  • AWS アカウント
  • 少なくとも 1 つの Amazon S3 バケット
  • AWS CLI

知っておくべきこと

重要なことから先に言っておきます。慎重に作業を進めてください。 SSE を使って既存のオブジェクトを暗号化するため、オブジェクトを置き換えます。既存のオブジェクトを適切に暗号化するには、コピーオブジェクトまたはコピーパート API を使用できます。これで、同じ名前のオブジェクトをコピーし、サーバー側で暗号化することでオブジェクトデータを暗号化します。コピーオブジェクト API を使用する前に、次の点を考慮してください。

  • LastModified タイムスタンプは、コピーのタイムスタンプに変更されます。オブジェクトのタイムスタンプに依存するアプリケーションは、元のアップロードのタイムスタンプではなく、コピーのタイムスタンプを参照するようになりました。たとえば、S3 ライフサイクルは新しいオブジェクトの日付を使用します。
  • S3 イベント通知は PUT または COPY イベントで有効にでき、既存のオブジェクトをコピーして暗号化するとトリガーされます。たとえば、Lambda 関数がもう一度トリガーされることがあります。
  • S3 クロスリージョンレプリケーション (CRR) は、オブジェクトの新しいバージョンをレプリケーションします。
  • 次のいずれかを使用している場合、メタデータのレプリケーションの利用を検討してください。
    • アクセスコントロール (ACL) は S3 バケットのデフォルトにリセットされます。オブジェクト ACL を使用する場合は、それらをコピー操作に追加する必要があります。
    • カスタムメタデータ: メタデータを新しいオブジェクトにコピーしていることを確認します。multipart_threshold 値 (下記では 5 GB) より大きいオブジェクトをコピーする場合、AWS CLI はメタデータをコピーしません。「–metadata」パラメータを持つ新しいオブジェクトのメタデータを明示的に設定します。
    • S3 オブジェクトタグ: AWS CLI の「cp」コマンドは、ソースオブジェクトから宛先オブジェクトにオブジェクトタグをコピーしません。aws s3api put-object-tag コマンドを使用すれば、これらを新しいオブジェクトに追加できます。
  • S3 ETag は変更される可能性があります。
    • アップロードしたマルチパートオブジェクト: 元のマルチパートアップロードとは異なるマルチパートチャンクサイズをコピーに使用すると、ETag が変更されます。
    • SSE-KMS (AWS Key Management Service を使用してデータを暗号化するサーバー側の暗号化)、または SSE-C (顧客が提供する暗号化キーを使用したサーバー側の暗号化) でオブジェクトを暗号化すると、オブジェクトは以前と同じ ETag を持ちません。
  • バケットのバージョニング: バージョニングが有効になっているバケットでは、この手順によって、暗号化されたオブジェクトの新しいバージョンが作成されますが、暗号化されていない既存のオブジェクトバージョンは変更されません。
  • ストレージクラスのデフォルトは STANDARD です。別のストレージクラスが必要な場合は、「–storage-class」で設定できます。 これで、オブジェクトが使用しているストレージクラス を簡単に変更することもできます。
  • オブジェクトロック: オブジェクトロックを使用している場合、保持期間はバケットのデフォルトにリセットされます。

AWS CLI を使用して暗号化を試みる前の推奨事項

上記以外にも、AWS CLI を使用して暗号化を試みる前に考慮すべきいくつかの事項があります。

  • S3 のバージョニング、またはこの変更を元に戻すことができるその他の方法を有効にすることを検討してください。
  • SSE-KMS の使用をお考えの場合は、このデータにアクセスしているユーザーまたはアプリケーションに正しいアクセス許可があることを確認してください。
  • S3 バケット内のすべてのオブジェクトに適用する前に、まずデータのサブセットでこれを実行してください。
  • S3 のインベントリを設定して、暗号化されているものや、検討する必要があるその他の詳細をモニタリングすることを検討してください。

AWS CLI を使用したオブジェクトの暗号化

開始するには、AWS CLI をインストールし、設定する必要があります。以下は、AWS CLI を使ってオブジェクトを暗号化するために使用できるコマンドのコレクションです。

  • 次のコマンドで、単一のオブジェクトを SSE-S3 で暗号化したオブジェクト自体 (Amazon S3 管理キーを使用したサーバー側の暗号化) にコピーして戻すことができます。
aws s3 cp s3://awsexamplebucket/myfile s3://awsexamplebucket/myfile --sse AES256
  • 次のコマンドで、デフォルトの Amazon S3 キーを使って、SSE-KMS で暗号化された単一のオブジェクトをそれ自体にコピーして戻すことができます。
aws s3 cp s3://awsexamplebucket/myfile s3://awsexamplebucket/myfile --sse aws:kms
  • –sse-kms-key-id 引数を追加することにより、カスタマー管理型のキーを使用して、SSE-KMS で暗号化された単一のオブジェクトをそれ自体にコピーして戻すことができます。
aws s3 cp s3://awsexamplebucket/myfile s3://awsexamplebucket/myfile --sse aws:kms –sse-kms-key-id arn:aws:kms:us-west-2:111122223333:key/3aefc301-b7d2-4601-9298-5a854cf9999d
  • 「–dryrun」フラグを使用すると、実行前にコマンドが何を行うかを確認することもできます。
aws s3 cp s3://awsexamplebucket/myfile s3://awsexamplebucket/myfile --sse aws:kms --dryrun  
(dryrun) copy: s3://awsexamplebucket/myfile to s3://awsexamplebucket/myfile
  • S3 バケット内のすべてのオブジェクトを暗号化する必要がある場合は、次のコマンドを実行します。
aws s3 cp s3://awsexamplebucket/ s3://awsexamplebucket/ --sse aws:kms –recursive
  • 次のコマンドで、プレフィックス内のすべてのオブジェクトをコピーします。
aws s3 cp s3://awsexamplebucket/prefix1/ s3://awsexamplebucket/prefix1/ --sse aws:kms –recursive
  • オブジェクトが多数ある場合は、AWS CLI が使用するスレッド数やチャンクサイズを増やすことで、コピー処理を高速化できます。これらの詳細な説明については、設定に関するページをご参照ください。
aws configure set default.s3.max_concurrent_requests 60
aws configure set default.s3.multipart_threshold 5GB
aws configure set default.s3.multipart_chunksize 5GB

コピーと設定に関するその他のオプションと例は、AWS CLI のドキュメントに記載されています。

コピーと暗号化に関する一般的な質問

ここでは、コピーと暗号化に関してよくある質問に回答していきましょう。

コピーにはどのくらい時間がかかりますか?

S3 バケットと同じリージョンの T2.medium EC2 インスタンスでテストしました。1 GB のオブジェクトを合計 10,000 個使用しました。サイズは合計で 10 TB でした。SSE-KMS 暗号化タイプを使用して、テストバケット内のすべてのオブジェクトを数分で完全に暗号化することができました。

コピーにかかる時間は、主にオブジェクトの総数によります。たとえば、小さなオブジェクトでも数が多く合計サイズが大きい場合、数の少ない大きなオブジェクトよりも時間がかかります。

大きバケットの場合はどうなりますか?

オブジェクトが多数ある (数百万または数十億ほど) S3 バケットの場合、Amazon S3 インベントリ、または Amazon S3 バッチオペレーション を使用する方が、この投稿にある AWS CLI での手順を使用するよりもよい場合があります。バッチオペレーションの詳細については、こちらのブログ投稿をご覧ください。

Amazon S3 Glacier または Amazon S3 Glacier Deep Archive に保存しているデータについてはどうですか?

オブジェクトを Amazon S3 Glacier または Amazon S3 Glacier Deep Archiveに移動すると、保存時に自動的に暗号化されます。S3 Glacier または S3 Glacier Deep Archive のオブジェクトは、コピー要求を実行し SSE-S3 で暗号化する前に、まず復元する必要があります。

バージョンのあるオブジェクトの場合はどうですか?

S3 オブジェクトを上書きすると、バケットに新しいオブジェクトバージョンが作成されます。こちらで説明しているコマンドを実行すると、新しい暗号化バージョンが生成されます。ただし、暗号化されていない古いバージョンのオブジェクトは削除されません。これらのバージョンを削除する場合は、このバージョニングに関するドキュメントを参照し、S3 ライフサイクルを使用して以前のバージョンのオブジェクトを期限切れにする方法につい確認してください。

タグ、ACL、カスタムメタデータはどうすればよいですか?

オブジェクトが multipart_threshold (この例では 5 GB) より大きい場合、AWS CLI は既存のタグ、ACL、またはカスタムメタデータをソースオブジェクトからコピーできません。このような場合、最大の 5 GB を使用しますが、オブジェクトがこれより大きい場合は、明示的に追加する必要があります。

  • たとえば、S3 オブジェクトタグの場合、次のようになります。
aws s3 cp s3://awsexamplebucket/myfile s3://awsexamplebucket/myfile --sse aws:kms -–metadata tag1=value1
  • S3 オブジェクト ACL の場合、次のようになります。
aws s3 cp s3://awsexamplebucket/myfile s3://awsexamplebucket/myfile --sse aws:kms --acl bucket-owner-full-control

その他の例と情報は、AWS CLI のドキュメントに記載されています。

CLI を使用して既存のオブジェクトを暗号化するには、どれくらいの費用がかかりますか?

S3 の外部にデータを移動しない場合、この投稿にある CLI の手順を使用して暗号化すると、追加のデータ転送コストは発生しません。LIST および COPY API 呼び出しのコストのみが発生し、SSE-KMS を使用している場合はオブジェクトの暗号化のコストが発生します。現在暗号化されているオブジェクトの以前のバージョンを削除しないと、両方のオブジェクトのバージョンのストレージに対して課金されます。

クリーンアップ

この投稿で説明した暗号化手順を完了した後、AWS CLI 設定をデフォルトまたは皆さんのユースケース用に最適化した値にリセットします。

これらのコマンドは、CLI 設定をデフォルトに戻します。

aws configure set default.s3.max_concurrent_requests 10
aws configure set default.s3.multipart_threshold 8MB
aws configure set default.s3.multipart_chunksize 8MB

CLI の設定情報とオプションの詳細については、こちらをご覧ください。

まとめ

この投稿では、AWS CLI を使用して Amazon S3 バケット内の既存のデータを暗号化し、データを確実に保護する方法をご紹介しました。さらに、オブジェクトを暗号化する際に考慮すべきいくつかの事項と推奨事項についても説明しました。これらのコマンドを実行すれば、S3 バケット内の既存のすべてのオブジェクトを暗号化して、コンプライアンスまたは組織内部のガイドラインを満たすといったオペレーションを迅速かつ簡単に完了することができます。その結果、高度なデータセキュリティを実現しながら、暗号化の設定に費やす時間を節約できます。

AWS CLI を使用した Amazon S3 でのオブジェクトの暗号化に関する、このブログ投稿をお読みいただきありがとうございました。ご意見やご質問があれば、コメント欄よりお送りください。