mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-10-31 02:08:13 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			176 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			176 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| /*
 | |
| Copyright 2016 The Kubernetes Authors.
 | |
| 
 | |
| 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 options
 | |
| 
 | |
| import (
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/spf13/pflag"
 | |
| 
 | |
| 	"k8s.io/apiserver/pkg/authentication/authenticatorfactory"
 | |
| 	authenticationclient "k8s.io/client-go/kubernetes/typed/authentication/v1beta1"
 | |
| 	"k8s.io/client-go/rest"
 | |
| 	"k8s.io/client-go/tools/clientcmd"
 | |
| )
 | |
| 
 | |
| type RequestHeaderAuthenticationOptions struct {
 | |
| 	UsernameHeaders     []string
 | |
| 	GroupHeaders        []string
 | |
| 	ExtraHeaderPrefixes []string
 | |
| 	ClientCAFile        string
 | |
| 	AllowedNames        []string
 | |
| }
 | |
| 
 | |
| func (s *RequestHeaderAuthenticationOptions) AddFlags(fs *pflag.FlagSet) {
 | |
| 	fs.StringSliceVar(&s.UsernameHeaders, "requestheader-username-headers", s.UsernameHeaders, ""+
 | |
| 		"List of request headers to inspect for usernames. X-Remote-User is common.")
 | |
| 
 | |
| 	fs.StringSliceVar(&s.GroupHeaders, "requestheader-group-headers", s.GroupHeaders, ""+
 | |
| 		"List of request headers to inspect for groups. X-Remote-Group is suggested.")
 | |
| 
 | |
| 	fs.StringSliceVar(&s.ExtraHeaderPrefixes, "requestheader-extra-headers-prefix", s.ExtraHeaderPrefixes, ""+
 | |
| 		"List of request header prefixes to inspect. X-Remote-Extra- is suggested.")
 | |
| 
 | |
| 	fs.StringVar(&s.ClientCAFile, "requestheader-client-ca-file", s.ClientCAFile, ""+
 | |
| 		"Root certificate bundle to use to verify client certificates on incoming requests "+
 | |
| 		"before trusting usernames in headers specified by --requestheader-username-headers")
 | |
| 
 | |
| 	fs.StringSliceVar(&s.AllowedNames, "requestheader-allowed-names", s.AllowedNames, ""+
 | |
| 		"List of client certificate common names to allow to provide usernames in headers "+
 | |
| 		"specified by --requestheader-username-headers. If empty, any client certificate validated "+
 | |
| 		"by the authorities in --requestheader-client-ca-file is allowed.")
 | |
| }
 | |
| 
 | |
| // ToAuthenticationRequestHeaderConfig returns a RequestHeaderConfig config object for these options
 | |
| // if necessary, nil otherwise.
 | |
| func (s *RequestHeaderAuthenticationOptions) ToAuthenticationRequestHeaderConfig() *authenticatorfactory.RequestHeaderConfig {
 | |
| 	if len(s.UsernameHeaders) == 0 {
 | |
| 		return nil
 | |
| 	}
 | |
| 
 | |
| 	return &authenticatorfactory.RequestHeaderConfig{
 | |
| 		UsernameHeaders:     s.UsernameHeaders,
 | |
| 		GroupHeaders:        s.GroupHeaders,
 | |
| 		ExtraHeaderPrefixes: s.ExtraHeaderPrefixes,
 | |
| 		ClientCA:            s.ClientCAFile,
 | |
| 		AllowedClientNames:  s.AllowedNames,
 | |
| 	}
 | |
| }
 | |
| 
 | |
| type ClientCertAuthenticationOptions struct {
 | |
| 	// ClientCA is the certificate bundle for all the signers that you'll recognize for incoming client certificates
 | |
| 	ClientCA string
 | |
| }
 | |
| 
 | |
| func (s *ClientCertAuthenticationOptions) AddFlags(fs *pflag.FlagSet) {
 | |
| 	fs.StringVar(&s.ClientCA, "client-ca-file", s.ClientCA, ""+
 | |
| 		"If set, any request presenting a client certificate signed by one of "+
 | |
| 		"the authorities in the client-ca-file is authenticated with an identity "+
 | |
| 		"corresponding to the CommonName of the client certificate.")
 | |
| }
 | |
| 
 | |
| // DelegatingAuthenticationOptions provides an easy way for composing API servers to delegate their authentication to
 | |
| // the root kube API server.  The API federator will act as
 | |
| // a front proxy and direction connections will be able to delegate to the core kube API server
 | |
| type DelegatingAuthenticationOptions struct {
 | |
| 	// RemoteKubeConfigFile is the file to use to connect to a "normal" kube API server which hosts the
 | |
| 	// TokenAccessReview.authentication.k8s.io endpoint for checking tokens.
 | |
| 	RemoteKubeConfigFile string
 | |
| 
 | |
| 	// CacheTTL is the length of time that a token authentication answer will be cached.
 | |
| 	CacheTTL time.Duration
 | |
| 
 | |
| 	ClientCert    ClientCertAuthenticationOptions
 | |
| 	RequestHeader RequestHeaderAuthenticationOptions
 | |
| }
 | |
| 
 | |
| func NewDelegatingAuthenticationOptions() *DelegatingAuthenticationOptions {
 | |
| 	return &DelegatingAuthenticationOptions{
 | |
| 		// very low for responsiveness, but high enough to handle storms
 | |
| 		CacheTTL:   10 * time.Second,
 | |
| 		ClientCert: ClientCertAuthenticationOptions{},
 | |
| 		RequestHeader: RequestHeaderAuthenticationOptions{
 | |
| 			UsernameHeaders:     []string{"x-remote-user"},
 | |
| 			GroupHeaders:        []string{"x-remote-group"},
 | |
| 			ExtraHeaderPrefixes: []string{"x-remote-extra-"},
 | |
| 		},
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (s *DelegatingAuthenticationOptions) Validate() []error {
 | |
| 	allErrors := []error{}
 | |
| 	return allErrors
 | |
| }
 | |
| 
 | |
| func (s *DelegatingAuthenticationOptions) AddFlags(fs *pflag.FlagSet) {
 | |
| 	fs.StringVar(&s.RemoteKubeConfigFile, "authentication-kubeconfig", s.RemoteKubeConfigFile, ""+
 | |
| 		"kubeconfig file pointing at the 'core' kubernetes server with enough rights to create "+
 | |
| 		"tokenaccessreviews.authentication.k8s.io.")
 | |
| 
 | |
| 	fs.DurationVar(&s.CacheTTL, "authentication-token-webhook-cache-ttl", s.CacheTTL,
 | |
| 		"The duration to cache responses from the webhook token authenticator.")
 | |
| 
 | |
| 	s.ClientCert.AddFlags(fs)
 | |
| 	s.RequestHeader.AddFlags(fs)
 | |
| }
 | |
| 
 | |
| func (s *DelegatingAuthenticationOptions) ToAuthenticationConfig() (authenticatorfactory.DelegatingAuthenticatorConfig, error) {
 | |
| 	tokenClient, err := s.newTokenAccessReview()
 | |
| 	if err != nil {
 | |
| 		return authenticatorfactory.DelegatingAuthenticatorConfig{}, err
 | |
| 	}
 | |
| 
 | |
| 	ret := authenticatorfactory.DelegatingAuthenticatorConfig{
 | |
| 		Anonymous:               true,
 | |
| 		TokenAccessReviewClient: tokenClient,
 | |
| 		CacheTTL:                s.CacheTTL,
 | |
| 		ClientCAFile:            s.ClientCert.ClientCA,
 | |
| 		RequestHeaderConfig:     s.RequestHeader.ToAuthenticationRequestHeaderConfig(),
 | |
| 	}
 | |
| 	return ret, nil
 | |
| }
 | |
| 
 | |
| func (s *DelegatingAuthenticationOptions) newTokenAccessReview() (authenticationclient.TokenReviewInterface, error) {
 | |
| 	var clientConfig *rest.Config
 | |
| 	var err error
 | |
| 	if len(s.RemoteKubeConfigFile) > 0 {
 | |
| 		loadingRules := &clientcmd.ClientConfigLoadingRules{ExplicitPath: s.RemoteKubeConfigFile}
 | |
| 		loader := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, &clientcmd.ConfigOverrides{})
 | |
| 
 | |
| 		clientConfig, err = loader.ClientConfig()
 | |
| 
 | |
| 	} else {
 | |
| 		// without the remote kubeconfig file, try to use the in-cluster config.  Most addon API servers will
 | |
| 		// use this path
 | |
| 		clientConfig, err = rest.InClusterConfig()
 | |
| 	}
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	// set high qps/burst limits since this will effectively limit API server responsiveness
 | |
| 	clientConfig.QPS = 200
 | |
| 	clientConfig.Burst = 400
 | |
| 
 | |
| 	client, err := authenticationclient.NewForConfig(clientConfig)
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	return client.TokenReviews(), nil
 | |
| }
 | 
