AWS-CLIからS3の暗号化を使ってみる

aws_logo

S3のデータ保護

S3は以下のような手順で S3 ストレージの機密性を担保している。

1. ssl通信

S3 サービスイン時から

2. client-side encryption

クライアント側で暗号化したデータを S3 に保存する。

aws_java_sdk_encryptionpng

以下の SDK で対応

  • Java
  • .NET
  • Ruby

3.server-side encryption

S3 の出し入れ時に AWS が管理する鍵で暗号・復号する。

s3_sse

4.server-side encryption with customer-provided encryption keys(SSE-C)

S3の出し入れ時にクライアントが指定した鍵で暗号・復号する。

2014-Jun-12 発表

  1. http://aws.amazon.com/blogs/aws/s3-encryption-with-your-keys/
  2. http://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html

s3_sse_customer_key

※画像はすべて aws blog から

#1 はAPIの裏で常に行われるからいいとして、REST API でも利用可能な #3 と #4 をコマンドラインツールの AWS CLI から使ってみる。

#4 は 1.3.17 以上が必要なので、 pip なり yum 経由で最新版にあげておく。

$ sudo pip install awscli --upgrade
$ aws --version
aws-cli/1.3.17 Python/2.7.3 Linux/3.2.0-23-generic

3.server-side encryption を AWS CLI から使う

鍵の管理は AWS、暗号・復号処理も AWS がおこなう

アップロードするデータを作成

$ echo sse test > sse.txt

S3 にデータを PUT する

--server-side-encryptionで暗号方式を指定する。

以下のリクエストヘッダーが関連する

  • x-amz-server-side-encryption: 暗号アルゴリズム
$ aws s3api put-object --bucket xxxxd906 --key sse.txt --body  sse.txt --server-side-encryption AES256 --debug
...
PUT

Sat, 14 Jun 2014 06:16:17 GMT
x-amz-server-side-encryption:AES256
/xxxxd906/sse.txt
...
2014-06-14 15:16:18,013 - MainThread - botocore.response - DEBUG - Response Headers:
content-length: 9
x-amz-id-2: tl1P8RCeItQ4KkYqNQ/eu8ZT1QFkhm9YgclXjJc3fY0ydQrJyL9veMLLQQhqjwY2
server: AmazonS3
x-amz-request-id: EFC8A1DB03B796BE
etag: "d41d8cd98f00b204e9800998ecf8427e"
date: Sat, 14 Jun 2014 06:15:48 GMT
x-amz-server-side-encryption: AES256
2014-06-14 15:16:18,014 - MainThread - botocore.response - DEBUG - Response Body:

...
2014-06-14 15:16:18,015 - MainThread - awscli.errorhandler - DEBUG - HTTP Response Code: 200
{
    "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
    "ServerSideEncryption": "AES256"
}

保存されたデータを HEAD で確認

$ aws s3api head-object --bucket xxxxd906 --key sse.txt
{
    "AcceptRanges": "bytes",
    "ContentType": "binary/octet-stream",
    "LastModified": "Sat, 14 Jun 2014 06:19:20 GMT",
    "ContentLength": "9",
    "ETag": "\"0be2e4e600d851930832691240b127d0\"",
    "ServerSideEncryption": "AES256"
}

保存したデータを GET する。

$ aws s3 cp s3://xxxxd906/sse.txt  /tmp/hoge
download: s3://xxxxd906/sse.txt to ../../../tmp/hoge
$ cat /tmp/hoge
sse test

これはアップロードしたものと同じ

鍵はすべて AWS が面倒を見てくれるので、PUT/HEAD/GET 全てにおいて、クライアントサイトは鍵を意識しなくて良い。

4.server-side encryption with customer-provided encryption keys(SSE-C)をAWS CLI から使う

鍵の管理は クライアント、暗号・復号処理は AWS がおこなう

アップロードするデータを作成

$ echo sse-c test > sse-c.txt

キーを生成

SHA-256 に対応した 256 ビットの暗号鍵を作成する。

$ pwgen -Bs 32 1 | tee sse-key
ERiy7sJ9njctxAHeb7Cru9pwsXfaUqAd

SSE-C では各 API において--sse-customer-key で鍵ファイルまたは鍵の文字列を指定する

以下のリクエストヘッダーが関連する

  • x-amz-server-side-encryption-customer-algorithm:暗号アルゴリズム
  • x-amz-server-side-encryption-customer-key:暗号鍵のBASE64
  • x-amz-server-side-encryption-customer-key-md5:暗号鍵のMD5

S3 にデータを PUT する

$ aws s3api put-object --bucket xxxxd906 --key sse-c.txt --body sse-c.txt --sse-customer-algorithm AES256 --sse-customer-key file://sse-key --debug
...
2014-06-14 15:27:00,623 - MainThread - botocore.auth - DEBUG - StringToSign:
PUT

Sat, 14 Jun 2014 06:27:00 GMT
x-amz-server-side-encryption-customer-algorithm:AES256
x-amz-server-side-encryption-customer-key:MTIzNDU2Nzg5MTIzNDU2Nzg5MDAxMjM0NTY3ODkwMTI=
x-amz-server-side-encryption-customer-key-md5:gBvGugvRTwtunlWPlCps7g==
/xxxxd906/sse-c.txt
...
2014-06-14 15:27:00,913 - MainThread - botocore.vendored.requests.packages.urllib3.connectionpool - DEBUG - "PUT /sse-c.txt HTTP/1.1" 200 0
2014-06-14 15:27:00,914 - MainThread - botocore.response - DEBUG - Response Headers:
x-amz-server-side-encryption-customer-key-md5: gBvGugvRTwtunlWPlCps7g==
content-length: 0
x-amz-server-side-encryption-customer-algorithm: AES256
x-amz-id-2: qUGWtdC+RjZVCv+Q729eF0m88r8+Z1qyGW8B5gIAImQycjk7QtEArOoN2ppu2Yno
server: AmazonS3
x-amz-request-id: 5BE152F769994811
etag: "2fd99df176207a88d7fb56391f5b81c7"
date: Sat, 14 Jun 2014 06:26:31 GMT
2014-06-14 15:27:00,915 - MainThread - botocore.response - DEBUG - Response Body:

...
2014-06-14 15:27:00,916 - MainThread - awscli.errorhandler - DEBUG - HTTP Response Code: 200
{
    "SSECustomerKeyMD5": "gBvGugvRTwtunlWPlCps7g==",
    "SSECustomerAlgorithm": "AES256",
    "ETag": "\"2fd99df176207a88d7fb56391f5b81c7\""
}

保存されたデータを HEAD で確認

$ aws s3api head-object --bucket xxxxd906 --key sse-c.txt --sse-customer-algorithm AES256 --sse-customer-key file://sse-key  --debug
...
2014-06-14 15:38:22,582 - MainThread - botocore.auth - DEBUG - StringToSign:
HEAD

Sat, 14 Jun 2014 06:38:22 GMT
x-amz-server-side-encryption-customer-algorithm:AES256
x-amz-server-side-encryption-customer-key:MTIzNDU2Nzg5MTIzNDU2Nzg5MDAxMjM0NTY3ODkwMTI=
x-amz-server-side-encryption-customer-key-md5:gBvGugvRTwtunlWPlCps7g==
/xxxxd906/sse-c.txt
...
2014-06-14 15:38:22,723 - MainThread - botocore.response - DEBUG - Response Headers:
x-amz-server-side-encryption-customer-key-md5: gBvGugvRTwtunlWPlCps7g==
content-length: 11
x-amz-server-side-encryption-customer-algorithm: AES256
x-amz-id-2: E6gCA5IleRAnp/g2d35+1X+FLO4U30puJ4i9GEuZ7RzZNigoplt9nTWhvMiUYWyG
accept-ranges: bytes
server: AmazonS3
last-modified: Sat, 14 Jun 2014 06:26:31 GMT
x-amz-request-id: D17130B4439FB6F3
etag: "2fd99df176207a88d7fb56391f5b81c7"
date: Sat, 14 Jun 2014 06:37:52 GMT
content-type: binary/octet-stream
2014-06-14 15:38:22,724 - MainThread - botocore.response - DEBUG - Response Body:

...
2014-06-14 15:38:22,725 - MainThread - awscli.errorhandler - DEBUG - HTTP Response Code: 200
{
    "SSECustomerAlgorithm": "AES256",
    "ContentType": "binary/octet-stream",
    "LastModified": "Sat, 14 Jun 2014 06:26:31 GMT",
    "ContentLength": "11",
    "AcceptRanges": "bytes",
    "ETag": "\"2fd99df176207a88d7fb56391f5b81c7\"",
    "SSECustomerKeyMD5": "gBvGugvRTwtunlWPlCps7g=="
}

保存したデータを GET する。

$ aws s3api get-object --bucket xxxxd906 --key sse-c.txt --sse-customer-algorithm AES256 --sse-customer-key file://sse-key  piyo --debug
...
2014-06-14 15:36:46,441 - MainThread - botocore.auth - DEBUG - StringToSign:
GET

Sat, 14 Jun 2014 06:36:46 GMT
x-amz-server-side-encryption-customer-algorithm:AES256
x-amz-server-side-encryption-customer-key:MTIzNDU2Nzg5MTIzNDU2Nzg5MDAxMjM0NTY3ODkwMTI=
x-amz-server-side-encryption-customer-key-md5:gBvGugvRTwtunlWPlCps7g==
/xxxxd906/sse-c.txt
...
2014-06-14 15:36:46,660 - MainThread - botocore.response - DEBUG - Response Headers:
x-amz-server-side-encryption-customer-key-md5: gBvGugvRTwtunlWPlCps7g==
content-length: 11
x-amz-server-side-encryption-customer-algorithm: AES256
x-amz-id-2: DxI4DG4LGEMno2upYJc+WMomFSpHHxcyrkGQiCNwvQb6EWilurvt+B06TL+/d+Qn
accept-ranges: bytes
server: AmazonS3
last-modified: Sat, 14 Jun 2014 06:26:31 GMT
x-amz-request-id: 1F1B7C6CDF3A69FB
etag: "2fd99df176207a88d7fb56391f5b81c7"
date: Sat, 14 Jun 2014 06:36:16 GMT
content-type: binary/octet-stream
...
{
    "AcceptRanges": "bytes",
    "ContentType": "binary/octet-stream",
    "LastModified": "Sat, 14 Jun 2014 06:26:31 GMT",
    "ContentLength": "11",
    "SSECustomerAlgorithm": "AES256",
    "ETag": "\"2fd99df176207a88d7fb56391f5b81c7\"",
    "SSECustomerKeyMD5": "gBvGugvRTwtunlWPlCps7g=="
}
$ cat piyo
sse-c test

これはアップロードしたものと同じ。

鍵の管理をクライアントで制御できるのは要件によっては便利なのだろうけど、鍵データが吹っ飛んだときは非常に残念なことになる。

SSE-C 系のエラーメッセージ

鍵の長さが不正

The secret key was invalid for the specified algorithm. と怒られる。

$ aws s3api put-object --bucket xxxxd906 --key sse-c.txt --body sse-c.txt --sse-customer-algorithm AES256 --sse-customer-key file://INVALID-KEY
A client error (InvalidArgument) occurred when calling the PutObject operation: The secret key was invalid for the specified algorithm.

復号情報を渡さない

SSE-C で暗号化されたオブジェクトに対して、通常のS3オブジェクトの如く復号化情報を渡さずにアクセスするとどうなるか

$ aws s3api get-object --bucket my-bucket --key foo bar

A client error (InvalidRequest) occurred when calling the GetObject operation: The object was stored using a form of Server Side Encryption.  The correct parameters must be provided to retrieve the object.

暗号化されたままのオブジェクトを GET できるわけではない。

Advertisements
Tagged with: , , , ,
Posted in aws

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
  • RT @__apf__: How to write a research paper: a guide for software engineers & practitioners. docs.google.com/presentation/d… /cc @inwyrd 4 months ago
  • RT @HayatoChiba: 昔、自然と対話しながら数学に打ち込んだら何かを悟れるのではと思いたち、専門書1つだけ持ってパワースポットで名高い奈良の山奥に1週間籠ったことがある。しかし泊まった民宿にドカベンが全巻揃っていたため、水島新司と対話しただけで1週間過ぎた。 それ… 4 months ago
  • RT @googlecloud: Ever wonder what underwater fiber optic internet cables look like? Look no further than this deep dive w/ @NatAndLo: https… 4 months ago
  • @ijin UTC+01:00 な時間帯で生活しています、、、 10 months ago
  • RT @mattcutts: Google's world-class Site Reliability Engineering team wrote a new book: amazon.com/Site-Reliabili… It's about managing produc… 1 year ago
%d bloggers like this: