8020fb2098
* tlsutil: initial implementation of types/TLSVersion tlsutil: add test for parsing deprecated agent TLS version strings tlsutil: return TLSVersionInvalid with error tlsutil: start moving tlsutil cipher suite lookups over to types/tls tlsutil: rename tlsLookup to ParseTLSVersion, add cipherSuiteLookup agent: attempt to use types in runtime config agent: implement b.tlsVersion validation in config builder agent: fix tlsVersion nil check in builder tlsutil: update to renamed ParseTLSVersion and goTLSVersions tlsutil: fixup TestConfigurator_CommonTLSConfigTLSMinVersion tlsutil: disable invalid config parsing tests tlsutil: update tests auto_config: lookup old config strings from base.TLSMinVersion auto_config: update endpoint tests to use TLS types agent: update runtime_test to use TLS types agent: update TestRuntimeCinfig_Sanitize.golden agent: update config runtime tests to expect TLS types * website: update Consul agent tls_min_version values * agent: fixup TLS parsing and compilation errors * test: fixup lint issues in agent/config_runtime_test and tlsutil/config_test * tlsutil: add CHACHA20_POLY1305 cipher suites to goTLSCipherSuites * test: revert autoconfig tls min version fixtures to old format * types: add TLSVersions public function * agent: add warning for deprecated TLS version strings * agent: move agent config specific logic from tlsutil.ParseTLSVersion into agent config builder * tlsutil(BREAKING): change default TLS min version to TLS 1.2 * agent: move ParseCiphers logic from tlsutil into agent config builder * tlsutil: remove unused CipherString function * agent: fixup import for types package * Revert "tlsutil: remove unused CipherString function" This reverts commit 6ca7f6f58d268e617501b7db9500113c13bae70c. * agent: fixup config builder and runtime tests * tlsutil: fixup one remaining ListenerConfig -> ProtocolConfig * test: move TLS cipher suites parsing test from tlsutil into agent config builder tests * agent: remove parseCiphers helper from auto_config_endpoint_test * test: remove unused imports from tlsutil * agent: remove resolved FIXME comment * tlsutil: remove TODO and FIXME in cipher suite validation * agent: prevent setting inherited cipher suite config when TLS 1.3 is specified * changelog: add entry for converting agent config to TLS types * agent: remove FIXME in runtime test, this is covered in builder tests with invalid tls9 value now * tlsutil: remove config tests for values checked at agent config builder boundary * tlsutil: remove tls version check from loadProtocolConfig * tlsutil: remove tests and TODOs for logic checked in TestBuilder_tlsVersion and TestBuilder_tlsCipherSuites * website: update search link for supported Consul agent cipher suites * website: apply review suggestions for tls_min_version description * website: attempt to clean up markdown list formatting for tls_min_version * website: moar linebreaks to fix tls_min_version formatting * Revert "website: moar linebreaks to fix tls_min_version formatting" This reverts commit 38585927422f73ebf838a7663e566ac245f2a75c. * autoconfig: translate old values for TLSMinVersion * agent: rename var for translated value of deprecated TLS version value * Update agent/config/deprecated.go Co-authored-by: Dan Upton <daniel@floppy.co> * agent: fix lint issue * agent: fixup deprecated config test assertions for updated warning Co-authored-by: Dan Upton <daniel@floppy.co>
287 lines
9.5 KiB
Go
287 lines
9.5 KiB
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/hashicorp/consul/types"
|
|
)
|
|
|
|
type DeprecatedConfig struct {
|
|
// DEPRECATED (ACL-Legacy-Compat) - moved into the "acl.tokens" stanza
|
|
ACLAgentMasterToken *string `mapstructure:"acl_agent_master_token"`
|
|
// DEPRECATED (ACL-Legacy-Compat) - moved into the "acl.tokens" stanza
|
|
ACLAgentToken *string `mapstructure:"acl_agent_token"`
|
|
// DEPRECATED (ACL-Legacy-Compat) - moved into the "acl.tokens" stanza
|
|
ACLToken *string `mapstructure:"acl_token"`
|
|
// DEPRECATED (ACL-Legacy-Compat) - moved to "acl.enable_key_list_policy"
|
|
ACLEnableKeyListPolicy *bool `mapstructure:"acl_enable_key_list_policy"`
|
|
|
|
// DEPRECATED (ACL-Legacy-Compat) - moved into the "acl" stanza
|
|
ACLMasterToken *string `mapstructure:"acl_master_token"`
|
|
// DEPRECATED (ACL-Legacy-Compat) - moved into the "acl.tokens" stanza
|
|
ACLReplicationToken *string `mapstructure:"acl_replication_token"`
|
|
// DEPRECATED (ACL-Legacy-Compat) - moved to "acl.enable_token_replication"
|
|
EnableACLReplication *bool `mapstructure:"enable_acl_replication"`
|
|
|
|
// DEPRECATED (ACL-Legacy-Compat) - moved to "primary_datacenter"
|
|
ACLDatacenter *string `mapstructure:"acl_datacenter"`
|
|
|
|
// DEPRECATED (ACL-Legacy-Compat) - moved to "acl.default_policy"
|
|
ACLDefaultPolicy *string `mapstructure:"acl_default_policy"`
|
|
// DEPRECATED (ACL-Legacy-Compat) - moved to "acl.down_policy"
|
|
ACLDownPolicy *string `mapstructure:"acl_down_policy"`
|
|
// DEPRECATED (ACL-Legacy-Compat) - moved to "acl.token_ttl"
|
|
ACLTTL *string `mapstructure:"acl_ttl"`
|
|
|
|
// DEPRECATED(TLS) - moved to "tls.defaults.ca_file"
|
|
CAFile *string `mapstructure:"ca_file"`
|
|
|
|
// DEPRECATED(TLS) - moved to "tls.defaults.ca_path"
|
|
CAPath *string `mapstructure:"ca_path"`
|
|
|
|
// DEPRECATED(TLS) - moved to "tls.defaults.cert_file"
|
|
CertFile *string `mapstructure:"cert_file"`
|
|
|
|
// DEPRECATED(TLS) - moved to "tls.defaults.key_file"
|
|
KeyFile *string `mapstructure:"key_file"`
|
|
|
|
// DEPRECATED(TLS) - moved to "tls.defaults.tls_cipher_suites"
|
|
TLSCipherSuites *string `mapstructure:"tls_cipher_suites"`
|
|
|
|
// DEPRECATED(TLS) - moved to "tls.defaults.tls_min_version"
|
|
TLSMinVersion *string `mapstructure:"tls_min_version"`
|
|
|
|
// DEPRECATED(TLS) - moved to "tls.defaults.verify_incoming"
|
|
VerifyIncoming *bool `mapstructure:"verify_incoming"`
|
|
|
|
// DEPRECATED(TLS) - moved to "tls.https.verify_incoming"
|
|
VerifyIncomingHTTPS *bool `mapstructure:"verify_incoming_https"`
|
|
|
|
// DEPRECATED(TLS) - moved to "tls.internal_rpc.verify_incoming"
|
|
VerifyIncomingRPC *bool `mapstructure:"verify_incoming_rpc"`
|
|
|
|
// DEPRECATED(TLS) - moved to "tls.defaults.verify_outgoing"
|
|
VerifyOutgoing *bool `mapstructure:"verify_outgoing"`
|
|
|
|
// DEPRECATED(TLS) - moved to "tls.internal_rpc.verify_server_hostname"
|
|
VerifyServerHostname *bool `mapstructure:"verify_server_hostname"`
|
|
|
|
// DEPRECATED(TLS) - this isn't honored by crypto/tls anymore.
|
|
TLSPreferServerCipherSuites *bool `mapstructure:"tls_prefer_server_cipher_suites"`
|
|
}
|
|
|
|
func applyDeprecatedConfig(d *decodeTarget) (Config, []string) {
|
|
dep := d.DeprecatedConfig
|
|
var warns []string
|
|
|
|
// TODO(boxofrad): The DeprecatedConfig struct only holds fields that were once
|
|
// on the top-level Config struct (not nested fields e.g. ACL.Tokens) maybe we
|
|
// should rethink this a bit?
|
|
if d.Config.ACL.Tokens.AgentMaster != nil {
|
|
if d.Config.ACL.Tokens.AgentRecovery == nil {
|
|
d.Config.ACL.Tokens.AgentRecovery = d.Config.ACL.Tokens.AgentMaster
|
|
}
|
|
warns = append(warns, deprecationWarning("acl.tokens.agent_master", "acl.tokens.agent_recovery"))
|
|
}
|
|
|
|
if dep.ACLAgentMasterToken != nil {
|
|
if d.Config.ACL.Tokens.AgentRecovery == nil {
|
|
d.Config.ACL.Tokens.AgentRecovery = dep.ACLAgentMasterToken
|
|
}
|
|
warns = append(warns, deprecationWarning("acl_agent_master_token", "acl.tokens.agent_recovery"))
|
|
}
|
|
|
|
if dep.ACLAgentToken != nil {
|
|
if d.Config.ACL.Tokens.Agent == nil {
|
|
d.Config.ACL.Tokens.Agent = dep.ACLAgentToken
|
|
}
|
|
warns = append(warns, deprecationWarning("acl_agent_token", "acl.tokens.agent"))
|
|
}
|
|
|
|
if dep.ACLToken != nil {
|
|
if d.Config.ACL.Tokens.Default == nil {
|
|
d.Config.ACL.Tokens.Default = dep.ACLToken
|
|
}
|
|
warns = append(warns, deprecationWarning("acl_token", "acl.tokens.default"))
|
|
}
|
|
|
|
if d.Config.ACL.Tokens.Master != nil {
|
|
if d.Config.ACL.Tokens.InitialManagement == nil {
|
|
d.Config.ACL.Tokens.InitialManagement = d.Config.ACL.Tokens.Master
|
|
}
|
|
warns = append(warns, deprecationWarning("acl.tokens.master", "acl.tokens.initial_management"))
|
|
}
|
|
|
|
if dep.ACLMasterToken != nil {
|
|
if d.Config.ACL.Tokens.InitialManagement == nil {
|
|
d.Config.ACL.Tokens.InitialManagement = dep.ACLMasterToken
|
|
}
|
|
warns = append(warns, deprecationWarning("acl_master_token", "acl.tokens.initial_management"))
|
|
}
|
|
|
|
if dep.ACLReplicationToken != nil {
|
|
if d.Config.ACL.Tokens.Replication == nil {
|
|
d.Config.ACL.Tokens.Replication = dep.ACLReplicationToken
|
|
}
|
|
d.Config.ACL.TokenReplication = pBool(true)
|
|
warns = append(warns, deprecationWarning("acl_replication_token", "acl.tokens.replication"))
|
|
}
|
|
|
|
if dep.EnableACLReplication != nil {
|
|
if d.Config.ACL.TokenReplication == nil {
|
|
d.Config.ACL.TokenReplication = dep.EnableACLReplication
|
|
}
|
|
warns = append(warns, deprecationWarning("enable_acl_replication", "acl.enable_token_replication"))
|
|
}
|
|
|
|
if dep.ACLDatacenter != nil {
|
|
if d.Config.PrimaryDatacenter == nil {
|
|
d.Config.PrimaryDatacenter = dep.ACLDatacenter
|
|
}
|
|
|
|
// when the acl_datacenter config is used it implicitly enables acls
|
|
d.Config.ACL.Enabled = pBool(true)
|
|
warns = append(warns, deprecationWarning("acl_datacenter", "primary_datacenter"))
|
|
}
|
|
|
|
if dep.ACLDefaultPolicy != nil {
|
|
if d.Config.ACL.DefaultPolicy == nil {
|
|
d.Config.ACL.DefaultPolicy = dep.ACLDefaultPolicy
|
|
}
|
|
warns = append(warns, deprecationWarning("acl_default_policy", "acl.default_policy"))
|
|
}
|
|
|
|
if dep.ACLDownPolicy != nil {
|
|
if d.Config.ACL.DownPolicy == nil {
|
|
d.Config.ACL.DownPolicy = dep.ACLDownPolicy
|
|
}
|
|
warns = append(warns, deprecationWarning("acl_down_policy", "acl.down_policy"))
|
|
}
|
|
|
|
if dep.ACLTTL != nil {
|
|
if d.Config.ACL.TokenTTL == nil {
|
|
d.Config.ACL.TokenTTL = dep.ACLTTL
|
|
}
|
|
warns = append(warns, deprecationWarning("acl_ttl", "acl.token_ttl"))
|
|
}
|
|
|
|
if dep.ACLEnableKeyListPolicy != nil {
|
|
if d.Config.ACL.EnableKeyListPolicy == nil {
|
|
d.Config.ACL.EnableKeyListPolicy = dep.ACLEnableKeyListPolicy
|
|
}
|
|
warns = append(warns, deprecationWarning("acl_enable_key_list_policy", "acl.enable_key_list_policy"))
|
|
}
|
|
|
|
warns = append(warns, applyDeprecatedTLSConfig(dep, &d.Config)...)
|
|
|
|
return d.Config, warns
|
|
}
|
|
|
|
func applyDeprecatedTLSConfig(dep DeprecatedConfig, cfg *Config) []string {
|
|
var warns []string
|
|
|
|
defaults := &cfg.TLS.Defaults
|
|
internalRPC := &cfg.TLS.InternalRPC
|
|
https := &cfg.TLS.HTTPS
|
|
|
|
if v := dep.CAFile; v != nil {
|
|
if defaults.CAFile == nil {
|
|
defaults.CAFile = v
|
|
}
|
|
warns = append(warns, deprecationWarning("ca_file", "tls.defaults.ca_file"))
|
|
}
|
|
|
|
if v := dep.CAPath; v != nil {
|
|
if defaults.CAPath == nil {
|
|
defaults.CAPath = v
|
|
}
|
|
warns = append(warns, deprecationWarning("ca_path", "tls.defaults.ca_path"))
|
|
}
|
|
|
|
if v := dep.CertFile; v != nil {
|
|
if defaults.CertFile == nil {
|
|
defaults.CertFile = v
|
|
}
|
|
warns = append(warns, deprecationWarning("cert_file", "tls.defaults.cert_file"))
|
|
}
|
|
|
|
if v := dep.KeyFile; v != nil {
|
|
if defaults.KeyFile == nil {
|
|
defaults.KeyFile = v
|
|
}
|
|
warns = append(warns, deprecationWarning("key_file", "tls.defaults.key_file"))
|
|
}
|
|
|
|
if v := dep.TLSCipherSuites; v != nil {
|
|
if defaults.TLSCipherSuites == nil {
|
|
defaults.TLSCipherSuites = v
|
|
}
|
|
warns = append(warns, deprecationWarning("tls_cipher_suites", "tls.defaults.tls_cipher_suites"))
|
|
}
|
|
|
|
if v := dep.TLSMinVersion; v != nil {
|
|
if defaults.TLSMinVersion == nil {
|
|
// NOTE: This inner check for deprecated values should eventually be
|
|
// removed
|
|
if version, ok := types.DeprecatedConsulAgentTLSVersions[*v]; ok {
|
|
// Log warning about deprecated config values
|
|
warns = append(warns, fmt.Sprintf("'tls_min_version' value '%s' is deprecated, please specify '%s' instead", *v, version))
|
|
versionString := version.String()
|
|
defaults.TLSMinVersion = &versionString
|
|
} else {
|
|
defaults.TLSMinVersion = v
|
|
}
|
|
}
|
|
warns = append(warns, deprecationWarning("tls_min_version", "tls.defaults.tls_min_version"))
|
|
}
|
|
|
|
if v := dep.VerifyIncoming; v != nil {
|
|
if defaults.VerifyIncoming == nil {
|
|
defaults.VerifyIncoming = v
|
|
}
|
|
warns = append(warns, deprecationWarning("verify_incoming", "tls.defaults.verify_incoming"))
|
|
}
|
|
|
|
if v := dep.VerifyIncomingHTTPS; v != nil {
|
|
if https.VerifyIncoming == nil {
|
|
https.VerifyIncoming = v
|
|
}
|
|
warns = append(warns, deprecationWarning("verify_incoming_https", "tls.https.verify_incoming"))
|
|
}
|
|
|
|
if v := dep.VerifyIncomingRPC; v != nil {
|
|
if internalRPC.VerifyIncoming == nil {
|
|
internalRPC.VerifyIncoming = v
|
|
}
|
|
warns = append(warns, deprecationWarning("verify_incoming_rpc", "tls.internal_rpc.verify_incoming"))
|
|
}
|
|
|
|
if v := dep.VerifyOutgoing; v != nil {
|
|
if defaults.VerifyOutgoing == nil {
|
|
defaults.VerifyOutgoing = v
|
|
}
|
|
warns = append(warns, deprecationWarning("verify_outgoing", "tls.defaults.verify_outgoing"))
|
|
}
|
|
|
|
if v := dep.VerifyServerHostname; v != nil {
|
|
if internalRPC.VerifyServerHostname == nil {
|
|
internalRPC.VerifyServerHostname = v
|
|
}
|
|
warns = append(warns, deprecationWarning("verify_server_hostname", "tls.internal_rpc.verify_server_hostname"))
|
|
}
|
|
|
|
if dep.TLSPreferServerCipherSuites != nil {
|
|
warns = append(warns, "The 'tls_prefer_server_cipher_suites' field is deprecated and will be ignored.")
|
|
}
|
|
|
|
return warns
|
|
}
|
|
|
|
func deprecationWarning(old, new string) string {
|
|
return fmt.Sprintf("The '%v' field is deprecated. Use the '%v' field instead.", old, new)
|
|
}
|
|
|
|
func pBool(v bool) *bool {
|
|
return &v
|
|
}
|