Kubernetes: Search for rule granting certain action

kubernetes role clusterrole rule lookup

3 min read | by Jordi Prats

To be able to audit access permissions of users un a Kubernetes cluster we might be interested in searching for Roles or ClusterRoles that grants access to a certain object:

For example, if we want to identify which Roles in a certain namespace or ClusterRoles are allowing create of ConfigMap objects.

To do so we'll need to list all the ClusterRoles and Roles within and then look at all it's rules for one that matches this criteria. We can install the golang version from the releases page in github.

Below you'll find how much of a difference would it make to implement this functionality using a bash script, python and golang.

Bash script + python

We are going to use a bash script that uses kubectl to list all the Roles that we need to check, and then let a python script check for rules that match the criteria.

This script takes around 8 minutes to list all the matching roles:

$ time bash bash rule-lookup.sh demo-ns create configmaps "" (...) real 8m20.793s user 2m13.657s sys 2m50.060s 

Python script

We can rewrite the bash script to python to improve the execution time, a pure python script takes around 2 seconds:

$ time python3 rule-lookup.py --namespace demo-ns --verb create --resource configmaps --api-group "" (...) real 0m2.575s user 0m0.612s sys 0m0.117s $ time python3 rule-lookup.py --namespace demo-ns --verb create --resource configmaps --api-group "" (...) real 0m2.310s user 0m0.737s sys 0m0.215s $ time python3 rule-lookup.py --namespace demo-ns --verb create --resource configmaps --api-group "" (...) real 0m2.053s user 0m0.662s sys 0m0.163s 

Golang with go run

If we use a go run to execute the golang version it takes about the same time it takes to run the python script:

$ time go run rule-lookup.go --namespace demo-ns --verb create --resource configmaps --api-group "" (...) real 0m2.809s user 0m1.135s sys 0m0.562s $ time go run rule-lookup.go --namespace demo-ns --verb create --resource configmaps --api-group "" (...) real 0m1.835s user 0m1.123s sys 0m0.501s $ time go run rule-lookup.go --namespace demo-ns --verb create --resource configmaps --api-group "" (...) real 0m1.849s user 0m1.124s sys 0m0.492s 

Compiled Golang

If we compile this golang version with go build rule-lookup.go we can get better results, taking somewhere between 1 second and half a second:

$ time ./rule-lookup --namespace demo-ns --verb create --resource configmaps --api-group "" (...) real 0m1.034s user 0m0.115s sys 0m0.049s $ time ./rule-lookup --namespace demo-ns --verb create --resource configmaps --api-group "" (...) real 0m0.478s user 0m0.105s sys 0m0.028s $ time ./rule-lookup --namespace demo-ns --verb create --resource configmaps --api-group "" (...) real 0m0.449s user 0m0.100s sys 0m0.024s 

Posted on 27/02/2023