Amazon S3暗号化と運用
はじめに
S3は、拡張性と信頼性に優れた堅牢なストレージサービスとして、AWSサービス支えるの中心的な存在です。冗長化、ライフサイクル管理、アクセス制御、暗号化等バックアップメディアに期待される機能を標準で備えています。 ご紹介するS3暗号化はクライアントサイド暗号化、サーバーサイド暗号化が可能で、さらに暗号化にユーザーが管理する鍵を使用できます。企業の内部情報や個人情報を含むデータでも、手間をかけずに暗号化して保管できます。
S3暗号化の分類
データを暗号化する場所と鍵の管理をどこが担うかによって分類されます。 ・鍵の生成・管理はサーバサイドとクライアントサイドのどちらであるか ・オブジェクトの暗号化はサーバサイドとクライアントサイドのどちらかであるか
AWSが提供するS3暗号化ソリューション
Client Side Encryption
Client Side Encryption(以降、CSEと略す)はクライアント内で暗合したオブジェクトをS3に登録しますので、暗号化されたオブジェクトはユーザー以外に複合化が不可能です。AWS SDK(Java、Ruby、.NET)のクライアントサイドの機能として暗号化機能を提供しています。
Server Side Encryption
Server Side Encryption(以降、SSEと略す)は、クライアントから暗号化オプションを指定して登録するだけで、サーバー内で鍵が自動生成され、暗号化したデータを保存します。鍵はユーザーが管理する必要がなく、AWSで管理されるので手間をかけずに暗号化できます。AWS SDKやAWSCliの機能として利用できます。
登録したオブジェクトはプロパティの詳細から確認すると”Server Side Encryption:”が”AES-256”と確認できます。
AWSCliから利用する例を以下に示します。
ファイルの登録
$ aws s3api put-object --bucket bucket_name --key keyname --body src_path --server-side-encryption AES256
ファイルの取得
$ aws s3api get-object --bucket bucket_name --key keyname dest_path
ファイルの状態
$ aws s3api head-object --bucket bucket_name --key keyname
参考資料
Amazon S3がAES256によるサーバサイド暗号化に対応
Server-Side Encryption with Customer-Provided Encryption Keys (SSE-C)
SSEにおいて、ユーザーが鍵の作成や管理をしたい場合はServer-Side Encryption with Customer-Provided Encryption Keys(以降、SSE-Cと略す)となります。AWS SDKやAWSCliの機能として利用できます。
登録したオブジェクトはプロパティの詳細から確認すると”Server Side Encryption:”が”none”と表示され、SSE-Cであることは確認できません。
AWSCliから利用する例を以下に示します。
事前にAES256 キーの生成
$ pwgen -Bs 31 1 | tee sse-key<br />ifxHAIEaASzbUT1kspCxEMo1N4syAXr
ファイルの登録
$ aws s3api put-object --bucket bucket_name --key keyname --body src_path --sse-customer-algorithm AES256 --sse-customer-key file://sse-c-key
ファイルの取得
$ aws s3api get-object --bucket bucket_name --key keyname --sse-customer-algorithm AES256 --sse-customer-key file://sse-c-key dest_path
ファイルの状態
$ aws s3api head-object --bucket bucket_name --key keyname --sse-customer-algorithm AES256 --sse-customer-key file://sse-c-key
参考資料
S3のユーザ提供キーによるサーバサイド暗号化 (SSE-C) を試してみた
S3暗号化の運用
SSEと比較してセキュアなCSEとSSE-Cですが、運用にあたっては以下の点を考慮してください。
CSEとSSE-Cの鍵の管理
CSEとSSE-Cの鍵はユーザーが管理する必要がありますので、Amazon CloudHSMやHSMs(Hardware security modules)といった鍵の管理を検討する必要があります。
CSEとSSE-Cはオブジェクトが暗号化状態の確認できない
CSEとSSE-Cによって登録したオブジェクトが暗号化されているか否かを確認するためには、暗号化の種別を知っている必要があります。
CSEとSSE-Cは暗号化と種別の強制ができない
同じキーに対して暗号化/非暗号化オブジェクト問わず上書きが可能なので、誰かが異なる暗号化方式や非暗号化オブジェクトを登録した後に、オブジェクトの取得に失敗することがあります。
SSEは以下のようにSSEを強制させるようにBucketポリシーを設定できますので、この問題を回避することが可能です。
{ "Version":"2012-10-17", "Id":"PutObjPolicy", "Statement":[{ "Sid":"DenyUnEncryptedObjectUploads", "Effect":"Deny", "Principal":{ "AWS":"*" }, "Action":"s3:PutObject", "Resource":"arn:aws:s3:::bucket_name/*", "Condition":{ "StringNotEquals":{ "s3:x-amz-server-side-encryption":"AES256" } } }] }
最後に
SSEは鍵がAWSで管理されますので、最も手間をかけずに暗号化できる方式ですが、悪意のある第三者がオブジェクトへのアクセス権を得ると、暗号化が掛かっていようといまいと関係なく復号化されたファイルをダウンロードできてしまいます。この対策が必要な場合は、鍵の管理が必要となりますが、SSE-CやCSEをご検討ください。但し、SSE-CやCSEは「S3暗号化の運用」で解説したとおり、AWSで暗号化を管理・強制する仕組みがありませんので暗号化をアプリケーション作りや運用ルールで強制することが必要になります。