@@ -80,6 +80,12 @@ func TestNodeAuthorizer(t *testing.T) {
80
80
featuregatetesting .SetFeatureGateDuringTest (t , selectorAuthzEnabled , genericfeatures .AuthorizeWithSelectors , true )
81
81
featuregatetesting .SetFeatureGateDuringTest (t , selectorAuthzEnabled , features .AuthorizeNodeWithSelectors , true )
82
82
83
+ serviceAccountTokenForCredentialProvidersDisabled := utilfeature .DefaultFeatureGate .DeepCopy ()
84
+ featuregatetesting .SetFeatureGateDuringTest (t , serviceAccountTokenForCredentialProvidersDisabled , features .KubeletServiceAccountTokenForCredentialProviders , false )
85
+
86
+ serviceAccountTokenForCredentialProvidersEnabled := utilfeature .DefaultFeatureGate .DeepCopy ()
87
+ featuregatetesting .SetFeatureGateDuringTest (t , serviceAccountTokenForCredentialProvidersEnabled , features .KubeletServiceAccountTokenForCredentialProviders , true )
88
+
83
89
featureVariants := []struct {
84
90
suffix string
85
91
features featuregate.FeatureGate
@@ -89,10 +95,11 @@ func TestNodeAuthorizer(t *testing.T) {
89
95
}
90
96
91
97
tests := []struct {
92
- name string
93
- attrs authorizer.AttributesRecord
94
- expect authorizer.Decision
95
- features featuregate.FeatureGate
98
+ name string
99
+ attrs authorizer.AttributesRecord
100
+ expect authorizer.Decision
101
+ expectReason string
102
+ features featuregate.FeatureGate
96
103
}{
97
104
{
98
105
name : "allowed configmap" ,
@@ -115,19 +122,22 @@ func TestNodeAuthorizer(t *testing.T) {
115
122
expect : authorizer .DecisionAllow ,
116
123
},
117
124
{
118
- name : "disallowed list many secrets" ,
119
- attrs : authorizer.AttributesRecord {User : node0 , ResourceRequest : true , Verb : "list" , Resource : "secrets" , Name : "" , Namespace : "ns0" },
120
- expect : authorizer .DecisionNoOpinion ,
125
+ name : "disallowed list many secrets" ,
126
+ attrs : authorizer.AttributesRecord {User : node0 , ResourceRequest : true , Verb : "list" , Resource : "secrets" , Name : "" , Namespace : "ns0" },
127
+ expect : authorizer .DecisionNoOpinion ,
128
+ expectReason : "No Object name found," ,
121
129
},
122
130
{
123
- name : "disallowed watch many secrets" ,
124
- attrs : authorizer.AttributesRecord {User : node0 , ResourceRequest : true , Verb : "watch" , Resource : "secrets" , Name : "" , Namespace : "ns0" },
125
- expect : authorizer .DecisionNoOpinion ,
131
+ name : "disallowed watch many secrets" ,
132
+ attrs : authorizer.AttributesRecord {User : node0 , ResourceRequest : true , Verb : "watch" , Resource : "secrets" , Name : "" , Namespace : "ns0" },
133
+ expect : authorizer .DecisionNoOpinion ,
134
+ expectReason : "No Object name found," ,
126
135
},
127
136
{
128
- name : "disallowed list secrets from all namespaces with name" ,
129
- attrs : authorizer.AttributesRecord {User : node0 , ResourceRequest : true , Verb : "list" , Resource : "secrets" , Name : "secret0-pod0-node0" , Namespace : "" },
130
- expect : authorizer .DecisionNoOpinion ,
137
+ name : "disallowed list secrets from all namespaces with name" ,
138
+ attrs : authorizer.AttributesRecord {User : node0 , ResourceRequest : true , Verb : "list" , Resource : "secrets" , Name : "secret0-pod0-node0" , Namespace : "" },
139
+ expect : authorizer .DecisionNoOpinion ,
140
+ expectReason : "can only read namespaced object of this type" ,
131
141
},
132
142
{
133
143
name : "allowed shared secret via pod" ,
@@ -219,6 +229,33 @@ func TestNodeAuthorizer(t *testing.T) {
219
229
attrs : authorizer.AttributesRecord {User : node0 , ResourceRequest : true , Verb : "update" , Resource : "serviceaccounts" , Subresource : "token" , Name : "svcacct0-node0" , Namespace : "ns0" },
220
230
expect : authorizer .DecisionNoOpinion ,
221
231
},
232
+ {
233
+ name : "get allowed svcacct via pod - feature enabled" ,
234
+ attrs : authorizer.AttributesRecord {User : node0 , ResourceRequest : true , Verb : "get" , Resource : "serviceaccounts" , Name : "svcacct0-node0" , Namespace : "ns0" },
235
+ expect : authorizer .DecisionAllow ,
236
+ features : serviceAccountTokenForCredentialProvidersEnabled ,
237
+ },
238
+ {
239
+ name : "disallowed get svcacct via pod - feature disabled" ,
240
+ attrs : authorizer.AttributesRecord {User : node0 , ResourceRequest : true , Verb : "get" , Resource : "serviceaccounts" , Name : "svcacct0-node0" , Namespace : "ns0" },
241
+ expect : authorizer .DecisionNoOpinion ,
242
+ features : serviceAccountTokenForCredentialProvidersDisabled ,
243
+ expectReason : "not allowed to get service accounts" ,
244
+ },
245
+ {
246
+ name : "disallowed list svcacct via pod - feature disabled" ,
247
+ attrs : authorizer.AttributesRecord {User : node0 , ResourceRequest : true , Verb : "list" , Resource : "serviceaccounts" , Name : "svcacct0-node0" , Namespace : "ns0" },
248
+ expect : authorizer .DecisionNoOpinion ,
249
+ features : serviceAccountTokenForCredentialProvidersDisabled ,
250
+ expectReason : "can only create tokens for individual service accounts" ,
251
+ },
252
+ {
253
+ name : "disallowed watch svcacct via pod - feature disabled" ,
254
+ attrs : authorizer.AttributesRecord {User : node0 , ResourceRequest : true , Verb : "watch" , Resource : "serviceaccounts" , Name : "svcacct0-node0" , Namespace : "ns0" },
255
+ expect : authorizer .DecisionNoOpinion ,
256
+ features : serviceAccountTokenForCredentialProvidersDisabled ,
257
+ expectReason : "can only create tokens for individual service accounts" ,
258
+ },
222
259
{
223
260
name : "disallowed get lease in namespace other than kube-node-lease - feature enabled" ,
224
261
attrs : authorizer.AttributesRecord {User : node0 , ResourceRequest : true , Verb : "get" , Resource : "leases" , APIGroup : "coordination.k8s.io" , Name : "node0" , Namespace : "foo" },
@@ -398,10 +435,11 @@ func TestNodeAuthorizer(t *testing.T) {
398
435
features : selectorAuthzDisabled ,
399
436
},
400
437
{
401
- name : "disallowed unfiltered list ResourceSlices - selector authz enabled" ,
402
- attrs : authorizer.AttributesRecord {User : node0 , ResourceRequest : true , Verb : "list" , Resource : "resourceslices" , APIGroup : "resource.k8s.io" },
403
- expect : authorizer .DecisionNoOpinion ,
404
- features : selectorAuthzEnabled ,
438
+ name : "disallowed unfiltered list ResourceSlices - selector authz enabled" ,
439
+ attrs : authorizer.AttributesRecord {User : node0 , ResourceRequest : true , Verb : "list" , Resource : "resourceslices" , APIGroup : "resource.k8s.io" },
440
+ expect : authorizer .DecisionNoOpinion ,
441
+ features : selectorAuthzEnabled ,
442
+ expectReason : "can only list/watch/deletecollection resourceslices with nodeName field selector" ,
405
443
},
406
444
{
407
445
name : "allowed filtered watch ResourceSlices" ,
@@ -415,10 +453,11 @@ func TestNodeAuthorizer(t *testing.T) {
415
453
features : selectorAuthzDisabled ,
416
454
},
417
455
{
418
- name : "disallowed unfiltered watch ResourceSlices - selector authz enabled" ,
419
- attrs : authorizer.AttributesRecord {User : node0 , ResourceRequest : true , Verb : "watch" , Resource : "resourceslices" , APIGroup : "resource.k8s.io" },
420
- expect : authorizer .DecisionNoOpinion ,
421
- features : selectorAuthzEnabled ,
456
+ name : "disallowed unfiltered watch ResourceSlices - selector authz enabled" ,
457
+ attrs : authorizer.AttributesRecord {User : node0 , ResourceRequest : true , Verb : "watch" , Resource : "resourceslices" , APIGroup : "resource.k8s.io" },
458
+ expect : authorizer .DecisionNoOpinion ,
459
+ features : selectorAuthzEnabled ,
460
+ expectReason : "can only list/watch/deletecollection resourceslices with nodeName field selector" ,
422
461
},
423
462
{
424
463
name : "allowed get ResourceSlice" ,
@@ -460,10 +499,11 @@ func TestNodeAuthorizer(t *testing.T) {
460
499
features : selectorAuthzDisabled ,
461
500
},
462
501
{
463
- name : "get unrelated pod - selector enabled" ,
464
- attrs : authorizer.AttributesRecord {User : node0 , ResourceRequest : true , Verb : "get" , Resource : "pods" , APIGroup : "" , Name : "pod0-node1" , Namespace : "ns0" },
465
- expect : authorizer .DecisionNoOpinion , // stricter with selector authz enabled
466
- features : selectorAuthzEnabled ,
502
+ name : "get unrelated pod - selector enabled" ,
503
+ attrs : authorizer.AttributesRecord {User : node0 , ResourceRequest : true , Verb : "get" , Resource : "pods" , APIGroup : "" , Name : "pod0-node1" , Namespace : "ns0" },
504
+ expect : authorizer .DecisionNoOpinion , // stricter with selector authz enabled
505
+ features : selectorAuthzEnabled ,
506
+ expectReason : "no relationship found between node 'node0' and this object" ,
467
507
},
468
508
// list pods
469
509
{
@@ -488,10 +528,11 @@ func TestNodeAuthorizer(t *testing.T) {
488
528
features : selectorAuthzDisabled ,
489
529
},
490
530
{
491
- name : "list unrelated pods - selector enabled" ,
492
- attrs : authorizer.AttributesRecord {User : node0 , ResourceRequest : true , Verb : "list" , Resource : "pods" , APIGroup : "" },
493
- expect : authorizer .DecisionNoOpinion , // stricter with selector authz enabled
494
- features : selectorAuthzEnabled ,
531
+ name : "list unrelated pods - selector enabled" ,
532
+ attrs : authorizer.AttributesRecord {User : node0 , ResourceRequest : true , Verb : "list" , Resource : "pods" , APIGroup : "" },
533
+ expect : authorizer .DecisionNoOpinion , // stricter with selector authz enabled
534
+ features : selectorAuthzEnabled ,
535
+ expectReason : "can only list/watch pods with spec.nodeName field selector" ,
495
536
},
496
537
// watch pods
497
538
{
@@ -516,10 +557,11 @@ func TestNodeAuthorizer(t *testing.T) {
516
557
features : selectorAuthzDisabled ,
517
558
},
518
559
{
519
- name : "watch unrelated pods - selector enabled" ,
520
- attrs : authorizer.AttributesRecord {User : node0 , ResourceRequest : true , Verb : "watch" , Resource : "pods" , APIGroup : "" },
521
- expect : authorizer .DecisionNoOpinion , // stricter with selector authz enabled
522
- features : selectorAuthzEnabled ,
560
+ name : "watch unrelated pods - selector enabled" ,
561
+ attrs : authorizer.AttributesRecord {User : node0 , ResourceRequest : true , Verb : "watch" , Resource : "pods" , APIGroup : "" },
562
+ expect : authorizer .DecisionNoOpinion , // stricter with selector authz enabled
563
+ features : selectorAuthzEnabled ,
564
+ expectReason : "can only list/watch pods with spec.nodeName field selector" ,
523
565
},
524
566
// create, delete pods
525
567
{
@@ -604,10 +646,11 @@ func TestNodeAuthorizer(t *testing.T) {
604
646
features : selectorAuthzDisabled ,
605
647
},
606
648
{
607
- name : "get unrelated pod - selector enabled" ,
608
- attrs : authorizer.AttributesRecord {User : node0 , ResourceRequest : true , Verb : "get" , Resource : "nodes" , APIGroup : "" , Name : "node1" },
609
- expect : authorizer .DecisionNoOpinion , // stricter with selector authz enabled
610
- features : selectorAuthzEnabled ,
649
+ name : "get unrelated pod - selector enabled" ,
650
+ attrs : authorizer.AttributesRecord {User : node0 , ResourceRequest : true , Verb : "get" , Resource : "nodes" , APIGroup : "" , Name : "node1" },
651
+ expect : authorizer .DecisionNoOpinion , // stricter with selector authz enabled
652
+ features : selectorAuthzEnabled ,
653
+ expectReason : "node 'node0' cannot read 'node1', only its own Node object" ,
611
654
},
612
655
// list nodes
613
656
{
@@ -622,10 +665,11 @@ func TestNodeAuthorizer(t *testing.T) {
622
665
features : selectorAuthzDisabled ,
623
666
},
624
667
{
625
- name : "list single unrelated node - selector enabled" ,
626
- attrs : authorizer.AttributesRecord {User : node0 , ResourceRequest : true , Verb : "list" , Resource : "nodes" , APIGroup : "" , Name : "node1" },
627
- expect : authorizer .DecisionNoOpinion , // stricter with selector authz enabled
628
- features : selectorAuthzEnabled ,
668
+ name : "list single unrelated node - selector enabled" ,
669
+ attrs : authorizer.AttributesRecord {User : node0 , ResourceRequest : true , Verb : "list" , Resource : "nodes" , APIGroup : "" , Name : "node1" },
670
+ expect : authorizer .DecisionNoOpinion , // stricter with selector authz enabled
671
+ features : selectorAuthzEnabled ,
672
+ expectReason : "node 'node0' cannot read 'node1', only its own Node object" ,
629
673
},
630
674
{
631
675
name : "list all nodes - selector disabled" ,
@@ -634,10 +678,11 @@ func TestNodeAuthorizer(t *testing.T) {
634
678
features : selectorAuthzDisabled ,
635
679
},
636
680
{
637
- name : "list all nodes - selector enabled" ,
638
- attrs : authorizer.AttributesRecord {User : node0 , ResourceRequest : true , Verb : "list" , Resource : "nodes" , APIGroup : "" },
639
- expect : authorizer .DecisionNoOpinion , // stricter with selector authz enabled
640
- features : selectorAuthzEnabled ,
681
+ name : "list all nodes - selector enabled" ,
682
+ attrs : authorizer.AttributesRecord {User : node0 , ResourceRequest : true , Verb : "list" , Resource : "nodes" , APIGroup : "" },
683
+ expect : authorizer .DecisionNoOpinion , // stricter with selector authz enabled
684
+ features : selectorAuthzEnabled ,
685
+ expectReason : "node 'node0' cannot read all nodes, only its own Node object" ,
641
686
},
642
687
// watch nodes
643
688
{
@@ -652,10 +697,11 @@ func TestNodeAuthorizer(t *testing.T) {
652
697
features : selectorAuthzDisabled ,
653
698
},
654
699
{
655
- name : "watch single unrelated node - selector enabled" ,
656
- attrs : authorizer.AttributesRecord {User : node0 , ResourceRequest : true , Verb : "watch" , Resource : "nodes" , APIGroup : "" , Name : "node1" },
657
- expect : authorizer .DecisionNoOpinion , // stricter with selector authz enabled
658
- features : selectorAuthzEnabled ,
700
+ name : "watch single unrelated node - selector enabled" ,
701
+ attrs : authorizer.AttributesRecord {User : node0 , ResourceRequest : true , Verb : "watch" , Resource : "nodes" , APIGroup : "" , Name : "node1" },
702
+ expect : authorizer .DecisionNoOpinion , // stricter with selector authz enabled
703
+ features : selectorAuthzEnabled ,
704
+ expectReason : "node 'node0' cannot read 'node1', only its own Node object" ,
659
705
},
660
706
{
661
707
name : "watch all nodes - selector disabled" ,
@@ -664,10 +710,11 @@ func TestNodeAuthorizer(t *testing.T) {
664
710
features : selectorAuthzDisabled ,
665
711
},
666
712
{
667
- name : "watch all nodes - selector enabled" ,
668
- attrs : authorizer.AttributesRecord {User : node0 , ResourceRequest : true , Verb : "watch" , Resource : "nodes" , APIGroup : "" },
669
- expect : authorizer .DecisionNoOpinion , // stricter with selector authz enabled
670
- features : selectorAuthzEnabled ,
713
+ name : "watch all nodes - selector enabled" ,
714
+ attrs : authorizer.AttributesRecord {User : node0 , ResourceRequest : true , Verb : "watch" , Resource : "nodes" , APIGroup : "" },
715
+ expect : authorizer .DecisionNoOpinion , // stricter with selector authz enabled
716
+ features : selectorAuthzEnabled ,
717
+ expectReason : "node 'node0' cannot read all nodes, only its own Node object" ,
671
718
},
672
719
// create nodes
673
720
{
@@ -737,6 +784,9 @@ func TestNodeAuthorizer(t *testing.T) {
737
784
if decision != tc .expect {
738
785
t .Errorf ("expected %v, got %v (%s)" , tc .expect , decision , reason )
739
786
}
787
+ if reason != tc .expectReason {
788
+ t .Errorf ("expected reason %q, got %q" , tc .expectReason , reason )
789
+ }
740
790
})
741
791
}
742
792
}
0 commit comments