277c41d336
* xds: refactor ingress listener SDS configuration * xds: update resolveListenerSDS call args in listeners_test * ingress: add TLS min, max and cipher suites to GatewayTLSConfig * xds: implement envoyTLSVersions and envoyTLSCipherSuites * xds: merge TLS config * xds: configure TLS parameters with ingress TLS context from leaf * xds: nil check in resolveListenerTLSConfig validation * xds: nil check in makeTLSParameters* functions * changelog: add entry for TLS params on ingress config entries * xds: remove indirection for TLS params in TLSConfig structs * xds: return tlsContext, nil instead of ambiguous err Co-authored-by: Chris S. Kim <ckim@hashicorp.com> * xds: switch zero checks to types.TLSVersionUnspecified * ingress: add validation for ingress config entry TLS params * ingress: validate listener TLS config * xds: add basic ingress with TLS params tests * xds: add ingress listeners mixed TLS min version defaults precedence test * xds: add more explicit tests for ingress listeners inheriting gateway defaults * xds: add test for single TLS listener on gateway without TLS defaults * xds: regen golden files for TLSVersionInvalid zero value, add TLSVersionAuto listener test * types/tls: change TLSVersion to string * types/tls: update TLSCipherSuite to string type * types/tls: implement validation functions for TLSVersion and TLSCipherSuites, make some maps private * api: add TLS params to GatewayTLSConfig, add tests * api: add TLSMinVersion to ingress gateway config entry test JSON * xds: switch to Envoy TLS cipher suite encoding from types package * xds: fixup validation for TLSv1_3 min version with cipher suites * add some kitchen sink tests and add a missing struct tag * xds: check if mergedCfg.TLSVersion is in TLSVersionsWithConfigurableCipherSuites * xds: update connectTLSEnabled comment * xds: remove unsued resolveGatewayServiceTLSConfig function * xds: add makeCommonTLSContextFromLeafWithoutParams * types/tls: add LessThan comparator function for concrete values * types/tls: change tlsVersions validation map from string to TLSVersion keys * types/tls: remove unused envoyTLSCipherSuites * types/tls: enable chacha20 cipher suites for Consul agent * types/tls: remove insecure cipher suites from allowed config TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 and TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 are both explicitly listed as insecure and disabled in the Go source. Refs https://cs.opensource.google/go/go/+/refs/tags/go1.17.3:src/crypto/tls/cipher_suites.go;l=329-330 * types/tls: add ValidateConsulAgentCipherSuites function, make direct lookup map private * types/tls: return all unmatched cipher suites in validation errors * xds: check that Envoy API value matching TLS version is found when building TlsParameters * types/tls: check that value is found in map before appending to slice in MarshalEnvoyTLSCipherSuiteStrings * types/tls: cast to string rather than fmt.Printf in TLSCihperSuite.String() * xds: add TLSVersionUnspecified to list of configurable cipher suites * structs: update note about config entry warning * xds: remove TLS min version cipher suite unconfigurable test placeholder * types/tls: update tests to remove assumption about private map values Co-authored-by: R.B. Boyer <rb@hashicorp.com>
203 lines
8 KiB
Go
203 lines
8 KiB
Go
package api
|
|
|
|
// IngressGatewayConfigEntry manages the configuration for an ingress service
|
|
// with the given name.
|
|
type IngressGatewayConfigEntry struct {
|
|
// Kind of the config entry. This should be set to api.IngressGateway.
|
|
Kind string
|
|
|
|
// Name is used to match the config entry with its associated ingress gateway
|
|
// service. This should match the name provided in the service definition.
|
|
Name string
|
|
|
|
// Partition is the partition the IngressGateway is associated with.
|
|
// Partitioning is a Consul Enterprise feature.
|
|
Partition string `json:",omitempty"`
|
|
|
|
// Namespace is the namespace the IngressGateway is associated with.
|
|
// Namespacing is a Consul Enterprise feature.
|
|
Namespace string `json:",omitempty"`
|
|
|
|
// TLS holds the TLS configuration for this gateway.
|
|
TLS GatewayTLSConfig
|
|
|
|
// Listeners declares what ports the ingress gateway should listen on, and
|
|
// what services to associated to those ports.
|
|
Listeners []IngressListener
|
|
|
|
Meta map[string]string `json:",omitempty"`
|
|
|
|
// CreateIndex is the Raft index this entry was created at. This is a
|
|
// read-only field.
|
|
CreateIndex uint64
|
|
|
|
// ModifyIndex is used for the Check-And-Set operations and can also be fed
|
|
// back into the WaitIndex of the QueryOptions in order to perform blocking
|
|
// queries.
|
|
ModifyIndex uint64
|
|
}
|
|
|
|
type GatewayTLSConfig struct {
|
|
// Indicates that TLS should be enabled for this gateway service.
|
|
Enabled bool
|
|
|
|
// SDS allows configuring TLS certificate from an SDS service.
|
|
SDS *GatewayTLSSDSConfig `json:",omitempty"`
|
|
|
|
TLSMinVersion string `json:",omitempty" alias:"tls_min_version"`
|
|
TLSMaxVersion string `json:",omitempty" alias:"tls_max_version"`
|
|
|
|
// Define a subset of cipher suites to restrict
|
|
// Only applicable to connections negotiated via TLS 1.2 or earlier
|
|
CipherSuites []string `json:",omitempty" alias:"cipher_suites"`
|
|
}
|
|
|
|
type GatewayServiceTLSConfig struct {
|
|
// SDS allows configuring TLS certificate from an SDS service.
|
|
SDS *GatewayTLSSDSConfig `json:",omitempty"`
|
|
}
|
|
|
|
type GatewayTLSSDSConfig struct {
|
|
ClusterName string `json:",omitempty" alias:"cluster_name"`
|
|
CertResource string `json:",omitempty" alias:"cert_resource"`
|
|
}
|
|
|
|
// IngressListener manages the configuration for a listener on a specific port.
|
|
type IngressListener struct {
|
|
// Port declares the port on which the ingress gateway should listen for traffic.
|
|
Port int
|
|
|
|
// Protocol declares what type of traffic this listener is expected to
|
|
// receive. Depending on the protocol, a listener might support multiplexing
|
|
// services over a single port, or additional discovery chain features. The
|
|
// current supported values are: (tcp | http | http2 | grpc).
|
|
Protocol string
|
|
|
|
// Services declares the set of services to which the listener forwards
|
|
// traffic.
|
|
//
|
|
// For "tcp" protocol listeners, only a single service is allowed.
|
|
// For "http" listeners, multiple services can be declared.
|
|
Services []IngressService
|
|
|
|
// TLS allows specifying some TLS configuration per listener.
|
|
TLS *GatewayTLSConfig `json:",omitempty"`
|
|
}
|
|
|
|
// IngressService manages configuration for services that are exposed to
|
|
// ingress traffic.
|
|
type IngressService struct {
|
|
// Name declares the service to which traffic should be forwarded.
|
|
//
|
|
// This can either be a specific service, or the wildcard specifier,
|
|
// "*". If the wildcard specifier is provided, the listener must be of "http"
|
|
// protocol and means that the listener will forward traffic to all services.
|
|
//
|
|
// A name can be specified on multiple listeners, and will be exposed on both
|
|
// of the listeners.
|
|
Name string
|
|
|
|
// Hosts is a list of hostnames which should be associated to this service on
|
|
// the defined listener. Only allowed on layer 7 protocols, this will be used
|
|
// to route traffic to the service by matching the Host header of the HTTP
|
|
// request.
|
|
//
|
|
// If a host is provided for a service that also has a wildcard specifier
|
|
// defined, the host will override the wildcard-specifier-provided
|
|
// "<service-name>.*" domain for that listener.
|
|
//
|
|
// This cannot be specified when using the wildcard specifier, "*", or when
|
|
// using a "tcp" listener.
|
|
Hosts []string
|
|
|
|
// Namespace is the namespace where the service is located.
|
|
// Namespacing is a Consul Enterprise feature.
|
|
Namespace string `json:",omitempty"`
|
|
|
|
// Partition is the partition where the service is located.
|
|
// Partitioning is a Consul Enterprise feature.
|
|
Partition string `json:",omitempty"`
|
|
|
|
// TLS allows specifying some TLS configuration per listener.
|
|
TLS *GatewayServiceTLSConfig `json:",omitempty"`
|
|
|
|
// Allow HTTP header manipulation to be configured.
|
|
RequestHeaders *HTTPHeaderModifiers `json:",omitempty" alias:"request_headers"`
|
|
ResponseHeaders *HTTPHeaderModifiers `json:",omitempty" alias:"response_headers"`
|
|
}
|
|
|
|
func (i *IngressGatewayConfigEntry) GetKind() string { return i.Kind }
|
|
func (i *IngressGatewayConfigEntry) GetName() string { return i.Name }
|
|
func (i *IngressGatewayConfigEntry) GetPartition() string { return i.Partition }
|
|
func (i *IngressGatewayConfigEntry) GetNamespace() string { return i.Namespace }
|
|
func (i *IngressGatewayConfigEntry) GetMeta() map[string]string { return i.Meta }
|
|
func (i *IngressGatewayConfigEntry) GetCreateIndex() uint64 { return i.CreateIndex }
|
|
func (i *IngressGatewayConfigEntry) GetModifyIndex() uint64 { return i.ModifyIndex }
|
|
|
|
// TerminatingGatewayConfigEntry manages the configuration for a terminating gateway
|
|
// with the given name.
|
|
type TerminatingGatewayConfigEntry struct {
|
|
// Kind of the config entry. This should be set to api.TerminatingGateway.
|
|
Kind string
|
|
|
|
// Name is used to match the config entry with its associated terminating gateway
|
|
// service. This should match the name provided in the service definition.
|
|
Name string
|
|
|
|
// Services is a list of service names represented by the terminating gateway.
|
|
Services []LinkedService `json:",omitempty"`
|
|
|
|
Meta map[string]string `json:",omitempty"`
|
|
|
|
// CreateIndex is the Raft index this entry was created at. This is a
|
|
// read-only field.
|
|
CreateIndex uint64
|
|
|
|
// ModifyIndex is used for the Check-And-Set operations and can also be fed
|
|
// back into the WaitIndex of the QueryOptions in order to perform blocking
|
|
// queries.
|
|
ModifyIndex uint64
|
|
|
|
// Partition is the partition the config entry is associated with.
|
|
// Partitioning is a Consul Enterprise feature.
|
|
Partition string `json:",omitempty"`
|
|
|
|
// Namespace is the namespace the config entry is associated with.
|
|
// Namespacing is a Consul Enterprise feature.
|
|
Namespace string `json:",omitempty"`
|
|
}
|
|
|
|
// A LinkedService is a service represented by a terminating gateway
|
|
type LinkedService struct {
|
|
// Referencing other partitions is not supported.
|
|
|
|
// Namespace is where the service is registered.
|
|
Namespace string `json:",omitempty"`
|
|
|
|
// Name is the name of the service, as defined in Consul's catalog.
|
|
Name string `json:",omitempty"`
|
|
|
|
// CAFile is the optional path to a CA certificate to use for TLS connections
|
|
// from the gateway to the linked service.
|
|
CAFile string `json:",omitempty" alias:"ca_file"`
|
|
|
|
// CertFile is the optional path to a client certificate to use for TLS connections
|
|
// from the gateway to the linked service.
|
|
CertFile string `json:",omitempty" alias:"cert_file"`
|
|
|
|
// KeyFile is the optional path to a private key to use for TLS connections
|
|
// from the gateway to the linked service.
|
|
KeyFile string `json:",omitempty" alias:"key_file"`
|
|
|
|
// SNI is the optional name to specify during the TLS handshake with a linked service.
|
|
SNI string `json:",omitempty"`
|
|
}
|
|
|
|
func (g *TerminatingGatewayConfigEntry) GetKind() string { return g.Kind }
|
|
func (g *TerminatingGatewayConfigEntry) GetName() string { return g.Name }
|
|
func (g *TerminatingGatewayConfigEntry) GetPartition() string { return g.Partition }
|
|
func (g *TerminatingGatewayConfigEntry) GetNamespace() string { return g.Namespace }
|
|
func (g *TerminatingGatewayConfigEntry) GetMeta() map[string]string { return g.Meta }
|
|
func (g *TerminatingGatewayConfigEntry) GetCreateIndex() uint64 { return g.CreateIndex }
|
|
func (g *TerminatingGatewayConfigEntry) GetModifyIndex() uint64 { return g.ModifyIndex }
|