ちょっと話題の記事

Amazon S3暗号化と運用

2014.07.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

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の機能として利用できます。

sse-flow

登録したオブジェクトはプロパティの詳細から確認すると”Server Side Encryption:”が”AES-256”と確認できます。 sse-state

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の機能として利用できます。 sse-c

 

登録したオブジェクトはプロパティの詳細から確認すると”Server Side Encryption:”が”none”と表示され、SSE-Cであることは確認できません。 sse-c-state

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で暗号化を管理・強制する仕組みがありませんので暗号化をアプリケーション作りや運用ルールで強制することが必要になります。