Questa pagina fornisce buone pratiche per la pianificazione dei criteri di controllo dell'accesso basato sui ruoli (RBAC). Per scoprire come implementare RBAC in Google Kubernetes Engine (GKE), consulta le Configurare il controllo degli accessi basato su ruoli
RBAC è una funzionalità di sicurezza fondamentale in Kubernetes che consente di creare cluster autorizzazioni per gestire le azioni che utenti e carichi di lavoro possono eseguire sulle risorse nei tuoi cluster. In qualità di amministratore di piattaforma, puoi creare ruoli RBAC e legare questi ruoli a soggetti, ovvero utenti autenticati, come o gruppi Google.
Prima di iniziare
Assicurati di conoscere i seguenti concetti:
Per un elenco di controllo di queste indicazioni, consulta Riepilogo dell'elenco di controllo.
Come funziona RBAC
RBAC supporta i seguenti tipi di ruoli e associazioni:
- ClusterRole: un insieme di autorizzazioni che può essere applicato a qualsiasi spazio dei nomi o all'intero cluster.
- Ruolo: un insieme di autorizzazioni limitato a un singolo spazio dei nomi.
- ClusterRoleBinding: associa un
ClusterRole
a un utente o a un gruppo per tutti gli spazi dei nomi del cluster. - RoleBinding: associa un
Role
o unClusterRole
a un utente o a un gruppo all'interno di uno spazio dei nomi specifico.
Puoi definire le autorizzazioni come rules
in Role
o ClusterRole
. Ogni campo rules
in un ruolo è costituito da un gruppo di API, dalle risorse API all'interno di quel gruppo di API e dai verbi (azioni) consentiti su queste risorse. Se vuoi, puoi limitare i verbi a istanze denominate di risorse API utilizzando il campo resourceNames
. Per un esempio, vedi
Limita l'accesso a istanze di risorse specifiche.
Dopo aver definito un ruolo, puoi utilizzare un RoleBinding
o un ClusterRoleBinding
per eseguire l'associazione
il ruolo a un soggetto. Scegli il tipo di associazione in base a se vuoi
concedere le autorizzazioni in un singolo spazio dei nomi o in più spazi dei nomi.
Progettazione dei ruoli RBAC
Applicare il principio del privilegio minimo
Quando si assegnano le autorizzazioni in un ruolo RBAC, utilizza il principio del privilegio minimo e concedi le autorizzazioni minime necessarie per eseguire un'attività. Utilizzando il principio del privilegio minimo riduce la possibilità di escalation dei privilegi se è compromesso e riduce la probabilità che un accesso eccessivo in un incidente di sicurezza.
Quando progetti i ruoli, valuta attentamente i rischi comuni di riassegnazione dei privilegi, come i verbi escalate
o bind
, l'accesso create
per i PersistentVolume o l'accesso create
per le richieste di firma del certificato. Per un elenco dei rischi, consulta
Kubernetes RBAC - privilege escalation risks.
Evitare ruoli e gruppi predefiniti
Kubernetes crea un set di ClusterRoles e ClusterRoleBinding predefiniti che
puoi utilizzare per il rilevamento API e per abilitare la funzionalità dei componenti gestiti. La
autorizzazioni concesse da questi ruoli predefiniti potrebbero essere estese a seconda
ruolo. Kubernetes favorisce inoltre
ha un insieme di utenti e gruppi di utenti predefiniti, identificati dal prefisso system:
.
Per impostazione predefinita, Kubernetes e GKE associano automaticamente questi ruoli
ai gruppi predefiniti e a vari soggetti. Per un elenco completo dei ruoli predefiniti
e le associazioni create da Kubernetes, fanno riferimento
Ruoli e associazioni di ruoli predefiniti.
La tabella seguente descrive alcuni ruoli, utenti e gruppi predefiniti. Me di evitare di interagire con questi ruoli, utenti e gruppi, a meno che sono stati valutati attentamente, perché interagire con queste risorse può avere e conseguenze indesiderate per la security posture del cluster.
Nome | Tipo | Descrizione |
---|---|---|
cluster-admin |
ClusterRole | Concede a un soggetto l'autorizzazione a eseguire qualsiasi operazione su qualsiasi risorsa nel cluster. |
system:anonymous |
Utente | Kubernetes assegna questo utente alle richieste del server API per le quali non sono state fornite informazioni di autenticazione. L'associazione di un ruolo a questo utente concede a qualsiasi utente non autenticato le autorizzazioni concesse dal ruolo. |
system:unauthenticated |
Gruppo | Kubernetes assegna questo gruppo alle richieste del server dell'API per le quali non sono state fornite informazioni di autenticazione. L'associazione di un ruolo a questo gruppo concede a qualsiasi utente non autenticato autorizzazioni concesse da quel ruolo. |
system:authenticated |
Gruppo | GKE assegna questo gruppo alle richieste del server API effettuate
da qualsiasi utente che ha eseguito l'accesso con un Account Google, inclusi tutti
account Gmail. In pratica, non si tratta
notevolmente diverso da L'associazione di un ruolo a questo gruppo concede a qualsiasi utente con un Account Google, inclusi tutti gli account Gmail, le autorizzazioni concesse dal ruolo. |
system:masters |
Gruppo | Kubernetes assegna il ruolo Se a questo gruppo aggiungi dei soggetti, questi possono eseguire qualsiasi azione sulle risorse nel cluster. |
Se possibile, evita di creare associazioni che coinvolgano utenti, ruoli e gruppi specifici. Questo può avere conseguenze indesiderate sulla sicurezza del cluster postura. Ad esempio:
- Associazione del ClusterRole predefinito
cluster-admin
al cluster Il grupposystem:unauthenticated
concede a qualsiasi utente non autenticato l'accesso a tutti risorse nel cluster (inclusi i secret). Questi privilegiati associazioni sono attivamente presi di mira da attacchi come le campagne di malware di massa. - L'associazione di un ruolo personalizzato al gruppo
system:unauthenticated
consente di ottenere le autorizzazioni concesse da quel ruolo agli utenti non autenticati.
Se possibile, segui queste linee guida:
- Non aggiungere soggetti personali al gruppo
system:masters
. - Non associare il gruppo
system:unauthenticated
a nessun ruolo RBAC. - Non associare il gruppo
system:authenticated
a nessun ruolo RBAC. - Non associare l'utente
system:anonymous
a nessun ruolo RBAC. - Non associare il ClusterRole
cluster-admin
ai tuoi soggetti o a nessuno gli utenti e i gruppi predefiniti. Se la tua applicazione richiede molte autorizzazioni, determina le autorizzazioni esatte richieste e crea un ruolo specifico a questo scopo. - Valuta le autorizzazioni concesse da altri ruoli predefiniti prima dell'associazione soggetti.
- Valuta i ruoli associati ai gruppi predefiniti prima di modificare i membri di quei gruppi.
Impedire l'utilizzo dei gruppi predefiniti
Puoi utilizzare gcloud CLI per disabilitare le associazioni RBAC non predefinite in un
che fanno riferimento a system:unauthenticated
e system:authenticated
gruppi o l'utente system:anonymous
. Utilizza uno o entrambi i seguenti flag quando crei un nuovo cluster GKE o aggiorni un cluster esistente.
L'utilizzo di questi flag non disattiva le associazioni Kubernetes predefinite che fanno riferimento a questi gruppi. Questi flag richiedono GKE versione 1.30.1-gke.1283000 o successiva.
--no-enable-insecure-binding-system-authenticated
: disattiva le opzioni non predefinite associazioni che fanno riferimento asystem:authenticated
.--no-enable-insecure-binding-system-unauthenticated
: disattiva le opzioni non predefinite associazioni che fanno riferimento asystem:unauthenticated
esystem:anonymous
.
Rilevare e rimuovere l'utilizzo di ruoli e gruppi predefiniti
Devi valutare i cluster per identificare se hai associato l'utente system:anonymous
o l'system:unauthenticated
oppure
system:authenticated
gruppi che utilizzano sia ClusterRoleBindings che RoleBinding.
ClusterRoleBindings
Elenca i nomi di tutti i ClusterRoleBinding con l'oggetto
system:anonymous
,system:unauthenticated
osystem:authenticated
:kubectl get clusterrolebindings -o json \ | jq -r '["Name"], ["-----"], (.items[] | select((.subjects | length) > 0) | select(any(.subjects[]; .name == "system:anonymous" or .name == "system:unauthenticated" or .name == "system:authenticated")) | [.metadata.namespace, .metadata.name]) | @tsv'
L'output dovrebbe elencare solo i seguenti ClusterRoleBinding:
Name ---- "system:basic-user" "system:discovery" "system:public-info-viewer"
Se l'output contiene associazioni non predefinite aggiuntive, svolgi i passaggi riportati di seguito per ogni associazione aggiuntiva. Se l'output non contiene valori non predefiniti associazioni, ignora i passaggi seguenti.
Elenca le autorizzazioni del ruolo associato all'associazione:
kubectl get clusterrolebinding CLUSTER_ROLE_BINDING_NAME -o json \ | jq ' .roleRef.name +" " + .roleRef.kind' \ | sed -e 's/"//g' \ | xargs -l bash -c 'kubectl get $1 $0 -o yaml'
Sostituisci
CLUSTER_ROLE_BINDING_NAME
con il nome del ruolo ClusterRoleBinding non predefinito.L'output è simile al seguente:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: ... rules: - apiGroups: - "" resources: - secrets verbs: - get - watch - list
Se stabilisci che le autorizzazioni nell'output possono essere concesse in sicurezza al per utenti o gruppi predefiniti, non sono necessarie ulteriori azioni. Se determini che le autorizzazioni concesse dall'associazione non sono sicure, vai alla successiva passaggio.
Elimina un'associazione non sicura dal cluster:
kubectl delete clusterrolebinding CLUSTER_ROLE_BINDING_NAME
Sostituisci
CLUSTER_ROLE_BINDING_NAME
con il nome di l'oggetto ClusterRoleBinding da eliminare.
RoleBinding
Elenca lo spazio dei nomi e il nome di eventuali associazioni dei ruoli con l'oggetto
system:anonymous
,system:unauthenticated
osystem:authenticated
:kubectl get rolebindings -A -o json \ | jq -r '["Namespace", "Name"], ["---------", "-----"], (.items[] | select((.subjects | length) > 0) | select(any(.subjects[]; .name == "system:anonymous" or .name == "system:unauthenticated" or .name == "system:authenticated")) | [.metadata.namespace, .metadata.name]) | @tsv'
Se il cluster è configurato correttamente, l'output dovrebbe essere vuoto. Se l'output contiene associazioni non predefinite, segui questi passaggi passaggi per ogni associazione aggiuntiva. Se l'output è vuoto, salta il passaggio i seguenti passaggi.
Se conosci solo il nome del RoleBinding, puoi utilizzare il seguente comando per trovare i RoleBinding corrispondenti in tutti gli spazi dei nomi:
kubectl get rolebindings -A -o json \ | jq -r '["Namespace", "Name"], ["---------", "-----"], (.items[] | select((.subjects | length) > 0) | select(.metadata.name == "ROLE_BINDING_NAME") | [.metadata.namespace, .metadata.name]) | @tsv'
Sostituisci
ROLE_BINDING_NAME
con il nome del RoleBinding non predefinito.Elenca le autorizzazioni del ruolo associato all'associazione:
kubectl get rolebinding ROLE_BINDING_NAME --namespace ROLE_BINDING_NAMESPACE -o json \ | jq ' .roleRef.name +" " + .roleRef.kind' \ | sed -e 's/"//g' \ | xargs -l bash -c 'kubectl get $1 $0 -o yaml --namespace ROLE_BINDING_NAMESPACE'
Sostituisci quanto segue:
ROLE_BINDING_NAME
: il nome del ruolo RoleBinding non predefinito.ROLE_BINDING_NAMESPACE
: lo spazio dei nomi del RoleBinding non predefinito.
L'output è simile al seguente:
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: ... rules: - apiGroups: - "" resources: - secrets verbs: - get - watch - list
Se stabilisci che le autorizzazioni nell'output possono essere concesse in sicurezza al per utenti o gruppi predefiniti, non sono necessarie ulteriori azioni. Se determini che le autorizzazioni concesse dall'associazione non sono sicure, vai alla successiva passaggio.
Elimina un'associazione non sicura dal cluster:
kubectl delete rolebinding ROLE_BINDING_NAME --namespace ROLE_BINDING_NAMESPACE
Sostituisci quanto segue:
ROLE_BINDING_NAME
: il nome dell'associazione dei ruoli eliminare.ROLE_BINDING_NAMESPACE
: lo spazio dei nomi del RoleBinding da eliminare.
Definire le autorizzazioni di ambito a livello di spazio dei nomi
Utilizza le associazioni e i ruoli come segue, a seconda delle esigenze del tuo carico di lavoro o dell'utente:
- Per concedere l'accesso alle risorse in uno spazio dei nomi, utilizza un
Role
con unRoleBinding
. - Per concedere l'accesso alle risorse in più di uno spazio dei nomi, utilizza un
ClusterRole
con unRoleBinding
per ogni spazio dei nomi. - Per concedere l'accesso alle risorse in ogni spazio dei nomi, utilizza un
ClusterRole
con unClusterRoleBinding
.
Concedi le autorizzazioni nel minor numero possibile di spazi dei nomi.
Non utilizzare caratteri jolly
Il carattere *
è un carattere jolly che si applica a tutto. Evita di utilizzare
caratteri jolly nelle regole. Specifica in modo esplicito gruppi di API, risorse e verbi in
regole RBAC. Ad esempio, specificando *
nel campo verbs
verranno concesse le autorizzazioni get
,
list
, watch
, patch
, update
, deletecollection
e delete
sulle risorse. La tabella seguente mostra esempi di come evitare i caratteri jolly nelle tue regole:
Consigliato | Non consigliato |
---|---|
- rules: apiGroups: ["apps","extensions"] resources: ["deployments"] verbs: ["get","list","watch"] Concede |
- rules: apiGroups: ["*"] resources: ["deployments"] verbs: ["get","list","watch"] Concedi i verbi a |
- rules: apiGroups: ["apps", "extensions"] resources: ["deployments"] verbs: ["get", "list", "watch"] Concede solo |
- rules: apiGroups: ["apps", "extensions"] resources: ["deployments"] verbs: ["*"] Concedi tutti i verbi, inclusi |
Utilizza regole separate per concedere l'accesso con privilegi minimi a risorse specifiche
Quando pianifichi le regole, prova i seguenti passaggi di alto livello per un design più efficiente delle regole con privilegi minimi in ogni ruolo:
- Crea una bozza di regole RBAC separate per ogni verbo su ogni risorsa a cui un soggetto deve accedere.
- Dopo aver creato le regole, analizzale per verificare se sono presenti più regole
hanno lo stesso elenco
verbs
. Combina queste regole in un'unica regola. - Mantieni separate tutte le regole rimanenti.
Questo approccio consente di progettare regole più organizzate, in cui le regole che concedono gli stessi verbi a più risorse sono combinate e quelle che concedono verbi diversi alle risorse sono separate.
Ad esempio, se il carico di lavoro ha bisogno delle autorizzazioni per deployments
risorsa, ma ha bisogno di list
e watch
sulle risorse daemonsets
, dovresti
usare regole separate quando si crea un ruolo. Quando colleghi il ruolo RBAC al tuo
carico di lavoro, non potrà utilizzare watch
su deployments
.
Per fare un altro esempio, se il carico di lavoro ha bisogno di get
e watch
sia su pods
e la risorsa daemonsets
, puoi combinarle in un'unica
perché il carico di lavoro ha bisogno degli stessi verbi su entrambe le risorse.
Nella tabella seguente, entrambi i layout delle regole funzionano, ma le regole di suddivisione sono più limitare l'accesso alle risorse in modo granulare in base alle tue esigenze:
Consigliato | Sconsigliato |
---|---|
- rules: apiGroups: ["apps"] resources: ["deployments"] verbs: ["get"] - rules: apiGroups: ["apps"] resources: ["daemonsets"] verbs: ["list", "watch"] Concede l'accesso |
- rules: apiGroups: ["apps"] resources: ["deployments", "daemonsets"] verbs: ["get","list","watch"] Concedi i verbi sia ai deployment che ai DaemonSet. Un soggetto
che potrebbe non richiedere l'accesso |
- rules: apiGroups: ["apps"] resources: ["daemonsets", "deployments"] verbs: ["list", "watch"] Combina due regole perché il soggetto ha bisogno degli stessi verbi per
le risorse |
- rules: apiGroups: ["apps"] resources: ["daemonsets"] verbs: ["list", "watch"] - rules: apiGroups: ["apps"] resources: ["deployments"] verbs: ["list", "watch"] Queste regole di suddivisione avrebbero lo stesso risultato della combinazione ma creare disordine non necessario nel file manifest del ruolo |
Limita l'accesso a istanze di risorse specifiche
RBAC ti consente di utilizzare il campo resourceNames
nelle regole per limitare l'accesso a
per una specifica istanza con nome di una risorsa. Ad esempio, se stai scrivendo un ruolo RBAC che deve update
il ConfigMap seccomp-high
e nient'altro, puoi utilizzare resourceNames
per specificare solo quel ConfigMap. Usa resourceNames
ove possibile.
Consigliato | Non consigliato |
---|---|
- rules: apiGroups: [""] resources: ["configmaps"] resourceNames: ["seccomp-high"] verbs: ["update"] Limita il soggetto ad aggiornare solo il ConfigMap |
- rules: apiGroups: [""] resources: ["configmaps"] verbs: ["update"] L'oggetto può aggiornare il ConfigMap |
- rules: apiGroups: [""] resources: ["configmaps"] verbs: ["list"] - rules: apiGroups: [""] resources: ["configmaps"] resourceNames: ["seccomp-high"] verbs: ["update"] Concede a |
- rules: apiGroups: [""] resources: ["configmaps"] verbs: ["update", "list"] Concede l'accesso |
Non consentire agli account di servizio di modificare le risorse RBAC
Non associare risorse Role
o ClusterRole
con bind
, escalate
,
Autorizzazioni create
, update
o patch
in rbac.authorization.k8s.io
da un gruppo API ad account di servizio
in qualsiasi spazio dei nomi. In particolare, escalate
e bind
possono consentire a un malintenzionato di aggirare i meccanismi di prevenzione della riassegnazione integrati nel RBAC.
Account di servizio Kubernetes
crea un account di servizio Kubernetes per ogni carico di lavoro
Creare un account di servizio Kubernetes separato per ogni carico di lavoro. Associa un ruolo Role
o ClusterRole
con il privilegio minimo a quell'account di servizio.
Non utilizzare l'account di servizio predefinito
Kubernetes crea un account di servizio denominato default
in ogni spazio dei nomi. L'account di serviziodefault
viene assegnato automaticamente ai pod che non specificano esplicitamente un account di servizio nel file manifest. Evita di associare un Role
o
ClusterRole
all'account di servizio default
. Kubernetes potrebbe assegnare default
a un pod che non necessita dell'accesso concesso in questi ruoli.
Non montare automaticamente i token degli account di servizio
Il campo automountServiceAccountToken
nella specifica del pod indica a Kubernetes di iniettare un token delle credenziali per un account di servizio Kubernetes nel pod. Il pod può utilizzare questo token per effettuare richieste autenticate ai
il server API Kubernetes. Il valore predefinito per questo campo è true
.
In tutte le versioni di GKE, imposta automountServiceAccountToken=false
nella specifica del pod se i pod non devono comunicare con l'API server.
Preferenza ai token temporanei rispetto ai token basati su secret
Per impostazione predefinita, il processo kubelet sul nodo recupera un token dell'account di servizio di breve durata e con rotazione automatica per ogni pod. Kubelet monta questo token sul pod come volume proiettato, a meno che non imposti il campo automountServiceAccountToken
su false
nella specifica del pod. Eventuali chiamate all'API Kubernetes dal pod utilizzano questo token per autenticarsi al server API.
Se recuperi manualmente i token dell'account di servizio, evita di utilizzare i secret Kubernetes per archiviare il token. I token degli account di servizio basati su secret sono credenziali legacy che non scadono e non vengono ruotate automaticamente. Se hai bisogno di credenziali per gli account di servizio, utilizza l'API TokenRequest
per ottenere token di breve durata che vengono ruotati automaticamente.
Controlla continuamente le autorizzazioni RBAC
Rivedi regolarmente i ruoli e l'accesso RBAC per identificare potenziali percorsi di riassegnazione e regole ridondanti. Ad esempio, considera una situazione in cui non elimini un RoleBinding
che lega un Role
con privilegi speciali a un utente eliminato. Se un utente malintenzionato crea un account utente in quello spazio dei nomi con lo stesso nome
dell'utente eliminato, saranno associati a quell'Role
ed erediteranno lo stesso
l'accesso. Le revisioni periodiche riducono al minimo questo rischio.
Riepilogo elenco di controllo
Passaggi successivi
- Leggi i consigli sulla protezione avanzata di GKE.
- Leggi le best practice di Kubernetes RBAC.
- Consulta le altre best practice.
- Visualizza manifest di esempio per i ruoli comuni dei cluster