yaml_vault 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7701aaf47f1f8a9aa15aa5a92cf42ba9faa683b6
4
- data.tar.gz: bdd5eb6f504aadaabf6fb6b1404c6778a5365c7c
3
+ metadata.gz: d513c736945058b14e097674eb7f2a4743718a0b
4
+ data.tar.gz: 417af775003ec2105570ef50ce819303a2561d88
5
5
  SHA512:
6
- metadata.gz: 605babf1e0e0000ea234cbe65a4d43e2176940da312d8df88cff698678590eea5d3b7668d0905ea7c6b13d06ff87791f4dea99adf983d34ab175a4e240d2b604
7
- data.tar.gz: d7f18f1e1d329a939bba142eda79da0fbb4f7e389ddc7f9364799feb7c8ad87b1e07060a4749c8d7da4dea22ada0d23647020d86741675e92b18ff14216a897a
6
+ metadata.gz: fce2b4f85b47332badef4c03882d86fb83cfac33ee9da92b376512de571272b5bf4580dfccee0bcbe42e359c98356a282197c1b0466e9bee1fdb39a358ba2b35
7
+ data.tar.gz: 8e8abd2ec36cb12797f110d95043f5a8947f1ebf74246da0b967779252ccfb781aa80128a9a91716f6455f26fa2debb4acfe176cfe874955c8e5f09942089016
data/README.md CHANGED
@@ -109,7 +109,19 @@ Max encryptable size is 4096 bytes. (value size as encoded by Base64)
109
109
  --aws-secret-access-key=<AWS_SECRET_ACCESS_KEY>
110
110
  ```
111
111
 
112
- If region, access_key_id, secret_access_key is not set, use `ENV["AWS_REGION"]`, `ENV["AWS_ACCESS_KEY_ID"]`, `ENV["AWS_SECRET_ACCESS_KEY"]`.
112
+ If region, access_key_id, secret_access_key is not set, use `ENV["AWS_REGION"]`, `ENV["AWS_ACCESS_KEY_ID"]`, `ENV["AWS_SECRET_ACCESS_KEY"]` or default credentials or Instance Profile.
113
+
114
+ #### GCP KMS Encryption
115
+
116
+ ```
117
+ % yaml_vault encrypt secrets.yml -o encrypted_secrets.yml --cryptor=gcp-kms \
118
+ --gcp-kms-resource-id=<kms-resource-id> \
119
+ --gcp-credential-file=<credential-json-file-path>
120
+ ```
121
+
122
+ ex. `--gcp-kms-resource-id=projects/<PROJECT_ID>/locations/global/keyRings/<KEYRING_ID>/cryptoKeys/<KEY_ID>`
123
+
124
+ If gcp_credential_file is not set, use Google Application Default Credentials flow (https://developers.google.com/identity/protocols/application-default-credentials)
113
125
 
114
126
  ### Decrypt
115
127
 
@@ -129,6 +141,14 @@ If `ENV["YAML_VAULT_PASSPHRASE"]`, use it as passphrase
129
141
  --aws-secret-access-key=<AWS_SECRET_ACCESS_KEY>
130
142
  ```
131
143
 
144
+ #### GCP KMS Decryption
145
+
146
+ ```
147
+ % yaml_vault decrypt encrypted_secrets.yml -o secrets.yml --cryptor=gcp-kms \
148
+ --gcp-kms-resource-id=<kms-resource-id> \
149
+ --gcp-credential-file=<credential-json-file-path>
150
+ ```
151
+
132
152
  ### Direct Assignment
133
153
 
134
154
  ```ruby
@@ -141,7 +161,7 @@ configs = YamlVault::Main.from_file(
141
161
  passphrase: ENV["YAML_VAULT_PASSPHRASE"], sign_passphrase: ENV["YAML_VAULT_SIGN_PASSPHRASE"]
142
162
  ).decrypt
143
163
 
144
- # KMS
164
+ # AWS KMS
145
165
  configs = YamlVault::Main.from_file(
146
166
  File.expand_path("../encrypted_sample.yml", __FILE__),
147
167
  [["vault"], ["production", "password"]],
@@ -151,6 +171,15 @@ configs = YamlVault::Main.from_file(
151
171
  aws_access_key_id: "xxxxxxx", # optional
152
172
  aws_secret_access_key: "xxxxxxx", # optional
153
173
  ).decrypt
174
+
175
+ # GCP KMS
176
+ configs = YamlVault::Main.from_file(
177
+ File.expand_path("../encrypted_sample.yml", __FILE__),
178
+ [["vault"], ["production", "password"]],
179
+ "gcp-kms",
180
+ gcp_kms_resource_id: "xxxxxxx",
181
+ gcp_credential_file: File.expand_path("../credential.json", __FILE__)
182
+ ).decrypt
154
183
  ```
155
184
 
156
185
  ## How to use with docker
data/exe/yaml_vault CHANGED
@@ -8,7 +8,7 @@ class YamlVault::Cli < Thor
8
8
  include Thor::Actions
9
9
 
10
10
  class_option :key, aliases: "-k", type: :string, banner: "KEYNAME (format: \"KEY1.INNER_KEY,KEY2\")", desc: "target key", default: "vault"
11
- class_option :cryptor, type: :string, enum: %w(simple aws-kms), default: "simple"
11
+ class_option :cryptor, type: :string, enum: %w(simple aws-kms gcp-kms), default: "simple"
12
12
 
13
13
  class_option :salt, aliases: "-s", type: :string
14
14
  class_option :cipher, type: :string, desc: "Encrypt cipher (see. OpenSSL::Cipher.ciphers)", default: "aes-256-cbc"
@@ -22,6 +22,9 @@ class YamlVault::Cli < Thor
22
22
  class_option :aws_access_key_id, type: :string
23
23
  class_option :aws_secret_access_key, type: :string
24
24
 
25
+ class_option :gcp_kms_resource_id, type: :string
26
+ class_option :gcp_credential_file, type: :string
27
+
25
28
  desc "encrypt YAML_FILE", "Encrypt yaml file"
26
29
  method_option :output, aliases: "-o", type: :string, required: true
27
30
  def encrypt(yaml_file)
@@ -37,7 +40,9 @@ class YamlVault::Cli < Thor
37
40
  aws_kms_key_id: options[:aws_kms_key_id],
38
41
  aws_region: options[:aws_region],
39
42
  aws_access_key_id: options[:aws_access_key_id],
40
- aws_secret_access_key: options[:aws_secret_access_key]
43
+ aws_secret_access_key: options[:aws_secret_access_key],
44
+ gcp_kms_resource_id: options[:gcp_kms_resource_id],
45
+ gcp_credential_file: options[:gcp_credential_file]
41
46
  ).encrypt_yaml
42
47
  puts "encrypted #{yaml_file} -> #{options[:output]}"
43
48
  File.open(options[:output], "w") { |f| f.write encrypted_yaml }
@@ -57,7 +62,9 @@ class YamlVault::Cli < Thor
57
62
  aws_kms_key_id: options[:aws_kms_key_id],
58
63
  aws_region: options[:aws_region],
59
64
  aws_access_key_id: options[:aws_access_key_id],
60
- aws_secret_access_key: options[:aws_secret_access_key]
65
+ aws_secret_access_key: options[:aws_secret_access_key],
66
+ gcp_kms_resource_id: options[:gcp_kms_resource_id],
67
+ gcp_credential_file: options[:gcp_credential_file]
61
68
  ).decrypt_yaml
62
69
  puts "decrypted #{yaml_file} -> #{options[:output]}"
63
70
  File.open(options[:output], "w") { |f| f.write decrypted_yaml }
@@ -1,3 +1,3 @@
1
1
  module YamlVault
2
- VERSION = "0.5.0"
2
+ VERSION = "0.6.0"
3
3
  end
data/lib/yaml_vault.rb CHANGED
@@ -18,7 +18,8 @@ module YamlVault
18
18
  def initialize(
19
19
  yaml_content, keys, cryptor_name = nil,
20
20
  passphrase: nil, sign_passphrase: nil, salt: nil, cipher: "aes-256-cbc", key_len: 32, signature_key_len: 64, digest: "SHA256",
21
- aws_kms_key_id: nil, aws_region: nil, aws_access_key_id: nil, aws_secret_access_key: nil
21
+ aws_kms_key_id: nil, aws_region: nil, aws_access_key_id: nil, aws_secret_access_key: nil,
22
+ gcp_kms_resource_id: nil, gcp_credential_file: nil
22
23
  )
23
24
  @data = YAML.load(yaml_content)
24
25
  @keys = keys
@@ -36,6 +37,9 @@ module YamlVault
36
37
  @aws_access_key_id = aws_access_key_id
37
38
  @aws_secret_access_key = aws_secret_access_key
38
39
 
40
+ @gcp_kms_resource_id = gcp_kms_resource_id
41
+ @gcp_credential_file = gcp_credential_file
42
+
39
43
  @cryptor = get_cryptor(cryptor_name)
40
44
  end
41
45
 
@@ -67,6 +71,8 @@ module YamlVault
67
71
  ValueCryptor::Simple.new(@passphrase, @sign_passphrase, @salt, @cipher, @digest, @key_len, @signature_key_len)
68
72
  when "aws-kms", "kms"
69
73
  ValueCryptor::KMS.new(@aws_kms_key_id, region: @aws_region, aws_access_key_id: @aws_access_key_id, aws_secret_access_key: @aws_secret_access_key)
74
+ when "gcp-kms"
75
+ ValueCryptor::GCPKMS.new(@gcp_kms_resource_id, @gcp_credential_file)
70
76
  else
71
77
  ValueCryptor::Simple.new(@passphrase, @sign_passphrase, @salt, @cipher, @digest, @key_len, @signature_key_len)
72
78
  end
@@ -154,6 +160,39 @@ module YamlVault
154
160
  YAML.load(resp.plaintext)
155
161
  end
156
162
  end
163
+
164
+ class GCPKMS
165
+ def initialize(resource_id, credential_file)
166
+ raise "Need key resource id" unless resource_id
167
+ require 'googleauth'
168
+ require 'google/apis/cloudkms_v1'
169
+
170
+ scope = [
171
+ 'https://www.googleapis.com/auth/cloud-platform'
172
+ ]
173
+
174
+ @resource_id = resource_id
175
+ @client = Google::Apis::CloudkmsV1::CloudKMSService.new
176
+ if credential_file
177
+ @client.authorization = Google::Auth::DefaultCredentials.make_creds(
178
+ json_key_io: File.open(credential_file),
179
+ scope: scope
180
+ )
181
+ else
182
+ @client.authorization = Google::Auth.get_application_default(scope)
183
+ end
184
+ end
185
+
186
+ def encrypt(value)
187
+ response = @client.encrypt_crypto_key(@resource_id, {plaintext: YAML.dump(value)}, {})
188
+ Base64.strict_encode64(response.ciphertext)
189
+ end
190
+
191
+ def decrypt(value)
192
+ response = @client.decrypt_crypto_key(@resource_id, {ciphertext: Base64.strict_decode64(value)}, {})
193
+ YAML.load(response.plaintext)
194
+ end
195
+ end
157
196
  end
158
197
 
159
198
  private_constant :ValueCryptor
data/yaml_vault.gemspec CHANGED
@@ -20,6 +20,8 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_runtime_dependency "activesupport", ">= 4"
22
22
  spec.add_runtime_dependency "aws-sdk", "~> 2.0"
23
+ spec.add_runtime_dependency "google-api-client", "~> 0.11"
24
+ spec.add_runtime_dependency "googleauth", "~> 0.4"
23
25
  spec.add_runtime_dependency "thor"
24
26
 
25
27
  spec.add_development_dependency "bundler", "~> 1.11"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yaml_vault
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - joker1007
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-03-31 00:00:00.000000000 Z
11
+ date: 2017-05-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -38,6 +38,34 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '2.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: google-api-client
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.11'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.11'
55
+ - !ruby/object:Gem::Dependency
56
+ name: googleauth
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.4'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.4'
41
69
  - !ruby/object:Gem::Dependency
42
70
  name: thor
43
71
  requirement: !ruby/object:Gem::Requirement