mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-03 19:58:17 +00:00 
			
		
		
		
	Merge pull request #42491 from deads2k/auth-03-adder
Automatic merge from submit-queue make the system:authenticated group adder smarter Fixes #42437 This prevents the group adder from adding the system:authenticated group when: 1. it's already in the list 2. the user is system:anonymous 3. system:unauthenticated is in the list Smaller alternative to https://github.com/kubernetes/kubernetes/pull/42421 for 1.6. @kubernetes/sig-auth-pr-reviews @enj @liggitt
This commit is contained in:
		@@ -23,7 +23,6 @@ go_library(
 | 
				
			|||||||
        "//vendor:k8s.io/apiserver/pkg/authentication/request/union",
 | 
					        "//vendor:k8s.io/apiserver/pkg/authentication/request/union",
 | 
				
			||||||
        "//vendor:k8s.io/apiserver/pkg/authentication/request/x509",
 | 
					        "//vendor:k8s.io/apiserver/pkg/authentication/request/x509",
 | 
				
			||||||
        "//vendor:k8s.io/apiserver/pkg/authentication/token/tokenfile",
 | 
					        "//vendor:k8s.io/apiserver/pkg/authentication/token/tokenfile",
 | 
				
			||||||
        "//vendor:k8s.io/apiserver/pkg/authentication/user",
 | 
					 | 
				
			||||||
        "//vendor:k8s.io/apiserver/plugin/pkg/authenticator/password/keystone",
 | 
					        "//vendor:k8s.io/apiserver/plugin/pkg/authenticator/password/keystone",
 | 
				
			||||||
        "//vendor:k8s.io/apiserver/plugin/pkg/authenticator/password/passwordfile",
 | 
					        "//vendor:k8s.io/apiserver/plugin/pkg/authenticator/password/passwordfile",
 | 
				
			||||||
        "//vendor:k8s.io/apiserver/plugin/pkg/authenticator/request/basicauth",
 | 
					        "//vendor:k8s.io/apiserver/plugin/pkg/authenticator/request/basicauth",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,7 +30,6 @@ import (
 | 
				
			|||||||
	"k8s.io/apiserver/pkg/authentication/request/union"
 | 
						"k8s.io/apiserver/pkg/authentication/request/union"
 | 
				
			||||||
	"k8s.io/apiserver/pkg/authentication/request/x509"
 | 
						"k8s.io/apiserver/pkg/authentication/request/x509"
 | 
				
			||||||
	"k8s.io/apiserver/pkg/authentication/token/tokenfile"
 | 
						"k8s.io/apiserver/pkg/authentication/token/tokenfile"
 | 
				
			||||||
	"k8s.io/apiserver/pkg/authentication/user"
 | 
					 | 
				
			||||||
	"k8s.io/apiserver/plugin/pkg/authenticator/password/keystone"
 | 
						"k8s.io/apiserver/plugin/pkg/authenticator/password/keystone"
 | 
				
			||||||
	"k8s.io/apiserver/plugin/pkg/authenticator/password/passwordfile"
 | 
						"k8s.io/apiserver/plugin/pkg/authenticator/password/passwordfile"
 | 
				
			||||||
	"k8s.io/apiserver/plugin/pkg/authenticator/request/basicauth"
 | 
						"k8s.io/apiserver/plugin/pkg/authenticator/request/basicauth"
 | 
				
			||||||
@@ -207,7 +206,7 @@ func (config AuthenticatorConfig) New() (authenticator.Request, *spec.SecurityDe
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	authenticator := union.New(authenticators...)
 | 
						authenticator := union.New(authenticators...)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	authenticator = group.NewGroupAdder(authenticator, []string{user.AllAuthenticated})
 | 
						authenticator = group.NewAuthenticatedGroupAdder(authenticator)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if config.Anonymous {
 | 
						if config.Anonymous {
 | 
				
			||||||
		// If the authenticator chain returns an error, return an error (don't consider a bad bearer token anonymous).
 | 
							// If the authenticator chain returns an error, return an error (don't consider a bad bearer token anonymous).
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,7 +30,6 @@ import (
 | 
				
			|||||||
	"k8s.io/apiserver/pkg/authentication/request/headerrequest"
 | 
						"k8s.io/apiserver/pkg/authentication/request/headerrequest"
 | 
				
			||||||
	unionauth "k8s.io/apiserver/pkg/authentication/request/union"
 | 
						unionauth "k8s.io/apiserver/pkg/authentication/request/union"
 | 
				
			||||||
	"k8s.io/apiserver/pkg/authentication/request/x509"
 | 
						"k8s.io/apiserver/pkg/authentication/request/x509"
 | 
				
			||||||
	"k8s.io/apiserver/pkg/authentication/user"
 | 
					 | 
				
			||||||
	webhooktoken "k8s.io/apiserver/plugin/pkg/authenticator/token/webhook"
 | 
						webhooktoken "k8s.io/apiserver/plugin/pkg/authenticator/token/webhook"
 | 
				
			||||||
	authenticationclient "k8s.io/client-go/kubernetes/typed/authentication/v1beta1"
 | 
						authenticationclient "k8s.io/client-go/kubernetes/typed/authentication/v1beta1"
 | 
				
			||||||
	"k8s.io/client-go/util/cert"
 | 
						"k8s.io/client-go/util/cert"
 | 
				
			||||||
@@ -107,7 +106,7 @@ func (c DelegatingAuthenticatorConfig) New() (authenticator.Request, *spec.Secur
 | 
				
			|||||||
		return nil, nil, errors.New("No authentication method configured")
 | 
							return nil, nil, errors.New("No authentication method configured")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	authenticator := group.NewGroupAdder(unionauth.New(authenticators...), []string{user.AllAuthenticated})
 | 
						authenticator := group.NewAuthenticatedGroupAdder(unionauth.New(authenticators...))
 | 
				
			||||||
	if c.Anonymous {
 | 
						if c.Anonymous {
 | 
				
			||||||
		authenticator = unionauth.NewFailOnError(authenticator, anonymous.NewAuthenticator())
 | 
							authenticator = unionauth.NewFailOnError(authenticator, anonymous.NewAuthenticator())
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,60 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					Copyright 2017 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 group
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"net/http"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"k8s.io/apiserver/pkg/authentication/authenticator"
 | 
				
			||||||
 | 
						"k8s.io/apiserver/pkg/authentication/user"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// AuthenticatedGroupAdder adds system:authenticated group when appropriate
 | 
				
			||||||
 | 
					type AuthenticatedGroupAdder struct {
 | 
				
			||||||
 | 
						// Authenticator is delegated to make the authentication decision
 | 
				
			||||||
 | 
						Authenticator authenticator.Request
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewAuthenticatedGroupAdder wraps a request authenticator, and adds the system:authenticated group when appropriate.
 | 
				
			||||||
 | 
					// Authentication must succeed, the user must not be system:anonymous, the groups system:authenticated or system:unauthenticated must
 | 
				
			||||||
 | 
					// not be present
 | 
				
			||||||
 | 
					func NewAuthenticatedGroupAdder(auth authenticator.Request) authenticator.Request {
 | 
				
			||||||
 | 
						return &AuthenticatedGroupAdder{auth}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (g *AuthenticatedGroupAdder) AuthenticateRequest(req *http.Request) (user.Info, bool, error) {
 | 
				
			||||||
 | 
						u, ok, err := g.Authenticator.AuthenticateRequest(req)
 | 
				
			||||||
 | 
						if err != nil || !ok {
 | 
				
			||||||
 | 
							return nil, ok, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if u.GetName() == user.Anonymous {
 | 
				
			||||||
 | 
							return u, true, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for _, group := range u.GetGroups() {
 | 
				
			||||||
 | 
							if group == user.AllAuthenticated || group == user.AllUnauthenticated {
 | 
				
			||||||
 | 
								return u, true, nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &user.DefaultInfo{
 | 
				
			||||||
 | 
							Name:   u.GetName(),
 | 
				
			||||||
 | 
							UID:    u.GetUID(),
 | 
				
			||||||
 | 
							Groups: append(u.GetGroups(), user.AllAuthenticated),
 | 
				
			||||||
 | 
							Extra:  u.GetExtra(),
 | 
				
			||||||
 | 
						}, true, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -40,3 +40,72 @@ func TestGroupAdder(t *testing.T) {
 | 
				
			|||||||
		t.Errorf("Expected original,added groups, got %#v", user.GetGroups())
 | 
							t.Errorf("Expected original,added groups, got %#v", user.GetGroups())
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestAuthenticatedGroupAdder(t *testing.T) {
 | 
				
			||||||
 | 
						tests := []struct {
 | 
				
			||||||
 | 
							name         string
 | 
				
			||||||
 | 
							inputUser    user.Info
 | 
				
			||||||
 | 
							expectedUser user.Info
 | 
				
			||||||
 | 
						}{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name: "add",
 | 
				
			||||||
 | 
								inputUser: &user.DefaultInfo{
 | 
				
			||||||
 | 
									Name:   "user",
 | 
				
			||||||
 | 
									Groups: []string{"some-group"},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								expectedUser: &user.DefaultInfo{
 | 
				
			||||||
 | 
									Name:   "user",
 | 
				
			||||||
 | 
									Groups: []string{"some-group", user.AllAuthenticated},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name: "don't double add",
 | 
				
			||||||
 | 
								inputUser: &user.DefaultInfo{
 | 
				
			||||||
 | 
									Name:   "user",
 | 
				
			||||||
 | 
									Groups: []string{user.AllAuthenticated, "some-group"},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								expectedUser: &user.DefaultInfo{
 | 
				
			||||||
 | 
									Name:   "user",
 | 
				
			||||||
 | 
									Groups: []string{user.AllAuthenticated, "some-group"},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name: "don't add for anon",
 | 
				
			||||||
 | 
								inputUser: &user.DefaultInfo{
 | 
				
			||||||
 | 
									Name:   user.Anonymous,
 | 
				
			||||||
 | 
									Groups: []string{"some-group"},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								expectedUser: &user.DefaultInfo{
 | 
				
			||||||
 | 
									Name:   user.Anonymous,
 | 
				
			||||||
 | 
									Groups: []string{"some-group"},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name: "don't add for unauthenticated group",
 | 
				
			||||||
 | 
								inputUser: &user.DefaultInfo{
 | 
				
			||||||
 | 
									Name:   "user",
 | 
				
			||||||
 | 
									Groups: []string{user.AllUnauthenticated, "some-group"},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								expectedUser: &user.DefaultInfo{
 | 
				
			||||||
 | 
									Name:   "user",
 | 
				
			||||||
 | 
									Groups: []string{user.AllUnauthenticated, "some-group"},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, test := range tests {
 | 
				
			||||||
 | 
							adder := authenticator.Request(
 | 
				
			||||||
 | 
								NewAuthenticatedGroupAdder(
 | 
				
			||||||
 | 
									authenticator.RequestFunc(func(req *http.Request) (user.Info, bool, error) {
 | 
				
			||||||
 | 
										return test.inputUser, true, nil
 | 
				
			||||||
 | 
									}),
 | 
				
			||||||
 | 
								),
 | 
				
			||||||
 | 
							)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							user, _, _ := adder.AuthenticateRequest(nil)
 | 
				
			||||||
 | 
							if !reflect.DeepEqual(user, test.expectedUser) {
 | 
				
			||||||
 | 
								t.Errorf("got %#v", user)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										5
									
								
								vendor/BUILD
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/BUILD
									
									
									
									
										vendored
									
									
								
							@@ -9637,7 +9637,10 @@ go_test(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
go_library(
 | 
					go_library(
 | 
				
			||||||
    name = "k8s.io/apiserver/pkg/authentication/group",
 | 
					    name = "k8s.io/apiserver/pkg/authentication/group",
 | 
				
			||||||
    srcs = ["k8s.io/apiserver/pkg/authentication/group/group_adder.go"],
 | 
					    srcs = [
 | 
				
			||||||
 | 
					        "k8s.io/apiserver/pkg/authentication/group/authenticated_group_adder.go",
 | 
				
			||||||
 | 
					        "k8s.io/apiserver/pkg/authentication/group/group_adder.go",
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
    tags = ["automanaged"],
 | 
					    tags = ["automanaged"],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        "//vendor:k8s.io/apiserver/pkg/authentication/authenticator",
 | 
					        "//vendor:k8s.io/apiserver/pkg/authentication/authenticator",
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user