# Kubernetes Role-Based Access Control(RBAC)

{{#include ../../banners/hacktricks-training.md}}

## Role-Based Access Control (RBAC)

Kubernetes ima **modul autorizacije nazvan Role-Based Access Control** ([**RBAC**](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)) koji pomaže u postavljanju dozvola za korišćenje API servera.

RBAC-ov model dozvola se sastoji od **tri pojedinačna dela**:

1. **Role\ClusterRole ­–** Stvarna dozvola. Sadrži _**pravila**_ koja predstavljaju skup dozvola. Svako pravilo sadrži [resurse](https://kubernetes.io/docs/reference/kubectl/overview/#resource-types) i [glagole](https://kubernetes.io/docs/reference/access-authn-authz/authorization/#determine-the-request-verb). Glagol je akcija koja će se primeniti na resurs.
2. **Subject (Korisnik, Grupa ili ServiceAccount) –** Objekat koji će primiti dozvole.
3. **RoleBinding\ClusterRoleBinding –** Povezivanje između Role\ClusterRole i subjekta.

![](https://www.cyberark.com/wp-content/uploads/2018/12/rolebiding_serviceaccount_and_role-1024x551.png)

Razlika između “**Roles**” i “**ClusterRoles**” je samo u tome gde će se uloga primeniti – “**Role**” će omogućiti pristup samo **jednom** **specifičnom** **namespace-u**, dok se “**ClusterRole**” može koristiti u **svim namespace-ima** u klasteru. Štaviše, **ClusterRoles** takođe mogu omogućiti pristup:

- **resursima sa opsegom klastera** (kao što su čvorovi).
- **ne-resursnim** krajnjim tačkama (kao što je /healthz).
- resursima u namespace-u (kao što su Pods), **u svim namespace-ima**.

Od **Kubernetes** 1.6 pa nadalje, **RBAC** politike su **omogućene po default-u**. Ali da biste omogućili RBAC, možete koristiti nešto poput:
```
kube-apiserver --authorization-mode=Example,RBAC --other-options --more-options
```
## Šabloni

U šablonu **Role** ili **ClusterRole** potrebno je navesti **ime uloge**, **namespace** (u ulogama) i zatim **apiGroups**, **resources** i **verbs** uloge:

- **apiGroups** je niz koji sadrži različite **API namespace** na koje se ova pravila primenjuju. Na primer, definicija Pod koristi apiVersion: v1. _Može imati vrednosti kao što su rbac.authorization.k8s.io ili \[\*]_.
- **resources** je niz koji definiše **koje resurse se ova pravila primenjuju**. Sve resurse možete pronaći sa: `kubectl api-resources --namespaced=true`
- **verbs** je niz koji sadrži **dozvoljene glagole**. Glagol u Kubernetes definiše **tip akcije** koju treba primeniti na resurs. Na primer, glagol list se koristi za kolekcije dok se "get" koristi za pojedinačni resurs.

### Pravila Glagoli

(_Ove informacije su preuzete iz_ [_**dokumentacije**_](https://kubernetes.io/docs/reference/access-authn-authz/authorization/#determine-the-request-verb))

| HTTP glagol | glagol zahteva                                                                                                                                                  |
| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| POST        | create                                                                                                                                                        |
| GET, HEAD   | get (za pojedinačne resurse), list (za kolekcije, uključujući sadržaj celog objekta), watch (za praćenje pojedinačnog resursa ili kolekcije resursa) |
| PUT         | update                                                                                                                                                        |
| PATCH       | patch                                                                                                                                                         |
| DELETE      | delete (za pojedinačne resurse), deletecollection (za kolekcije)                                                                                         |

Kubernetes ponekad proverava autorizaciju za dodatne dozvole koristeći specijalizovane glagole. Na primer:

- [PodSecurityPolicy](https://kubernetes.io/docs/concepts/policy/pod-security-policy/)
- glagol `use` na `podsecuritypolicies` resursima u `policy` API grupi.
- [RBAC](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#privilege-escalation-prevention-and-bootstrapping)
- glagoli `bind` i `escalate` na `roles` i `clusterroles` resursima u `rbac.authorization.k8s.io` API grupi.
- [Autentifikacija](https://kubernetes.io/docs/reference/access-authn-authz/authentication/)
- glagol `impersonate` na `users`, `groups`, i `serviceaccounts` u osnovnoj API grupi, i `userextras` u `authentication.k8s.io` API grupi.

> [!WARNING]
> Možete pronaći **sve glagole koje svaki resurs podržava** izvršavanjem `kubectl api-resources --sort-by name -o wide`

### Primeri
```yaml:Role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: defaultGreen
name: pod-and-pod-logs-reader
rules:
- apiGroups: [""]
resources: ["pods", "pods/log"]
verbs: ["get", "list", "watch"]
```

```yaml:ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
# "namespace" omitted since ClusterRoles are not namespaced
name: secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "watch", "list"]
```
Na primer, možete koristiti **ClusterRole** da omogućite određenom korisniku da pokrene:
```
kubectl get pods --all-namespaces
```
### **RoleBinding i ClusterRoleBinding**

[**Iz dokumenata:**](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#rolebinding-and-clusterrolebinding) **Role binding dodeljuje dozvole definisane u roli korisniku ili skupu korisnika**. Sadrži listu subjekata (korisnici, grupe ili servisni nalozi) i referencu na rolu koja se dodeljuje. **RoleBinding** dodeljuje dozvole unutar specifičnog **namespace-a**, dok **ClusterRoleBinding** dodeljuje taj pristup **na nivou klastera**.
```yaml:RoleBinding
piVersion: rbac.authorization.k8s.io/v1
# This role binding allows "jane" to read pods in the "default" namespace.
# You need to already have a Role named "pod-reader" in that namespace.
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
# You can specify more than one "subject"
- kind: User
name: jane # "name" is case sensitive
apiGroup: rbac.authorization.k8s.io
roleRef:
# "roleRef" specifies the binding to a Role / ClusterRole
kind: Role #this must be Role or ClusterRole
name: pod-reader # this must match the name of the Role or ClusterRole you wish to bind to
apiGroup: rbac.authorization.k8s.io
```

```yaml:ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
# This cluster role binding allows anyone in the "manager" group to read secrets in any namespace.
kind: ClusterRoleBinding
metadata:
name: read-secrets-global
subjects:
- kind: Group
name: manager # Name is case sensitive
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: secret-reader
apiGroup: rbac.authorization.k8s.io
```
**Dozvole su aditivne**, tako da ako imate clusterRole sa “list” i “delete” tajnama, možete ga dodati sa Role koja ima “get”. Zato budite svesni i uvek testirajte svoje uloge i dozvole i **navedite šta je DOZVOLJENO, jer je sve po defaultu ZABRANJENO.**

## **Enumeracija RBAC**
```bash
# Get current privileges
kubectl auth can-i --list
# use `--as=system:serviceaccount:<namespace>:<sa_name>` to impersonate a service account

# List Cluster Roles
kubectl get clusterroles
kubectl describe clusterroles

# List Cluster Roles Bindings
kubectl get clusterrolebindings
kubectl describe clusterrolebindings

# List Roles
kubectl get roles
kubectl describe roles

# List Roles Bindings
kubectl get rolebindings
kubectl describe rolebindings
```
### Zloupotreba Role/ClusterRoles za Eskalaciju Privilegija

{{#ref}}
abusing-roles-clusterroles-in-kubernetes/
{{#endref}}

{{#include ../../banners/hacktricks-training.md}}
