Questa pagina fornisce una panoramica delle norme di logging di controllo in Google Kubernetes Engine (GKE). Questa pagina spiega come GKE acquisisce e registra gli eventi nel tuo cluster, i fattori che influenzano le informazioni registrate, dove vengono archiviate queste informazioni e le norme che influenzano ciò che visualizzi nei log di controllo.
Per istruzioni sull'attivazione e la visualizzazione dei diversi tipi di log di controllo, nonché sulle autorizzazioni IAM richieste, consulta Informazioni sul logging di controllo di GKE.
Questa pagina è dedicata agli esperti di sicurezza che vogliono ottenere informazioni dettagliate sulle attività che si verificano nei tuoi cluster per monitorare le minacce alla sicurezza, tenere traccia delle modifiche e risolvere i problemi. Per scoprire di più sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei contenuti, consulta Ruoli e attività comuni degli utenti GKE. Google Cloud
Prima di leggere questa pagina, assicurati di avere familiarità con i seguenti argomenti:
Panoramica dei criteri di audit
In un cluster GKE, il server API Kubernetes scrive le voci di audit log in un backend gestito da GKE. Quando GKE riceve le voci di log dal server API Kubernetes, le scrive nel log delle attività di amministrazione e nel log di accesso ai dati del tuo progetto.
Esistono due norme che influenzano ciò che vedi nei log di controllo del tuo progetto:
I criteri di controllo di Kubernetes definiscono le regole per gli eventi registrati come voci di log. Specifica inoltre quali dati devono essere inclusi nelle voci di log.
Il criterio di controllo GKE determina quali voci vengono scritte nel log delle attività di amministrazione e quali nel log degli accessi ai dati.
I log di controllo scritti nel log di accesso ai dati dipendono dalla configurazione del log di controllo. I log di accesso ai dati utilizzano i prezzi di Google Cloud Observability. I log delle attività di amministrazione sono offerti senza costi aggiuntivi. GKE supporta i seguenti tipi di log di accesso ai dati.
ADMIN_READ
: operazioni che leggono i metadati delle risorse Kubernetes, ad esempio l'elenco dei pod.DATA_READ
: operazioni che leggono i dati nelle risorse Kubernetes, ad esempio la lettura dei log di un pod.DATA_WRITE
: operazioni che scrivono dati nelle risorse Kubernetes, ad esempio l'aggiornamento dello stato del pod.
Per saperne di più, consulta Configurare gli audit log di accesso ai dati.
Criterio di controllo Kubernetes
Il server API Kubernetes segue un criterio specificato nel flag
--audit-policy-file
del comando
kube-apiserver.
Quando GKE avvia il server API Kubernetes, fornisce un file di criteri di controllo impostando il valore del flag --audit-policy-file
. Nel repository Kubernetes open source, puoi visualizzare lo script configure-helper.sh, che genera il file dei criteri di controllo. Puoi visualizzare la maggior parte del file
delle norme di controllo esaminando direttamente lo script.
Eventi e palchi
Quando una persona o un componente invia una richiesta al server API Kubernetes, la richiesta passa attraverso una o più fasi:
Fase | Descrizione |
---|---|
RequestReceived | Il gestore dell'audit ha ricevuto la richiesta. |
ResponseStarted | Le intestazioni della risposta sono state inviate, ma il corpo della risposta no. |
ResponseComplete | Il corpo della risposta è stato completato e non verranno inviati altri byte. |
Panico | Si è verificato un errore interno del server e la richiesta non è stata completata. |
Ogni fase di una richiesta genera un evento, che viene elaborato in base a un criterio. La policy specifica se l'evento deve essere registrato come voce di log e, in caso affermativo, quali dati devono essere inclusi nella voce di log.
Livelli di audit
Il file dei criteri di controllo Kubernetes contiene un elenco di regole. Nel file delle norme, la prima regola che corrisponde a un evento imposta il livello di controllo per l'evento.
Una regola può specificare uno di questi livelli di controllo:
Livello | Descrizione |
---|---|
Nessuno | Non creare una voce di log per l'evento. |
Metadati | Crea una voce di log. Includi i metadati, ma non includere il corpo della richiesta o il corpo della risposta. |
Richiesta | Crea una voce di log. Includi i metadati e il corpo della richiesta, ma non includere il corpo della risposta. |
RequestResponse | Crea una voce di log. Includi metadati, corpo della richiesta e corpo della risposta. |
Ecco un esempio di regola. Se un evento corrisponde alla regola, il server API Kubernetes crea una voce di log a livello Request
.
- level: Request userGroups: ["system:nodes"] verbs: ["update","patch"] resources: - group: "" # core resources: ["nodes/status", "pods/status"] omitStages: - "RequestReceived"
Un evento corrisponde alla regola se tutte le seguenti condizioni sono vere:
- L'evento non corrisponde ad alcuna regola precedente nel file delle norme.
- L'identità che effettua la chiamata si trova nel gruppo di utenti
system:nodes
. - La chiamata è una richiesta
update
opatch
. - La richiesta riguarda una risorsa
nodes/status
o una risorsapods/status
. - L'evento non riguarda la fase
RequestReceived
della chiamata.
Criterio di audit GKE
Quando GKE riceve le voci di log dal server API Kubernetes, applica le proprie norme per determinare quali voci vengono scritte nel Log delle attività di amministrazione del progetto e quali vengono scritte nel log di accesso ai dati del progetto.
Per la maggior parte, GKE applica le seguenti regole alle voci di log provenienti dal server API Kubernetes:
Le voci che rappresentano le richieste
create
,delete
eupdate
vengono inserite nel log delle attività di amministrazione.Le voci che rappresentano le richieste
get
,list
eupdateStatus
vengono inserite nel log di accesso ai dati.
Per informazioni sui prezzi e sui tipi di log abilitati per impostazione predefinita, consulta Dettagli di logging.
File dei criteri di controllo Kubernetes per i cluster GKE
Per i cluster GKE, il file dei criteri di controllo Kubernetes inizia con
regole che specificano che determinati eventi non devono essere registrati. Ad esempio, questa regola indica che qualsiasi richiesta get
da parte di kubelet
su una risorsa nodes
o una risorsa nodes/status
non deve essere registrata. Ricorda che un
livello di None
significa che nessun evento corrispondente deve essere registrato:
- level: None users: ["kubelet"] # legacy kubelet identity verbs: ["get"] resources: - group: "" # core resources: ["nodes", "nodes/status"]
Dopo l'elenco delle regole level: None
, il file dei criteri contiene un elenco di regole che
sono casi speciali. Ad esempio, ecco una regola per casi speciali che indica di registrare determinate
richieste a livello Metadata
:
- level: Metadata resources: - group: "" # core resources: ["secrets", "configmaps"] - group: authentication.k8s.io resources: ["tokenreviews"] omitStages: - "RequestReceived"
Un evento corrisponde alla regola se tutte le seguenti condizioni sono vere:
- L'evento non corrisponde ad alcuna regola precedente nel file delle norme.
- La richiesta riguarda una risorsa di tipo
secrets
,configmaps
otokenreviews
. - L'evento non riguarda la fase
RequestReceived
della chiamata.
Dopo l'elenco delle regole per casi speciali, il file delle norme contiene alcune regole generali.
Per visualizzare le regole generali nello
script,
devi sostituire il valore di known_apis
con ${known_apis}
. Dopo la
sostituzione, ottieni una regola come questa:
- level: Request verbs: ["get", "list", "watch"] resources: - group: "" # core - group: "admissionregistration.k8s.io" - group: "apiextensions.k8s.io" - group: "apiregistration.k8s.io" - group: "apps" - group: "authentication.k8s.io" - group: "authorization.k8s.io" - group: "autoscaling" - group: "batch" - group: "certificates.k8s.io" - group: "extensions" - group: "metrics.k8s.io" - group: "networking.k8s.io" - group: "policy" - group: "rbac.authorization.k8s.io" - group: "settings.k8s.io" - group: "storage.k8s.io" omitStages: - "RequestReceived"
La regola si applica agli eventi che non corrispondono a nessuna regola precedente nel file delle norme
e che non si trovano nella fase RequestReceived
. La regola stabilisce che le richieste get
,
list
e watch
su qualsiasi risorsa appartenente a uno dei gruppi elencati
devono essere registrate a livello Request
.
La regola successiva nel file delle norme ha il seguente aspetto:
- level: RequestResponse resources: - group: "" # core - group: "admissionregistration.k8s.io" - group: "apiextensions.k8s.io" - group: "apiregistration.k8s.io" - group: "apps" - group: "authentication.k8s.io" - group: "authorization.k8s.io" - group: "autoscaling" - group: "batch" - group: "certificates.k8s.io" - group: "extensions" - group: "metrics.k8s.io" - group: "networking.k8s.io" - group: "policy" - group: "rbac.authorization.k8s.io" - group: "settings.k8s.io" - group: "storage.k8s.io" omitStages: - "RequestReceived"
La regola si applica agli eventi che non corrispondono a nessuna regola precedente nel file delle norme
e che non si trovano nella fase RequestReceived
. In particolare, la regola non si applica alle richieste di lettura: get
, list
e watch
. La regola si applica invece alle richieste di scrittura come create
, update
e delete
. La regola prevede
che le richieste di scrittura vengano registrate a livello RequestResponse
.
Riepilogo della policy di controllo di Kubernetes per i cluster GKE
Il seguente elenco riepiloga la policy di controllo di Kubernetes per i cluster GKE:
In generale, le richieste di scrittura come
create
,update
edelete
vengono registrate a livelloRequestResponse
.In generale, gli eventi
get
,list
ewatch
vengono registrati a livelloMetadata
.Alcuni eventi vengono trattati come casi speciali. Per un elenco definitivo delle richieste che vengono trattate come casi speciali, consulta lo script delle norme. I casi speciali includono quanto segue:
Le richieste di aggiornamento e patch di
kubelet
,system:node-problem-detector
osystem:serviceaccount:kube-system:node-problem-detector
su una risorsanodes/status
o una risorsapods/status
vengono registrate a livello di richiesta.Le richieste di aggiornamento e patch da parte di qualsiasi identità nel gruppo
system:nodes
su una risorsanodes/status
o una risorsapods/status
vengono registrate a livello di richiesta.Le richieste di
deletecollection
disystem:serviceaccount:kube-system:namespace-controller
vengono registrate a livello di richiesta.Le richieste relative a una risorsa
secrets
, a una risorsaconfigmaps
o a una risorsatokenreviews
vengono registrate a livello di metadati.
Alcune richieste non vengono registrate. Per un elenco definitivo delle richieste che non vengono registrate, consulta le regole
level: None
nello script dei criteri. Le seguenti richieste non vengono registrate:Richieste di
system:kube-proxy
per guardare una risorsaendpoints
, una risorsaservices
o una risorsaservices/status
.Ottieni richieste per
system:unsecured
su una risorsaconfigmaps
nello spazio dei nomikube-system
.Ricevi richieste per
kubelet
su una risorsanodes
o una risorsanodes/status
.Ricevi richieste da qualsiasi identità nel gruppo
system:nodes
su una risorsanodes
o una risorsanodes/status
.Ricevi e aggiorna le richieste per
system:kube-controller-manager
,system:kube-scheduler
osystem:serviceaccount:endpoint-controller
su una risorsaendpoints
nello spazio dei nomikube-system
.Ottieni richieste per
system:apiserver
su una risorsanamespaces
, una risorsanamespaces/status
o una risorsanamespaces/finalize
.Recupera ed elenca le richieste di
system:kube-controller-manager
su qualsiasi risorsa nel gruppometrics.k8s.io
.Richieste agli URL che corrispondono a
/healthz*
,/version
o/swagger*
.