2023-04-19 21:54:14 +00:00
|
|
|
// Copyright (c) HashiCorp, Inc.
|
|
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
|
|
|
|
package api
|
|
|
|
|
|
|
|
import (
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
2023-07-04 13:53:12 +00:00
|
|
|
const (
|
|
|
|
DiscoveryTypeStrictDNS ClusterDiscoveryType = "STRICT_DNS"
|
|
|
|
DiscoveryTypeStatic ClusterDiscoveryType = "STATIC"
|
|
|
|
DiscoveryTypeLogicalDNS ClusterDiscoveryType = "LOGICAL_DNS"
|
|
|
|
DiscoveryTypeEDS ClusterDiscoveryType = "EDS"
|
|
|
|
DiscoveryTypeOriginalDST ClusterDiscoveryType = "ORIGINAL_DST"
|
|
|
|
)
|
|
|
|
|
2023-04-19 21:54:14 +00:00
|
|
|
type JWTProviderConfigEntry struct {
|
|
|
|
// Kind is the kind of configuration entry and must be "jwt-provider".
|
|
|
|
Kind string `json:",omitempty"`
|
|
|
|
|
|
|
|
// Name is the name of the provider being configured.
|
|
|
|
Name string `json:",omitempty"`
|
|
|
|
|
|
|
|
// JSONWebKeySet defines a JSON Web Key Set, its location on disk, or the
|
|
|
|
// means with which to fetch a key set from a remote server.
|
|
|
|
JSONWebKeySet *JSONWebKeySet `json:",omitempty" alias:"json_web_key_set"`
|
|
|
|
|
|
|
|
// Issuer is the entity that must have issued the JWT.
|
|
|
|
// This value must match the "iss" claim of the token.
|
|
|
|
Issuer string `json:",omitempty"`
|
|
|
|
|
|
|
|
// Audiences is the set of audiences the JWT is allowed to access.
|
|
|
|
// If specified, all JWTs verified with this provider must address
|
|
|
|
// at least one of these to be considered valid.
|
|
|
|
Audiences []string `json:",omitempty"`
|
|
|
|
|
|
|
|
// Locations where the JWT will be present in requests.
|
|
|
|
// Envoy will check all of these locations to extract a JWT.
|
|
|
|
// If no locations are specified Envoy will default to:
|
|
|
|
// 1. Authorization header with Bearer schema:
|
|
|
|
// "Authorization: Bearer <token>"
|
|
|
|
// 2. access_token query parameter.
|
|
|
|
Locations []*JWTLocation `json:",omitempty"`
|
|
|
|
|
|
|
|
// Forwarding defines rules for forwarding verified JWTs to the backend.
|
|
|
|
Forwarding *JWTForwardingConfig `json:",omitempty"`
|
|
|
|
|
|
|
|
// ClockSkewSeconds specifies the maximum allowable time difference
|
|
|
|
// from clock skew when validating the "exp" (Expiration) and "nbf"
|
|
|
|
// (Not Before) claims.
|
|
|
|
//
|
|
|
|
// Default value is 30 seconds.
|
|
|
|
ClockSkewSeconds int `json:",omitempty" alias:"clock_skew_seconds"`
|
|
|
|
|
|
|
|
// CacheConfig defines configuration for caching the validation
|
|
|
|
// result for previously seen JWTs. Caching results can speed up
|
|
|
|
// verification when individual tokens are expected to be handled
|
|
|
|
// multiple times.
|
|
|
|
CacheConfig *JWTCacheConfig `json:",omitempty" alias:"cache_config"`
|
|
|
|
|
|
|
|
Meta map[string]string `json:",omitempty"`
|
|
|
|
|
|
|
|
// CreateIndex is the Raft index this entry was created at. This is a
|
|
|
|
// read-only field.
|
|
|
|
CreateIndex uint64 `json:",omitempty"`
|
|
|
|
|
|
|
|
// 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 `json:",omitempty"`
|
|
|
|
|
|
|
|
// Partition is the partition the JWTProviderConfigEntry applies to.
|
|
|
|
// Partitioning is a Consul Enterprise feature.
|
|
|
|
Partition string `json:",omitempty"`
|
|
|
|
|
|
|
|
// Namespace is the namespace the JWTProviderConfigEntry applies to.
|
|
|
|
// Namespacing is a Consul Enterprise feature.
|
|
|
|
Namespace string `json:",omitempty"`
|
|
|
|
}
|
|
|
|
|
|
|
|
// JWTLocation is a location where the JWT could be present in requests.
|
|
|
|
//
|
|
|
|
// Only one of Header, QueryParam, or Cookie can be specified.
|
|
|
|
type JWTLocation struct {
|
|
|
|
// Header defines how to extract a JWT from an HTTP request header.
|
|
|
|
Header *JWTLocationHeader `json:",omitempty"`
|
|
|
|
|
|
|
|
// QueryParam defines how to extract a JWT from an HTTP request
|
|
|
|
// query parameter.
|
|
|
|
QueryParam *JWTLocationQueryParam `json:",omitempty" alias:"query_param"`
|
|
|
|
|
|
|
|
// Cookie defines how to extract a JWT from an HTTP request cookie.
|
|
|
|
Cookie *JWTLocationCookie `json:",omitempty"`
|
|
|
|
}
|
|
|
|
|
|
|
|
// JWTLocationHeader defines how to extract a JWT from an HTTP
|
|
|
|
// request header.
|
|
|
|
type JWTLocationHeader struct {
|
|
|
|
// Name is the name of the header containing the token.
|
|
|
|
Name string `json:",omitempty"`
|
|
|
|
|
|
|
|
// ValuePrefix is an optional prefix that precedes the token in the
|
|
|
|
// header value.
|
|
|
|
// For example, "Bearer " is a standard value prefix for a header named
|
|
|
|
// "Authorization", but the prefix is not part of the token itself:
|
|
|
|
// "Authorization: Bearer <token>"
|
|
|
|
ValuePrefix string `json:",omitempty" alias:"value_prefix"`
|
|
|
|
|
|
|
|
// Forward defines whether the header with the JWT should be
|
|
|
|
// forwarded after the token has been verified. If false, the
|
|
|
|
// header will not be forwarded to the backend.
|
|
|
|
//
|
|
|
|
// Default value is false.
|
|
|
|
Forward bool `json:",omitempty"`
|
|
|
|
}
|
|
|
|
|
|
|
|
// JWTLocationQueryParam defines how to extract a JWT from an HTTP request query parameter.
|
|
|
|
type JWTLocationQueryParam struct {
|
|
|
|
// Name is the name of the query param containing the token.
|
|
|
|
Name string `json:",omitempty"`
|
|
|
|
}
|
|
|
|
|
|
|
|
// JWTLocationCookie defines how to extract a JWT from an HTTP request cookie.
|
|
|
|
type JWTLocationCookie struct {
|
|
|
|
// Name is the name of the cookie containing the token.
|
|
|
|
Name string `json:",omitempty"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type JWTForwardingConfig struct {
|
|
|
|
// HeaderName is a header name to use when forwarding a verified
|
|
|
|
// JWT to the backend. The verified JWT could have been extracted
|
|
|
|
// from any location (query param, header, or cookie).
|
|
|
|
//
|
|
|
|
// The header value will be base64-URL-encoded, and will not be
|
|
|
|
// padded unless PadForwardPayloadHeader is true.
|
|
|
|
HeaderName string `json:",omitempty" alias:"header_name"`
|
|
|
|
|
|
|
|
// PadForwardPayloadHeader determines whether padding should be added
|
|
|
|
// to the base64 encoded token forwarded with ForwardPayloadHeader.
|
|
|
|
//
|
|
|
|
// Default value is false.
|
|
|
|
PadForwardPayloadHeader bool `json:",omitempty" alias:"pad_forward_payload_header"`
|
|
|
|
}
|
|
|
|
|
|
|
|
// JSONWebKeySet defines a key set, its location on disk, or the
|
|
|
|
// means with which to fetch a key set from a remote server.
|
|
|
|
//
|
|
|
|
// Exactly one of Local or Remote must be specified.
|
|
|
|
type JSONWebKeySet struct {
|
|
|
|
// Local specifies a local source for the key set.
|
|
|
|
Local *LocalJWKS `json:",omitempty"`
|
|
|
|
|
|
|
|
// Remote specifies how to fetch a key set from a remote server.
|
|
|
|
Remote *RemoteJWKS `json:",omitempty"`
|
|
|
|
}
|
|
|
|
|
|
|
|
// LocalJWKS specifies a location for a local JWKS.
|
|
|
|
//
|
|
|
|
// Only one of String and Filename can be specified.
|
|
|
|
type LocalJWKS struct {
|
|
|
|
// JWKS contains a base64 encoded JWKS.
|
|
|
|
JWKS string `json:",omitempty"`
|
|
|
|
|
|
|
|
// Filename configures a location on disk where the JWKS can be
|
|
|
|
// found. If specified, the file must be present on the disk of ALL
|
|
|
|
// proxies with intentions referencing this provider.
|
|
|
|
Filename string `json:",omitempty"`
|
|
|
|
}
|
|
|
|
|
|
|
|
// RemoteJWKS specifies how to fetch a JWKS from a remote server.
|
|
|
|
type RemoteJWKS struct {
|
|
|
|
// URI is the URI of the server to query for the JWKS.
|
|
|
|
URI string `json:",omitempty"`
|
|
|
|
|
|
|
|
// RequestTimeoutMs is the number of milliseconds to
|
|
|
|
// time out when making a request for the JWKS.
|
|
|
|
RequestTimeoutMs int `json:",omitempty" alias:"request_timeout_ms"`
|
|
|
|
|
|
|
|
// CacheDuration is the duration after which cached keys
|
|
|
|
// should be expired.
|
|
|
|
//
|
|
|
|
// Default value is 5 minutes.
|
|
|
|
CacheDuration time.Duration `json:",omitempty" alias:"cache_duration"`
|
|
|
|
|
|
|
|
// FetchAsynchronously indicates that the JWKS should be fetched
|
|
|
|
// when a client request arrives. Client requests will be paused
|
|
|
|
// until the JWKS is fetched.
|
|
|
|
// If false, the proxy listener will wait for the JWKS to be
|
|
|
|
// fetched before being activated.
|
|
|
|
//
|
|
|
|
// Default value is false.
|
|
|
|
FetchAsynchronously bool `json:",omitempty" alias:"fetch_asynchronously"`
|
|
|
|
|
|
|
|
// RetryPolicy defines a retry policy for fetching JWKS.
|
|
|
|
//
|
|
|
|
// There is no retry by default.
|
|
|
|
RetryPolicy *JWKSRetryPolicy `json:",omitempty" alias:"retry_policy"`
|
2023-07-04 13:53:12 +00:00
|
|
|
|
|
|
|
// JWKSCluster defines how the specified Remote JWKS URI is to be fetched.
|
|
|
|
JWKSCluster *JWKSCluster `json:",omitempty" alias:"jwks_cluster"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type JWKSCluster struct {
|
|
|
|
// DiscoveryType refers to the service discovery type to use for resolving the cluster.
|
|
|
|
//
|
|
|
|
// This defaults to STRICT_DNS.
|
|
|
|
// Other options include STATIC, LOGICAL_DNS, EDS or ORIGINAL_DST.
|
|
|
|
DiscoveryType ClusterDiscoveryType `json:",omitempty" alias:"discovery_type"`
|
|
|
|
|
|
|
|
// TLSCertificates refers to the data containing certificate authority certificates to use
|
|
|
|
// in verifying a presented peer certificate.
|
|
|
|
// If not specified and a peer certificate is presented it will not be verified.
|
|
|
|
//
|
|
|
|
// Must be either CaCertificateProviderInstance or TrustedCA.
|
|
|
|
TLSCertificates *JWKSTLSCertificate `json:",omitempty" alias:"tls_certificates"`
|
|
|
|
|
|
|
|
// The timeout for new network connections to hosts in the cluster.
|
|
|
|
// If not set, a default value of 5s will be used.
|
|
|
|
ConnectTimeout time.Duration `json:",omitempty" alias:"connect_timeout"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type ClusterDiscoveryType string
|
|
|
|
|
|
|
|
// JWKSTLSCertificate refers to the data containing certificate authority certificates to use
|
|
|
|
// in verifying a presented peer certificate.
|
|
|
|
// If not specified and a peer certificate is presented it will not be verified.
|
|
|
|
//
|
|
|
|
// Must be either CaCertificateProviderInstance or TrustedCA.
|
|
|
|
type JWKSTLSCertificate struct {
|
|
|
|
// CaCertificateProviderInstance Certificate provider instance for fetching TLS certificates.
|
|
|
|
CaCertificateProviderInstance *JWKSTLSCertProviderInstance `json:",omitempty" alias:"ca_certificate_provider_instance"`
|
|
|
|
|
|
|
|
// TrustedCA defines TLS certificate data containing certificate authority certificates
|
|
|
|
// to use in verifying a presented peer certificate.
|
|
|
|
//
|
|
|
|
// Exactly one of Filename, EnvironmentVariable, InlineString or InlineBytes must be specified.
|
|
|
|
TrustedCA *JWKSTLSCertTrustedCA `json:",omitempty" alias:"trusted_ca"`
|
|
|
|
}
|
|
|
|
|
|
|
|
// JWKSTLSCertTrustedCA defines TLS certificate data containing certificate authority certificates
|
|
|
|
// to use in verifying a presented peer certificate.
|
|
|
|
//
|
|
|
|
// Exactly one of Filename, EnvironmentVariable, InlineString or InlineBytes must be specified.
|
|
|
|
type JWKSTLSCertTrustedCA struct {
|
|
|
|
Filename string `json:",omitempty" alias:"filename"`
|
|
|
|
EnvironmentVariable string `json:",omitempty" alias:"environment_variable"`
|
|
|
|
InlineString string `json:",omitempty" alias:"inline_string"`
|
|
|
|
InlineBytes []byte `json:",omitempty" alias:"inline_bytes"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type JWKSTLSCertProviderInstance struct {
|
|
|
|
// InstanceName refers to the certificate provider instance name
|
|
|
|
//
|
|
|
|
// The default value is "default".
|
|
|
|
InstanceName string `json:",omitempty" alias:"instance_name"`
|
|
|
|
|
|
|
|
// CertificateName is used to specify certificate instances or types. For example, "ROOTCA" to specify
|
|
|
|
// a root-certificate (validation context) or "example.com" to specify a certificate for a
|
|
|
|
// particular domain.
|
|
|
|
//
|
|
|
|
// The default value is the empty string.
|
|
|
|
CertificateName string `json:",omitempty" alias:"certificate_name"`
|
2023-04-19 21:54:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type JWKSRetryPolicy struct {
|
|
|
|
// NumRetries is the number of times to retry fetching the JWKS.
|
|
|
|
// The retry strategy uses jittered exponential backoff with
|
|
|
|
// a base interval of 1s and max of 10s.
|
|
|
|
//
|
|
|
|
// Default value is 0.
|
|
|
|
NumRetries int `json:",omitempty" alias:"num_retries"`
|
|
|
|
|
|
|
|
// Backoff policy
|
|
|
|
//
|
|
|
|
// Defaults to Envoy's backoff policy
|
|
|
|
RetryPolicyBackOff *RetryPolicyBackOff `json:",omitempty" alias:"retry_policy_back_off"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type RetryPolicyBackOff struct {
|
|
|
|
// BaseInterval to be used for the next back off computation
|
|
|
|
//
|
|
|
|
// The default value from envoy is 1s
|
|
|
|
BaseInterval time.Duration `json:",omitempty" alias:"base_interval"`
|
|
|
|
|
|
|
|
// MaxInternal to be used to specify the maximum interval between retries.
|
|
|
|
// Optional but should be greater or equal to BaseInterval.
|
|
|
|
//
|
|
|
|
// Defaults to 10 times BaseInterval
|
|
|
|
MaxInterval time.Duration `json:",omitempty" alias:"max_interval"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type JWTCacheConfig struct {
|
|
|
|
// Size specifies the maximum number of JWT verification
|
|
|
|
// results to cache.
|
|
|
|
//
|
|
|
|
// Defaults to 0, meaning that JWT caching is disabled.
|
|
|
|
Size int `json:",omitempty"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *JWTProviderConfigEntry) GetKind() string {
|
|
|
|
return JWTProvider
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *JWTProviderConfigEntry) GetName() string { return e.Name }
|
|
|
|
func (e *JWTProviderConfigEntry) GetMeta() map[string]string { return e.Meta }
|
|
|
|
func (e *JWTProviderConfigEntry) GetCreateIndex() uint64 { return e.CreateIndex }
|
|
|
|
func (e *JWTProviderConfigEntry) GetModifyIndex() uint64 { return e.ModifyIndex }
|
|
|
|
func (e *JWTProviderConfigEntry) GetPartition() string { return e.Partition }
|
|
|
|
func (e *JWTProviderConfigEntry) GetNamespace() string { return e.Namespace }
|