@@ -16,73 +16,34 @@ import (
1616 authorizationclientv1 "k8s.io/client-go/kubernetes/typed/authorization/v1"
1717)
1818
19- type RBACRequirement struct {
20- APIGroup string
21- Resource string
22- Verbs []string
23- }
24-
25- type VersionedRBACRequirements struct {
26- VersionConstraints * semver.Constraints
27- RBACRequirements []* RBACRequirement
28- }
29-
30- var verbsCreateDeleteList = []string {"create" , "delete" , "list" }
31-
32- func NewRBACRequirement (apiGroup , resource string , verbs ... string ) * RBACRequirement {
33- return & RBACRequirement {
34- APIGroup : apiGroup ,
35- Resource : resource ,
36- Verbs : verbs ,
37- }
38- }
39-
40- var allVersionedRBACRequirements = []VersionedRBACRequirements {
41- {
42- VersionConstraints : api .MustConstraint (">= 1.20" ),
43- RBACRequirements : []* RBACRequirement {
44- NewRBACRequirement ("" , "pods" , verbsCreateDeleteList ... ),
45- NewRBACRequirement ("" , "roles" , verbsCreateDeleteList ... ),
46- NewRBACRequirement ("" , "rolebindings" , verbsCreateDeleteList ... ),
47- NewRBACRequirement ("" , "secrets" , verbsCreateDeleteList ... ),
48- NewRBACRequirement ("" , "serviceaccounts" , verbsCreateDeleteList ... ),
49- NewRBACRequirement ("" , "services" , verbsCreateDeleteList ... ),
50- NewRBACRequirement ("apps" , "deployments" , verbsCreateDeleteList ... ),
51- NewRBACRequirement ("apps" , "replicasets" , verbsCreateDeleteList ... ),
52- NewRBACRequirement ("apps" , "statefulsets" , verbsCreateDeleteList ... ),
53- NewRBACRequirement ("extensions" , "ingresses" , verbsCreateDeleteList ... ),
54- },
55- },
56- }
57-
5819func (k * KubernetesChecker ) CheckRBAC (ctx context.Context ) []* api.CheckResult {
5920 const checkName = "kubernetes-rbac"
6021 authClient := k .client .AuthorizationV1 ()
6122 results := make ([]* api.CheckResult , 0 )
6223
63- for _ , req := range k .rbacRequirements {
24+ for req , reqVerbs := range k .rbacRequirements {
6425 resName := fmt .Sprintf ("%s-%s" , checkName , req .Resource )
65- if err := k .checkOneRBAC (ctx , authClient , req ); err != nil {
26+ if err := k .checkOneRBAC (ctx , authClient , req , reqVerbs ); err != nil {
6627 summary := fmt .Sprintf ("missing permissions on resource %s: %s" , req .Resource , err )
6728 results = append (results , api .ErrorResult (resName , summary , err ))
6829 continue
6930 }
7031
71- summary := fmt .Sprintf ("%s: can %s" , req .Resource , strings .Join (req . Verbs , ", " ))
32+ summary := fmt .Sprintf ("%s: can %s" , req .Resource , strings .Join (reqVerbs , ", " ))
7233 results = append (results , api .PassResult (resName , summary ))
7334 }
7435
7536 return results
7637}
7738
78- func (k * KubernetesChecker ) checkOneRBAC (ctx context.Context , authClient authorizationclientv1.AuthorizationV1Interface , req * RBACRequirement ) error {
79- have := make ([]string , 0 , len (req . Verbs ))
80- for _ , verb := range req . Verbs {
39+ func (k * KubernetesChecker ) checkOneRBAC (ctx context.Context , authClient authorizationclientv1.AuthorizationV1Interface , req * ResourceRequirement , reqVerbs ResourceVerbs ) error {
40+ have := make ([]string , 0 , len (reqVerbs ))
41+ for _ , verb := range reqVerbs {
8142 sar := & authorizationv1.SelfSubjectAccessReview {
8243 Spec : authorizationv1.SelfSubjectAccessReviewSpec {
8344 ResourceAttributes : & authorizationv1.ResourceAttributes {
8445 Namespace : k .namespace ,
85- Group : req .APIGroup ,
46+ Group : req .Group ,
8647 Resource : req .Resource ,
8748 Verb : verb ,
8849 },
@@ -102,17 +63,17 @@ func (k *KubernetesChecker) checkOneRBAC(ctx context.Context, authClient authori
10263 }
10364 }
10465
105- if len (have ) != len (req . Verbs ) {
106- return xerrors .Errorf (fmt .Sprintf ("need: %+v have: %+v" , req . Verbs , have ))
66+ if len (have ) != len (reqVerbs ) {
67+ return xerrors .Errorf (fmt .Sprintf ("need: %+v have: %+v" , reqVerbs , have ))
10768 }
10869
10970 return nil
11071}
11172
112- func findClosestVersionRequirements (v * semver.Version ) [] * RBACRequirement {
113- for _ , vreqs := range allVersionedRBACRequirements {
73+ func findClosestVersionRequirements (v * semver.Version ) map [ * ResourceRequirement ] ResourceVerbs {
74+ for _ , vreqs := range allRequirements {
11475 if vreqs .VersionConstraints .Check (v ) {
115- return vreqs .RBACRequirements
76+ return vreqs .ResourceRequirements
11677 }
11778 }
11879 return nil
0 commit comments