mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-27 21:47:07 +00:00
Plumb versioned informers to authz config
This commit is contained in:
parent
d3428a5736
commit
ba09fadecf
@ -443,7 +443,7 @@ func BuildGenericConfig(s *options.ServerRunOptions, proxyTransport *http.Transp
|
|||||||
return nil, nil, nil, nil, nil, fmt.Errorf("invalid authentication config: %v", err)
|
return nil, nil, nil, nil, nil, fmt.Errorf("invalid authentication config: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
genericConfig.Authorizer, genericConfig.RuleResolver, err = BuildAuthorizer(s, sharedInformers)
|
genericConfig.Authorizer, genericConfig.RuleResolver, err = BuildAuthorizer(s, sharedInformers, versionedInformers)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, nil, nil, fmt.Errorf("invalid authorization config: %v", err)
|
return nil, nil, nil, nil, nil, fmt.Errorf("invalid authorization config: %v", err)
|
||||||
}
|
}
|
||||||
@ -546,8 +546,8 @@ func BuildAuthenticator(s *options.ServerRunOptions, storageFactory serverstorag
|
|||||||
}
|
}
|
||||||
|
|
||||||
// BuildAuthorizer constructs the authorizer
|
// BuildAuthorizer constructs the authorizer
|
||||||
func BuildAuthorizer(s *options.ServerRunOptions, sharedInformers informers.SharedInformerFactory) (authorizer.Authorizer, authorizer.RuleResolver, error) {
|
func BuildAuthorizer(s *options.ServerRunOptions, sharedInformers informers.SharedInformerFactory, versionedInformers clientgoinformers.SharedInformerFactory) (authorizer.Authorizer, authorizer.RuleResolver, error) {
|
||||||
authorizationConfig := s.Authorization.ToAuthorizationConfig(sharedInformers)
|
authorizationConfig := s.Authorization.ToAuthorizationConfig(sharedInformers, versionedInformers)
|
||||||
return authorizationConfig.New()
|
return authorizationConfig.New()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,6 +33,7 @@ go_library(
|
|||||||
"//vendor/k8s.io/apiserver/pkg/authorization/authorizerfactory:go_default_library",
|
"//vendor/k8s.io/apiserver/pkg/authorization/authorizerfactory:go_default_library",
|
||||||
"//vendor/k8s.io/apiserver/pkg/authorization/union:go_default_library",
|
"//vendor/k8s.io/apiserver/pkg/authorization/union:go_default_library",
|
||||||
"//vendor/k8s.io/apiserver/plugin/pkg/authorizer/webhook:go_default_library",
|
"//vendor/k8s.io/apiserver/plugin/pkg/authorizer/webhook:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/informers:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -25,6 +25,7 @@ import (
|
|||||||
"k8s.io/apiserver/pkg/authorization/authorizerfactory"
|
"k8s.io/apiserver/pkg/authorization/authorizerfactory"
|
||||||
"k8s.io/apiserver/pkg/authorization/union"
|
"k8s.io/apiserver/pkg/authorization/union"
|
||||||
"k8s.io/apiserver/plugin/pkg/authorizer/webhook"
|
"k8s.io/apiserver/plugin/pkg/authorizer/webhook"
|
||||||
|
versionedinformers "k8s.io/client-go/informers"
|
||||||
"k8s.io/kubernetes/pkg/auth/authorizer/abac"
|
"k8s.io/kubernetes/pkg/auth/authorizer/abac"
|
||||||
"k8s.io/kubernetes/pkg/auth/nodeidentifier"
|
"k8s.io/kubernetes/pkg/auth/nodeidentifier"
|
||||||
informers "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion"
|
informers "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion"
|
||||||
@ -52,6 +53,7 @@ type AuthorizationConfig struct {
|
|||||||
WebhookCacheUnauthorizedTTL time.Duration
|
WebhookCacheUnauthorizedTTL time.Duration
|
||||||
|
|
||||||
InformerFactory informers.SharedInformerFactory
|
InformerFactory informers.SharedInformerFactory
|
||||||
|
VersionedInformerFactory versionedinformers.SharedInformerFactory
|
||||||
}
|
}
|
||||||
|
|
||||||
// New returns the right sort of union of multiple authorizer.Authorizer objects
|
// New returns the right sort of union of multiple authorizer.Authorizer objects
|
||||||
@ -71,6 +73,7 @@ func (config AuthorizationConfig) New() (authorizer.Authorizer, authorizer.RuleR
|
|||||||
if authorizerMap[authorizationMode] {
|
if authorizerMap[authorizationMode] {
|
||||||
return nil, nil, fmt.Errorf("Authorization mode %s specified more than once", authorizationMode)
|
return nil, nil, fmt.Errorf("Authorization mode %s specified more than once", authorizationMode)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Keep cases in sync with constant list above.
|
// Keep cases in sync with constant list above.
|
||||||
switch authorizationMode {
|
switch authorizationMode {
|
||||||
case modes.ModeNode:
|
case modes.ModeNode:
|
||||||
|
@ -33,6 +33,7 @@ go_library(
|
|||||||
"//vendor/k8s.io/apiserver/pkg/server:go_default_library",
|
"//vendor/k8s.io/apiserver/pkg/server:go_default_library",
|
||||||
"//vendor/k8s.io/apiserver/pkg/server/options:go_default_library",
|
"//vendor/k8s.io/apiserver/pkg/server/options:go_default_library",
|
||||||
"//vendor/k8s.io/apiserver/pkg/util/flag:go_default_library",
|
"//vendor/k8s.io/apiserver/pkg/util/flag:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/informers:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@ import (
|
|||||||
|
|
||||||
"github.com/spf13/pflag"
|
"github.com/spf13/pflag"
|
||||||
|
|
||||||
|
versionedinformers "k8s.io/client-go/informers"
|
||||||
informers "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion"
|
informers "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion"
|
||||||
"k8s.io/kubernetes/pkg/kubeapiserver/authorizer"
|
"k8s.io/kubernetes/pkg/kubeapiserver/authorizer"
|
||||||
authzmodes "k8s.io/kubernetes/pkg/kubeapiserver/authorizer/modes"
|
authzmodes "k8s.io/kubernetes/pkg/kubeapiserver/authorizer/modes"
|
||||||
@ -83,7 +84,7 @@ func (s *BuiltInAuthorizationOptions) Modes() []string {
|
|||||||
return modes
|
return modes
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *BuiltInAuthorizationOptions) ToAuthorizationConfig(informerFactory informers.SharedInformerFactory) authorizer.AuthorizationConfig {
|
func (s *BuiltInAuthorizationOptions) ToAuthorizationConfig(informerFactory informers.SharedInformerFactory, versionedInformerFactory versionedinformers.SharedInformerFactory) authorizer.AuthorizationConfig {
|
||||||
return authorizer.AuthorizationConfig{
|
return authorizer.AuthorizationConfig{
|
||||||
AuthorizationModes: s.Modes(),
|
AuthorizationModes: s.Modes(),
|
||||||
PolicyFile: s.PolicyFile,
|
PolicyFile: s.PolicyFile,
|
||||||
@ -91,5 +92,6 @@ func (s *BuiltInAuthorizationOptions) ToAuthorizationConfig(informerFactory info
|
|||||||
WebhookCacheAuthorizedTTL: s.WebhookCacheAuthorizedTTL,
|
WebhookCacheAuthorizedTTL: s.WebhookCacheAuthorizedTTL,
|
||||||
WebhookCacheUnauthorizedTTL: s.WebhookCacheUnauthorizedTTL,
|
WebhookCacheUnauthorizedTTL: s.WebhookCacheUnauthorizedTTL,
|
||||||
InformerFactory: informerFactory,
|
InformerFactory: informerFactory,
|
||||||
|
VersionedInformerFactory: versionedInformerFactory,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -73,6 +73,8 @@ go_test(
|
|||||||
"//vendor/k8s.io/apiserver/pkg/util/feature/testing:go_default_library",
|
"//vendor/k8s.io/apiserver/pkg/util/feature/testing:go_default_library",
|
||||||
"//vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/tokentest:go_default_library",
|
"//vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/tokentest:go_default_library",
|
||||||
"//vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/webhook:go_default_library",
|
"//vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/webhook:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/informers:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/kubernetes:go_default_library",
|
||||||
"//vendor/k8s.io/client-go/rest:go_default_library",
|
"//vendor/k8s.io/client-go/rest:go_default_library",
|
||||||
"//vendor/k8s.io/client-go/tools/clientcmd/api/v1:go_default_library",
|
"//vendor/k8s.io/client-go/tools/clientcmd/api/v1:go_default_library",
|
||||||
"//vendor/k8s.io/client-go/transport:go_default_library",
|
"//vendor/k8s.io/client-go/transport:go_default_library",
|
||||||
|
@ -33,6 +33,7 @@ import (
|
|||||||
"k8s.io/apiserver/pkg/authentication/user"
|
"k8s.io/apiserver/pkg/authentication/user"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
utilfeaturetesting "k8s.io/apiserver/pkg/util/feature/testing"
|
utilfeaturetesting "k8s.io/apiserver/pkg/util/feature/testing"
|
||||||
|
versionedinformers "k8s.io/client-go/informers"
|
||||||
restclient "k8s.io/client-go/rest"
|
restclient "k8s.io/client-go/rest"
|
||||||
"k8s.io/kubernetes/pkg/api/legacyscheme"
|
"k8s.io/kubernetes/pkg/api/legacyscheme"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
@ -71,13 +72,15 @@ func TestNodeAuthorizer(t *testing.T) {
|
|||||||
|
|
||||||
// Build client config, clientset, and informers
|
// Build client config, clientset, and informers
|
||||||
clientConfig := &restclient.Config{Host: apiServer.URL, ContentConfig: restclient.ContentConfig{NegotiatedSerializer: legacyscheme.Codecs}}
|
clientConfig := &restclient.Config{Host: apiServer.URL, ContentConfig: restclient.ContentConfig{NegotiatedSerializer: legacyscheme.Codecs}}
|
||||||
superuserClient := clientsetForToken(tokenMaster, clientConfig)
|
superuserClient, superuserClientExternal := clientsetForToken(tokenMaster, clientConfig)
|
||||||
informerFactory := informers.NewSharedInformerFactory(superuserClient, time.Minute)
|
informerFactory := informers.NewSharedInformerFactory(superuserClient, time.Minute)
|
||||||
|
versionedInformerFactory := versionedinformers.NewSharedInformerFactory(superuserClientExternal, time.Minute)
|
||||||
|
|
||||||
// Set up Node+RBAC authorizer
|
// Set up Node+RBAC authorizer
|
||||||
authorizerConfig := &authorizer.AuthorizationConfig{
|
authorizerConfig := &authorizer.AuthorizationConfig{
|
||||||
AuthorizationModes: []string{"Node", "RBAC"},
|
AuthorizationModes: []string{"Node", "RBAC"},
|
||||||
InformerFactory: informerFactory,
|
InformerFactory: informerFactory,
|
||||||
|
VersionedInformerFactory: versionedInformerFactory,
|
||||||
}
|
}
|
||||||
nodeRBACAuthorizer, _, err := authorizerConfig.New()
|
nodeRBACAuthorizer, _, err := authorizerConfig.New()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -94,7 +97,6 @@ func TestNodeAuthorizer(t *testing.T) {
|
|||||||
// Start the server
|
// Start the server
|
||||||
masterConfig := framework.NewIntegrationTestMasterConfig()
|
masterConfig := framework.NewIntegrationTestMasterConfig()
|
||||||
masterConfig.GenericConfig.Authenticator = authenticator
|
masterConfig.GenericConfig.Authenticator = authenticator
|
||||||
|
|
||||||
masterConfig.GenericConfig.Authorizer = nodeRBACAuthorizer
|
masterConfig.GenericConfig.Authorizer = nodeRBACAuthorizer
|
||||||
masterConfig.GenericConfig.AdmissionControl = nodeRestrictionAdmission
|
masterConfig.GenericConfig.AdmissionControl = nodeRestrictionAdmission
|
||||||
_, _, closeFn := framework.RunAMasterUsingServer(masterConfig, apiServer, h)
|
_, _, closeFn := framework.RunAMasterUsingServer(masterConfig, apiServer, h)
|
||||||
@ -104,6 +106,7 @@ func TestNodeAuthorizer(t *testing.T) {
|
|||||||
stopCh := make(chan struct{})
|
stopCh := make(chan struct{})
|
||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
informerFactory.Start(stopCh)
|
informerFactory.Start(stopCh)
|
||||||
|
versionedInformerFactory.Start(stopCh)
|
||||||
|
|
||||||
// Wait for a healthy server
|
// Wait for a healthy server
|
||||||
for {
|
for {
|
||||||
@ -303,9 +306,9 @@ func TestNodeAuthorizer(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nodeanonClient := clientsetForToken(tokenNodeUnknown, clientConfig)
|
nodeanonClient, _ := clientsetForToken(tokenNodeUnknown, clientConfig)
|
||||||
node1Client := clientsetForToken(tokenNode1, clientConfig)
|
node1Client, _ := clientsetForToken(tokenNode1, clientConfig)
|
||||||
node2Client := clientsetForToken(tokenNode2, clientConfig)
|
node2Client, _ := clientsetForToken(tokenNode2, clientConfig)
|
||||||
|
|
||||||
// all node requests from node1 and unknown node fail
|
// all node requests from node1 and unknown node fail
|
||||||
expectForbidden(t, getSecret(nodeanonClient))
|
expectForbidden(t, getSecret(nodeanonClient))
|
||||||
|
@ -36,6 +36,7 @@ import (
|
|||||||
"k8s.io/apiserver/pkg/authentication/user"
|
"k8s.io/apiserver/pkg/authentication/user"
|
||||||
"k8s.io/apiserver/pkg/authorization/authorizer"
|
"k8s.io/apiserver/pkg/authorization/authorizer"
|
||||||
"k8s.io/apiserver/pkg/registry/generic"
|
"k8s.io/apiserver/pkg/registry/generic"
|
||||||
|
externalclientset "k8s.io/client-go/kubernetes"
|
||||||
restclient "k8s.io/client-go/rest"
|
restclient "k8s.io/client-go/rest"
|
||||||
"k8s.io/client-go/transport"
|
"k8s.io/client-go/transport"
|
||||||
"k8s.io/kubernetes/pkg/api/legacyscheme"
|
"k8s.io/kubernetes/pkg/api/legacyscheme"
|
||||||
@ -65,10 +66,10 @@ func clientForToken(user string) *http.Client {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func clientsetForToken(user string, config *restclient.Config) clientset.Interface {
|
func clientsetForToken(user string, config *restclient.Config) (clientset.Interface, externalclientset.Interface) {
|
||||||
configCopy := *config
|
configCopy := *config
|
||||||
configCopy.BearerToken = user
|
configCopy.BearerToken = user
|
||||||
return clientset.NewForConfigOrDie(&configCopy)
|
return clientset.NewForConfigOrDie(&configCopy), externalclientset.NewForConfigOrDie(&configCopy)
|
||||||
}
|
}
|
||||||
|
|
||||||
type testRESTOptionsGetter struct {
|
type testRESTOptionsGetter struct {
|
||||||
@ -431,7 +432,8 @@ func TestRBAC(t *testing.T) {
|
|||||||
clientConfig := &restclient.Config{Host: s.URL, ContentConfig: restclient.ContentConfig{NegotiatedSerializer: legacyscheme.Codecs}}
|
clientConfig := &restclient.Config{Host: s.URL, ContentConfig: restclient.ContentConfig{NegotiatedSerializer: legacyscheme.Codecs}}
|
||||||
|
|
||||||
// Bootstrap the API Server with the test case's initial roles.
|
// Bootstrap the API Server with the test case's initial roles.
|
||||||
if err := tc.bootstrapRoles.bootstrap(clientsetForToken(superUser, clientConfig)); err != nil {
|
superuserClient, _ := clientsetForToken(superUser, clientConfig)
|
||||||
|
if err := tc.bootstrapRoles.bootstrap(superuserClient); err != nil {
|
||||||
t.Errorf("case %d: failed to apply initial roles: %v", i, err)
|
t.Errorf("case %d: failed to apply initial roles: %v", i, err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user