2017-02-03 3 views
1

Ruby/Ruby on Rails를 사용하여 DynamoDB의 암호화를 설정할 수 있습니까?AWS DynamoDB 암호화 - Ruby

aws-sdk에서 제공하나요?

나 혼자서해야합니까?

아니면 불가능합니까?

참고 : 동일한 Rails 응용 프로그램이 병렬로 실행되며 동일한 DynamoDB에 연결되는 경우는 거의 없습니다.

+0

체크 아웃이 필요 – Tilo

답변

1

DynamoDB는 데이터를 암호화하지 않습니다. DynamoDB 클라이언트 코드에서 암호화 및 암호 해독을 처리해야합니다. 이 문제를 처리하기 위해 Java library이 있지만 Ruby에 대해서는 표시되지 않습니다.

DynamoDB는 암호화 한 필드에 대해 의미있는 쿼리를 수행 할 수 없습니다.

AWS KMS 서비스를 사용하여 응용 프로그램이 DynamoDB에 데이터를 삽입하기 전에 데이터를 암호화하는 데 사용하는 암호화 키를 관리하는 것이 좋습니다.

0

AWS로 중요한 필드 암호화 KMS는 잘 작동합니다 - 편리한 모듈에 포장하는 방법의 예가 여기에 있습니다.

은 보석 'AWS-SDK', 아래의 대답은 '~> 2.0'

설정/초기화/aws_kms.rb

# Helper for AWS KMS encryption/decryption: 
# 
# Example: 
# 
# cipherdata = Aws::KMS.encrypt('boring plain text') 
# 
# => "AQICAkSXnpkzAJrrzNcjlMxRK78jbKHnkPohQdSZ445Xv29z6C2ty433pG2rcs96IujEj4IXAa1rmSzJXfiQqw4LaFcluh3CYsFQOlOfhgh0LhPdiQhnIP7d0BzlIu3uRFzHLrhIpg2JssVsjnCLZstNkzerfiwYtGSNTpltVjaqJblz3kktSFNxnMoVOcJSlvTbuMdiD9yplGMDD3LC0YKjUZtEZIqEjt==" 
# 
# Aws::KMS.decrypt(cipherdata) 
# 
# => "boring plain text" 
# 
# 
# Protects from AWS KMS calls if we are in TEST environment 
# 
module Aws::KMS 

    def self.encrypt(plaintext) 
    if Rails.env.test? || Rails.env.development? 
     ['not_encrypted_in_test', plaintext].join('|') # faking encryption so we can test this without AWS 
    else 
     cipherdata = client.encrypt({ 
     key_id: ENV['KMS_ARN'], 
     plaintext: plaintext, 
     }).ciphertext_blob 
     Base64.strict_encode64(cipherdata) 
    end 
    end 

    def self.decrypt(ciphertext) 
    if Rails.env.test? || Rails.env.development? 
     ciphertext.split('|').second # faking decryption so we can test this without AWS 
    else 
     cipherdata = Base64.strict_decode64(ciphertext) 

     client.decrypt({ 
     ciphertext_blob: cipherdata 
     }).plaintext 
    end 
    end 

    # this helper method can be called to check if the ENV variables are configured correctly: 
    def self.setup_correct? 
    plaintext = 'Hey, it works!' 
    cipherdata = Aws::KMS.encrypt(plaintext) 
    Aws::KMS.decrypt(cipherdata) == plaintext 
    end 

    def self.client 
    Aws::KMS::Client.new 
    end 

end