Questa pagina mostra come autorizzare le azioni sulle risorse nei cluster Google Kubernetes Engine (GKE) utilizzando il meccanismo di controllo dell'accesso basato sui ruoli (RBAC) integrato in Kubernetes. Kubernetes RBAC è abilitato per impostazione predefinita, il che ti consente di controllare l'accesso al cluster in modo granulare.
Scoprirai come definire e assegnare autorizzazioni precise, creare ruoli e associazioni di ruoli per gestire l'accesso degli utenti, verificare l'accesso API per controllare il livello di accesso, risolvere i problemi comuni e comprendere le limitazioni quando lavori con RBAC in GKE.
Questa pagina è destinata a specialisti della sicurezza e operatori che vogliono utilizzare RBAC per migliorare la sicurezza nei cluster GKE. Per saperne di più sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei Google Cloud contenuti, consulta Ruoli e attività comuni degli utenti GKE.
Prima di leggere questa pagina, assicurati di conoscere i seguenti concetti:
- Panoramica di Kubernetes RBAC
- Best practice per RBAC in GKE per le linee guida per migliorare la progettazione delle policy RBAC.
Prima di iniziare
Prima di iniziare, assicurati di aver eseguito le seguenti attività:
- Abilita l'API Google Kubernetes Engine. Abilita l'API Google Kubernetes Engine
- Se vuoi utilizzare Google Cloud CLI per questa attività,
installala e poi
inizializza gcloud CLI. Se hai già installato gcloud CLI, scarica l'ultima
versione eseguendo il
gcloud components updatecomando. Le versioni precedenti di gcloud CLI potrebbero non supportare l'esecuzione dei comandi in questo documento.
Interazione con Identity and Access Management
Puoi utilizzare sia Identity and Access Management (IAM) sia Kubernetes RBAC per controllare l'accesso al cluster GKE:
IAM non è specifico per Kubernetes; fornisce la gestione delle identità per più Google Cloud prodotti e opera principalmente al livello del Google Cloud progetto.
Kubernetes RBAC è un componente fondamentale di Kubernetes e consente di creare e concedere ruoli (set di autorizzazioni) per qualsiasi oggetto o tipo di oggetto all'interno del cluster.
Per autorizzare un'azione, GKE controlla prima una policy RBAC. Se non esiste una policy RBAC, GKE controlla le autorizzazioni IAM.
In GKE, IAM e Kubernetes RBAC sono integrati per autorizzare gli utenti a eseguire azioni se dispongono di autorizzazioni sufficienti in base a uno dei due strumenti. Questa è una parte importante del bootstrapping di un cluster GKE, poiché per impostazione predefinita Google Cloud gli utenti non hanno alcun RoleBinding Kubernetes RBAC.
Per autorizzare gli utenti che utilizzano gli account Google Cloud , il client deve
essere configurato correttamente per l'autenticazione utilizzando questi account. Ad esempio,
se utilizzi kubectl, devi
configurare il comando kubectl per l'autenticazione a Google Cloud
prima di eseguire qualsiasi comando che richieda l'autorizzazione.
Nella maggior parte dei casi, è possibile utilizzare Kubernetes RBAC anziché IAM.
Gli utenti GKE richiedono, come minimo, l'autorizzazione IAM container.clusters.get nel progetto che contiene il cluster.
Questa autorizzazione è inclusa nel ruolo container.clusterViewer e in altri ruoli con privilegi più elevati. L'autorizzazione container.clusters.get è necessaria per consentire agli utenti di autenticarsi ai cluster nel progetto, ma non li autorizza a eseguire alcuna azione all'interno di questi cluster. L'autorizzazione può essere fornita da IAM o Kubernetes RBAC.
Definire e assegnare le autorizzazioni
Puoi definire le regole RBAC negli oggetti ClusterRole e Role, quindi assegnare
tali regole con gli oggetti ClusterRoleBinding e RoleBinding come segue:
- ClusterRole: un raggruppamento a livello di cluster di risorse e operazioni consentite
che puoi assegnare a un utente o a un gruppo utilizzando un
RoleBindingo unClusterRoleBinding. - Ruolo: un raggruppamento con spazio dei nomi di risorse e operazioni consentite che puoi assegnare a un utente o a un gruppo di utenti utilizzando un
RoleBinding. - ClusterRoleBinding: assegna un
ClusterRolea un utente o a un gruppo per tutti gli spazi dei nomi nel cluster. - RoleBinding: assegna un
Roleo unClusterRolea un utente o a un gruppo all'interno di uno spazio dei nomi specifico.
Quando utilizzi un RoleBinding per assegnare un ClusterRole a un utente o a un gruppo, questi utenti e gruppi possono accedere solo alle risorse nello spazio dei nomi specificato nel RoleBinding. Se vuoi che gli utenti o i gruppi accedano alle risorse in tutti gli spazi dei nomi, utilizza invece un ClusterRoleBinding.
Definire le autorizzazioni utilizzando Role o ClusterRole
Definisci le autorizzazioni all'interno di un oggetto Role o ClusterRole. Un oggetto Role definisce l'accesso alle risorse all'interno di un singolo spazio dei nomi, mentre un oggetto ClusterRole definisce l'accesso alle risorse nell'intero cluster.
Role e ClusterRole hanno la stessa sintassi. Ognuno ha una sezione rules, in cui definisci le risorse a cui si applica la regola e le operazioni consentite per il ruolo. Ad esempio, il seguente ruolo concede l'accesso in lettura (get, watch e list) a tutti i pod nello spazio dei nomi accounting:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: accounting
name: pod-reader
rules:
- apiGroups: [""] # "" indicates the core API group
resources: ["pods"]
verbs: ["get", "watch", "list"]
Consulta la documentazione dell'API Role e ClusterRole per un elenco completo dei campi consentiti.
Role rispetto a ClusterRole
Poiché le autorizzazioni concesse da un ClusterRole si applicano all'intero cluster, puoi utilizzare i ClusterRole per controllare l'accesso a diversi tipi di risorse rispetto a quelle che puoi utilizzare con i ruoli. Questi includono:
- Risorse con ambito cluster come i nodi
- Endpoint REST non di risorse come
/healthz - Risorse con spazio dei nomi in tutti gli spazi dei nomi (ad esempio, tutti i pod nell'intero cluster, indipendentemente dallo spazio dei nomi)
Assegnare i ruoli utilizzando RoleBinding o ClusterRoleBinding
Dopo aver creato un ruolo o un ClusterRole, lo assegni a un utente o a un gruppo di utenti creando un RoleBinding o un ClusterRoleBinding. Gli utenti e i gruppi sono chiamati subjects e possono essere uno dei seguenti:
| Tipo di soggetto | Valore per kind |
Valore per name |
|---|---|---|
| Google Cloud account utente | User |
Google Cloud indirizzo email registrato |
| Account di servizio Kubernetes | ServiceAccount |
Il nome di un oggetto ServiceAccount Kubernetes nel cluster |
| Account di servizio IAM | User |
Indirizzo email del account di servizio IAM generato automaticamente |
| Indirizzo del gruppo Google su un dominio verificato | Group |
Indirizzo email di un gruppo Google Workspace che è membro del gruppo gke-security-groups. Per istruzioni su come configurare Google Gruppi per RBAC, consulta Configurare Google Gruppi per RBAC. |
Il seguente RoleBinding concede il pod-reader ruolo a un utente, a un
account di servizio Kubernetes, a un account di servizio IAM e a un gruppo
Google:
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: pod-reader-binding
namespace: accounting
subjects:
# Google Cloud user account
- kind: User
name: janedoe@example.com
# Kubernetes service account
- kind: ServiceAccount
name: johndoe
# IAM service account
- kind: User
name: test-account@test-project.iam.gserviceaccount.com
# Google Group
- kind: Group
name: accounting-group@example.com
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
Verificare l'accesso API utilizzando kubectl
kubectl fornisce il sottocomando auth can-i per eseguire rapidamente query sul livello di autorizzazione API. In qualità di amministratore della piattaforma, potresti dover rappresentare gli utenti per determinare le azioni che possono eseguire. Puoi utilizzare il auth can-i e passare un flag --as aggiuntivo.
Quando esegui il comando kubectl auth can-i senza il flag --as, Identity and Access Management (IAM) esegue l'autorizzazione. Invece, quando aggiungi il flag --as, Kubernetes RBAC esegue l'autorizzazione. Pertanto, dovrai creare gli oggetti necessari
Role e RoleBinding per RBAC.
Per ulteriori informazioni, consulta la sezione Verificare l'accesso API.
Utilizzo e esempi dell'API
Per informazioni complete sull'utilizzo dell'API Kubernetes per creare gli oggetti
Role, ClusterRole, RoleBinding, e ClusterRoleBinding necessari per
RBAC, consulta la sezione Utilizzo dell'autorizzazione del controllo dell'accesso basato sui ruoli
nella documentazione di Kubernetes.
Risolvere i problemi relativi a RBAC
Per eseguire il debug dei problemi relativi a RBAC, utilizza l'
audit log Attività di amministrazione, che
è abilitato per impostazione predefinita su tutti i cluster. Se l'accesso a una risorsa o a un'operazione viene negato a causa della mancanza di autorizzazioni sufficienti, il server API registra un errore RBAC DENY, insieme a informazioni aggiuntive come l'appartenenza implicita ed esplicita al gruppo dell'utente. Se utilizzi Google Gruppi per RBAC, nel messaggio di log viene visualizzato google groups.
Limitazioni
Le sezioni seguenti descrivono le interazioni che potrebbero non sembrare ovvie quando si lavora con Kubernetes RBAC e IAM.
Ruoli di rilevamento predefiniti
I cluster vengono creati con un insieme di
ClusterRole e ClusterRoleBinding predefiniti.
Le richieste effettuate con credenziali valide vengono inserite nel gruppo system:authenticated, mentre tutte le altre richieste rientrano in system:unauthenticated.
Il ClusterRole system:basic-user consente agli utenti di eseguire SelfSubjectAccessReviews per testare le proprie autorizzazioni nel cluster. Il
system:discovery ruolo consente agli utenti di leggere le API di rilevamento, che possono rivelare
informazioni su
CustomResourceDefinitions
aggiunte al cluster.
Gli utenti anonimi (system:unauthenticated) ricevono invece il ClusterRole system:public-info-viewer, che concede l'accesso in sola lettura alle API /healthz e /version.
Per visualizzare gli endpoint API consentiti dal ClusterRole system:discovery, esegui il seguente comando:
kubectl get clusterroles system:discovery -o yaml
Errore Forbidden per i service account sulle istanze Google Cloud VM
Il seguente errore può verificarsi quando l'istanza VM non ha l'ambito userinfo-email:
Error from server (Forbidden): error when creating ... "role-name" is forbidden: attempt to grant extra privileges:...
Ad esempio, supponiamo che la VM abbia l'ambito cloud-platform ma non l'ambito userinfo-email. Quando la VM riceve un token di accesso, Google Cloud
lo associa all'ambito cloud-platform Quando il server API Kubernetes
chiede Google Cloud l'identità associata al token di accesso,
riceve l'ID univoco del account di servizio, non l'indirizzo email del account di servizio.
Per eseguire l'autenticazione correttamente, crea una nuova VM con l'ambito userinfo-email o crea una nuova associazione di ruoli che utilizzi l'ID univoco.
Per creare una nuova istanza VM con l'ambito userinfo-email, esegui il seguente comando:
gcloud compute instances create INSTANCE_NAME \
--service-account SERVICE_ACCOUNT_EMAIL \
--scopes userinfo-email
Per creare una nuova associazione di ruoli che utilizzi l'ID univoco del account di servizio per una VM esistente, segui questi passaggi:
Identifica l'ID univoco del account di servizio:
gcloud iam service-accounts describe SERVICE_ACCOUNT_EMAILAd esempio, il seguente output mostra
uniqueIdper il account di serviziomy-iam-account@somedomain.com:displayName: Some Domain IAM service account email: my-iam-account@somedomain.com etag: BwWWja0YfJA name: projects/project-name/serviceAccounts/my-iam-account@somedomain.com oauth2ClientId: '123456789012345678901' projectId: project-name uniqueId: '123456789012345678901'Crea un'associazione di ruoli utilizzando
uniqueIddel account di servizio:kubectl create clusterrolebinding CLUSTERROLEBINDING_NAME \ --clusterrole cluster-admin \ --user UNIQUE_ID
Autorizzazione per creare o aggiornare ruoli e associazioni di ruoli
In Kubernetes, puoi creare o aggiornare un ruolo o un'associazione di ruoli con autorizzazioni specifiche solo se soddisfi le seguenti condizioni:
- Crea o aggiorna un ruolo: devi già disporre delle stesse autorizzazioni che vuoi concedere al ruolo. In alternativa, devi disporre dell'autorizzazione per eseguire il verbo
escalatesul ruolo. - Crea o aggiorna un'associazione di ruoli: devi già disporre delle stesse autorizzazioni concesse nel ruolo associato, con lo stesso ambito dell'associazione di ruoli. In alternativa, devi disporre dell'autorizzazione per eseguire il verbo
bindsul ruolo a cui viene fatto riferimento.
Se le autorizzazioni che stai concedendo nel ruolo ti sono state concesse originariamente utilizzando una policy di autorizzazione IAM anziché RBAC, la richiesta di ruolo o di associazione di ruoli potrebbe non riuscire. Ad esempio, considera la seguente richiesta di creazione di ruoli da parte di un utente a cui sono state concesse le autorizzazioni IAM container.pods.* e container.roles.create:
kubectl create role allowed-to-view-pods --resource pods --verb list,get
Se all'utente sono state concesse le autorizzazioni solo tramite IAM, potrebbe verificarsi il seguente errore:
Error from server (Forbidden): clusterroles.rbac.authorization.k8s.io "allowed-to-view-pods" is forbidden:
user "caller@example.com" (groups=["system:authenticated"]) is attempting to grant RBAC permissions not currently held:
{APIGroups:[""], Resources:["pods"], Verbs:["list" "get"]}
Per attenuare questa limitazione, concedi al chiamante le autorizzazioni nel ruolo utilizzando RBAC anziché IAM.
In alternativa, puoi utilizzare RBAC o IAM per concedere al chiamante il verbo escalate, il verbo bind o entrambi. Tuttavia, GKE non consiglia questo approccio, perché il chiamante può quindi concedere qualsiasi autorizzazione a qualsiasi ruolo.
Passaggi successivi
- Scopri come configurare Google Gruppi per RBAC.
- Scopri come creare policy di autorizzazione IAM.
- Scopri di più sul controllo dell'accesso.
- Scopri di più sulle best practice per RBAC in GKE.
- Scopri come eseguire l'autenticazione nel server dell'API Kubernetes.