vault 0.10.1 → 0.11.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 +4 -4
- data/.travis.yml +4 -2
- data/CHANGELOG.md +10 -0
- data/README.md +14 -0
- data/lib/vault/api/auth.rb +86 -6
- data/lib/vault/api/auth_token.rb +2 -2
- data/lib/vault/api/sys.rb +1 -0
- data/lib/vault/api/sys/audit.rb +18 -1
- data/lib/vault/api/sys/health.rb +63 -0
- data/lib/vault/defaults.rb +6 -1
- data/lib/vault/version.rb +1 -1
- data/vault.gemspec +2 -0
- metadata +18 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dcb5948ae3d3f53115a8e0aef77b70d18c042550
|
4
|
+
data.tar.gz: 143ffc1b71f99550e83548ba92f1edb0e7e4ef0a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a7473e4c1791e62f8814a677d0c71bce2ca9b51a32c534dfd11830bcbbd3a2b8e993dacf3df52bc747fc1473931801733731de5e3a00c1078a9e59f2cbaa75b8
|
7
|
+
data.tar.gz: 7c7a6793019c4f67a7927f01e839cbe9d0ac288dea9affe6e564d6482eedb4da5553cf01a823b9615c572e06a937bef532fd4a80777feb2488e5b3f41cd7e9a6
|
data/.travis.yml
CHANGED
@@ -4,13 +4,15 @@ language: ruby
|
|
4
4
|
cache: bundler
|
5
5
|
|
6
6
|
env:
|
7
|
-
- VAULT_VERSION=0.
|
7
|
+
- VAULT_VERSION=0.8.3
|
8
|
+
- VAULT_VERSION=0.7.3
|
9
|
+
- VAULT_VERSION=0.6.5
|
8
10
|
- VAULT_VERSION=0.5.3
|
9
11
|
|
10
12
|
before_install:
|
11
13
|
- curl -sLo vault.zip https://releases.hashicorp.com/vault/${VAULT_VERSION}/vault_${VAULT_VERSION}_linux_amd64.zip
|
12
14
|
- unzip vault.zip
|
13
|
-
- mkdir ~/bin
|
15
|
+
- mkdir -p ~/bin
|
14
16
|
- mv vault ~/bin
|
15
17
|
- export PATH="~/bin:$PATH"
|
16
18
|
|
data/CHANGELOG.md
CHANGED
@@ -1,11 +1,21 @@
|
|
1
1
|
# Vault Ruby Changelog
|
2
2
|
|
3
|
+
## v0.11.0 (March 19, 2018)
|
4
|
+
|
5
|
+
IMPROVEMENTS
|
6
|
+
|
7
|
+
- Access to health has been added.
|
8
|
+
- Added ability to handle a Base64 encoded PEM (useful for certs in environment variables)
|
9
|
+
- Added IAM EC2 authentication support
|
10
|
+
- Add custom mount path support to TLS authentication
|
11
|
+
|
3
12
|
## v0.10.1 (May 8, 2017)
|
4
13
|
|
5
14
|
IMPROVEMENTS
|
6
15
|
|
7
16
|
- `vault-ruby` is licensed under Mozilla Public License 2.0, and has been for over 2 years. This patch release updates the gemspec to use the correct SPDX ID string for reporting this license, but **no change to the licensing of this gem has occurred**.
|
8
17
|
|
18
|
+
|
9
19
|
## v0.10.0 (April 19, 2017)
|
10
20
|
|
11
21
|
IMPROVEMENTS
|
data/README.md
CHANGED
@@ -53,6 +53,10 @@ Vault.configure do |config|
|
|
53
53
|
# Custom SSL PEM, also read as ENV["VAULT_SSL_CERT"]
|
54
54
|
config.ssl_pem_file = "/path/on/disk.pem"
|
55
55
|
|
56
|
+
# As an alternative to a pem file, you can provide the raw PEM string, also read in the following order of preference:
|
57
|
+
# ENV["VAULT_SSL_PEM_CONTENTS_BASE64"] then ENV["VAULT_SSL_PEM_CONTENTS"]
|
58
|
+
config.ssl_pem_contents = "-----BEGIN ENCRYPTED..."
|
59
|
+
|
56
60
|
# Use SSL verification, also read as ENV["VAULT_SSL_VERIFY"]
|
57
61
|
config.ssl_verify = false
|
58
62
|
|
@@ -75,6 +79,16 @@ client_1 = Vault::Client.new(address: "https://vault.mycompany.com")
|
|
75
79
|
client_2 = Vault::Client.new(address: "https://other-vault.mycompany.com")
|
76
80
|
```
|
77
81
|
|
82
|
+
And if you want to authenticate with a `AWS EC2` :
|
83
|
+
|
84
|
+
```ruby
|
85
|
+
# Export VAULT_ADDR to ENV then
|
86
|
+
# Get the pkcs7 value from AWS
|
87
|
+
signature = `curl http://169.254.169.254/latest/dynamic/instance-identity/pkcs7`
|
88
|
+
vault_token = Vault.auth.aws_ec2(ENV['EC2_ROLE'], signature, nil)
|
89
|
+
vault_client = Vault::Client.new(address: ENV["VAULT_ADDR"], token: vault_token.auth.client_token)
|
90
|
+
```
|
91
|
+
|
78
92
|
### Making requests
|
79
93
|
All of the methods and API calls are heavily documented with examples inline using YARD. In order to keep the examples versioned with the code, the README only lists a few examples for using the Vault gem. Please see the inline documentation for the full API documentation. The tests in the 'spec' directory are an additional source of examples.
|
80
94
|
|
data/lib/vault/api/auth.rb
CHANGED
@@ -173,12 +173,70 @@ module Vault
|
|
173
173
|
# @param [String] role
|
174
174
|
# @param [String] pkcs7
|
175
175
|
# pkcs7 returned by the instance identity document (with line breaks removed)
|
176
|
-
# @param [String] nonce
|
176
|
+
# @param [String] nonce optional
|
177
|
+
# @param [String] route optional
|
177
178
|
#
|
178
179
|
# @return [Secret]
|
179
|
-
def aws_ec2(role, pkcs7, nonce)
|
180
|
-
|
181
|
-
|
180
|
+
def aws_ec2(role, pkcs7, nonce = nil, route = nil)
|
181
|
+
route ||= '/v1/auth/aws-ec2/login'
|
182
|
+
payload = { role: role, pkcs7: pkcs7 }
|
183
|
+
# Set a custom nonce if client is providing one
|
184
|
+
payload[:nonce] = nonce if nonce
|
185
|
+
json = client.post(route, JSON.fast_generate(payload))
|
186
|
+
secret = Secret.decode(json)
|
187
|
+
client.token = secret.auth.client_token
|
188
|
+
return secret
|
189
|
+
end
|
190
|
+
|
191
|
+
# Authenticate via AWS IAM auth method by providing a AWS CredentialProvider (either ECS, AssumeRole, etc.)
|
192
|
+
# If authentication is successful, the resulting token will be stored on the client and used
|
193
|
+
# for future requests.
|
194
|
+
#
|
195
|
+
# @example
|
196
|
+
# Vault.auth.aws_iam("dev-role-iam", Aws::AssumeRoleCredentials.new, "vault.example.com", "https://sts.us-east-2.amazonaws.com") #=> #<Vault::Secret lease_id="">
|
197
|
+
#
|
198
|
+
# @param [String] role
|
199
|
+
# @param [CredentialProvider] credentials_provider
|
200
|
+
# https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/CredentialProvider.html
|
201
|
+
# @param [String] iam_auth_header_value optional
|
202
|
+
# As of Jan 2018, Vault will accept ANY or NO header if none is configured by the Vault server admin
|
203
|
+
# @param [String] sts_endpoint optional
|
204
|
+
# https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html
|
205
|
+
# @return [Secret]
|
206
|
+
def aws_iam(role, credentials_provider, iam_auth_header_value = nil, sts_endpoint = 'https://sts.amazonaws.com')
|
207
|
+
require "aws-sigv4"
|
208
|
+
require "base64"
|
209
|
+
|
210
|
+
request_body = 'Action=GetCallerIdentity&Version=2011-06-15'
|
211
|
+
request_method = 'POST'
|
212
|
+
|
213
|
+
vault_headers = {
|
214
|
+
'User-Agent' => Vault::Client::USER_AGENT,
|
215
|
+
'Content-Type' => 'application/x-www-form-urlencoded; charset=utf-8'
|
216
|
+
}
|
217
|
+
|
218
|
+
vault_headers['X-Vault-AWS-IAM-Server-ID'] = iam_auth_header_value if iam_auth_header_value
|
219
|
+
|
220
|
+
sig4_headers = Aws::Sigv4::Signer.new(
|
221
|
+
service: 'sts',
|
222
|
+
region: region_from_sts_endpoint(sts_endpoint),
|
223
|
+
credentials_provider: credentials_provider
|
224
|
+
).sign_request(
|
225
|
+
http_method: request_method,
|
226
|
+
url: sts_endpoint,
|
227
|
+
headers: vault_headers,
|
228
|
+
body: request_body
|
229
|
+
).headers
|
230
|
+
|
231
|
+
payload = {
|
232
|
+
role: role,
|
233
|
+
iam_http_request_method: request_method,
|
234
|
+
iam_request_url: Base64.strict_encode64(sts_endpoint),
|
235
|
+
iam_request_headers: Base64.strict_encode64(vault_headers.merge(sig4_headers).to_json),
|
236
|
+
iam_request_body: Base64.strict_encode64(request_body)
|
237
|
+
}
|
238
|
+
|
239
|
+
json = client.post('/v1/auth/aws/login', JSON.fast_generate(payload))
|
182
240
|
secret = Secret.decode(json)
|
183
241
|
client.token = secret.auth.client_token
|
184
242
|
return secret
|
@@ -194,18 +252,40 @@ module Vault
|
|
194
252
|
# @example Reading a pem from disk
|
195
253
|
# Vault.auth.tls(File.read("/path/to/my/certificate.pem")) #=> #<Vault::Secret lease_id="">
|
196
254
|
#
|
255
|
+
# @example Sending to a cert authentication backend mounted at a custom location
|
256
|
+
# Vault.auth.tls(pem_contents, 'custom/location') #=> #<Vault::Secret lease_id="">
|
257
|
+
#
|
197
258
|
# @param [String] pem (default: the configured SSL pem file or contents)
|
198
259
|
# The raw pem contents to use for the login procedure.
|
199
260
|
#
|
261
|
+
# @param [String] path (default: 'cert')
|
262
|
+
# The path to the auth backend to use for the login procedure.
|
263
|
+
#
|
200
264
|
# @return [Secret]
|
201
|
-
def tls(pem = nil)
|
265
|
+
def tls(pem = nil, path = 'cert')
|
202
266
|
new_client = client.dup
|
203
267
|
new_client.ssl_pem_contents = pem if !pem.nil?
|
204
268
|
|
205
|
-
json = new_client.post("/v1/auth/
|
269
|
+
json = new_client.post("/v1/auth/#{CGI.escape(path)}/login")
|
206
270
|
secret = Secret.decode(json)
|
207
271
|
client.token = secret.auth.client_token
|
208
272
|
return secret
|
209
273
|
end
|
274
|
+
|
275
|
+
private
|
276
|
+
|
277
|
+
# Parse an AWS region from a STS endpoint
|
278
|
+
# STS in the China (Beijing) region (cn-north-1) is sts.cn-north-1.amazonaws.com.cn
|
279
|
+
# Take care changing below regex with that edge case in mind
|
280
|
+
#
|
281
|
+
# @param [String] sts_endpoint
|
282
|
+
# https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html
|
283
|
+
#
|
284
|
+
# @return [String] aws region
|
285
|
+
def region_from_sts_endpoint(sts_endpoint)
|
286
|
+
valid_sts_endpoint = %r{https:\/\/sts\.?(.*).amazonaws.com}.match(sts_endpoint)
|
287
|
+
raise "Unable to parse STS endpoint #{sts_endpoint}" unless valid_sts_endpoint
|
288
|
+
valid_sts_endpoint[1].empty? ? 'us-east-1' : valid_sts_endpoint[1]
|
289
|
+
end
|
210
290
|
end
|
211
291
|
end
|
data/lib/vault/api/auth_token.rb
CHANGED
@@ -102,7 +102,7 @@ module Vault
|
|
102
102
|
# Lookup information about the current token.
|
103
103
|
#
|
104
104
|
# @example
|
105
|
-
# Vault.auth_token.
|
105
|
+
# Vault.auth_token.lookup("abcd-...") #=> #<Vault::Secret lease_id="">
|
106
106
|
#
|
107
107
|
# @param [String] token
|
108
108
|
# @param [Hash] options
|
@@ -215,7 +215,7 @@ module Vault
|
|
215
215
|
# @return [true]
|
216
216
|
def revoke_accessor(accessor, options = {})
|
217
217
|
headers = extract_headers!(options)
|
218
|
-
client.put("/v1/auth/
|
218
|
+
client.put("/v1/auth/token/revoke-accessor", JSON.fast_generate(
|
219
219
|
accessor: accessor,
|
220
220
|
), headers)
|
221
221
|
return true
|
data/lib/vault/api/sys.rb
CHANGED
data/lib/vault/api/sys/audit.rb
CHANGED
@@ -19,7 +19,7 @@ module Vault
|
|
19
19
|
end
|
20
20
|
|
21
21
|
class Sys
|
22
|
-
# List all
|
22
|
+
# List all audits for the vault.
|
23
23
|
#
|
24
24
|
# @example
|
25
25
|
# Vault.sys.audits #=> { :file => #<Audit> }
|
@@ -70,5 +70,22 @@ module Vault
|
|
70
70
|
client.delete("/v1/sys/audit/#{encode_path(path)}")
|
71
71
|
return true
|
72
72
|
end
|
73
|
+
|
74
|
+
# Generates a HMAC verifier for a given input.
|
75
|
+
#
|
76
|
+
# @example
|
77
|
+
# Vault.sys.audit_hash("file-audit", "my input") #=> "hmac-sha256:30aa7de18a5e90bbc1063db91e7c387b32b9fa895977eb8c177bbc91e7d7c542"
|
78
|
+
#
|
79
|
+
# @param [String] path
|
80
|
+
# the path of the audit backend
|
81
|
+
# @param [String] input
|
82
|
+
# the input to generate a HMAC for
|
83
|
+
#
|
84
|
+
# @return [String]
|
85
|
+
def audit_hash(path, input)
|
86
|
+
json = client.post("/v1/sys/audit-hash/#{encode_path(path)}", JSON.fast_generate(input: input))
|
87
|
+
json = json[:data] if json[:data]
|
88
|
+
json[:hash]
|
89
|
+
end
|
73
90
|
end
|
74
91
|
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require "json"
|
2
|
+
|
3
|
+
module Vault
|
4
|
+
class HealthStatus < Response
|
5
|
+
# @!attribute [r] initialized
|
6
|
+
# Whether the Vault server is Initialized.
|
7
|
+
# @return [Boolean]
|
8
|
+
field :initialized, as: :initialized?
|
9
|
+
|
10
|
+
# @!attribute [r] sealed
|
11
|
+
# Whether the Vault server is Sealed.
|
12
|
+
# @return [Boolean]
|
13
|
+
field :sealed, as: :sealed?
|
14
|
+
|
15
|
+
# @!attribute [r] standby
|
16
|
+
# Whether the Vault server is in Standby mode.
|
17
|
+
# @return [Boolean]
|
18
|
+
field :standby, as: :standby?
|
19
|
+
|
20
|
+
# @!attribute [r] replication_performance_mode
|
21
|
+
# Verbose description of DR mode (added in 0.9.2)
|
22
|
+
# @return [String]
|
23
|
+
field :replication_performance_mode
|
24
|
+
|
25
|
+
# @!attribute [r] replication_dr_mode
|
26
|
+
# Verbose description of DR mode (added in 0.9.2)
|
27
|
+
# @return [String]
|
28
|
+
field :replication_dr_mode
|
29
|
+
|
30
|
+
# @!attribute [r] server_time_utc
|
31
|
+
# Server time in Unix seconds, UTC
|
32
|
+
# @return [Fixnum]
|
33
|
+
field :server_time_utc
|
34
|
+
|
35
|
+
# @!attribute [r] version
|
36
|
+
# Server Vault version string (added in 0.6.1)
|
37
|
+
# @return [String]
|
38
|
+
field :version
|
39
|
+
|
40
|
+
# @!attribute [r] cluster_name
|
41
|
+
# Server cluster name
|
42
|
+
# @return [String]
|
43
|
+
field :cluster_name
|
44
|
+
|
45
|
+
# @!attribute [r] cluster_id
|
46
|
+
# Server cluster UUID
|
47
|
+
# @return [String]
|
48
|
+
field :cluster_id
|
49
|
+
end
|
50
|
+
|
51
|
+
class Sys
|
52
|
+
# Show the health status for this vault.
|
53
|
+
#
|
54
|
+
# @example
|
55
|
+
# Vault.sys.health_status #=> #Vault::HealthStatus @initialized=true, @sealed=false, @standby=false, @replication_performance_mode="disabled", @replication_dr_mode="disabled", @server_time_utc=1519776728, @version="0.9.3", @cluster_name="vault-cluster-997f514e", @cluster_id="c2dad70a-6d88-a06d-69f6-9ae7f5485998">
|
56
|
+
#
|
57
|
+
# @return [HealthStatus]
|
58
|
+
def health_status
|
59
|
+
json = client.get("/v1/sys/health", {:sealedcode => 200, :uninitcode => 200, :standbycode => 200})
|
60
|
+
return HealthStatus.decode(json)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
data/lib/vault/defaults.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "pathname"
|
2
|
+
require "base64"
|
2
3
|
|
3
4
|
module Vault
|
4
5
|
module Defaults
|
@@ -126,7 +127,11 @@ module Vault
|
|
126
127
|
# the value for {#ssl_pem_file}, if set.
|
127
128
|
# @return [String, nil]
|
128
129
|
def ssl_pem_contents
|
129
|
-
ENV["
|
130
|
+
if ENV["VAULT_SSL_PEM_CONTENTS_BASE64"]
|
131
|
+
Base64.decode64(ENV["VAULT_SSL_PEM_CONTENTS_BASE64"])
|
132
|
+
else
|
133
|
+
ENV["VAULT_SSL_PEM_CONTENTS"]
|
134
|
+
end
|
130
135
|
end
|
131
136
|
|
132
137
|
# The path to a pem on disk to use with custom SSL verification
|
data/lib/vault/version.rb
CHANGED
data/vault.gemspec
CHANGED
@@ -19,6 +19,8 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
20
|
spec.require_paths = ["lib"]
|
21
21
|
|
22
|
+
spec.add_runtime_dependency "aws-sigv4"
|
23
|
+
|
22
24
|
spec.add_development_dependency "bundler"
|
23
25
|
spec.add_development_dependency "pry"
|
24
26
|
spec.add_development_dependency "rake", "~> 12.0"
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vault
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Seth Vargo
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-03-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: aws-sigv4
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: bundler
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -121,6 +135,7 @@ files:
|
|
121
135
|
- lib/vault/api/sys.rb
|
122
136
|
- lib/vault/api/sys/audit.rb
|
123
137
|
- lib/vault/api/sys/auth.rb
|
138
|
+
- lib/vault/api/sys/health.rb
|
124
139
|
- lib/vault/api/sys/init.rb
|
125
140
|
- lib/vault/api/sys/leader.rb
|
126
141
|
- lib/vault/api/sys/lease.rb
|
@@ -163,7 +178,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
163
178
|
version: '0'
|
164
179
|
requirements: []
|
165
180
|
rubyforge_project:
|
166
|
-
rubygems_version: 2.6.
|
181
|
+
rubygems_version: 2.6.14
|
167
182
|
signing_key:
|
168
183
|
specification_version: 4
|
169
184
|
summary: Vault is a Ruby API client for interacting with a Vault server.
|