settings_reader-vault_resolver 0.2.1 → 0.2.4
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/lib/settings_reader/vault_resolver/entry.rb +4 -0
- data/lib/settings_reader/vault_resolver/instance.rb +11 -0
- data/lib/settings_reader/vault_resolver/logging.rb +40 -0
- data/lib/settings_reader/vault_resolver/refresher.rb +18 -7
- data/lib/settings_reader/vault_resolver/version.rb +1 -1
- data/lib/settings_reader/vault_resolver.rb +16 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ce73ad9e3b10d933922778fa85c1f2fecc4f33dd0041a83c4b6b034229c7574f
|
4
|
+
data.tar.gz: eef4339b9136147de04ba2e85648fbf2328c3771fed427e600edf544683c1c98
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ddab1303046474d0da7916d9e64803d9c599f1ee80e2d50e2c96e4cc73ff17f5d4e0b45dd0db37447d3553596135883ca088868800c588f9ceffb7113457bfe4
|
7
|
+
data.tar.gz: 6f31f31fccc0281890df52503a9b8c353229fe7cc6f4233eb251e69ed245ea63acdc8bd4cd9e9e5cd1e0f6ef00c448ba30e0afb732105d2322a0ae338180438d
|
@@ -4,6 +4,8 @@ module SettingsReader
|
|
4
4
|
module VaultResolver
|
5
5
|
# Resolver class for Settings Reader
|
6
6
|
class Instance
|
7
|
+
include Logging
|
8
|
+
|
7
9
|
IDENTIFIER = 'vault://'.freeze
|
8
10
|
DATABASE_MOUNT = 'database'.freeze
|
9
11
|
|
@@ -15,6 +17,7 @@ module SettingsReader
|
|
15
17
|
|
16
18
|
# Expect value in format `vault://mount/path/to/secret?attribute_name`
|
17
19
|
def resolve(value, _path)
|
20
|
+
debug { "Resolving Vault secret at #{value}" }
|
18
21
|
address = SettingsReader::VaultResolver::Address.new(value)
|
19
22
|
entry = fetch_entry(address)
|
20
23
|
entry&.value_for(address.attribute)
|
@@ -22,14 +25,18 @@ module SettingsReader
|
|
22
25
|
|
23
26
|
# Resolve KV secret
|
24
27
|
def kv_secret(address)
|
28
|
+
debug { "Fetching new kv secret at: #{address}" }
|
25
29
|
Vault.kv(address.mount).read(address.path)
|
26
30
|
rescue Vault::HTTPClientError => e
|
31
|
+
error { "Error retrieving secret at: #{address}: #{e.message}" }
|
27
32
|
raise SettingsReader::VaultResolver::Error, e.message
|
28
33
|
end
|
29
34
|
|
30
35
|
def database_secret(address)
|
36
|
+
debug { "Fetching new database secret at: #{address}" }
|
31
37
|
Vault.logical.read(address.full_path)
|
32
38
|
rescue Vault::HTTPClientError => e
|
39
|
+
error { "Error retrieving database secret: #{address}: #{e.message}" }
|
33
40
|
return nil if e.message.include?('* unknown role')
|
34
41
|
|
35
42
|
raise SettingsReader::VaultResolver::Error, e.message
|
@@ -39,8 +46,12 @@ module SettingsReader
|
|
39
46
|
|
40
47
|
def fetch_entry(address)
|
41
48
|
cache.fetch(address) do
|
49
|
+
info { "Retrieving new secret at: #{address}" }
|
42
50
|
if (secret = address.mount == DATABASE_MOUNT ? database_secret(address) : kv_secret(address))
|
51
|
+
debug { "Retrieved secret at: #{address}" }
|
43
52
|
SettingsReader::VaultResolver::Entry.new(address, secret)
|
53
|
+
else
|
54
|
+
debug { "Secret not retrieved: #{address}" }
|
44
55
|
end
|
45
56
|
end
|
46
57
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module SettingsReader
|
2
|
+
module VaultResolver
|
3
|
+
# Methods for centralized logging
|
4
|
+
module Logging
|
5
|
+
def debug(&block)
|
6
|
+
logger.debug do
|
7
|
+
"[VaultResolver] #{block.call}"
|
8
|
+
end
|
9
|
+
nil
|
10
|
+
end
|
11
|
+
|
12
|
+
def info(&block)
|
13
|
+
logger.info do
|
14
|
+
"[VaultResolver] #{block.call}"
|
15
|
+
end
|
16
|
+
nil
|
17
|
+
end
|
18
|
+
|
19
|
+
def warn(&block)
|
20
|
+
logger.warn do
|
21
|
+
"[VaultResolver] #{block.call}"
|
22
|
+
end
|
23
|
+
nil
|
24
|
+
end
|
25
|
+
|
26
|
+
def error(&block)
|
27
|
+
logger.error do
|
28
|
+
"[VaultResolver] #{block.call}"
|
29
|
+
end
|
30
|
+
nil
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def logger
|
36
|
+
SettingsReader::VaultResolver.logger
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -2,6 +2,8 @@ module SettingsReader
|
|
2
2
|
module VaultResolver
|
3
3
|
# Vault Lease refresher task
|
4
4
|
class Refresher
|
5
|
+
include Logging
|
6
|
+
|
5
7
|
DEFAULT_RENEW_DELAY = 200
|
6
8
|
REFRESH_INTERVAL = 60
|
7
9
|
|
@@ -10,15 +12,24 @@ module SettingsReader
|
|
10
12
|
end
|
11
13
|
|
12
14
|
def refresh
|
15
|
+
info { 'Starting Vault lease refreshing' }
|
13
16
|
@cache.entries.each do |entry|
|
14
|
-
|
15
|
-
next unless entry.expires_in < DEFAULT_RENEW_DELAY
|
16
|
-
|
17
|
-
entry.renew
|
18
|
-
rescue SettingsReader::VaultResolver::Error => _e
|
19
|
-
# TODO: Log error in future. Think if we can request new secret again.
|
20
|
-
# Continue renewal.
|
17
|
+
refresh_entry(entry)
|
21
18
|
end
|
19
|
+
info { 'Finished Vault lease refreshing' }
|
20
|
+
end
|
21
|
+
|
22
|
+
def refresh_entry(entry)
|
23
|
+
debug { "Checking lease for #{entry}. Leased?: #{entry.leased?}. Expires in: #{entry.expires_in}s" }
|
24
|
+
return unless entry.leased?
|
25
|
+
return unless entry.expires_in < DEFAULT_RENEW_DELAY
|
26
|
+
|
27
|
+
info { "Refreshing lease for #{entry}. Expires in: #{entry.expires_in}" }
|
28
|
+
entry.renew
|
29
|
+
info { "Lease renewed for #{entry}. Expires in: #{entry.expires_in}" }
|
30
|
+
rescue SettingsReader::VaultResolver::Error => e
|
31
|
+
error { "Error refreshing lease for #{entry}: #{e.message}" }
|
32
|
+
# Continue renewal.
|
22
33
|
end
|
23
34
|
|
24
35
|
def self.refresh_task(cache)
|
@@ -1,6 +1,9 @@
|
|
1
|
+
require 'logger'
|
1
2
|
require 'concurrent/timer_task'
|
3
|
+
|
2
4
|
require 'settings_reader'
|
3
5
|
require 'settings_reader/vault_resolver/version'
|
6
|
+
require 'settings_reader/vault_resolver/logging'
|
4
7
|
require 'settings_reader/vault_resolver/address'
|
5
8
|
require 'settings_reader/vault_resolver/entry'
|
6
9
|
require 'settings_reader/vault_resolver/cache'
|
@@ -16,11 +19,24 @@ module SettingsReader
|
|
16
19
|
attr_accessor :cache, :refresher_timer_task
|
17
20
|
end
|
18
21
|
|
22
|
+
def self.logger
|
23
|
+
return @logger if @logger
|
24
|
+
return @logger = Rails.logger if (defined? Rails) && Rails.logger
|
25
|
+
|
26
|
+
@logger = Logger.new($stdout, level: Logger::INFO)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.logger=(logger)
|
30
|
+
@logger = logger
|
31
|
+
end
|
32
|
+
|
19
33
|
def self.setup_cache
|
34
|
+
logger.debug { '[VaultResolver] Setting up secrets cache' }
|
20
35
|
self.cache ||= SettingsReader::VaultResolver::Cache.new
|
21
36
|
end
|
22
37
|
|
23
38
|
def self.setup_lease_refresher
|
39
|
+
logger.debug { '[VaultResolver] Setting up lease resolver task' }
|
24
40
|
self.refresher_timer_task ||= SettingsReader::VaultResolver::Refresher.refresh_task(self.cache)
|
25
41
|
self.refresher_timer_task.execute
|
26
42
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: settings_reader-vault_resolver
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Volodymyr Mykhailyk
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-03-
|
11
|
+
date: 2022-03-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -84,6 +84,7 @@ files:
|
|
84
84
|
- lib/settings_reader/vault_resolver/entry.rb
|
85
85
|
- lib/settings_reader/vault_resolver/helpers/k8s_auth.rb
|
86
86
|
- lib/settings_reader/vault_resolver/instance.rb
|
87
|
+
- lib/settings_reader/vault_resolver/logging.rb
|
87
88
|
- lib/settings_reader/vault_resolver/patches/authenticate.rb
|
88
89
|
- lib/settings_reader/vault_resolver/refresher.rb
|
89
90
|
- lib/settings_reader/vault_resolver/version.rb
|