ejson_wrapper 0.3.1 → 0.4.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
  SHA256:
3
- metadata.gz: 4da8151cb31c1a65a18b01e0e16833567bccd5d44c5bd31a9a0bd03e51b363ff
4
- data.tar.gz: 297da1cbce75a75deb42110631903c342f372fb28beee2da8ace8863cefa7bcc
3
+ metadata.gz: 03540eb1e0282e58213d51685b2737acf75b7ee9d93ffe8f6fe9fe2f271e7cc6
4
+ data.tar.gz: 5f243301d52eeac7ddc77212669b4cdfcb0487d0b92a42bb08ccc1d5a32777fa
5
5
  SHA512:
6
- metadata.gz: 444befc48197ce281f1ff2e1887375fb50aded70e4d39d84dca4749137f7a8755b0b8b2686cd2888d1395b1b2ceda7389f0ee6380071ad7c99e3471fe1e39eef
7
- data.tar.gz: 0131ad60f86e89efa9872b310aa10557047af9e74099d1c928a20a17c832150ff4ad5ad616f7c1616abe3fcfccbeaa4e7b4ec879b28e491ddc2089118ff7d9be
6
+ metadata.gz: fbd749781614f53594e33de22e97cf2e93b47f9267d6a8dfb7b2919668bfb18fcdc7320de17a1ce8a6195eff69c51283a0116a0f6c492e79754a6f6524d14fb5
7
+ data.tar.gz: 18d62cd0be9556d80c38057882d1ba414d93497e1c9a3c1c5cbb259471ad4e107a625f229178c39af02c9932ef2bf7841671e443d4370c4200a4a897217f81e3
data/README.md CHANGED
@@ -1,6 +1,11 @@
1
- # EjsonWrapper
1
+ # EJSON Wrapper
2
2
 
3
- Wraps the EJSON go program to safely execute it and parse the resulting JSON.
3
+ Wraps the [`ejson`](https://github.com/Shopify/ejson) program to safely execute it and parse the resulting JSON. Additionally it offers a feature to encrypt/decrypt secrets with encrypted private key using AWS KMS.
4
+
5
+ ## Prerequisites
6
+
7
+ * [`ejson`](https://github.com/Shopify/ejson) application
8
+ * Path to `ejson` binary is included in `PATH` environment variable
4
9
 
5
10
  ## Installation
6
11
 
@@ -12,17 +17,23 @@ gem 'ejson_wrapper'
12
17
 
13
18
  And then execute:
14
19
 
15
- $ bundle
20
+ ```
21
+ $ bundle
22
+ ```
16
23
 
17
24
  Or install it yourself as:
18
25
 
19
- $ gem install ejson_wrapper
26
+ ```
27
+ $ gem install ejson_wrapper
28
+ ```
20
29
 
21
30
  ## Usage
22
31
 
23
32
  ### Decrypting EJSON files
24
33
 
25
- From Ruby:
34
+ Ensure your application has [AWS IAM Permission to decrypt with KMS](https://docs.aws.amazon.com/kms/latest/developerguide/iam-policies.html#iam-policy-example-encrypt-decrypt-specific-cmks).
35
+
36
+ In Ruby code:
26
37
 
27
38
  ```
28
39
  # Private key is in /opt/ejson/keys
@@ -48,24 +59,70 @@ Command line:
48
59
  # decrypt all
49
60
  $ ejson_wrapper decrypt --file file.ejson --region us-east-1
50
61
  {
51
- "datadog_api_token": "[datadog_api_token]"
62
+ "my_api_key": "[secret]"
52
63
  }
53
64
 
54
65
  # decrypt & extract a specific secret
55
- $ ejson_wrapper decrypt --file file.ejson --region us-east-1 --secret datadog_api_token
56
- [datadog_api_token]
66
+ $ ejson_wrapper decrypt --file file.ejson --region us-east-1 --secret my_api_key
67
+ [secret]
57
68
  ```
58
69
 
59
70
  ### Generating EJSON files
60
71
 
72
+ Ensure your application has [AWS IAM Permission to encrypt with KMS](https://docs.aws.amazon.com/kms/latest/developerguide/iam-policies.html#iam-policy-example-encrypt-decrypt-specific-cmks).
73
+
74
+ Firstly, the EJSON is generated to have public key and Base64 encoded & encrypted private key in `_public_key` and `_private_key_enc` respectively with:
75
+
76
+ Using CLI:
77
+
78
+ ```
79
+ $ ejson_wrapper generate --region $AWS_REGION --kms-key-id [key_id] --file myfile.ejson
80
+ Generated EJSON file myfile.ejson
61
81
  ```
62
- $ ejson_wrapper generate --region ap-southeast-2 --kms-key-id [key_id] --file file.ejson
63
- Generated EJSON file file.ejson
64
82
 
65
- $ cat file.ejson
83
+ OR Ruby code:
84
+
85
+ ```
86
+ # Generate encrypted EJSON file (overwritting the unencrypted EJSON file)
87
+ EJSONWrapper.generate(region: ENV['AWS_REGION'], kms_key_id: 'key_id', file: 'myfile.ejson')
88
+ => Generated EJSON file myfile.ejson
89
+ ```
90
+
91
+ Verify to ensure the new file contain the two required keys:
92
+
93
+ ```
94
+ $ cat myfile.ejson
95
+ {
96
+ "_public_key": "[public_key]",
97
+ "_private_key_enc":"[base64_encoded_encrypted_private_key]",
98
+ }
99
+ ```
100
+
101
+ You now can add secrets into the EJSON file, in following example `my_api_key` in plaintext entry is added:
102
+
103
+ ```
104
+ # myfile.ejson
105
+ {
106
+ "_public_key": "[public_key]",
107
+ "_private_key_enc":"[base64_encoded_encrypted_private_key]",
108
+ "my_api_key": "plaintext"
109
+ }
110
+ ```
111
+
112
+ to encrypt the secrets, run following command:
113
+
114
+ ```
115
+ $ ejson encrypt myfile.ejson
116
+ ```
117
+
118
+ Verify to ensure the secret is encrypted correctly:
119
+
120
+ ```
121
+ $ cat myfile.ejson
66
122
  {
67
123
  "_public_key": "[public_key]",
68
- "_private_key_enc":"[encrypted_private_key]"
124
+ "_private_key_enc":"[base64_encoded_encrypted_private_key]",
125
+ "my_api_key": "encrypted_secret"
69
126
  }
70
127
  ```
71
128
 
@@ -29,7 +29,7 @@ Gem::Specification.new do |spec|
29
29
 
30
30
  spec.add_dependency "ejson"
31
31
  spec.add_dependency "aws-sdk-kms"
32
- spec.add_development_dependency "bundler", "~> 1.15"
32
+ spec.add_development_dependency "bundler"
33
33
  spec.add_development_dependency "rake", "~> 10.0"
34
34
  spec.add_development_dependency "rspec", "~> 3.0"
35
35
  spec.add_development_dependency "pry"
@@ -10,7 +10,7 @@ options = {
10
10
  kms_key_id: nil
11
11
  }
12
12
  option_parser = OptionParser.new do |opts|
13
- opts.banner = 'Usage: ejson_wrapper generate [options]'
13
+ opts.banner = 'Usage: ejson_wrapper {generate,decrypt,reveal_key} [options]'
14
14
 
15
15
  opts.on('--region R', String, 'AWS Region') do |v|
16
16
  options[:region] = v
@@ -68,6 +68,15 @@ when 'decrypt'
68
68
  else
69
69
  puts JSON.pretty_generate(decrypted_secrets)
70
70
  end
71
+
72
+ when 'reveal_key'
73
+ begin
74
+ puts EJSONWrapper.private_key_decrypted(options[:file], region: options[:region])
75
+ rescue Errno::ENOENT
76
+ STDERR.puts "Secrets file not found"
77
+ exit 1
78
+ end
79
+
71
80
  else
72
81
  STDERR.puts option_parser.banner
73
82
  exit 1
@@ -6,7 +6,7 @@ require "ejson_wrapper/generate"
6
6
  module EJSONWrapper
7
7
  def self.decrypt(file_path, key_dir: nil, private_key: nil, use_kms: false, region: nil)
8
8
  if use_kms
9
- private_key = DecryptPrivateKeyWithKMS.call(file_path, region: region)
9
+ private_key = private_key_decrypted(file_path, region: region)
10
10
  end
11
11
  DecryptEJSONFile.call(file_path, key_dir: key_dir, private_key: private_key)
12
12
  end
@@ -14,4 +14,8 @@ module EJSONWrapper
14
14
  def self.generate(**args)
15
15
  Generate.new.call(**args)
16
16
  end
17
+
18
+ def self.private_key_decrypted(file_path, region: nil)
19
+ DecryptPrivateKeyWithKMS.call(file_path, region: region)
20
+ end
17
21
  end
@@ -14,7 +14,7 @@ module EJSONWrapper
14
14
  def call(ejson_file_path, region:)
15
15
  ejson_hash = JSON.parse(File.read(ejson_file_path))
16
16
  encrypted_private_key = ejson_hash.fetch(KEY) do
17
- raise PrivateKeyNotFound, "Private key was not found in ejson file under key #{key}"
17
+ raise PrivateKeyNotFound, "Private key was not found in ejson file under key #{KEY}"
18
18
  end
19
19
  decrypt(Base64.decode64(encrypted_private_key), region: region)
20
20
  end
@@ -1,3 +1,3 @@
1
1
  module EjsonWrapper
2
- VERSION = "0.3.1"
2
+ VERSION = "0.4.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ejson_wrapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steve Hodgkiss
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-09-06 00:00:00.000000000 Z
11
+ date: 2019-08-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ejson
@@ -42,16 +42,16 @@ dependencies:
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '1.15'
47
+ version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '1.15'
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -137,7 +137,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
137
137
  version: '0'
138
138
  requirements: []
139
139
  rubyforge_project:
140
- rubygems_version: 2.7.6
140
+ rubygems_version: 2.7.6.2
141
141
  signing_key:
142
142
  specification_version: 4
143
143
  summary: Invoke EJSON from Ruby