mirror of
				https://github.com/optim-enterprises-bv/vault.git
				synced 2025-10-31 02:28:09 +00:00 
			
		
		
		
	feature: secrets/auth plugin multiplexing (#14946)
* enable registering backend muxed plugins in plugin catalog * set the sysview on the pluginconfig to allow enabling secrets/auth plugins * store backend instances in map * store single implementations in the instances map cleanup instance map and ensure we don't deadlock * fix system backend unit tests move GetMultiplexIDFromContext to pluginutil package fix pluginutil test fix dbplugin ut * return error(s) if we can't get the plugin client update comments * refactor/move GetMultiplexIDFromContext test * add changelog * remove unnecessary field on pluginClient * add unit tests to PluginCatalog for secrets/auth plugins * fix comment * return pluginClient from TestRunTestPlugin * add multiplexed backend test * honor metadatamode value in newbackend pluginconfig * check that connection exists on cleanup * add automtls to secrets/auth plugins * don't remove apiclientmeta parsing * use formatting directive for fmt.Errorf * fix ut: remove tls provider func * remove tlsproviderfunc from backend plugin tests * use env var to prevent test plugin from running as a unit test * WIP: remove lazy loading * move non lazy loaded backend to new package * use version wrapper for backend plugin factory * remove backendVersionWrapper type * implement getBackendPluginType for plugin catalog * handle backend plugin v4 registration * add plugin automtls env guard * modify plugin factory to determine the backend to use * remove old pluginsets from v5 and log pid in plugin catalog * add reload mechanism via context * readd v3 and v4 to pluginset * call cleanup from reload if non-muxed * move v5 backend code to new package * use context reload for for ErrPluginShutdown case * add wrapper on v5 backend * fix run config UTs * fix unit tests - use v4/v5 mapping for plugin versions - fix test build err - add reload method on fakePluginClient - add multiplexed cases for integration tests * remove comment and update AutoMTLS field in test * remove comment * remove errwrap and unused context * only support metadatamode false for v5 backend plugins * update plugin catalog errors * use const for env variables * rename locks and remove unused * remove unneeded nil check * improvements based on staticcheck recommendations * use const for single implementation string * use const for context key * use info default log level * move pid to pluginClient struct * remove v3 and v4 from multiplexed plugin set * return from reload when non-multiplexed * update automtls env string * combine getBackend and getBrokeredClient * update comments for plugin reload, Backend return val and log * revert Backend return type * allow non-muxed plugins to serve v5 * move v5 code to existing sdk plugin package * do next export sdk fields now that we have removed extra plugin pkg * set TLSProvider in ServeMultiplex for backwards compat * use bool to flag multiplexing support on grpc backend server * revert userpass main.go * refactor plugin sdk - update comments - make use of multiplexing boolean and single implementation ID const * update comment and use multierr * attempt v4 if dispense fails on getPluginTypeForUnknown * update comments on sdk plugin backend
This commit is contained in:
		 John-Michael Faircloth
					John-Michael Faircloth
				
			
				
					committed by
					
						 GitHub
						GitHub
					
				
			
			
				
	
			
			
			 GitHub
						GitHub
					
				
			
						parent
						
							e75173a894
						
					
				
				
					commit
					07927e036c
				
			| @@ -16,7 +16,11 @@ import ( | ||||
| 	"github.com/hashicorp/errwrap" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| const ( | ||||
| 	// PluginAutoMTLSEnv is used to ensure AutoMTLS is used. This will override | ||||
| 	// setting a TLSProviderFunc for a plugin. | ||||
| 	PluginAutoMTLSEnv = "VAULT_PLUGIN_AUTOMTLS_ENABLED" | ||||
|  | ||||
| 	// PluginMetadataModeEnv is an ENV name used to disable TLS communication | ||||
| 	// to bootstrap mounting plugins. | ||||
| 	PluginMetadataModeEnv = "VAULT_PLUGIN_METADATA_MODE" | ||||
| @@ -24,51 +28,51 @@ var ( | ||||
| 	// PluginUnwrapTokenEnv is the ENV name used to pass unwrap tokens to the | ||||
| 	// plugin. | ||||
| 	PluginUnwrapTokenEnv = "VAULT_UNWRAP_TOKEN" | ||||
|  | ||||
| 	// sudoPaths is a map containing the paths that require a token's policy | ||||
| 	// to have the "sudo" capability. The keys are the paths as strings, in | ||||
| 	// the same format as they are returned by the OpenAPI spec. The values | ||||
| 	// are the regular expressions that can be used to test whether a given | ||||
| 	// path matches that path or not (useful specifically for the paths that | ||||
| 	// contain templated fields.) | ||||
| 	sudoPaths = map[string]*regexp.Regexp{ | ||||
| 		"/auth/token/accessors/":                        regexp.MustCompile(`^/auth/token/accessors/$`), | ||||
| 		"/pki/root":                                     regexp.MustCompile(`^/pki/root$`), | ||||
| 		"/pki/root/sign-self-issued":                    regexp.MustCompile(`^/pki/root/sign-self-issued$`), | ||||
| 		"/sys/audit":                                    regexp.MustCompile(`^/sys/audit$`), | ||||
| 		"/sys/audit/{path}":                             regexp.MustCompile(`^/sys/audit/.+$`), | ||||
| 		"/sys/auth/{path}":                              regexp.MustCompile(`^/sys/auth/.+$`), | ||||
| 		"/sys/auth/{path}/tune":                         regexp.MustCompile(`^/sys/auth/.+/tune$`), | ||||
| 		"/sys/config/auditing/request-headers":          regexp.MustCompile(`^/sys/config/auditing/request-headers$`), | ||||
| 		"/sys/config/auditing/request-headers/{header}": regexp.MustCompile(`^/sys/config/auditing/request-headers/.+$`), | ||||
| 		"/sys/config/cors":                              regexp.MustCompile(`^/sys/config/cors$`), | ||||
| 		"/sys/config/ui/headers/":                       regexp.MustCompile(`^/sys/config/ui/headers/$`), | ||||
| 		"/sys/config/ui/headers/{header}":               regexp.MustCompile(`^/sys/config/ui/headers/.+$`), | ||||
| 		"/sys/leases":                                   regexp.MustCompile(`^/sys/leases$`), | ||||
| 		"/sys/leases/lookup/":                           regexp.MustCompile(`^/sys/leases/lookup/$`), | ||||
| 		"/sys/leases/lookup/{prefix}":                   regexp.MustCompile(`^/sys/leases/lookup/.+$`), | ||||
| 		"/sys/leases/revoke-force/{prefix}":             regexp.MustCompile(`^/sys/leases/revoke-force/.+$`), | ||||
| 		"/sys/leases/revoke-prefix/{prefix}":            regexp.MustCompile(`^/sys/leases/revoke-prefix/.+$`), | ||||
| 		"/sys/plugins/catalog/{name}":                   regexp.MustCompile(`^/sys/plugins/catalog/[^/]+$`), | ||||
| 		"/sys/plugins/catalog/{type}":                   regexp.MustCompile(`^/sys/plugins/catalog/[\w-]+$`), | ||||
| 		"/sys/plugins/catalog/{type}/{name}":            regexp.MustCompile(`^/sys/plugins/catalog/[\w-]+/[^/]+$`), | ||||
| 		"/sys/raw":                                      regexp.MustCompile(`^/sys/raw$`), | ||||
| 		"/sys/raw/{path}":                               regexp.MustCompile(`^/sys/raw/.+$`), | ||||
| 		"/sys/remount":                                  regexp.MustCompile(`^/sys/remount$`), | ||||
| 		"/sys/revoke-force/{prefix}":                    regexp.MustCompile(`^/sys/revoke-force/.+$`), | ||||
| 		"/sys/revoke-prefix/{prefix}":                   regexp.MustCompile(`^/sys/revoke-prefix/.+$`), | ||||
| 		"/sys/rotate":                                   regexp.MustCompile(`^/sys/rotate$`), | ||||
|  | ||||
| 		// enterprise-only paths | ||||
| 		"/sys/replication/dr/primary/secondary-token":          regexp.MustCompile(`^/sys/replication/dr/primary/secondary-token$`), | ||||
| 		"/sys/replication/performance/primary/secondary-token": regexp.MustCompile(`^/sys/replication/performance/primary/secondary-token$`), | ||||
| 		"/sys/replication/primary/secondary-token":             regexp.MustCompile(`^/sys/replication/primary/secondary-token$`), | ||||
| 		"/sys/replication/reindex":                             regexp.MustCompile(`^/sys/replication/reindex$`), | ||||
| 		"/sys/storage/raft/snapshot-auto/config/":              regexp.MustCompile(`^/sys/storage/raft/snapshot-auto/config/$`), | ||||
| 		"/sys/storage/raft/snapshot-auto/config/{name}":        regexp.MustCompile(`^/sys/storage/raft/snapshot-auto/config/[^/]+$`), | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| // sudoPaths is a map containing the paths that require a token's policy | ||||
| // to have the "sudo" capability. The keys are the paths as strings, in | ||||
| // the same format as they are returned by the OpenAPI spec. The values | ||||
| // are the regular expressions that can be used to test whether a given | ||||
| // path matches that path or not (useful specifically for the paths that | ||||
| // contain templated fields.) | ||||
| var sudoPaths = map[string]*regexp.Regexp{ | ||||
| 	"/auth/token/accessors/":                        regexp.MustCompile(`^/auth/token/accessors/$`), | ||||
| 	"/pki/root":                                     regexp.MustCompile(`^/pki/root$`), | ||||
| 	"/pki/root/sign-self-issued":                    regexp.MustCompile(`^/pki/root/sign-self-issued$`), | ||||
| 	"/sys/audit":                                    regexp.MustCompile(`^/sys/audit$`), | ||||
| 	"/sys/audit/{path}":                             regexp.MustCompile(`^/sys/audit/.+$`), | ||||
| 	"/sys/auth/{path}":                              regexp.MustCompile(`^/sys/auth/.+$`), | ||||
| 	"/sys/auth/{path}/tune":                         regexp.MustCompile(`^/sys/auth/.+/tune$`), | ||||
| 	"/sys/config/auditing/request-headers":          regexp.MustCompile(`^/sys/config/auditing/request-headers$`), | ||||
| 	"/sys/config/auditing/request-headers/{header}": regexp.MustCompile(`^/sys/config/auditing/request-headers/.+$`), | ||||
| 	"/sys/config/cors":                              regexp.MustCompile(`^/sys/config/cors$`), | ||||
| 	"/sys/config/ui/headers/":                       regexp.MustCompile(`^/sys/config/ui/headers/$`), | ||||
| 	"/sys/config/ui/headers/{header}":               regexp.MustCompile(`^/sys/config/ui/headers/.+$`), | ||||
| 	"/sys/leases":                                   regexp.MustCompile(`^/sys/leases$`), | ||||
| 	"/sys/leases/lookup/":                           regexp.MustCompile(`^/sys/leases/lookup/$`), | ||||
| 	"/sys/leases/lookup/{prefix}":                   regexp.MustCompile(`^/sys/leases/lookup/.+$`), | ||||
| 	"/sys/leases/revoke-force/{prefix}":             regexp.MustCompile(`^/sys/leases/revoke-force/.+$`), | ||||
| 	"/sys/leases/revoke-prefix/{prefix}":            regexp.MustCompile(`^/sys/leases/revoke-prefix/.+$`), | ||||
| 	"/sys/plugins/catalog/{name}":                   regexp.MustCompile(`^/sys/plugins/catalog/[^/]+$`), | ||||
| 	"/sys/plugins/catalog/{type}":                   regexp.MustCompile(`^/sys/plugins/catalog/[\w-]+$`), | ||||
| 	"/sys/plugins/catalog/{type}/{name}":            regexp.MustCompile(`^/sys/plugins/catalog/[\w-]+/[^/]+$`), | ||||
| 	"/sys/raw":                                      regexp.MustCompile(`^/sys/raw$`), | ||||
| 	"/sys/raw/{path}":                               regexp.MustCompile(`^/sys/raw/.+$`), | ||||
| 	"/sys/remount":                                  regexp.MustCompile(`^/sys/remount$`), | ||||
| 	"/sys/revoke-force/{prefix}":                    regexp.MustCompile(`^/sys/revoke-force/.+$`), | ||||
| 	"/sys/revoke-prefix/{prefix}":                   regexp.MustCompile(`^/sys/revoke-prefix/.+$`), | ||||
| 	"/sys/rotate":                                   regexp.MustCompile(`^/sys/rotate$`), | ||||
|  | ||||
| 	// enterprise-only paths | ||||
| 	"/sys/replication/dr/primary/secondary-token":          regexp.MustCompile(`^/sys/replication/dr/primary/secondary-token$`), | ||||
| 	"/sys/replication/performance/primary/secondary-token": regexp.MustCompile(`^/sys/replication/performance/primary/secondary-token$`), | ||||
| 	"/sys/replication/primary/secondary-token":             regexp.MustCompile(`^/sys/replication/primary/secondary-token$`), | ||||
| 	"/sys/replication/reindex":                             regexp.MustCompile(`^/sys/replication/reindex$`), | ||||
| 	"/sys/storage/raft/snapshot-auto/config/":              regexp.MustCompile(`^/sys/storage/raft/snapshot-auto/config/$`), | ||||
| 	"/sys/storage/raft/snapshot-auto/config/{name}":        regexp.MustCompile(`^/sys/storage/raft/snapshot-auto/config/[^/]+$`), | ||||
| } | ||||
|  | ||||
| // PluginAPIClientMeta is a helper that plugins can use to configure TLS connections | ||||
| // back to Vault. | ||||
| type PluginAPIClientMeta struct { | ||||
| @@ -120,7 +124,7 @@ func VaultPluginTLSProvider(apiTLSConfig *TLSConfig) func() (*tls.Config, error) | ||||
| // VaultPluginTLSProviderContext is run inside a plugin and retrieves the response | ||||
| // wrapped TLS certificate from vault. It returns a configured TLS Config. | ||||
| func VaultPluginTLSProviderContext(ctx context.Context, apiTLSConfig *TLSConfig) func() (*tls.Config, error) { | ||||
| 	if os.Getenv(PluginMetadataModeEnv) == "true" { | ||||
| 	if os.Getenv(PluginAutoMTLSEnv) == "true" || os.Getenv(PluginMetadataModeEnv) == "true" { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user