cloudpackエバンジェリストの吉田真吾(@yoshidashingo)です。
前回APIのキー(credential)をOSXに設定したので、今回はそれを利用してRubyのSDKから「S3クライアント暗号化」を試してみます。
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. ホントに暗号化されてる?
元のテキストファイル
S3に入っている暗号化済ファイルをダウンロード
ダウンロードしたファイル
暗号化されているみたいですね。