AWS SDK for RubyでS3クライアント暗号化を試す

cloudpackエバンジェリストの吉田真吾@yoshidashingo)です。

前回APIのキー(credential)をOSXに設定したので、今回はそれを利用してRubyのSDKから「S3クライアント暗号化」を試してみます。

f:id:yoshidashingo:20140808210610p:plain

1.AWS SDK for Ruby をインストールする

$ gem install aws-sdk

2.S3にクライアント暗号化してファイルをアップロード

引数にバケット名とファイル名を渡して、バケット名とファイル名でプライベート暗号キーをローカルに出力し、それを使ってファイルを暗号化してアップロードします。

# Usage: ruby s3clienc_write.rb bucketname filename

require 'rubygems'
require 'aws-sdk'
require 'openssl'

bucketname = ARGV[0]
filename = ARGV[1]
keyname = 'key_' + bucketname + '_' + filename
data = File.open(filename)

# Creates and store a string key
symmetric_key = OpenSSL::Cipher::AES256.new(:CBC).random_key

File.open(keyname, 'wb') do |file|
        file.write(symmetric_key)
end

options = { :encryption_key => symmetric_key }
s3_object = AWS.s3.buckets[bucketname].objects[filename]

s3_object.write(data, options)

3.S3から暗号化を解除してダウンロードする

次は逆に、引数にバケット名とファイル名を渡して、バケット名とファイル名で合致するプライベート暗号キーをローカルから読み込み、それを使って暗号化ファイルをダウンロードして展開します。

# Usage: ruby s3clienc_read.rb bucketname filename

require 'rubygems'
require 'aws-sdk'
require 'openssl'

s3=AWS::S3.new
bucketname = ARGV[0]
filename = ARGV[1]
keyname = 'key_' + bucketname + '_' + filename

symmetric_key = File.read(keyname)
options = { :encryption_key => symmetric_key }
s3_object = AWS.s3.buckets[bucketname].objects[filename]

File.open(filename, 'wb') do |file|
  s3_object.read(options) do |chunk|
     file.write(chunk)
  end
end

4. ホントに暗号化されてる?

元のテキストファイル

f:id:yoshidashingo:20140808212039p:plain

S3に入っている暗号化済ファイルをダウンロード

f:id:yoshidashingo:20140808212420p:plain

ダウンロードしたファイル

f:id:yoshidashingo:20140808212132p:plain

暗号化されているみたいですね。