vault_ruby_client 0.18.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +287 -0
- data/LICENSE +364 -0
- data/README.md +223 -0
- data/lib/vault/api/approle.rb +221 -0
- data/lib/vault/api/auth.rb +324 -0
- data/lib/vault/api/auth_tls.rb +95 -0
- data/lib/vault/api/auth_token.rb +245 -0
- data/lib/vault/api/help.rb +36 -0
- data/lib/vault/api/kv.rb +230 -0
- data/lib/vault/api/logical.rb +153 -0
- data/lib/vault/api/secret.rb +171 -0
- data/lib/vault/api/sys/audit.rb +94 -0
- data/lib/vault/api/sys/auth.rb +119 -0
- data/lib/vault/api/sys/health.rb +66 -0
- data/lib/vault/api/sys/init.rb +86 -0
- data/lib/vault/api/sys/leader.rb +51 -0
- data/lib/vault/api/sys/lease.rb +52 -0
- data/lib/vault/api/sys/mount.rb +165 -0
- data/lib/vault/api/sys/namespace.rb +86 -0
- data/lib/vault/api/sys/policy.rb +95 -0
- data/lib/vault/api/sys/quota.rb +110 -0
- data/lib/vault/api/sys/seal.rb +84 -0
- data/lib/vault/api/sys.rb +30 -0
- data/lib/vault/api/transform/alphabet.rb +46 -0
- data/lib/vault/api/transform/role.rb +45 -0
- data/lib/vault/api/transform/template.rb +57 -0
- data/lib/vault/api/transform/transformation.rb +64 -0
- data/lib/vault/api/transform.rb +32 -0
- data/lib/vault/api.rb +17 -0
- data/lib/vault/client.rb +460 -0
- data/lib/vault/configurable.rb +53 -0
- data/lib/vault/defaults.rb +218 -0
- data/lib/vault/encode.rb +22 -0
- data/lib/vault/errors.rb +87 -0
- data/lib/vault/persistent/connection.rb +45 -0
- data/lib/vault/persistent/pool.rb +51 -0
- data/lib/vault/persistent/timed_stack_multi.rb +73 -0
- data/lib/vault/persistent.rb +1161 -0
- data/lib/vault/request.rb +47 -0
- data/lib/vault/response.rb +92 -0
- data/lib/vault/vendor/connection_pool/timed_stack.rb +181 -0
- data/lib/vault/vendor/connection_pool/version.rb +8 -0
- data/lib/vault/vendor/connection_pool.rb +153 -0
- data/lib/vault/version.rb +6 -0
- data/lib/vault_ruby_client.rb +53 -0
- metadata +158 -0
@@ -0,0 +1,324 @@
|
|
1
|
+
# Copyright (c) HashiCorp, Inc.
|
2
|
+
# SPDX-License-Identifier: MPL-2.0
|
3
|
+
|
4
|
+
require "json"
|
5
|
+
|
6
|
+
require_relative "secret"
|
7
|
+
require_relative "../client"
|
8
|
+
|
9
|
+
module Vault
|
10
|
+
class Client
|
11
|
+
# A proxy to the {Auth} methods.
|
12
|
+
# @return [Auth]
|
13
|
+
def auth
|
14
|
+
@auth ||= Authenticate.new(self)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class Authenticate < Request
|
19
|
+
# Authenticate via the "token" authentication method. This authentication
|
20
|
+
# method is a bit bizarre because you already have a token, but hey,
|
21
|
+
# whatever floats your boat.
|
22
|
+
#
|
23
|
+
# This method hits the `/v1/auth/token/lookup-self` endpoint after setting
|
24
|
+
# the Vault client's token to the given token parameter. If the self lookup
|
25
|
+
# succeeds, the token is persisted onto the client for future requests. If
|
26
|
+
# the lookup fails, the old token (which could be unset) is restored on the
|
27
|
+
# client.
|
28
|
+
#
|
29
|
+
# @example
|
30
|
+
# Vault.auth.token("6440e1bd-ba22-716a-887d-e133944d22bd") #=> #<Vault::Secret lease_id="">
|
31
|
+
# Vault.token #=> "6440e1bd-ba22-716a-887d-e133944d22bd"
|
32
|
+
#
|
33
|
+
# @param [String] new_token
|
34
|
+
# the new token to try to authenticate and store on the client
|
35
|
+
#
|
36
|
+
# @return [Secret]
|
37
|
+
def token(new_token)
|
38
|
+
old_token = client.token
|
39
|
+
client.token = new_token
|
40
|
+
json = client.get("/v1/auth/token/lookup-self")
|
41
|
+
secret = Secret.decode(json)
|
42
|
+
return secret
|
43
|
+
rescue
|
44
|
+
client.token = old_token
|
45
|
+
raise
|
46
|
+
end
|
47
|
+
|
48
|
+
# Authenticate via the "app-id" authentication method. If authentication is
|
49
|
+
# successful, the resulting token will be stored on the client and used for
|
50
|
+
# future requests.
|
51
|
+
#
|
52
|
+
# @example
|
53
|
+
# Vault.auth.app_id(
|
54
|
+
# "aeece56e-3f9b-40c3-8f85-781d3e9a8f68",
|
55
|
+
# "3b87be76-95cf-493a-a61b-7d5fc70870ad",
|
56
|
+
# ) #=> #<Vault::Secret lease_id="">
|
57
|
+
#
|
58
|
+
# @example with a custom mount point
|
59
|
+
# Vault.auth.app_id(
|
60
|
+
# "aeece56e-3f9b-40c3-8f85-781d3e9a8f68",
|
61
|
+
# "3b87be76-95cf-493a-a61b-7d5fc70870ad",
|
62
|
+
# mount: "new-app-id",
|
63
|
+
# )
|
64
|
+
#
|
65
|
+
# @param [String] app_id
|
66
|
+
# @param [String] user_id
|
67
|
+
# @param [Hash] options
|
68
|
+
# additional options to pass to the authentication call, such as a custom
|
69
|
+
# mount point
|
70
|
+
#
|
71
|
+
# @return [Secret]
|
72
|
+
def app_id(app_id, user_id, options = {})
|
73
|
+
payload = { app_id: app_id, user_id: user_id }.merge(options)
|
74
|
+
json = client.post("/v1/auth/app-id/login", JSON.fast_generate(payload))
|
75
|
+
secret = Secret.decode(json)
|
76
|
+
client.token = secret.auth.client_token
|
77
|
+
return secret
|
78
|
+
end
|
79
|
+
|
80
|
+
# Authenticate via the "approle" authentication method. If authentication is
|
81
|
+
# successful, the resulting token will be stored on the client and used for
|
82
|
+
# future requests.
|
83
|
+
#
|
84
|
+
# @example
|
85
|
+
# Vault.auth.approle(
|
86
|
+
# "db02de05-fa39-4855-059b-67221c5c2f63",
|
87
|
+
# "6a174c20-f6de-a53c-74d2-6018fcceff64",
|
88
|
+
# ) #=> #<Vault::Secret lease_id="">
|
89
|
+
#
|
90
|
+
# @param [String] role_id
|
91
|
+
# @param [String] secret_id (default: nil)
|
92
|
+
# It is required when `bind_secret_id` is enabled for the specified role_id
|
93
|
+
#
|
94
|
+
# @return [Secret]
|
95
|
+
def approle(role_id, secret_id=nil)
|
96
|
+
payload = { role_id: role_id }
|
97
|
+
payload[:secret_id] = secret_id if secret_id
|
98
|
+
json = client.post("/v1/auth/approle/login", JSON.fast_generate(payload))
|
99
|
+
secret = Secret.decode(json)
|
100
|
+
client.token = secret.auth.client_token
|
101
|
+
return secret
|
102
|
+
end
|
103
|
+
|
104
|
+
# Authenticate via the "userpass" authentication method. If authentication
|
105
|
+
# is successful, the resulting token will be stored on the client and used
|
106
|
+
# for future requests.
|
107
|
+
#
|
108
|
+
# @example
|
109
|
+
# Vault.auth.userpass("sethvargo", "s3kr3t") #=> #<Vault::Secret lease_id="">
|
110
|
+
#
|
111
|
+
# @example with a custom mount point
|
112
|
+
# Vault.auth.userpass("sethvargo", "s3kr3t", mount: "admin-login") #=> #<Vault::Secret lease_id="">
|
113
|
+
#
|
114
|
+
# @param [String] username
|
115
|
+
# @param [String] password
|
116
|
+
# @param [Hash] options
|
117
|
+
# additional options to pass to the authentication call, such as a custom
|
118
|
+
# mount point
|
119
|
+
#
|
120
|
+
# @return [Secret]
|
121
|
+
def userpass(username, password, options = {})
|
122
|
+
payload = { password: password }.merge(options)
|
123
|
+
json = client.post("/v1/auth/userpass/login/#{encode_path(username)}", JSON.fast_generate(payload))
|
124
|
+
secret = Secret.decode(json)
|
125
|
+
client.token = secret.auth.client_token
|
126
|
+
return secret
|
127
|
+
end
|
128
|
+
|
129
|
+
# Authenticate via the "ldap" authentication method. If authentication
|
130
|
+
# is successful, the resulting token will be stored on the client and used
|
131
|
+
# for future requests.
|
132
|
+
#
|
133
|
+
# @example
|
134
|
+
# Vault.auth.ldap("sethvargo", "s3kr3t") #=> #<Vault::Secret lease_id="">
|
135
|
+
#
|
136
|
+
# @param [String] username
|
137
|
+
# @param [String] password
|
138
|
+
# @param [Hash] options
|
139
|
+
# additional options to pass to the authentication call, such as a custom
|
140
|
+
# mount point
|
141
|
+
#
|
142
|
+
# @return [Secret]
|
143
|
+
def ldap(username, password, options = {})
|
144
|
+
payload = { password: password }.merge(options)
|
145
|
+
json = client.post("/v1/auth/ldap/login/#{encode_path(username)}", JSON.fast_generate(payload))
|
146
|
+
secret = Secret.decode(json)
|
147
|
+
client.token = secret.auth.client_token
|
148
|
+
return secret
|
149
|
+
end
|
150
|
+
|
151
|
+
# Authenticate via the GitHub authentication method. If authentication is
|
152
|
+
# successful, the resulting token will be stored on the client and used
|
153
|
+
# for future requests.
|
154
|
+
#
|
155
|
+
# @example
|
156
|
+
# Vault.auth.github("mypersonalgithubtoken") #=> #<Vault::Secret lease_id="">
|
157
|
+
#
|
158
|
+
# @param [String] github_token
|
159
|
+
#
|
160
|
+
# @return [Secret]
|
161
|
+
def github(github_token, path="/v1/auth/github/login")
|
162
|
+
payload = {token: github_token}
|
163
|
+
json = client.post(path, JSON.fast_generate(payload))
|
164
|
+
secret = Secret.decode(json)
|
165
|
+
client.token = secret.auth.client_token
|
166
|
+
return secret
|
167
|
+
end
|
168
|
+
|
169
|
+
# Authenticate via the AWS EC2 authentication method. If authentication is
|
170
|
+
# successful, the resulting token will be stored on the client and used
|
171
|
+
# for future requests.
|
172
|
+
#
|
173
|
+
# @example
|
174
|
+
# Vault.auth.aws_ec2("read-only", "pkcs7", "vault-nonce") #=> #<Vault::Secret lease_id="">
|
175
|
+
#
|
176
|
+
# @param [String] role
|
177
|
+
# @param [String] pkcs7
|
178
|
+
# pkcs7 returned by the instance identity document (with line breaks removed)
|
179
|
+
# @param [String] nonce optional
|
180
|
+
# @param [String] route optional
|
181
|
+
#
|
182
|
+
# @return [Secret]
|
183
|
+
def aws_ec2(role, pkcs7, nonce = nil, route = nil)
|
184
|
+
route ||= '/v1/auth/aws-ec2/login'
|
185
|
+
payload = { role: role, pkcs7: pkcs7 }
|
186
|
+
# Set a custom nonce if client is providing one
|
187
|
+
payload[:nonce] = nonce if nonce
|
188
|
+
json = client.post(route, JSON.fast_generate(payload))
|
189
|
+
secret = Secret.decode(json)
|
190
|
+
client.token = secret.auth.client_token
|
191
|
+
return secret
|
192
|
+
end
|
193
|
+
|
194
|
+
# Authenticate via AWS IAM auth method by providing a AWS CredentialProvider (either ECS, AssumeRole, etc.)
|
195
|
+
# If authentication is successful, the resulting token will be stored on the client and used
|
196
|
+
# for future requests.
|
197
|
+
#
|
198
|
+
# @example
|
199
|
+
# Vault.auth.aws_iam("dev-role-iam", Aws::InstanceProfileCredentials.new, "vault.example.com", "https://sts.us-east-2.amazonaws.com") #=> #<Vault::Secret lease_id="">
|
200
|
+
#
|
201
|
+
# @param [String] role
|
202
|
+
# @param [CredentialProvider] credentials_provider
|
203
|
+
# https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/CredentialProvider.html
|
204
|
+
# @param [String] iam_auth_header_value optional
|
205
|
+
# As of Jan 2018, Vault will accept ANY or NO header if none is configured by the Vault server admin
|
206
|
+
# @param [String] sts_endpoint optional
|
207
|
+
# https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html
|
208
|
+
# @param [String] route optional
|
209
|
+
# @return [Secret]
|
210
|
+
def aws_iam(role, credentials_provider, iam_auth_header_value = nil, sts_endpoint = 'https://sts.amazonaws.com', route = nil)
|
211
|
+
require "aws-sigv4"
|
212
|
+
require "base64"
|
213
|
+
|
214
|
+
request_body = 'Action=GetCallerIdentity&Version=2011-06-15'
|
215
|
+
request_method = 'POST'
|
216
|
+
|
217
|
+
route ||= '/v1/auth/aws/login'
|
218
|
+
|
219
|
+
vault_headers = {
|
220
|
+
'User-Agent' => Vault::Client::USER_AGENT,
|
221
|
+
'Content-Type' => 'application/x-www-form-urlencoded; charset=utf-8'
|
222
|
+
}
|
223
|
+
|
224
|
+
vault_headers['X-Vault-AWS-IAM-Server-ID'] = iam_auth_header_value if iam_auth_header_value
|
225
|
+
|
226
|
+
sig4_headers = Aws::Sigv4::Signer.new(
|
227
|
+
service: 'sts',
|
228
|
+
region: region_from_sts_endpoint(sts_endpoint),
|
229
|
+
credentials_provider: credentials_provider
|
230
|
+
).sign_request(
|
231
|
+
http_method: request_method,
|
232
|
+
url: sts_endpoint,
|
233
|
+
headers: vault_headers,
|
234
|
+
body: request_body
|
235
|
+
).headers
|
236
|
+
|
237
|
+
payload = {
|
238
|
+
role: role,
|
239
|
+
iam_http_request_method: request_method,
|
240
|
+
iam_request_url: Base64.strict_encode64(sts_endpoint),
|
241
|
+
iam_request_headers: Base64.strict_encode64(vault_headers.merge(sig4_headers).to_json),
|
242
|
+
iam_request_body: Base64.strict_encode64(request_body)
|
243
|
+
}
|
244
|
+
|
245
|
+
json = client.post(route, JSON.fast_generate(payload))
|
246
|
+
secret = Secret.decode(json)
|
247
|
+
client.token = secret.auth.client_token
|
248
|
+
return secret
|
249
|
+
end
|
250
|
+
|
251
|
+
# Authenticate via the GCP authentication method. If authentication is
|
252
|
+
# successful, the resulting token will be stored on the client and used
|
253
|
+
# for future requests.
|
254
|
+
#
|
255
|
+
# @example
|
256
|
+
# Vault.auth.gcp("read-only", "jwt", "gcp") #=> #<Vault::Secret lease_id="">
|
257
|
+
#
|
258
|
+
# @param [String] role
|
259
|
+
# @param [String] jwt
|
260
|
+
# jwt returned by the instance identity metadata, or iam api
|
261
|
+
# @param [String] path optional
|
262
|
+
# the path were the gcp auth backend is mounted
|
263
|
+
#
|
264
|
+
# @return [Secret]
|
265
|
+
def gcp(role, jwt, path = 'gcp')
|
266
|
+
payload = { role: role, jwt: jwt }
|
267
|
+
json = client.post("/v1/auth/#{CGI.escape(path)}/login", JSON.fast_generate(payload))
|
268
|
+
secret = Secret.decode(json)
|
269
|
+
client.token = secret.auth.client_token
|
270
|
+
return secret
|
271
|
+
end
|
272
|
+
|
273
|
+
# Authenticate via a TLS authentication method. If authentication is
|
274
|
+
# successful, the resulting token will be stored on the client and used
|
275
|
+
# for future requests.
|
276
|
+
#
|
277
|
+
# @example Sending raw pem contents
|
278
|
+
# Vault.auth.tls(pem_contents) #=> #<Vault::Secret lease_id="">
|
279
|
+
#
|
280
|
+
# @example Reading a pem from disk
|
281
|
+
# Vault.auth.tls(File.read("/path/to/my/certificate.pem")) #=> #<Vault::Secret lease_id="">
|
282
|
+
#
|
283
|
+
# @example Sending to a cert authentication backend mounted at a custom location
|
284
|
+
# Vault.auth.tls(pem_contents, 'custom/location') #=> #<Vault::Secret lease_id="">
|
285
|
+
#
|
286
|
+
# @param [String] pem (default: the configured SSL pem file or contents)
|
287
|
+
# The raw pem contents to use for the login procedure.
|
288
|
+
#
|
289
|
+
# @param [String] path (default: 'cert')
|
290
|
+
# The path to the auth backend to use for the login procedure.
|
291
|
+
#
|
292
|
+
# @param [String] name optional
|
293
|
+
# The named certificate role provided to the login request.
|
294
|
+
#
|
295
|
+
# @return [Secret]
|
296
|
+
def tls(pem = nil, path = 'cert', name: nil)
|
297
|
+
new_client = client.dup
|
298
|
+
new_client.ssl_pem_contents = pem if !pem.nil?
|
299
|
+
|
300
|
+
opts = {}
|
301
|
+
opts[:name] = name if name
|
302
|
+
json = new_client.post("/v1/auth/#{CGI.escape(path)}/login", opts)
|
303
|
+
secret = Secret.decode(json)
|
304
|
+
client.token = secret.auth.client_token
|
305
|
+
return secret
|
306
|
+
end
|
307
|
+
|
308
|
+
private
|
309
|
+
|
310
|
+
# Parse an AWS region from a STS endpoint
|
311
|
+
# STS in the China (Beijing) region (cn-north-1) is sts.cn-north-1.amazonaws.com.cn
|
312
|
+
# Take care changing below regex with that edge case in mind
|
313
|
+
#
|
314
|
+
# @param [String] sts_endpoint
|
315
|
+
# https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html
|
316
|
+
#
|
317
|
+
# @return [String] aws region
|
318
|
+
def region_from_sts_endpoint(sts_endpoint)
|
319
|
+
valid_sts_endpoint = %r{https:\/\/sts\.?(.*)\.amazonaws\.com}.match(sts_endpoint)
|
320
|
+
raise "Unable to parse STS endpoint #{sts_endpoint}" unless valid_sts_endpoint
|
321
|
+
valid_sts_endpoint[1].empty? ? 'us-east-1' : valid_sts_endpoint[1]
|
322
|
+
end
|
323
|
+
end
|
324
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
# Copyright (c) HashiCorp, Inc.
|
2
|
+
# SPDX-License-Identifier: MPL-2.0
|
3
|
+
|
4
|
+
require "json"
|
5
|
+
|
6
|
+
require_relative "secret"
|
7
|
+
require_relative "../client"
|
8
|
+
require_relative "../request"
|
9
|
+
require_relative "../response"
|
10
|
+
|
11
|
+
module Vault
|
12
|
+
class Client
|
13
|
+
# A proxy to the {AuthTLS} methods.
|
14
|
+
# @return [AuthTLS]
|
15
|
+
def auth_tls
|
16
|
+
@auth_tls ||= AuthTLS.new(self)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class AuthTLS < Request
|
21
|
+
# Saves a certificate with the given name and attributes. The certificate
|
22
|
+
# with the given name must already exist.
|
23
|
+
#
|
24
|
+
# @example
|
25
|
+
# Vault.auth_tls.set_certificate("web", {
|
26
|
+
# display_name: "web-cert",
|
27
|
+
# certificate: "-----BEGIN CERTIFICATE...",
|
28
|
+
# policies: "default",
|
29
|
+
# ttl: 3600,
|
30
|
+
# }) #=> true
|
31
|
+
#
|
32
|
+
# @param [String] name
|
33
|
+
# the name of the certificate
|
34
|
+
# @param [Hash] options
|
35
|
+
# @option options [String] :certificate
|
36
|
+
# The PEM-formatted CA certificate.
|
37
|
+
# @option options [String] :policies
|
38
|
+
# A comma-separated list of policies issued when authenticating with this
|
39
|
+
# CA.
|
40
|
+
# @option options [String] :display_name
|
41
|
+
# The name to display on tokens issued against this CA.
|
42
|
+
# @option options [Fixnum] :ttl
|
43
|
+
# The TTL period of the token, provided as a number of seconds.
|
44
|
+
#
|
45
|
+
# @return [true]
|
46
|
+
def set_certificate(name, options = {})
|
47
|
+
headers = extract_headers!(options)
|
48
|
+
client.post("/v1/auth/cert/certs/#{encode_path(name)}", JSON.fast_generate(options), headers)
|
49
|
+
return true
|
50
|
+
end
|
51
|
+
|
52
|
+
# Get the certificate by the given name. If a certificate does not exist by that name,
|
53
|
+
# +nil+ is returned.
|
54
|
+
#
|
55
|
+
# @example
|
56
|
+
# Vault.auth_tls.certificate("web") #=> #<Vault::Secret lease_id="...">
|
57
|
+
#
|
58
|
+
# @return [Secret, nil]
|
59
|
+
def certificate(name)
|
60
|
+
json = client.get("/v1/auth/cert/certs/#{encode_path(name)}")
|
61
|
+
return Secret.decode(json)
|
62
|
+
rescue HTTPError => e
|
63
|
+
return nil if e.code == 404
|
64
|
+
raise
|
65
|
+
end
|
66
|
+
|
67
|
+
# The list of certificates in vault auth backend.
|
68
|
+
#
|
69
|
+
# @example
|
70
|
+
# Vault.auth_tls.certificates #=> ["web"]
|
71
|
+
#
|
72
|
+
# @return [Array<String>]
|
73
|
+
def certificates(options = {})
|
74
|
+
headers = extract_headers!(options)
|
75
|
+
json = client.list("/v1/auth/cert/certs", options, headers)
|
76
|
+
return Secret.decode(json).data[:keys] || []
|
77
|
+
rescue HTTPError => e
|
78
|
+
return [] if e.code == 404
|
79
|
+
raise
|
80
|
+
end
|
81
|
+
|
82
|
+
# Delete the certificate with the given name. If a certificate does not exist, vault
|
83
|
+
# will not return an error.
|
84
|
+
#
|
85
|
+
# @example
|
86
|
+
# Vault.auth_tls.delete_certificate("web") #=> true
|
87
|
+
#
|
88
|
+
# @param [String] name
|
89
|
+
# the name of the certificate
|
90
|
+
def delete_certificate(name)
|
91
|
+
client.delete("/v1/auth/cert/certs/#{encode_path(name)}")
|
92
|
+
return true
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,245 @@
|
|
1
|
+
# Copyright (c) HashiCorp, Inc.
|
2
|
+
# SPDX-License-Identifier: MPL-2.0
|
3
|
+
|
4
|
+
require "json"
|
5
|
+
|
6
|
+
require_relative "secret"
|
7
|
+
require_relative "../client"
|
8
|
+
require_relative "../request"
|
9
|
+
require_relative "../response"
|
10
|
+
|
11
|
+
module Vault
|
12
|
+
class Client
|
13
|
+
# A proxy to the {AuthToken} methods.
|
14
|
+
# @return [AuthToken]
|
15
|
+
def auth_token
|
16
|
+
@auth_token ||= AuthToken.new(self)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class AuthToken < Request
|
21
|
+
# Lists all token accessors.
|
22
|
+
#
|
23
|
+
# @example Listing token accessors
|
24
|
+
# result = Vault.auth_token.accessors #=> #<Vault::Secret>
|
25
|
+
# result.data[:keys] #=> ["476ea048-ded5-4d07-eeea-938c6b4e43ec", "bb00c093-b7d3-b0e9-69cc-c4d85081165b"]
|
26
|
+
#
|
27
|
+
# @return [Array<Secret>]
|
28
|
+
def accessors(options = {})
|
29
|
+
headers = extract_headers!(options)
|
30
|
+
json = client.list("/v1/auth/token/accessors", options, headers)
|
31
|
+
return Secret.decode(json)
|
32
|
+
end
|
33
|
+
|
34
|
+
# Create an authentication token. Note that the parameters specified below
|
35
|
+
# are not validated and passed directly to the Vault server. Depending on
|
36
|
+
# the version of Vault in operation, some of these options may not work, and
|
37
|
+
# newer options may be available that are not listed here.
|
38
|
+
#
|
39
|
+
# @example Creating a token
|
40
|
+
# Vault.auth_token.create #=> #<Vault::Secret lease_id="">
|
41
|
+
#
|
42
|
+
# @example Creating a token assigned to policies with a wrap TTL
|
43
|
+
# Vault.auth_token.create(
|
44
|
+
# policies: ["myapp"],
|
45
|
+
# wrap_ttl: 500,
|
46
|
+
# )
|
47
|
+
#
|
48
|
+
# @param [Hash] options
|
49
|
+
# @option options [String] :id
|
50
|
+
# The ID of the client token - this can only be specified for root tokens
|
51
|
+
# @option options [Array<String>] :policies
|
52
|
+
# List of policies to apply to the token
|
53
|
+
# @option options [Fixnum, String] :wrap_ttl
|
54
|
+
# The number of seconds or a golang-formatted timestamp like "5s" or "10m"
|
55
|
+
# for the TTL on the wrapped response
|
56
|
+
# @option options [Hash<String, String>] :meta
|
57
|
+
# A map of metadata that is passed to audit backends
|
58
|
+
# @option options [Boolean] :no_parent
|
59
|
+
# Create a token without a parent - see also {#create_orphan}
|
60
|
+
# @option options [Boolean] :no_default_policy
|
61
|
+
# Create a token without the default policy attached
|
62
|
+
# @option options [Boolean] :renewable
|
63
|
+
# Set whether this token is renewable or not
|
64
|
+
# @option options [String] :display_name
|
65
|
+
# Name of the token
|
66
|
+
# @option options [Fixnum] :num_uses
|
67
|
+
# Maximum number of uses for the token
|
68
|
+
#
|
69
|
+
# @return [Secret]
|
70
|
+
def create(options = {})
|
71
|
+
headers = extract_headers!(options)
|
72
|
+
json = client.post("/v1/auth/token/create", JSON.fast_generate(options), headers)
|
73
|
+
return Secret.decode(json)
|
74
|
+
end
|
75
|
+
|
76
|
+
# Create an orphaned authentication token.
|
77
|
+
#
|
78
|
+
# @example
|
79
|
+
# Vault.auth_token.create_orphan #=> #<Vault::Secret lease_id="">
|
80
|
+
#
|
81
|
+
# @param (see #create)
|
82
|
+
# @option (see #create)
|
83
|
+
#
|
84
|
+
# @return [Secret]
|
85
|
+
def create_orphan(options = {})
|
86
|
+
headers = extract_headers!(options)
|
87
|
+
json = client.post("/v1/auth/token/create-orphan", JSON.fast_generate(options), headers)
|
88
|
+
return Secret.decode(json)
|
89
|
+
end
|
90
|
+
|
91
|
+
# Create an orphaned authentication token.
|
92
|
+
#
|
93
|
+
# @example
|
94
|
+
# Vault.auth_token.create_with_role("developer") #=> #<Vault::Secret lease_id="">
|
95
|
+
#
|
96
|
+
# @param [Hash] options
|
97
|
+
#
|
98
|
+
# @return [Secret]
|
99
|
+
def create_with_role(name, options = {})
|
100
|
+
headers = extract_headers!(options)
|
101
|
+
json = client.post("/v1/auth/token/create/#{encode_path(name)}", JSON.fast_generate(options), headers)
|
102
|
+
return Secret.decode(json)
|
103
|
+
end
|
104
|
+
|
105
|
+
# Lookup information about the current token.
|
106
|
+
#
|
107
|
+
# @example
|
108
|
+
# Vault.auth_token.lookup("abcd-...") #=> #<Vault::Secret lease_id="">
|
109
|
+
#
|
110
|
+
# @param [String] token
|
111
|
+
# @param [Hash] options
|
112
|
+
#
|
113
|
+
# @return [Secret]
|
114
|
+
def lookup(token, options = {})
|
115
|
+
headers = extract_headers!(options)
|
116
|
+
json = client.post("/v1/auth/token/lookup", JSON.fast_generate(
|
117
|
+
token: token,
|
118
|
+
), headers)
|
119
|
+
return Secret.decode(json)
|
120
|
+
end
|
121
|
+
|
122
|
+
# Lookup information about the given token accessor.
|
123
|
+
#
|
124
|
+
# @example
|
125
|
+
# Vault.auth_token.lookup_accessor("acbd-...") #=> #<Vault::Secret lease_id="">
|
126
|
+
#
|
127
|
+
# @param [String] accessor
|
128
|
+
# @param [Hash] options
|
129
|
+
def lookup_accessor(accessor, options = {})
|
130
|
+
headers = extract_headers!(options)
|
131
|
+
json = client.post("/v1/auth/token/lookup-accessor", JSON.fast_generate(
|
132
|
+
accessor: accessor,
|
133
|
+
), headers)
|
134
|
+
return Secret.decode(json)
|
135
|
+
end
|
136
|
+
|
137
|
+
# Lookup information about the given token.
|
138
|
+
#
|
139
|
+
# @example
|
140
|
+
# Vault.auth_token.lookup_self #=> #<Vault::Secret lease_id="">
|
141
|
+
#
|
142
|
+
# @return [Secret]
|
143
|
+
def lookup_self
|
144
|
+
json = client.get("/v1/auth/token/lookup-self")
|
145
|
+
return Secret.decode(json)
|
146
|
+
end
|
147
|
+
|
148
|
+
# Renew the given authentication token.
|
149
|
+
#
|
150
|
+
# @example
|
151
|
+
# Vault.auth_token.renew("abcd-1234") #=> #<Vault::Secret lease_id="">
|
152
|
+
#
|
153
|
+
# @param [String] token
|
154
|
+
# the auth token
|
155
|
+
# @param [Fixnum] increment
|
156
|
+
#
|
157
|
+
# @return [Secret]
|
158
|
+
def renew(token, increment = 0, options = {})
|
159
|
+
headers = extract_headers!(options)
|
160
|
+
json = client.put("/v1/auth/token/renew", JSON.fast_generate(
|
161
|
+
token: token,
|
162
|
+
increment: increment,
|
163
|
+
), headers)
|
164
|
+
return Secret.decode(json)
|
165
|
+
end
|
166
|
+
|
167
|
+
# Renews a lease associated with the calling token.
|
168
|
+
#
|
169
|
+
# @example
|
170
|
+
# Vault.auth_token.renew_self #=> #<Vault::Secret lease_id="">
|
171
|
+
#
|
172
|
+
# @param [Fixnum] increment
|
173
|
+
#
|
174
|
+
# @return [Secret]
|
175
|
+
def renew_self(increment = 0, options = {})
|
176
|
+
headers = extract_headers!(options)
|
177
|
+
json = client.put("/v1/auth/token/renew-self", JSON.fast_generate(
|
178
|
+
increment: increment,
|
179
|
+
), headers)
|
180
|
+
return Secret.decode(json)
|
181
|
+
end
|
182
|
+
|
183
|
+
# Revokes the token used to call it.
|
184
|
+
#
|
185
|
+
# @example
|
186
|
+
# Vault.auth_token.revoke_self #=> 204
|
187
|
+
#
|
188
|
+
# @return response code.
|
189
|
+
def revoke_self
|
190
|
+
client.post("/v1/auth/token/revoke-self")
|
191
|
+
end
|
192
|
+
|
193
|
+
# Revoke exactly the orphans at the id.
|
194
|
+
#
|
195
|
+
# @example
|
196
|
+
# Vault.auth_token.revoke_orphan("abcd-1234") #=> true
|
197
|
+
#
|
198
|
+
# @param [String] token
|
199
|
+
# the token to revoke
|
200
|
+
#
|
201
|
+
# @return [true]
|
202
|
+
def revoke_orphan(token, options = {})
|
203
|
+
headers = extract_headers!(options)
|
204
|
+
client.put("/v1/auth/token/revoke-orphan", JSON.fast_generate(
|
205
|
+
token: token,
|
206
|
+
), headers)
|
207
|
+
return true
|
208
|
+
end
|
209
|
+
|
210
|
+
# Revoke exactly the orphans at the id.
|
211
|
+
#
|
212
|
+
# @example
|
213
|
+
# Vault.auth_token.revoke_accessor("abcd-1234") #=> true
|
214
|
+
#
|
215
|
+
# @param [String] accessor
|
216
|
+
# the accessor to revoke
|
217
|
+
#
|
218
|
+
# @return [true]
|
219
|
+
def revoke_accessor(accessor, options = {})
|
220
|
+
headers = extract_headers!(options)
|
221
|
+
client.put("/v1/auth/token/revoke-accessor", JSON.fast_generate(
|
222
|
+
accessor: accessor,
|
223
|
+
), headers)
|
224
|
+
return true
|
225
|
+
end
|
226
|
+
|
227
|
+
# Revoke the token and all its children.
|
228
|
+
#
|
229
|
+
# @example
|
230
|
+
# Vault.auth_token.revoke("abcd-1234") #=> true
|
231
|
+
#
|
232
|
+
# @param [String] token
|
233
|
+
# the auth token
|
234
|
+
#
|
235
|
+
# @return [true]
|
236
|
+
def revoke(token, options = {})
|
237
|
+
headers = extract_headers!(options)
|
238
|
+
client.put("/v1/auth/token/revoke", JSON.fast_generate(
|
239
|
+
token: token,
|
240
|
+
), headers)
|
241
|
+
return true
|
242
|
+
end
|
243
|
+
alias_method :revoke_tree, :revoke
|
244
|
+
end
|
245
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# Copyright (c) HashiCorp, Inc.
|
2
|
+
# SPDX-License-Identifier: MPL-2.0
|
3
|
+
|
4
|
+
require_relative "../client"
|
5
|
+
require_relative "../response"
|
6
|
+
|
7
|
+
module Vault
|
8
|
+
# Help is the response from a help query.
|
9
|
+
class Help < Response
|
10
|
+
# @!attribute [r] help
|
11
|
+
# The help information.
|
12
|
+
# @return [String]
|
13
|
+
field :help
|
14
|
+
|
15
|
+
# @!attribute [r] see_also
|
16
|
+
# Additional help documentation to see.
|
17
|
+
# @return [String]
|
18
|
+
field :see_also
|
19
|
+
end
|
20
|
+
|
21
|
+
class Client
|
22
|
+
# Gets help for the given path.
|
23
|
+
#
|
24
|
+
# @example
|
25
|
+
# Vault.help("secret") #=> #<Vault::Help help="..." see_also="...">
|
26
|
+
#
|
27
|
+
# @param [String] path
|
28
|
+
# the path to get help for
|
29
|
+
#
|
30
|
+
# @return [Help]
|
31
|
+
def help(path)
|
32
|
+
json = self.get("/v1/#{EncodePath.encode_path(path)}", help: 1)
|
33
|
+
return Help.decode(json)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|