Code the Clouds Mix-up Vol.1 
S3 Client-Side Encryption for Big Data 
〜コンテンツグラビティの実践〜 
2014.10.3 
吉田真吾 @yoshidashingo
自己紹介 
☁ cloudpack エバンジェリスト 
ソリューションアーキテクト 
– コンサルティング 
– AWS設計・移行支援 
– テクニカルマーケティング 
☁ バックグラウンド 
– GISシステム,証券システム基盤 
の開発を経て 
2013.1より現職
40サービス 
EC2 
EMR Kinesis WorkSpaces 
CloudWatch 
Direct 
Connect 
IAM 
Route 53 
SNS 
SES 
SimpleDB 
CloudFront 
VPC 
Redshift 
ElastiCache 
Elastic SWF 
CloudFormation 
Transcoder 
CloudTrail 
SQS 
Storage 
Data Gateway 
Pipeline 
DynamoDB 
Elastic 
Beanstalk 
Glacier 
OpsWorks 
S3 Import/ 
Export RDS 
CloudSearch 
Mechanical 
Turk 
Management 
Console 
Amazon Web Services
SDK  Toolkit 
Java 
Ruby 
.NET 
PHP 
Python (boto) 
JavaScript 
Amazon Web Services 
Node.js 
iOS 
Android 
AWS Toolkit for 
Visual Studio 
AWS Toolkit for 
Eclipse 
AWS Toolkit for 
Windows 
PowerShell 
AWS CLI
Amazon S3 
1B〜5TB 
Unlimited 
Fault Torelance 99.999999999 % 
High Availability 99.99 %
コンテンツグラビティ 
Content Gravity 
☁ 「データを処理の近くに置く」 
– あるいは処理をデータの近くに集める 
– リアルタイム(Real Time), 弾力性(Elasticity) 
☁ AWSでは 
– Object Storage  Amazon S3 
– RDBMS     Amazon RDS 
– NoSQL Database Amazon DynamoDB 
– Data Warehouse  Amazon Redshift 
などなどにデータを集約できる
あつめて 
Data Integration 
可視化 
Visualization
Data Integration 
☁ 大量に収集する 
– 1日に数百GB〜数十TBとか現実ある 
☁ リアルタイムに収集する 
– 粒度の小さい処理をたくさん実行する 
☁ セキュアに収集する 
– ノード間のファイアウォール 
– 経路の暗号化 (IPSec) 
– ストレージの暗号化 
– データの暗号化
Use Case: On-premise to Redshift 
NACLs  SG Bucket Policy 
PUT 
Server Replicator S3 
(EC2) 
GET 
COPY 
Redshift 
BI Tools 
☁ ノード間のファイアウォール 
☁ 経路の暗号化 (IPSec) 
☁ ストレージの暗号化 
NACLs  SG 
IPsec VPN 
IPsec VPN
S3のデータを暗号化する方式 
☁ Client-Side Encryption 
– 独自の鍵を利用できる 
☁ Server-Side Encryption 
– 鍵管理をAWSにまかせられる 
☁ Server-Side Encryption with 
Customer-Provided Encryption Keys 
– 独自の鍵を渡して暗号化する 
☁ 独自に暗号化して格納 
– 暗号化制御をすべて掌握できる
Client-Side Encryption (CSE) 
☁ AWS SDK for Java  Ruby でサポート 
– プライベート暗号キーを作成する(手元で管理) 
– エンベロープ暗号キーでファイルを暗号化 
– エンベロープ暗号キーをプライベート暗号キーで暗号化 
– 暗号化したファイルのメタデータに暗号化済みエンベロープキーを付 
与してアップロードする 
– psqlでRedshiftに接続する 
– ファイルとプライベート暗号キーをパラメータに渡してCOPY文を発行 
する
Java (暗号キーの生成) 
Create256BitAESsecret.java 
 
ここ見てね 
↓ 
http://yoshidashingo.hatenablog.com/entry/2014/08/10/193631
Java (アップロードプロセス) 
UploadDirectoryUsingSymmetricKeyClientSideEncryption.java 
 
ここ見てね 
↓ 
http://yoshidashingo.hatenablog.com/entry/2014/08/10/193631
RedshiftにCOPY 
mydb=# COPY test FROM 's3://bucketname//test.csv' CSV 
credentials 
'aws_access_key_id=xxxxxxxxxx;aws_secret_access_key=xxxxxxxx 
xx;master_symmetric_key=private_key' delimiter ',' encrypted;
AWS SDK for Ruby でも
Ruby (暗号キー生成アップロード) 
# 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)
Ruby (ダウンロード) 
# 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
AWS SDK for Ruby V2(core)の対応 
☁ 今のところ、Server-Side Encryption 
with Customer-Provided Encryption 
Keys (SSE-C)しかない 
– 経路上での「データの暗号化」がされない 
– 経路の暗号化で担保するか、納得いかなけれ 
ばJavaで 
☁ 参考 
– http://docs.aws.amazon.com/sdkforruby/ 
api/frames.html
Read Later 
☁ AWS SDK for JavaでS3クライアント暗号化 
をしたCSVをAmazon RedshiftにCOPY(イン 
ポート)する 
http://yoshidashingo.hatenablog.com/entry/ 
2014/08/10/193631 
 
☁ AWS SDK for RubyでS3クライアント暗号化 
を試す 
http://yoshidashingo.hatenablog.com/entry/ 
2014/08/08/212646
最上位パートナー
人材募集中 ^^v

S3 Client-Side Encryption by AWS SDK for Java/Ruby

  • 1.
    Code the CloudsMix-up Vol.1 S3 Client-Side Encryption for Big Data 〜コンテンツグラビティの実践〜 2014.10.3 吉田真吾 @yoshidashingo
  • 2.
    自己紹介 ☁ cloudpackエバンジェリスト ソリューションアーキテクト – コンサルティング – AWS設計・移行支援 – テクニカルマーケティング ☁ バックグラウンド – GISシステム,証券システム基盤 の開発を経て 2013.1より現職
  • 3.
    40サービス EC2 EMRKinesis WorkSpaces CloudWatch Direct Connect IAM Route 53 SNS SES SimpleDB CloudFront VPC Redshift ElastiCache Elastic SWF CloudFormation Transcoder CloudTrail SQS Storage Data Gateway Pipeline DynamoDB Elastic Beanstalk Glacier OpsWorks S3 Import/ Export RDS CloudSearch Mechanical Turk Management Console Amazon Web Services
  • 4.
    SDK Toolkit Java Ruby .NET PHP Python (boto) JavaScript Amazon Web Services Node.js iOS Android AWS Toolkit for Visual Studio AWS Toolkit for Eclipse AWS Toolkit for Windows PowerShell AWS CLI
  • 5.
    Amazon S3 1B〜5TB Unlimited Fault Torelance 99.999999999 % High Availability 99.99 %
  • 6.
    コンテンツグラビティ Content Gravity ☁ 「データを処理の近くに置く」 – あるいは処理をデータの近くに集める – リアルタイム(Real Time), 弾力性(Elasticity) ☁ AWSでは – Object Storage Amazon S3 – RDBMS Amazon RDS – NoSQL Database Amazon DynamoDB – Data Warehouse Amazon Redshift などなどにデータを集約できる
  • 7.
    あつめて Data Integration 可視化 Visualization
  • 8.
    Data Integration ☁大量に収集する – 1日に数百GB〜数十TBとか現実ある ☁ リアルタイムに収集する – 粒度の小さい処理をたくさん実行する ☁ セキュアに収集する – ノード間のファイアウォール – 経路の暗号化 (IPSec) – ストレージの暗号化 – データの暗号化
  • 9.
    Use Case: On-premiseto Redshift NACLs SG Bucket Policy PUT Server Replicator S3 (EC2) GET COPY Redshift BI Tools ☁ ノード間のファイアウォール ☁ 経路の暗号化 (IPSec) ☁ ストレージの暗号化 NACLs SG IPsec VPN IPsec VPN
  • 10.
    S3のデータを暗号化する方式 ☁ Client-SideEncryption – 独自の鍵を利用できる ☁ Server-Side Encryption – 鍵管理をAWSにまかせられる ☁ Server-Side Encryption with Customer-Provided Encryption Keys – 独自の鍵を渡して暗号化する ☁ 独自に暗号化して格納 – 暗号化制御をすべて掌握できる
  • 11.
    Client-Side Encryption (CSE) ☁ AWS SDK for Java Ruby でサポート – プライベート暗号キーを作成する(手元で管理) – エンベロープ暗号キーでファイルを暗号化 – エンベロープ暗号キーをプライベート暗号キーで暗号化 – 暗号化したファイルのメタデータに暗号化済みエンベロープキーを付 与してアップロードする – psqlでRedshiftに接続する – ファイルとプライベート暗号キーをパラメータに渡してCOPY文を発行 する
  • 12.
    Java (暗号キーの生成) Create256BitAESsecret.java ここ見てね ↓ http://yoshidashingo.hatenablog.com/entry/2014/08/10/193631
  • 13.
    Java (アップロードプロセス) UploadDirectoryUsingSymmetricKeyClientSideEncryption.java ここ見てね ↓ http://yoshidashingo.hatenablog.com/entry/2014/08/10/193631
  • 14.
    RedshiftにCOPY mydb=# COPYtest FROM 's3://bucketname//test.csv' CSV credentials 'aws_access_key_id=xxxxxxxxxx;aws_secret_access_key=xxxxxxxx xx;master_symmetric_key=private_key' delimiter ',' encrypted;
  • 15.
    AWS SDK forRuby でも
  • 16.
    Ruby (暗号キー生成アップロード) #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)
  • 17.
    Ruby (ダウンロード) #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
  • 18.
    AWS SDK forRuby V2(core)の対応 ☁ 今のところ、Server-Side Encryption with Customer-Provided Encryption Keys (SSE-C)しかない – 経路上での「データの暗号化」がされない – 経路の暗号化で担保するか、納得いかなけれ ばJavaで ☁ 参考 – http://docs.aws.amazon.com/sdkforruby/ api/frames.html
  • 19.
    Read Later ☁AWS SDK for JavaでS3クライアント暗号化 をしたCSVをAmazon RedshiftにCOPY(イン ポート)する http://yoshidashingo.hatenablog.com/entry/ 2014/08/10/193631 ☁ AWS SDK for RubyでS3クライアント暗号化 を試す http://yoshidashingo.hatenablog.com/entry/ 2014/08/08/212646
  • 23.
  • 24.