ejson_wrapper 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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