Questa pagina mostra come autorizzare le azioni sulle risorse nei tuoi cluster Google Kubernetes Engine (GKE) utilizzando il meccanismo di controllo dell'accesso basato sui ruoli (RBAC) integrato in Kubernetes. Il controllo dell'accesso basato su ruoli (RBAC) di Kubernetes è abilitato per impostazione predefinita, in modo da offrire un controllo granulare sull'accesso al cluster.
Imparerai a definire e assegnare autorizzazioni precise, creare ruoli e associazioni di ruoli per gestire l'accesso degli utenti, verificare l'accesso all'API per controllare il livello di accesso, risolvere i problemi comuni e comprendere le limitazioni quando si utilizza RBAC in GKE.
Questa pagina è rivolta a specialisti della sicurezza e operatori che vogliono utilizzare il RBAC per migliorare la sicurezza nei loro cluster GKE. Per scoprire di più sui ruoli comuni e sugli esempi di attività a cui facciamo riferimento nei contenuti di Google Cloud, consulta Ruoli e attività comuni degli utenti di GKE Enterprise.
Prima di leggere questa pagina, assicurati di conoscere i seguenti concetti:
- Panoramica di Kubernetes RBAC
- Best practice per RBAC in GKE per linee guida per migliorare la progettazione dei criteri RBAC.
Prima di iniziare
Prima di iniziare, assicurati di aver eseguito le seguenti operazioni:
- Attiva l'API Google Kubernetes Engine. Attiva l'API Google Kubernetes Engine
- Se vuoi utilizzare Google Cloud CLI per questa attività,
installa e poi
inizializza gcloud CLI. Se hai già installato gcloud CLI, ottieni la versione più recente eseguendo
gcloud components update
.
Interazione con Identity and Access Management
Puoi utilizzare sia Identity and Access Management (IAM) che Kubernetes RBAC per controllare l'accesso al tuo cluster GKE:
IAM non è specifico di Kubernetes; fornisce la gestione delle identità per più prodotti Google Cloud e opera principalmente a livello di progetto Google Cloud.
Kubernetes RBAC è un componente fondamentale di Kubernetes e ti 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 la presenza di un criterio RBAC. Se non è presente un criterio 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 entrambi gli strumenti. Questa è una parte importante dell'avvio di un cluster GKE, poiché per impostazione predefinita gli utenti di Google Cloud non hanno associazioni di ruoli Kubernetes RBAC.
Per autorizzare gli utenti che utilizzano account Google Cloud, il client deve essere configurato correttamente per autenticarsi utilizzando questi account. Ad esempio, se utilizzi kubectl
, devi configurare il comando kubectl
per l'autenticazione su Google Cloud prima di eseguire qualsiasi comando che richieda l'autorizzazione.
In quasi tutti i casi, è possibile utilizzare Kubernetes RBAC anziché IAM.
Gli utenti GKE richiedono almeno 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
è obbligatoria per consentire agli utenti di autenticarsi nei cluster del progetto, ma non li autorizza a eseguire azioni all'interno di questi cluster. L'autorizzazione può essere fornita da IAM o Kubernetes RBAC.
Definire e assegnare le autorizzazioni
Puoi definire regole RBAC negli oggetti ClusterRole
e Role
, quindi assegnarle con gli oggetti ClusterRoleBinding
e RoleBinding
come segue:
- ClusterRole: un raggruppamento di risorse e operazioni consentite a livello di cluster che puoi assegnare a un utente o un gruppo utilizzando un
RoleBinding
o unClusterRoleBinding
. - Ruolo: un raggruppamento con nome nello 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
ClusterRole
a un utente o un gruppo per tutti gli spazi dei nomi del cluster. - RoleBinding: assegna un
Role
o unClusterRole
a un utente o a un gruppo all'interno di un ambito 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 alla risorsa in tutti gli spazi dei nomi, utilizza un ClusterRoleBinding
.
Definire le autorizzazioni utilizzando i ruoli o i ClusterRole
Le autorizzazioni vengono definite all'interno di un oggetto Role o ClusterRole. Un ruolo definisce l'accesso alle risorse all'interno di un singolo spazio dei nomi, mentre un ClusterRole definisce l'accesso alle risorse nell'intero cluster.
I ruoli e i ClusterRole hanno la stessa sintassi. Ognuno ha una sezione rules
, in cui
si definiscono 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"]
Per un elenco completo dei campi consentiti, consulta la documentazione dell'API Role e ClusterRole.
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 ai ruoli. Queste includono:
- Risorse con ambito cluster, come i nodi
- Endpoint REST non di risorse, ad esempio
/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)
Assegna i ruoli utilizzando RoleBinding o ClusterRoleBindings
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 |
---|---|---|
Account utente Google Cloud | User |
Indirizzo email registrato in Google Cloud |
Service account Kubernetes | ServiceAccount |
Il nome di un oggetto ServiceAccount Kubernetes nel cluster |
Account di servizio IAM | User |
Indirizzo email dell'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 ruolo pod-reader
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 all'API utilizzando kubectl
kubectl
fornisce il sottocomando auth can-i
per eseguire query rapide sul livello di autorizzazione dell'API. In qualità di amministratore della piattaforma, potresti dover rubare l'identità degli utenti per determinare quali azioni possono eseguire. Puoi utilizzare auth can-i
e passare un flag --as
aggiuntivo.
Quando esegui il comando kubectl auth can-i
senza il flag --as
, l'autorizzazione viene eseguita da Identity and Access Management (IAM). Invece, se aggiungi il flag --as
, l'autorizzazione viene eseguita da Kubernetes RBAC. Pertanto, dovrai creare gli oggetti Role
e RoleBinding
necessari per il RBAC.
Per ulteriori informazioni, consulta Verificare l'accesso all'API.
Utilizzo ed esempi di API
Per informazioni complete sull'utilizzo dell'API Kubernetes per creare gli oggetti Role
, ClusterRole
, RoleBinding
e ClusterRoleBinding
necessari per il RBAC, consulta Utilizzare l'autorizzazione di controllo dell'accesso basato sui ruoli nella documentazione di Kubernetes.
Risoluzione dei problemi e debug
Per eseguire il debug dei problemi relativi al RBAC, utilizza il
log di controllo delle attività di amministrazione, che è attivo su tutti i cluster per impostazione predefinita. Se l'accesso a una risorsa o a un'operazione viene rifiutato per mancanza di autorizzazioni sufficienti, il server API registra un errore RBAC DENY
, insieme a informazioni aggiuntive come l'appartenenza a gruppi impliciti ed espliciti 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 evidenti quando si lavora con RBAC e IAM di Kubernetes.
Ruoli di discovery predefiniti
I cluster vengono creati con un insieme di
ClusterRole e ClusterRoleBindings predefiniti.
Le richieste effettuate con credenziali valide vengono inserite nel gruppo system:authenticated
, mentre tutte le altre richieste rientrano in system:unauthenticated
.
Il ruolo system:basic-user
consente agli utenti di eseguire
SelfSubjectAccessReviews
per testare le proprie autorizzazioni nel cluster. Il ruolo
system:discovery
consente agli utenti di leggere le API di discovery, che possono rivelare informazioni su
CustomResourceDefinitions
aggiunto al cluster.
Gli utenti anonimi (system:unauthenticated
) ricevono invece il ruolo ClusterRole system:public-info-viewer
, che concede l'accesso di sola lettura alle API /healthz
e /version
.
Per visualizzare gli endpoint API consentiti dal ruolo ClusterRole system:discovery
, esegui il
seguente comando:
kubectl get clusterroles system:discovery -o yaml
Errore Forbidden per gli account di servizio nelle istanze VM Google Cloud
Quando l'istanza VM non ha l'ambito userinfo-email
, può verificarsi il seguente errore:
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 dell'API Kubernetes chiede a Google Cloud l'identità associata al token di accesso, riceve l'ID univoco dell'account di servizio, non l'indirizzo email dell'account di servizio.
Per eseguire l'autenticazione correttamente, crea una nuova VM con l'ambito userinfo-email
o una nuova associazione di ruolo 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 ruolo che utilizzi l'ID univoco dell'account di servizio per una VM esistente, svolgi i seguenti passaggi:
Identifica l'ID univoco dell'account di servizio:
gcloud iam service-accounts describe SERVICE_ACCOUNT_EMAIL
Ad esempio, l'output seguente mostra
uniqueId
per l'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 ruolo utilizzando il
uniqueId
dell'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
escalate
sul ruolo. - Crea o aggiorna un'associazione di ruolo: devi già disporre delle stesse autorizzazioni concesse nel ruolo associato, con lo stesso ambito dell'associazione di ruolo. In alternativa, devi disporre dell'autorizzazione per eseguire il verbo
bind
sul ruolo a cui fai riferimento.
Se le autorizzazioni che stai concedendo nel ruolo ti sono state originariamente concesse utilizzando un criterio di autorizzazione IAM anziché RBAC, la richiesta del ruolo o dell'associazione del ruolo potrebbe non riuscire. Ad esempio, prendi in considerazione la seguente richiesta di creazione di un ruolo 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 utilizzando 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 all'utente chiamante le autorizzazioni nel ruolo utilizzando RBAC anziché IAM.
In alternativa, puoi utilizzare RBAC o IAM per concedere all'autore della chiamata il verbo escalate
, il verbo bind
o entrambi. Tuttavia, GKE sconsiglia questo approccio, perché l'utente chiamante può concedere qualsiasi autorizzazione a qualsiasi ruolo.
Passaggi successivi
- Scopri come creare i criteri IAM.
- Scopri come configurare Google Gruppi per RBAC.