Abilitazione degli audit log Linux sui nodi GKE


Questa pagina spiega come abilitare log di controllo del sistema operativo dettagliati sui nodi di Google Kubernetes Engine che eseguono Container-Optimized OS. Questa pagina spiega anche come configurare un agente Logging fluent-bit per inviare log a Cloud Logging. L'abilitazione del logging controllato di Linux non è supportata nei cluster GKE Autopilot, perché Google gestisce i nodi e le macchine virtuali (VM) sottostanti.

L'audit logging del sistema operativo è diverso da Audit log di Cloud e Audit log di Kubernetes.

Panoramica

I log del sistema operativo sui nodi forniscono informazioni preziose sullo stato del cluster e dei carichi di lavoro, ad esempio messaggi di errore, tentativi di accesso ed esecuzioni binarie. Puoi utilizzare queste informazioni per risolvere i problemi o esaminare gli incidenti di sicurezza.

Per raccogliere i log da ciascun nodo in un cluster, utilizza un DaemonSet che esegue esattamente un pod su ciascun nodo del cluster in cui il DaemonSet è idoneo alla pianificazione. Questo pod configura il daemon di logging auditd sull'host e configura l'agente Logging per l'invio dei log a Logging o a qualsiasi altro servizio di log.

Per definizione, il controllo si verifica dopo un evento ed è una misura di sicurezza post mortem. I log di audit da soli probabilmente non sono sufficienti per eseguire l'analisi forense sul cluster. Considera come utilizzare al meglio il logging controllato come parte della strategia di sicurezza complessiva.

Limitazioni

I meccanismi di logging descritti in questa pagina funzionano solo sui nodi che eseguono Container-Optimized OS nei cluster GKE Standard.

Come funziona il DaemonSet di logging

Questa sezione descrive il funzionamento del DaemonSet di logging di esempio in modo da poterlo configurare in base alle tue esigenze. La sezione successiva spiega come eseguire il deployment del DaemonSet.

Il manifest di esempio definisce un oggetto DaemonSet, un ConfigMap e uno spazio dei nomi per contenerli.

Il DaemonSet esegue il deployment di un pod in ciascun nodo nel cluster. Il pod contiene due container. Il primo è un container init che avvia il servizio systemd di configurazione di controllo cloud disponibile sui nodi di Container-Optimized OS. Il secondo container, cos-auditd-fluent-bit, contiene un'istanza di fluent-bit configurata per raccogliere gli audit log di Linux dal journal del nodo ed esportarli in Cloud Logging.

L'esempio di logging di DaemonSet registra i seguenti eventi:

  • auditd modifiche alla configurazione del sistema
  • Controlli delle autorizzazioni AppArmor
  • execve(), socket(), setsockopt() e mmap() esecuzioni
  • connessioni di rete
  • accessi utente
  • sessione SSH e tutti gli altri TTY (incluse kubectl exec -t sessioni)

Configurazione del DaemonSet di logging

Puoi configurare il DaemonSet di logging utilizzando un ConfigMap, cos-auditd-fluent-bit-config. L'esempio fornito invia audit log a Logging, ma puoi configurarlo in modo che invii i log ad altre destinazioni.

Il volume di log prodotti da auditd può essere molto grande e potrebbe comportare costi aggiuntivi perché consuma risorse di sistema e invia più log rispetto alla configurazione di logging predefinita. Puoi configurare filtri per gestire il volume di logging:

Deployment del DaemonSet di logging

  1. Puoi utilizzare un cluster esistente o crearne uno nuovo.

  2. Scarica i file manifest di esempio:

    curl https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-node-tools/master/os-audit/cos-auditd-logging.yaml > cos-auditd-logging.yaml
    
  3. Modifica i manifest di esempio in base alle tue esigenze. Per informazioni dettagliate sul funzionamento del DaemonSet, consulta la sezione precedente.

  4. Inizializzare le variabili comuni:

    export CLUSTER_NAME=CLUSTER_NAME
    export CLUSTER_LOCATION=COMPUTE_REGION
    

    Sostituisci quanto segue:

    • CLUSTER_NAME: il nome del tuo cluster.
    • COMPUTE_REGION: la regione di Compute Engine per il cluster. Per i cluster a livello di zona, utilizza la zona.
  5. Esegui il deployment dello spazio dei nomi di logging, DaemonSet e ConfigMap:

    envsubst '$CLUSTER_NAME,$CLUSTER_LOCATION' < cos-auditd-logging.yaml \
    | kubectl apply -f -
    
  6. Verifica che i pod di logging siano stati avviati. Se hai definito uno spazio dei nomi diverso nei manifest, sostituisci cos-auditd con il nome dello spazio dei nomi che stai utilizzando.

    kubectl get pods --namespace=cos-auditd
    

    Se i pod sono in esecuzione, l'output è simile al seguente:

    NAME                                             READY   STATUS    RESTARTS   AGE
    cos-auditd-logging-g5sbq                         1/1     Running   0          27s
    cos-auditd-logging-l5p8m                         1/1     Running   0          27s
    cos-auditd-logging-tgwz6                         1/1     Running   0          27s
    

    Viene eseguito il deployment di un pod su ciascun nodo nel cluster, in questo caso il cluster ha tre nodi.

  7. Ora puoi accedere agli audit log in Logging. In Esplora log, filtra i risultati utilizzando la seguente query:

    LOG_ID("linux-auditd")
    resource.labels.cluster_name = "CLUSTER_NAME"
    resource.labels.location = "COMPUTE_REGION"
    

    In alternativa, puoi utilizzare gcloud CLI (usa --limit perché il set di risultati può essere molto grande):

    gcloud logging read --limit=100 "LOG_ID("linux-auditd") AND resource.labels.cluster_name = "${CLUSTER_NAME}" AND resource.labels.location = "${CLUSTER_LOCATION}""
    

Esportazione dei log

Per scoprire come eseguire il routing dei log verso destinazioni supportate, consulta Configurare e gestire i sink.

esegui la pulizia

Per disabilitare il logging di auditd, elimina il DaemonSet di logging e riavvia i nodi. Una volta abilitata, la configurazione dell'audit è bloccata e può essere modificata solo ricreando il nodo.

  1. Elimina il DaemonSet, il ConfigMap e il relativo spazio dei nomi dal cluster:

    kubectl delete -f cos-auditd-logging.yaml
    
  2. Riavvia i nodi del cluster. Innanzitutto, recupera il gruppo di istanze a cui appartengono:

    instance_group=$(gcloud compute instance-groups managed list \
                        --format="value(name)" \
                        --filter=${CLUSTER_NAME})
    

    Quindi, scarica le istanze:

    instances=$(gcloud compute instance-groups managed list-instances ${instance_group} \
                   --format="csv(instance)[no-heading][terminator=',']")
    

    Infine, ricrea le istanze:

    gcloud compute instance-groups managed recreate-instances ${instance_group} \
       --instances=${instances}
    

Passaggi successivi