Skip to content

Kubernetes RBAC (Role-Based Access Control)

RBAC Architecture

Fornisce un’identità ai Pod all’interno del cluster. Serve per autenticare i processi del Pod quando interagiscono con l'API Server di Kubernetes.

apiVersion: v1
kind: ServiceAccount
metadata:
  name: alloy
  namespace: monitoring
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: alloy-role
  namespace: monitoring
rules:
  - apiGroups: [""]
    resources: ["pods", "pods/log"] # Accesso ai pod e relativi log
    resourceNames: ["alloy-pod"]    # Limita l'azione esclusivamente a questo pod
    verbs: ["get", "list", "watch"]

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: example-role
  namespace: monitoring
rules:
- apiGroups: 
    - ""                # Core Group: pod, service, configmap, secret, node, pv, pvc
    - "apps"            # Workload: deployment, statefulset, daemonset, replicaset
    - "batch"           # Job, cronjob
    - "networking.k8s.io" # Ingress, networkpolicy
    - "storage.k8s.io"  # Storageclass, volumeattachment
    - "*"               # Jolly: TUTTI i gruppi API (attenzione alla sicurezza!)

  resources: 
    - "pods"            # Risorsa singola
    - "pods/log"        # Sub-risorsa (permetti di vedere i log ma non di modificare il pod)
    - "pods/exec"       # Sub-risorsa (permetti di entrare nel pod)
    - "deployments"     # Nota: va sempre scritto al PLURALE
    - "configmaps"
    - "*"               # Jolly: TUTTE le risorse del gruppo indicato sopra

  resourceNames: 
    - "nginx-pod"       # Opzionale: limita l'azione solo a questo specifico pod
    - "app-config"      # Limita l'azione solo a questa specifica configmap

  verbs: 
    - "get"             # Recupera il dettaglio di una singola risorsa
    - "list"            # Elenca tutte le risorse
    - "watch"           # Monitora i cambiamenti in tempo reale
    - "create"          # Crea una nuova risorsa
    - "update"          # Modifica una risorsa esistente (richiede intero oggetto)
    - "patch"           # Modifica parziale di una risorsa
    - "delete"          # Elimina una risorsa
    - "deletecollection" # Elimina più risorse in una volta sola
    - "*"               # Jolly: TUTTE le azioni (permessi da admin)
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: alloy-role-binding
  namespace: monitoring
subjects:
  - kind: ServiceAccount
    name: alloy
    namespace: monitoring
roleRef:
  kind: Role 
  name: alloy-role
  apiGroup: rbac.authorization.k8s.io
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: alloy-cluster-role
rules:
  - apiGroups: [""]
    resources: ["pods", "pods/log"]
    verbs: ["get", "list", "watch"]

 -------------------------------
Prestare attenzione quando si modificano ClusterRoles e ClusterRoleBindings con nomi che contengono un system:prefisso. Le modifiche a queste  risorse possono causare cluster non funzionali.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: alloy-cluster-binding
subjects:
  - kind: ServiceAccount
    name: alloy
    namespace: monitoring
roleRef:
  kind: ClusterRole
  name: alloy-cluster-role
  apiGroup: rbac.authorization.k8s.io
apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-resources
  namespace: target-namespace
spec:
  hard:
    requests.cpu: "1"      # Somma massima delle CPU garantite (requests) per l'intero namespace
    requests.memory: 1Gi   # Somma massima della RAM garantita (requests) per l'intero namespace
    limits.cpu: "2"        # Tetto massimo di CPU (limits) utilizzabile complessivamente dai container
    limits.memory: 2Gi     # Tetto massimo di RAM (limits) utilizzabile complessivamente dai container
    pods: "10"             # Numero massimo di oggetti Pod che possono coesistere nel namespace