Cheat sheet RBAC OpenShift / Kubernetes
Cheat sheet RBAC OpenShift / Kubernetes
Obiettivo
Raccolta pratica di comandi per verificare:
- permessi effettivi di utenti e gruppi
- Role / ClusterRole
- RoleBinding / ClusterRoleBinding
- accesso a log, exec, secrets, configmap, pvc, deployment
- troubleshooting rapido di problemi RBAC in OpenShift
Nota: in OpenShift
ocusa la stessa logica RBAC di Kubernetes. Molti comandi funzionano uguali anche conkubectl.
Script di supporto
list-rbac-subject.sh1. Verifiche rapide: chi sono e che contesto sto usando
oc whoamioc whoami --show-serveroc config current-contextoc projectVerifica token / login corrente:
oc status2. Test diretto dei permessi con oc auth can-i
Sintassi base
oc auth can-i <verb> <resource>oc auth can-i <verb> <resource> -n <namespace>Esempi base
oc auth can-i get pods -n my-namespaceoc auth can-i list pods -n my-namespaceoc auth can-i create deployments -n my-namespaceoc auth can-i delete pvc -n my-namespaceoc auth can-i get secrets -n my-namespaceoc auth can-i update configmaps -n my-namespaceVerifica come altro utente (--as)
oc auth can-i get pods -n my-namespace --as=usernameoc auth can-i create deployments -n my-namespace --as=usernameVerifica simulando anche il gruppo (--as-group)
oc auth can-i get pods -n my-namespace \ --as=username \ --as-group="CN=MY_GROUP,CN=Users,DC=example,DC=it"Verifica sottorisorse
oc auth can-i get pods/log -n my-namespace --as=usernameoc auth can-i create pods/exec -n my-namespace --as=usernameoc auth can-i create pods/portforward -n my-namespace --as=usernameoc auth can-i get deployments/scale -n my-namespace --as=usernameForma equivalente con --subresource:
oc auth can-i get pods --subresource=log -n my-namespace --as=usernameoc auth can-i create pods --subresource=exec -n my-namespace --as=usernameoc auth can-i create pods --subresource=portforward -n my-namespace --as=usernameElencare tutto ciò che puoi fare nel namespace corrente
oc auth can-i --list -n my-namespaceElencare tutto ciò che può fare un altro utente
oc auth can-i --list -n my-namespace --as=username3. Comandi utili per i casi più frequenti
Log applicativi
oc auth can-i get pods/log -n my-namespace --as=usernameExec dentro i pod
oc auth can-i create pods/exec -n my-namespace --as=usernamePort-forward
oc auth can-i create pods/portforward -n my-namespace --as=usernameLettura secrets
oc auth can-i get secrets -n my-namespace --as=usernameoc auth can-i list secrets -n my-namespace --as=usernameLettura configmap
oc auth can-i get configmaps -n my-namespace --as=usernameScale deployment / deploymentconfig
oc auth can-i update deployments/scale -n my-namespace --as=usernameoc auth can-i update deploymentconfigs/scale -n my-namespace --as=usernameCreazione pod
oc auth can-i create pods -n my-namespace --as=usernameAccesso PVC / PV
oc auth can-i get pvc -n my-namespace --as=usernameoc auth can-i list pvc -n my-namespace --as=usernameoc auth can-i get pv --as=usernameJobs / CronJobs
oc auth can-i create jobs -n my-namespace --as=usernameoc auth can-i get cronjobs -n my-namespace --as=usernameRoute / Service / Ingress
oc auth can-i get routes.route.openshift.io -n my-namespace --as=usernameoc auth can-i get services -n my-namespace --as=usernameoc auth can-i get ingress -n my-namespace --as=usernameOpenShift Build / Image / DeploymentConfig
oc auth can-i get buildconfigs.build.openshift.io -n my-namespace --as=usernameoc auth can-i get builds.build.openshift.io -n my-namespace --as=usernameoc auth can-i get deploymentconfigs.apps.openshift.io -n my-namespace --as=usernameoc auth can-i get imagestreams.image.openshift.io -n my-namespace --as=username4. Verificare quali risorse esistono davvero nel cluster
Utile quando non sei sicuro del nome esatto di una risorsa o del relativo API group.
oc api-resourcesoc api-resources | grep -i roleoc api-resources | grep -i bindingoc api-resources | grep -i routeoc api-resources | grep -i buildoc api-resources | grep -i imageoc api-resources | grep -i operatorCon API group:
oc api-resources -o wide | less5. Vedere ruoli e binding presenti
Role e ClusterRole
oc get role -n my-namespaceoc get clusterroleDettaglio:
oc describe role <role-name> -n my-namespaceoc describe clusterrole <clusterrole-name>In YAML:
oc get role <role-name> -n my-namespace -o yamloc get clusterrole <clusterrole-name> -o yamlRoleBinding e ClusterRoleBinding
oc get rolebinding -n my-namespaceoc get clusterrolebindingDettaglio:
oc describe rolebinding <rb-name> -n my-namespaceoc describe clusterrolebinding <crb-name>In YAML:
oc get rolebinding <rb-name> -n my-namespace -o yamloc get clusterrolebinding <crb-name> -o yaml6. Cercare un utente o gruppo nei binding
Nel namespace
oc get rolebinding -n my-namespace -o yaml | grep -n -B3 -A8 'username'oc get rolebinding -n my-namespace -o yaml | grep -n -B3 -A8 'CN=MY_GROUP'A livello cluster
oc get clusterrolebinding -o yaml | grep -n -B3 -A8 'username'oc get clusterrolebinding -o yaml | grep -n -B3 -A8 'CN=MY_GROUP'Cercare in tutti i namespace
oc get rolebinding -A -o yaml | grep -n -B3 -A8 'username'oc get rolebinding -A -o yaml | grep -n -B3 -A8 'CN=MY_GROUP'Più leggibile:
oc get rolebinding -Aoc get clusterrolebinding7. Capire da quale ruolo arriva il permesso
Metodo 1: dal binding al ruolo
- individua il binding che contiene utente o gruppo
- guarda
roleRef.name - descrivi quel ruolo
Esempio:
oc describe rolebinding <binding-name> -n my-namespaceoc describe clusterrole viewMetodo 2: grep sullo YAML
oc get rolebinding -n my-namespace -o yaml | sed -n '/CN=MY_GROUP/,+15p'8. oc adm policy who-can: chi può fare cosa
Verifica generale
oc adm policy who-can get pods -n my-namespaceoc adm policy who-can create deployments -n my-namespaceoc adm policy who-can get secrets -n my-namespaceoc adm policy who-can update deployments/scale -n my-namespaceoc adm policy who-can create pods/exec -n my-namespaceFiltrare un gruppo
oc adm policy who-can get pods -n my-namespace | grep -i 'MY_GROUP'oc adm policy who-can get secrets -n my-namespace | grep -i 'MY_GROUP'Nota:
who-cannon sempre gestisce bene tutte le sottorisorse. Se hai dubbi, usaoc auth can-iimpersonando utente e gruppo: è il test più affidabile.
9. Comandi tipici di audit namespace
Vedere i binding nel namespace
oc get rolebinding -n my-namespaceVedere i subject dei binding
oc get rolebinding -n my-namespace -o custom-columns=NAME:.metadata.name,ROLE:.roleRef.name,SUBJECTS:.subjects[*].nameVedere solo i gruppi bindati
oc get rolebinding -n my-namespace -o jsonpath='{range .items[*]}{.metadata.name}{";"}{.roleRef.name}{";"}{range .subjects[*]}{.kind}{":"}{.name}{" "}{end}{"\n"}{end}'Vedere se c’è view, edit, admin
oc get rolebinding -n my-namespace | egrep 'view|edit|admin'10. Ruoli built-in più comuni in OpenShift
view
Permette in generale sola lettura delle risorse del progetto, compresi normalmente i log dei pod.
edit
Permette modifica delle risorse applicative del namespace.
admin
Gestione quasi completa del namespace, inclusi molti aspetti RBAC locali.
cluster-admin
Permessi totali sul cluster.
Per vedere le regole esatte:
oc describe clusterrole viewoc describe clusterrole editoc describe clusterrole adminoc describe clusterrole cluster-admin11. Verifica utente + gruppo LDAP in modo realistico
Quando l’accesso dipende da gruppi esterni, usa sempre sia --as sia --as-group.
Esempio:
oc auth can-i get pods/log -n qw-forbearance-be \ --as=J18148 \ --as-group="CN=GU_OCP_QW_USER,CN=Users,DC=cariprpcpar,DC=it"Se serve simulare anche il gruppo base autenticato:
oc auth can-i get pods/log -n qw-forbearance-be \ --as=J18148 \ --as-group="system:authenticated" \ --as-group="CN=GU_OCP_QW_USER,CN=Users,DC=cariprpcpar,DC=it"12. Troubleshooting rapido quando can-i dice NO
Controlli da fare
- namespace corretto?
- risorsa corretta?
- API group corretto?
- serve una subresource (
pods/log,pods/exec,deployments/scale)? - il gruppo LDAP corretto è davvero presente nel token / nella sync?
- il permesso arriva da RoleBinding namespace o da ClusterRoleBinding?
- stai impersonando anche
system:authenticatedquando necessario?
Comandi utili
oc api-resources | grep -i <nome-risorsa>oc get rolebinding -A -o yaml | grep -n -B3 -A8 'username'oc get clusterrolebinding -o yaml | grep -n -B3 -A8 'username'oc describe clusterrole <role-name>13. Vedere gruppi, utenti e subject presenti in binding
Solo nel namespace
oc get rolebinding -n my-namespace -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{range .subjects[*]}{" - "}{.kind}{": "}{.name}{"\n"}{end}{end}'A livello cluster
oc get clusterrolebinding -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{range .subjects[*]}{" - "}{.kind}{": "}{.name}{"\n"}{end}{end}'14. Audit completo di un namespace
Ruoli locali
oc get role -n my-namespaceoc get role -n my-namespace -o yamlBinding locali
oc get rolebinding -n my-namespaceoc get rolebinding -n my-namespace -o yamlServiceAccount
oc get sa -n my-namespaceoc describe sa <sa-name> -n my-namespacePermessi tipici applicativi
oc auth can-i get pods -n my-namespace --as=usernameoc auth can-i get pods/log -n my-namespace --as=usernameoc auth can-i create pods/exec -n my-namespace --as=usernameoc auth can-i get secrets -n my-namespace --as=usernameoc auth can-i update deployments -n my-namespace --as=usernameoc auth can-i update deployments/scale -n my-namespace --as=usernameoc auth can-i create routes.route.openshift.io -n my-namespace --as=username15. Audit completo cluster-wide
Tutti i ClusterRole
oc get clusterroleTutti i ClusterRoleBinding
oc get clusterrolebindingTutti i RoleBinding su tutti i namespace
oc get rolebinding -ATutti i binding che coinvolgono un gruppo
oc get rolebinding -A -o yaml | grep -n -B3 -A8 'CN=MY_GROUP'oc get clusterrolebinding -o yaml | grep -n -B3 -A8 'CN=MY_GROUP'16. Comandi utili OpenShift-specifici
Chi può usare SCC
oc adm policy who-can use scc anyuidoc adm policy who-can use scc privilegedVedere SCC assegnate a pod/serviceaccount
oc get sccoc describe scc anyuidoc describe scc privilegedChi può creare project
oc adm policy who-can create projectrequests17. Query comode con jsonpath e custom-columns
Binding con ruolo referenziato
oc get rolebinding -n my-namespace -o custom-columns=NAME:.metadata.name,ROLEKIND:.roleRef.kind,ROLE:.roleRef.nameClusterRoleBinding con soggetti
oc get clusterrolebinding -o custom-columns=NAME:.metadata.name,ROLE:.roleRef.name,SUBJECTS:.subjects[*].nameRoleBinding con subject type + name
oc get rolebinding -n my-namespace -o jsonpath='{range .items[*]}{.metadata.name}{"; role="}{.roleRef.name}{"; subjects="}{range .subjects[*]}{.kind}{":"}{.name}{" "}{end}{"\n"}{end}'18. Differenza pratica fra RoleBinding e ClusterRoleBinding
RoleBinding
- vale dentro un namespace
- può referenziare un
Roleo unClusterRole
ClusterRoleBinding
- vale a livello cluster
- referenzia un
ClusterRole
Esempio classico:
RoleBindingnel namespaceapp1che assegnaviewal gruppo LDAP- quel gruppo avrà
viewsolo inapp1
19. Comandi rapidi che conviene ricordare
Capire se un utente vede i log
oc auth can-i get pods/log -n my-namespace --as=username --as-group="CN=MY_GROUP,..."Capire se un utente può fare exec
oc auth can-i create pods/exec -n my-namespace --as=username --as-group="CN=MY_GROUP,..."Trovare il gruppo nei binding
oc get rolebinding -A -o yaml | grep -n -B3 -A8 'CN=MY_GROUP'oc get clusterrolebinding -o yaml | grep -n -B3 -A8 'CN=MY_GROUP'Capire da dove arriva il permesso
oc describe rolebinding <binding> -n my-namespaceoc describe clusterrole <role-name>Vedere tutto quello che può fare un utente
oc auth can-i --list -n my-namespace --as=username20. Mini playbook pratico: “un gruppo LDAP può vedere i log in Loki/OpenShift?”
- Verifica accesso ai log dei pod:
oc auth can-i get pods/log -n my-namespace \ --as=username \ --as-group="CN=MY_GROUP,CN=Users,DC=example,DC=it"- Cerca il gruppo nei binding:
oc get rolebinding -n my-namespace -o yaml | grep -n -B3 -A8 'CN=MY_GROUP'oc get clusterrolebinding -o yaml | grep -n -B3 -A8 'CN=MY_GROUP'- Identifica il ruolo assegnato:
oc describe rolebinding <binding-name> -n my-namespace- Descrivi il ruolo:
oc describe clusterrole view- Se
can-i get pods/logrispondeyes, allora l’utente/gruppo può consultare i log applicativi del namespace anche tramite console / integrazione logging, salvo personalizzazioni molto particolari.
21. Comandi di raccolta completa per ticket / audit
oc whoamioc whoami --show-serveroc projectoc get rolebinding -n my-namespaceoc get rolebinding -n my-namespace -o yamloc get clusterrolebinding -o yaml | grep -n -B3 -A8 'username'oc get clusterrolebinding -o yaml | grep -n -B3 -A8 'CN=MY_GROUP'oc auth can-i --list -n my-namespace --as=usernameoc auth can-i get pods/log -n my-namespace --as=username --as-group="CN=MY_GROUP,..."oc auth can-i create pods/exec -n my-namespace --as=username --as-group="CN=MY_GROUP,..."oc describe clusterrole viewoc describe clusterrole editoc describe clusterrole admin22. Note finali
oc auth can-iè il test più affidabile per sapere se una specifica azione è permessa.oc adm policy who-canè ottimo per audit veloci, ma con alcune sottorisorse può non essere sempre il più comodo.- Quando il permesso dipende da LDAP/AD, impersona sempre sia utente sia gruppo.
- Se non conosci il nome esatto della risorsa, parti sempre da
oc api-resources. - In OpenShift molti permessi applicativi comuni arrivano da
view,edit,admino da ruoli custom bindati ai gruppi.