Files
teleport/lib/defaults/defaults.go
T
Forrest aaee695927 node hb and watcher scalability improvements (#21490)
* node hb and watcher scalability improvements

* ensure that node has ample time to hb

* fix degraded state

* hbv2 test cov
2023-03-03 17:39:00 +00:00

865 lines
28 KiB
Go

/*
Copyright 2016-2020 Gravitational, Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// Package defaults contains default constants set in various parts of
// teleport codebase
package defaults
import (
"crypto/tls"
"fmt"
"net/http"
"strings"
"time"
"github.com/gravitational/trace"
"github.com/jonboulle/clockwork"
"golang.org/x/exp/slices"
"gopkg.in/square/go-jose.v2"
"github.com/gravitational/teleport"
"github.com/gravitational/teleport/api/defaults"
"github.com/gravitational/teleport/lib/limiter"
"github.com/gravitational/teleport/lib/utils"
)
// Default port numbers used by all teleport tools
const (
// Web UI over HTTP(s)
HTTPListenPort = 3080
// When running in "SSH Server" mode behind a proxy, this
// listening port will be used to connect users to:
SSHServerListenPort = 3022
// When running in "SSH Proxy" role this port will be used to
// accept incoming client connections and proxy them to SSHServerListenPort of
// one of many SSH nodes
SSHProxyListenPort = 3023
SSHProxyTunnelListenPort = defaults.SSHProxyTunnelListenPort
// KubeListenPort is a default port for kubernetes proxies
KubeListenPort = 3026
// When running as a "SSH Proxy" this port will be used to
// serve auth requests.
AuthListenPort = 3025
// MySQLListenPort is the default listen port for MySQL proxy.
MySQLListenPort = 3036
// PostgresListenPort is the default listen port for PostgreSQL proxy.
PostgresListenPort = 5432
// MongoListenPort is the default listen port for Mongo proxy.
MongoListenPort = 27017
// RedisListenPort is the default listen port for Redis proxy.
RedisListenPort = 6379
// MetricsListenPort is the default listen port for the metrics service.
MetricsListenPort = 3081
// WindowsDesktopListenPort is the default listed port for
// windows_desktop_service.
//
// TODO(awly): update to match HTTPListenPort once SNI routing is
// implemented.
WindowsDesktopListenPort = 3028
// ProxyPeeringListenPort is the default port proxies will listen on when
// proxy peering is enabled.
ProxyPeeringListenPort = 3021
// RDPListenPort is the standard port for RDP servers.
RDPListenPort = 3389
// BackendDir is a default backend subdirectory
BackendDir = "backend"
// BackendPath is a default backend path parameter
BackendPath = "path"
// By default SSH server (and SSH proxy) will bind to this IP
BindIP = "0.0.0.0"
// By default all users use /bin/bash
DefaultShell = "/bin/bash"
// HTTPMaxIdleConns is the max idle connections across all hosts.
HTTPMaxIdleConns = 2000
// HTTPMaxIdleConnsPerHost is the max idle connections per-host.
HTTPMaxIdleConnsPerHost = 1000
// HTTPMaxConnsPerHost is the maximum number of connections per-host.
HTTPMaxConnsPerHost = 250
// HTTPIdleTimeout is a default timeout for idle HTTP connections
HTTPIdleTimeout = 30 * time.Second
// HTTPRequestTimeout is a default timeout for HTTP requests
HTTPRequestTimeout = 30 * time.Second
// WebHeadersTimeout is a timeout that is set for web requests
// before browsers raise "Timeout waiting web headers" error in
// the browser
WebHeadersTimeout = 10 * time.Second
// DefaultIdleConnectionDuration indicates for how long Teleport will hold
// the SSH connection open if there are no reads/writes happening over it.
// 15 minutes default is compliant with PCI DSS standards
DefaultIdleConnectionDuration = 15 * time.Minute
// DefaultGracefulShutdownTimeout is a default timeout for
// graceful shutdown waiting for connections to drain off
// before cutting the connections forcefully.
DefaultGracefulShutdownTimeout = 5 * time.Minute
// ShutdownPollPeriod is a polling period for graceful shutdowns of SSH servers
ShutdownPollPeriod = 500 * time.Millisecond
// ReadHeadersTimeout is a default TCP timeout when we wait
// for the response headers to arrive
ReadHeadersTimeout = time.Second
// DatabaseConnectTimeout is a timeout for connecting to a database via
// database access.
DatabaseConnectTimeout = time.Minute
// HandshakeReadDeadline is the default time to wait for the client during
// the TLS handshake.
HandshakeReadDeadline = 5 * time.Second
// SignupTokenTTL is a default TTL for a web signup one time token
SignupTokenTTL = time.Hour
// MaxSignupTokenTTL is a maximum TTL for a web signup one time token
// clients can reduce this time, not increase it
MaxSignupTokenTTL = 48 * time.Hour
// MaxChangePasswordTokenTTL is a maximum TTL for password change token
MaxChangePasswordTokenTTL = 24 * time.Hour
// ChangePasswordTokenTTL is a default password change token expiry time
ChangePasswordTokenTTL = 8 * time.Hour
// DefaultRenewableCertTTL is the default TTL for a renewable user certificate.
DefaultRenewableCertTTL = 1 * time.Hour
// MaxRenewableCertTTL is the maximum TTL that a certificate renewal bot
// can request for a renewable user certificate.
MaxRenewableCertTTL = 24 * time.Hour
// DefaultBotJoinTTL is the default TTL for bot join tokens.
DefaultBotJoinTTL = 1 * time.Hour
// RecoveryStartTokenTTL is a default expiry time for a recovery start token.
RecoveryStartTokenTTL = 3 * time.Hour
// RecoveryApprovedTokenTTL is a default expiry time for a recovery approved token.
RecoveryApprovedTokenTTL = 15 * time.Minute
// PrivilegeTokenTTL is a default expiry time for a privilege token.
PrivilegeTokenTTL = 5 * time.Minute
// ResetPasswordLength is the length of the reset user password
ResetPasswordLength = 16
// ProvisioningTokenTTL is a the default TTL for server provisioning
// tokens. When a user generates a token without an explicit TTL, this
// value is used.
ProvisioningTokenTTL = 30 * time.Minute
// MinPasswordLength is minimum password length
MinPasswordLength = 6
// MaxPasswordLength is maximum password length (for sanity)
MaxPasswordLength = 128
// MaxIterationLimit is max iteration limit
MaxIterationLimit = 1000
// EventsIterationLimit is a default limit if it's not set for events
EventsIterationLimit = 500
// EventsIterationLimit is max iteration limit for events
EventsMaxIterationLimit = 10000
// ActiveSessionTTL is a TTL when session is marked as inactive
ActiveSessionTTL = 30 * time.Second
// OIDCAuthRequestTTL is TTL of internally stored auth request created by client
OIDCAuthRequestTTL = 10 * 60 * time.Second
// SAMLAuthRequestTTL is TTL of internally stored auth request created by client
SAMLAuthRequestTTL = 10 * 60 * time.Second
// GithubAuthRequestTTL is TTL of internally stored Github auth request
GithubAuthRequestTTL = 10 * 60 * time.Second
// LogRotationPeriod defines how frequently to rotate the audit log file
LogRotationPeriod = time.Hour * 24
// UploaderScanPeriod is a default uploader scan period
UploaderScanPeriod = 5 * time.Second
// UploaderConcurrentUploads is a default number of concurrent
UploaderConcurrentUploads = 10
// MaxLoginAttempts sets the max. number of allowed failed login attempts
// before a user account is locked for AccountLockInterval
MaxLoginAttempts int = 5
// MaxAccountRecoveryAttempts sets the max number of allowed failed recovery attempts
// before a user is locked from login and further recovery attempts for AccountLockInterval.
MaxAccountRecoveryAttempts = 3
// AccountLockInterval defines a time interval during which a user account
// is locked after MaxLoginAttempts
AccountLockInterval = 20 * time.Minute
// AttemptTTL is TTL for login attempt
AttemptTTL = time.Minute * 30
// AuditLogTimeFormat is the format for the timestamp on audit log files.
AuditLogTimeFormat = "2006-01-02.15:04:05"
// PlaybackRecycleTTL is the TTL for unpacked session playback files
PlaybackRecycleTTL = 3 * time.Hour
// WaitCopyTimeout is how long Teleport will wait for a session to finish
// copying data from the PTY after "exit-status" has been received.
WaitCopyTimeout = 5 * time.Second
// ClientCacheSize is the size of the RPC clients expiring cache
ClientCacheSize = 1024
// Localhost is the address of localhost. Used for the default binding
// address for port forwarding.
Localhost = "127.0.0.1"
// AnyAddress is used to refer to the non-routable meta-address used to
// refer to all addresses on the machine.
AnyAddress = "0.0.0.0"
// CallbackTimeout is how long to wait for a response from SSO provider
// before timeout.
CallbackTimeout = 180 * time.Second
// NodeJoinTokenTTL is when a token for nodes expires.
NodeJoinTokenTTL = 4 * time.Hour
// LockMaxStaleness is the maximum staleness for cached lock resources
// to be deemed acceptable for strict locking mode.
LockMaxStaleness = 5 * time.Minute
// DefaultRedisUsername is a default username used by Redis when
// no name is provided at connection time.
DefaultRedisUsername = "default"
// ProxyPingInterval is the interval ping messages are going to be sent.
// This is only applicable for TLS routing protocols that support ping
// wrapping.
ProxyPingInterval = 30 * time.Second
)
const (
// TerminalResizePeriod is how long tsh waits before updating the size of the
// terminal window.
TerminalResizePeriod = 2 * time.Second
// SessionIdlePeriod is the period of inactivity after which the
// session will be considered idle
SessionIdlePeriod = 20 * time.Second
// HighResPollingPeriod is a default high resolution polling period
HighResPollingPeriod = 10 * time.Second
// LowResPollingPeriod is a default low resolution polling period
LowResPollingPeriod = 600 * time.Second
// HighResReportingPeriod is a high resolution polling reporting
// period used in services
HighResReportingPeriod = 10 * time.Second
// SessionControlTimeout is the maximum amount of time a controlled session
// may persist after contact with the auth server is lost (sessctl semaphore
// leases are refreshed at a rate of ~1/2 this duration).
SessionControlTimeout = time.Minute * 2
// PrometheusScrapeInterval is the default time interval for prometheus scrapes. Used for metric update periods.
PrometheusScrapeInterval = 15 * time.Second
// MaxWatcherBackoff is the maximum retry time a watcher should use in
// the event of connection issues
MaxWatcherBackoff = 90 * time.Second
)
const (
// AuthQueueSize is auth service queue size
AuthQueueSize = 8192
// ProxyQueueSize is proxy service queue size
ProxyQueueSize = 8192
// NodeQueueSize is node service queue size
NodeQueueSize = 128
// KubernetesQueueSize is kubernetes service watch queue size
KubernetesQueueSize = 128
// AppsQueueSize is apps service queue size.
AppsQueueSize = 128
// DatabasesQueueSize is db service queue size.
DatabasesQueueSize = 128
// WindowsDesktopQueueSize is windows_desktop service watch queue size.
WindowsDesktopQueueSize = 128
// DiscoveryQueueSize is discovery service queue size.
DiscoveryQueueSize = 128
)
var (
// ResyncInterval is how often tunnels are resynced.
ResyncInterval = 5 * time.Second
// HeartbeatCheckPeriod is a period between heartbeat status checks
HeartbeatCheckPeriod = 5 * time.Second
)
// Default connection limits, they can be applied separately on any of the Teleport
// services (SSH, auth, proxy)
const (
// LimiterMaxConnections Number of max. simultaneous connections to a service
LimiterMaxConnections = 15000
// LimiterMaxConcurrentUsers Number of max. simultaneous connected users/logins
LimiterMaxConcurrentUsers = 250
// LimiterMaxConcurrentSignatures limits maximum number of concurrently
// generated signatures by the auth server
LimiterMaxConcurrentSignatures = 10
)
// Default rate limits for unauthenticated passwordless endpoints.
const (
// LimiterPasswordlessPeriod is the default period for passwordless limiters.
LimiterPasswordlessPeriod = 1 * time.Minute
// LimiterPasswordlessAverage is the default average for passwordless
// limiters.
LimiterPasswordlessAverage = 10
// LimiterPasswordlessBurst is the default burst for passwordless limiters.
LimiterPasswordlessBurst = 20
)
const (
// HostCertCacheSize is the number of host certificates to cache at any moment.
HostCertCacheSize = 4000
// HostCertCacheTime is how long a certificate stays in the cache.
HostCertCacheTime = 24 * time.Hour
)
const (
// RotationGracePeriod is a default rotation period for graceful
// certificate rotations, by default to set to maximum allowed user
// cert duration
RotationGracePeriod = defaults.MaxCertDuration
// PendingAccessDuration defines the expiry of a pending access request.
PendingAccessDuration = time.Hour
// MaxAccessDuration defines the maximum time for which an access request
// can be active.
MaxAccessDuration = defaults.MaxCertDuration
)
// list of roles teleport service can run as:
const (
// RoleNode is SSH stateless node
RoleNode = "node"
// RoleProxy is a stateless SSH access proxy (bastion)
RoleProxy = "proxy"
// RoleAuthService is authentication and authorization service,
// the only stateful role in the system
RoleAuthService = "auth"
// RoleApp is an application proxy.
RoleApp = "app"
// RoleDatabase is a database proxy role.
RoleDatabase = "db"
// RoleWindowsDesktop is a Windows desktop service.
RoleWindowsDesktop = "windowsdesktop"
// RoleDiscovery is a discovery service
RoleDiscovery = "discovery"
)
const (
// ProtocolPostgres is the PostgreSQL database protocol.
ProtocolPostgres = "postgres"
// ProtocolMySQL is the MySQL/MariaDB database protocol.
ProtocolMySQL = "mysql"
// ProtocolMongoDB is the MongoDB database protocol.
ProtocolMongoDB = "mongodb"
// ProtocolRedis is the Redis database protocol.
ProtocolRedis = "redis"
// ProtocolCockroachDB is the CockroachDB database protocol.
//
// Technically it's the same as the Postgres protocol, but it's used to
// differentiate between Cockroach and Postgres databases e.g. when
// selecting a CLI client to use.
ProtocolCockroachDB = "cockroachdb"
// ProtocolSQLServer is the Microsoft SQL Server database protocol.
ProtocolSQLServer = "sqlserver"
// ProtocolSnowflake is the Snowflake REST database protocol.
ProtocolSnowflake = "snowflake"
// ProtocolCassandra is the Cassandra database protocol.
ProtocolCassandra = "cassandra"
// ProtocolElasticsearch is the Elasticsearch database protocol.
ProtocolElasticsearch = "elasticsearch"
// ProtocolDynamoDB is the DynamoDB database protocol.
ProtocolDynamoDB = "dynamodb"
)
// DatabaseProtocols is a list of all supported database protocols.
var DatabaseProtocols = []string{
ProtocolPostgres,
ProtocolMySQL,
ProtocolMongoDB,
ProtocolCockroachDB,
ProtocolRedis,
ProtocolSnowflake,
ProtocolSQLServer,
ProtocolCassandra,
ProtocolElasticsearch,
ProtocolDynamoDB,
}
// ReadableDatabaseProtocol returns a more human readable string of the
// provided database protocol.
func ReadableDatabaseProtocol(p string) string {
switch p {
case ProtocolPostgres:
return "PostgreSQL"
case ProtocolMySQL:
return "MySQL"
case ProtocolMongoDB:
return "MongoDB"
case ProtocolCockroachDB:
return "CockroachDB"
case ProtocolRedis:
return "Redis"
case ProtocolSnowflake:
return "Snowflake"
case ProtocolElasticsearch:
return "Elasticsearch"
case ProtocolSQLServer:
return "Microsoft SQL Server"
case ProtocolCassandra:
return "Cassandra"
case ProtocolDynamoDB:
return "DynamoDB"
default:
// Unknown protocol. Return original string.
return p
}
}
const (
// PerfBufferPageCount is the size of the perf ring buffer in number of pages.
// Must be power of 2.
PerfBufferPageCount = 8
// OpenPerfBufferPageCount is the page count for the perf buffer. Open
// events generate many events so this buffer needs to be extra large.
// Must be power of 2.
OpenPerfBufferPageCount = 128
// CgroupPath is where the cgroupv2 hierarchy will be mounted.
CgroupPath = "/cgroup2"
)
const (
// ConfigEnvar is a name of teleport's configuration environment variable
ConfigEnvar = "TELEPORT_CONFIG"
// ConfigFileEnvar is the name of the environment variable used to specify a path to
// the Teleport configuration file that tctl reads on use
ConfigFileEnvar = "TELEPORT_CONFIG_FILE"
// LicenseFile is the default name of the license file
LicenseFile = "license.pem"
// CACertFile is the default name of the certificate authority file to watch
CACertFile = "ca.cert"
// Krb5FilePath is the default location of Kerberos configuration file.
Krb5FilePath = "/etc/krb5.conf"
)
var (
// ConfigFilePath is default path to teleport config file
ConfigFilePath = "/etc/teleport.yaml"
// DataDir is where all mutable data is stored (user keys, recorded sessions,
// registered SSH servers, etc):
DataDir = "/var/lib/teleport"
// StartRoles is default roles teleport assumes when started via 'start' command
StartRoles = []string{RoleProxy, RoleNode, RoleAuthService, RoleApp, RoleDatabase}
)
const (
// PAMServiceName is the default PAM policy to use if one is not passed in
// configuration.
PAMServiceName = "sshd"
)
const (
initError = "failure initializing default values"
)
const (
// WebauthnChallengeTimeout is the timeout for ongoing Webauthn authentication
// or registration challenges.
WebauthnChallengeTimeout = 5 * time.Minute
// WebauthnGlobalChallengeTimeout is the timeout for global authentication
// challenges.
// Stricter than WebauthnChallengeTimeout because global challenges are
// anonymous.
WebauthnGlobalChallengeTimeout = 1 * time.Minute
)
const (
// LookaheadBufSize is a reasonable buffer size for decoders that need
// to buffer for the purposes of lookahead (e.g. `YAMLOrJSONDecoder`).
LookaheadBufSize = 32 * 1024
)
// TLS constants for Web Proxy HTTPS connection
const (
// path to a self-signed TLS PRIVATE key file for HTTPS connection for the web proxy
SelfSignedKeyPath = "webproxy_key.pem"
// path to a self-signed TLS PUBLIC key file for HTTPS connection for the web proxy
SelfSignedPubPath = "webproxy_pub.pem"
// path to a self-signed TLS cert file for HTTPS connection for the web proxy
SelfSignedCertPath = "webproxy_cert.pem"
)
const (
// SnowflakeURL is the Snowflake URL used for address validation.
SnowflakeURL = "snowflakecomputing.com"
)
// ConfigureLimiter assigns the default parameters to a connection throttler (AKA limiter)
func ConfigureLimiter(lc *limiter.Config) {
lc.MaxConnections = LimiterMaxConnections
lc.MaxNumberOfUsers = LimiterMaxConcurrentUsers
}
// AuthListenAddr returns the default listening address for the Auth service
func AuthListenAddr() *utils.NetAddr {
return makeAddr(BindIP, AuthListenPort)
}
// AuthConnectAddr returns the default address to search for auth. service on
func AuthConnectAddr() *utils.NetAddr {
return makeAddr("127.0.0.1", AuthListenPort)
}
// ProxyListenAddr returns the default listening address for the SSH Proxy service
func ProxyListenAddr() *utils.NetAddr {
return makeAddr(BindIP, SSHProxyListenPort)
}
// KubeProxyListenAddr returns the default listening address for the Kubernetes Proxy service
func KubeProxyListenAddr() *utils.NetAddr {
return makeAddr(BindIP, KubeListenPort)
}
// ProxyWebListenAddr returns the default listening address for the Web-based SSH Proxy service
func ProxyWebListenAddr() *utils.NetAddr {
return makeAddr(BindIP, HTTPListenPort)
}
// SSHServerListenAddr returns the default listening address for the Web-based SSH Proxy service
func SSHServerListenAddr() *utils.NetAddr {
return makeAddr(BindIP, SSHServerListenPort)
}
// ReverseTunnelListenAddr returns the default listening address for the SSH Proxy service used
// by the SSH nodes to establish proxy<->ssh_node connection from behind a firewall which
// blocks inbound connecions to ssh_nodes
func ReverseTunnelListenAddr() *utils.NetAddr {
return makeAddr(BindIP, SSHProxyTunnelListenPort)
}
// MetricsServiceListenAddr returns the default listening address for the metrics service
func MetricsServiceListenAddr() *utils.NetAddr {
return makeAddr(BindIP, MetricsListenPort)
}
func ProxyPeeringListenAddr() *utils.NetAddr {
return makeAddr(BindIP, ProxyPeeringListenPort)
}
func makeAddr(host string, port int16) *utils.NetAddr {
addrSpec := fmt.Sprintf("tcp://%s:%d", host, port)
retval, err := utils.ParseAddr(addrSpec)
if err != nil {
panic(fmt.Sprintf("%s: error parsing '%v'", initError, addrSpec))
}
return retval
}
// CATTL is a default lifetime of a CA certificate
const CATTL = time.Hour * 24 * 365 * 10
const (
// WebsocketVersion is the version of the protocol.
WebsocketVersion = "1"
// WebsocketClose is sent when the SSH session is over without any errors.
WebsocketClose = "c"
// WebsocketAudit is sending a audit event over the websocket to the web client.
WebsocketAudit = "a"
// WebsocketRaw is sending raw terminal bytes over the websocket to the web
// client.
WebsocketRaw = "r"
// WebsocketResize is receiving a resize request.
WebsocketResize = "w"
// WebsocketWebauthnChallenge is sending a webauthn challenge.
WebsocketWebauthnChallenge = "n"
// WebsocketSessionMetadata is sending the data for a ssh session.
WebsocketSessionMetadata = "s"
// WebsocketError is sending an error message.
WebsocketError = "e"
)
// The following are cryptographic primitives Teleport does not support in
// it's default configuration.
const (
DiffieHellmanGroup14SHA1 = "diffie-hellman-group14-sha1"
DiffieHellmanGroup1SHA1 = "diffie-hellman-group1-sha1"
HMACSHA1 = "hmac-sha1"
HMACSHA196 = "hmac-sha1-96"
)
const (
// ApplicationTokenKeyType is the type of asymmetric key used to sign tokens.
// See https://tools.ietf.org/html/rfc7518#section-6.1 for possible values.
ApplicationTokenKeyType = "RSA"
// ApplicationTokenAlgorithm is the default algorithm used to sign
// application access tokens.
ApplicationTokenAlgorithm = jose.RS256
)
var (
// FIPSCipherSuites is a list of supported FIPS compliant TLS cipher suites.
FIPSCipherSuites = []uint16{
//
// These two ciper suites:
//
// tls.TLS_RSA_WITH_AES_128_GCM_SHA256
// tls.TLS_RSA_WITH_AES_256_GCM_SHA384
//
// although supported by FIPS, are blacklisted in http2 spec:
//
// https://tools.ietf.org/html/rfc7540#appendix-A
//
// therefore we do not include them in this list.
//
tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
}
// FIPSCiphers is a list of supported FIPS compliant SSH ciphers.
FIPSCiphers = []string{
"aes128-ctr",
"aes192-ctr",
"aes256-ctr",
"aes128-gcm@openssh.com",
}
// FIPSKEXAlgorithms is a list of supported FIPS compliant SSH kex algorithms.
FIPSKEXAlgorithms = []string{
"ecdh-sha2-nistp256",
"ecdh-sha2-nistp384",
"echd-sha2-nistp521",
}
// FIPSMACAlgorithms is a list of supported FIPS compliant SSH mac algorithms.
FIPSMACAlgorithms = []string{
"hmac-sha2-256-etm@openssh.com",
"hmac-sha2-256",
}
)
// Transport returns a new http.Client with sensible defaults.
func HTTPClient() (*http.Client, error) {
transport, err := Transport()
if err != nil {
return nil, trace.Wrap(err)
}
return &http.Client{
Transport: transport,
}, nil
}
// Transport returns a new http.RoundTripper with sensible defaults.
func Transport() (*http.Transport, error) {
// Clone the default transport to pick up sensible defaults.
defaultTransport, ok := http.DefaultTransport.(*http.Transport)
if !ok {
return nil, trace.BadParameter("invalid transport type %T", http.DefaultTransport)
}
tr := defaultTransport.Clone()
// Increase the size of the transport's connection pool. This substantially
// improves the performance of Teleport under load as it reduces the number
// of TLS handshakes performed.
tr.MaxIdleConns = HTTPMaxIdleConns
tr.MaxIdleConnsPerHost = HTTPMaxIdleConnsPerHost
// Set IdleConnTimeout on the transport. This defines the maximum amount of
// time before idle connections are closed. Leaving this unset will lead to
// connections open forever and will cause memory leaks in a long-running
// process.
tr.IdleConnTimeout = HTTPIdleTimeout
return tr, nil
}
const (
// TeleportConfigVersionV1 is the teleport proxy configuration v1 version.
TeleportConfigVersionV1 string = "v1"
// TeleportConfigVersionV2 is the teleport proxy configuration v2 version.
TeleportConfigVersionV2 string = "v2"
// TeleportConfigVersionV3 is the teleport proxy configuration v3 version.
TeleportConfigVersionV3 string = "v3"
)
// TeleportConfigVersions is an exported slice of the allowed versions in the config file,
// for convenience (looping through, etc)
var TeleportConfigVersions = []string{
TeleportConfigVersionV1,
TeleportConfigVersionV2,
TeleportConfigVersionV3,
}
func ValidateConfigVersion(version string) error {
hasVersion := slices.Contains(TeleportConfigVersions, version)
if !hasVersion {
return trace.BadParameter("version must be one of %s", strings.Join(TeleportConfigVersions, ", "))
}
return nil
}
// Default values for tsh and tctl commands.
const (
// Use more human readable format than RFC3339
TshTctlSessionListTimeFormat = "2006-01-02"
TshTctlSessionListLimit = "50"
TshTctlSessionDayLimit = 365
)
// DefaultFormats is the default set of formats to use for commands that have the --format flag.
var DefaultFormats = []string{teleport.Text, teleport.JSON, teleport.YAML}
// FormatFlagDescription creates the description for the --format flag.
func FormatFlagDescription(formats ...string) string {
return fmt.Sprintf("Format output (%s)", strings.Join(formats, ", "))
}
func SearchSessionRange(clock clockwork.Clock, fromUTC, toUTC, recordingsSince string) (from time.Time, to time.Time, err error) {
if (fromUTC != "" || toUTC != "") && recordingsSince != "" {
return time.Time{}, time.Time{},
trace.BadParameter("use of 'since' is mutually exclusive with 'from-utc' and 'to-utc' flags")
}
from = clock.Now().Add(time.Hour * -24)
to = clock.Now()
if fromUTC != "" {
from, err = time.Parse(TshTctlSessionListTimeFormat, fromUTC)
if err != nil {
return time.Time{}, time.Time{},
trace.BadParameter("failed to parse session recording listing start time: expected format %s, got %s.", TshTctlSessionListTimeFormat, fromUTC)
}
}
if toUTC != "" {
to, err = time.Parse(TshTctlSessionListTimeFormat, toUTC)
if err != nil {
return time.Time{}, time.Time{},
trace.BadParameter("failed to parse session recording listing end time: expected format %s, got %s.", TshTctlSessionListTimeFormat, toUTC)
}
}
if recordingsSince != "" {
since, err := time.ParseDuration(recordingsSince)
if err != nil {
return time.Time{}, time.Time{},
trace.BadParameter("invalid duration provided to 'since': %s: expected format: '5h30m40s'", recordingsSince)
}
from = to.Add(-since)
}
if to.After(clock.Now()) {
return time.Time{}, time.Time{},
trace.BadParameter("invalid '--to-utc': '--to-utc' cannot be in the future")
}
if from.After(clock.Now()) {
return time.Time{}, time.Time{},
trace.BadParameter("invalid '--from-utc': '--from-utc' cannot be in the future")
}
if from.After(to) {
return time.Time{}, time.Time{},
trace.BadParameter("invalid '--from-utc' time: 'from' must be before '--to-utc'")
}
return from, to, nil
}
const (
// AWSInstallerDocument is the name of the default AWS document
// that will be called when executing the SSM command.
AWSInstallerDocument = "TeleportDiscoveryInstaller"
// AWSAgentlessInstallerDocument is the name of the default AWS document
// that will be called when executing the SSM command .
AWSAgentlessInstallerDocument = "TeleportAgentlessDiscoveryInstaller"
// IAMInviteTokenName is the name of the default Teleport IAM
// token to use when templating the script to be executed.
IAMInviteTokenName = "aws-discovery-iam-token"
// SSHDConfigPath is the path to the sshd config file to modify
// when using the agentless installer
SSHDConfigPath = "/etc/ssh/sshd_config"
)
// AzureInviteTokenName is the name of the default token to use
// when templating the script to be executed.
const AzureInviteTokenName = "azure-discovery-token"