Abilitazione degli audit log Linux sui nodi GKE


In questa pagina viene spiegato come attivare il controllo dettagliato del sistema operativo attiva Nodi di Google Kubernetes Engine in esecuzione Container-Optimized OS. Questa pagina spiega anche come configurare un agente di logging fluent-bit per inviare i log in Cloud Logging. L'attivazione della registrazione di auditd 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 Cloud Audit Logs 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, come messaggi di errore, tentativi di accesso esecuzioni binarie. Puoi usare queste informazioni per risolvere i problemi o indagare incidenti di sicurezza.

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

Per definizione, i controlli vengono eseguiti dopo un evento e sono una misura di sicurezza post-mortem. I log di auditd da soli probabilmente non sono sufficienti per eseguire la forensistica sul cluster. Valuta come utilizzare al meglio i log di auditd nell'ambito della tua strategia di sicurezza complessiva.

Limitazioni

I meccanismi di registrazione descritti in questa pagina funzionano solo sui nodi che eseguono un sistema operativo ottimizzato per i container nei cluster GKE Standard.

Come funziona il DaemonSet di logging

In questa sezione viene descritto come Esempio di logging DaemonSet in modo che tu possa configurarlo in base alle tue esigenze. La prossima sezione spiega come eseguire il deployment del DaemonSet.

Il manifest di esempio definisce un oggetto DaemonSet, un ConfigMap e uno spazio dei nomi che li contengono.

Il DaemonSet esegue il deployment di un pod su ogni nodo del cluster. Il pod contiene due containerizzati. Il primo è un contenitore init che avvia il servizio systemd cloud-audit-setup disponibile sui nodi OS ottimizzati per i container. Il secondo contenitore, cos-auditd-fluent-bit, contiene un'istanza di fluent-bit configurata per raccogliere gli audit log di Linux dal diario del nodo ed esportarli in Cloud Logging.

L'esempio di logging DaemonSet registra i seguenti eventi:

  • auditd modifiche alla configurazione di sistema
  • Controlli delle autorizzazioni AppArmor
  • Esecuzioni di execve(), socket(), setsockopt() e mmap()
  • connessioni di rete
  • Accessi utente
  • Sessione SSH e tutte le altre TTY (incluse le sessioni kubectl exec -t)

Configurazione del DaemonSet di logging

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

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

Deployment del DaemonSet di logging

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

  2. Scarica i 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. Consulta le sezione precedente per i dettagli su come funziona il DaemonSet.

  4. Inizializza 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: il Compute Engine region per il tuo cluster. Per cluster di zona, usa la zona.
  5. Esegui il deployment dello spazio dei nomi, del daemonset e del ConfigMap di logging:

    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 implementato un pod su ciascun nodo del 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 (utilizza --limit perché 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 instradare i log alle destinazioni supportate, consulta Configurare e gestire i sink.

Esegui la pulizia

Per disattivare la registrazione di auditd, elimina il DaemonSet di registrazione e riavvia i nodi. La configurazione dell'audit viene bloccata una volta abilitata e può essere eseguita solo modificato 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. Per prima cosa, ottieni il gruppo di istanze a cui appartengono:

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

    Quindi ottieni le istanze stesse:

    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