Merge pull request #58528 from deads2k/kubelet-02-mincipher
Automatic merge from submit-queue (batch tested with PRs 58547, 57228, 58528, 58499, 58618). If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>. Add TLS min version flag Adds a flag for controlling the minimum TLS level allowed. /assign liggitt @kubernetes/sig-node-pr-reviews @k8s-mirror-api-machinery-pr-reviews ```release-note --tls-min-version on kubelet and kube-apiserver allow for configuring minimum TLS versions ``` Kubernetes-commit: 3550551b9f68641f55fc16b6d31eb27ac39b1914
This commit is contained in:
		
						commit
						e94c7ed860
					
				
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -54,6 +54,9 @@ type SecureServingOptions struct { | |||
| 	// CipherSuites is the list of allowed cipher suites for the server.
 | ||||
| 	// Values are from tls package constants (https://golang.org/pkg/crypto/tls/#pkg-constants).
 | ||||
| 	CipherSuites []string | ||||
| 	// MinTLSVersion is the minimum TLS version supported.
 | ||||
| 	// Values are from tls package constants (https://golang.org/pkg/crypto/tls/#pkg-constants).
 | ||||
| 	MinTLSVersion string | ||||
| } | ||||
| 
 | ||||
| type CertKey struct { | ||||
|  | @ -142,6 +145,10 @@ func (s *SecureServingOptions) AddFlags(fs *pflag.FlagSet) { | |||
| 			"Values are from tls package constants (https://golang.org/pkg/crypto/tls/#pkg-constants). "+ | ||||
| 			"If omitted, the default Go cipher suites will be used") | ||||
| 
 | ||||
| 	fs.StringVar(&s.MinTLSVersion, "tls-min-version", s.MinTLSVersion, | ||||
| 		"Minimum TLS version supported. "+ | ||||
| 			"Value must match version names from https://golang.org/pkg/crypto/tls/#pkg-constants.") | ||||
| 
 | ||||
| 	fs.Var(utilflag.NewNamedCertKeyArray(&s.SNICertKeys), "tls-sni-cert-key", ""+ | ||||
| 		"A pair of x509 certificate and private key file paths, optionally suffixed with a list of "+ | ||||
| 		"domain patterns which are fully qualified domain names, possibly with prefixed wildcard "+ | ||||
|  | @ -249,6 +256,12 @@ func (s *SecureServingOptions) applyServingInfoTo(c *server.Config) error { | |||
| 		secureServingInfo.CipherSuites = cipherSuites | ||||
| 	} | ||||
| 
 | ||||
| 	var err error | ||||
| 	secureServingInfo.MinTLSVersion, err = utilflag.TLSVersion(s.MinTLSVersion) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	// load SNI certs
 | ||||
| 	namedTLSCerts := make([]server.NamedTLSCert, 0, len(s.SNICertKeys)) | ||||
| 	for _, nck := range s.SNICertKeys { | ||||
|  | @ -261,7 +274,6 @@ func (s *SecureServingOptions) applyServingInfoTo(c *server.Config) error { | |||
| 			return fmt.Errorf("failed to load SNI cert and key: %v", err) | ||||
| 		} | ||||
| 	} | ||||
| 	var err error | ||||
| 	secureServingInfo.SNICerts, err = server.GetNamedCertificateMap(namedTLSCerts) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
|  |  | |||
|  | @ -62,3 +62,26 @@ func TLSCipherSuites(cipherNames []string) ([]uint16, error) { | |||
| 	} | ||||
| 	return ciphersIntSlice, nil | ||||
| } | ||||
| 
 | ||||
| var versions = map[string]uint16{ | ||||
| 	"VersionTLS10": tls.VersionTLS10, | ||||
| 	"VersionTLS11": tls.VersionTLS11, | ||||
| 	"VersionTLS12": tls.VersionTLS12, | ||||
| } | ||||
| 
 | ||||
| func TLSVersion(versionName string) (uint16, error) { | ||||
| 	if len(versionName) == 0 { | ||||
| 		return DefaultTLSVersion(), nil | ||||
| 	} | ||||
| 	if version, ok := versions[versionName]; ok { | ||||
| 		return version, nil | ||||
| 	} | ||||
| 	return 0, fmt.Errorf("unknown tls version %q", versionName) | ||||
| } | ||||
| 
 | ||||
| func DefaultTLSVersion() uint16 { | ||||
| 	// Can't use SSLv3 because of POODLE and BEAST
 | ||||
| 	// Can't use TLSv1.0 because of POODLE and BEAST using CBC cipher
 | ||||
| 	// Can't use TLSv1.1 because of RC4 cipher usage
 | ||||
| 	return tls.VersionTLS12 | ||||
| } | ||||
|  |  | |||
|  | @ -80,8 +80,12 @@ func TestConstantMaps(t *testing.T) { | |||
| 		fmt.Printf("error: %s\n", err.Error()) | ||||
| 		return | ||||
| 	} | ||||
| 	discoveredVersions := map[string]bool{} | ||||
| 	discoveredCiphers := map[string]bool{} | ||||
| 	for _, declName := range pkg.Scope().Names() { | ||||
| 		if strings.HasPrefix(declName, "VersionTLS") { | ||||
| 			discoveredVersions[declName] = true | ||||
| 		} | ||||
| 		if strings.HasPrefix(declName, "TLS_RSA_") || strings.HasPrefix(declName, "TLS_ECDHE_") { | ||||
| 			discoveredCiphers[declName] = true | ||||
| 		} | ||||
|  | @ -97,4 +101,14 @@ func TestConstantMaps(t *testing.T) { | |||
| 			t.Errorf("ciphers map has %s not in tls package", k) | ||||
| 		} | ||||
| 	} | ||||
| 	for k := range discoveredVersions { | ||||
| 		if _, ok := versions[k]; !ok { | ||||
| 			t.Errorf("discovered version tls.%s not in version map", k) | ||||
| 		} | ||||
| 	} | ||||
| 	for k := range versions { | ||||
| 		if _, ok := discoveredVersions[k]; !ok { | ||||
| 			t.Errorf("versions map has %s not in tls package", k) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue