Habilita registros auditd de Linux en nodos de GKE


En esta página, se explica cómo habilitar los registros de auditoría del sistema operativo detallados en los nodos de Google Kubernetes Engine que ejecutan Container-Optimized OS. En esta página, también se explica cómo configurar un agente de Logging de fluent-bit para enviar registros a Cloud Logging. Los clústeres de GKE Autopilot no admiten la habilitación del registro auditd de Linux, ya que Google administra los nodos y las máquinas virtuales (VMs) subyacentes.

El registro de auditoría del sistema operativo es distinto de los Registros de auditoría de Cloud y los registros de auditoría de Kubernetes.

Descripción general

Los registros del sistema operativo en tus nodos proporcionan información valiosa sobre el estado del clúster y las cargas de trabajo, como los mensajes de error, los intentos de acceso y las ejecuciones binarias. Puedes usar esta información para depurar problemas o investigar incidentes de seguridad.

Para recopilar registros de cada nodo en un clúster, usa un DaemonSet que ejecute exactamente un Pod en cada uno de los nodos del clúster en los que el DaemonSet cumple los requisitos para ser programado. Este Pod configura el daemon de registro auditd en el host y configura el agente de Logging para enviar los registros a Logging o a cualquier otro servicio de transferencia de registros.

Por definición, la auditoría ocurre después de un evento y es una medida de seguridad post mortem. Es probable que los registros auditd, por sí solos, no sean suficientes para detectar intrusiones en tu clúster. Considera cómo usar mejor el registro auditd como parte de tu estrategia general de seguridad.

Limitaciones

Los mecanismos de registro que se describen en esta página solo funcionan en nodos que ejecutan Container-Optimized OS en clústeres de GKE Standard.

Funcionamiento del DaemonSet de registro

En esta sección, se describe cómo funciona el registro de ejemplo de DaemonSet a fin de que puedas configurarlo según tus necesidades. En la siguiente sección, se explica cómo implementar DaemonSet.

En el manifiesto de ejemplo, se define un DaemonSet, un ConfigMap y un Namespace para contenerlos.

El DaemonSet implementa un pod en cada nodo del clúster. El pod contiene dos contenedores. El primero es un contenedor init que inicia el servicio cloud-audit-setup de systemd en los nodos de Container-Optimized OS. El segundo contenedor, cos-auditd-fluent-bit, contiene una instancia de fluent-bit que está configurada para recopilar los registros de auditoría de Linux del diario de nodos y exportarlos a Cloud Logging.

El DaemonSet del registro de ejemplo registra los siguientes eventos:

  • Modificaciones de configuración del sistema de auditd
  • Comprobaciones de permisos de AppArmor
  • Ejecuciones execve(), socket(), setsockopt() y mmap()
  • Conexiones de red
  • Accesos de usuario
  • Sesión SSH y todos los demás TTY (incluidas las sesiones kubectl exec -t)

Configura el DaemonSet de registro

Configura el DaemonSet de registro con un ConfigMap, cos-auditd-fluent-bit-config. En el ejemplo proporcionado, se envían registros de auditoría a Logging, pero puedes configurarlo para que se envíen registros a otros destinos.

El volumen de los registros generados por auditd puede ser muy grande y puede generar costos adicionales debido a que consume recursos del sistema y envía más registros que la configuración de registro predeterminada. Puedes configurar filtros para administrar el volumen de registro:

Implementa el DaemonSet de registro

  1. Puedes usar un clúster existente o crear uno nuevo.

  2. Descarga los manifiestos de ejemplo:

    curl https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-node-tools/master/os-audit/cos-auditd-logging.yaml > cos-auditd-logging.yaml
    
  3. Edita los manifiestos de ejemplo para adaptarlos a tus necesidades. Consulta la sección anterior para obtener detalles sobre cómo funciona DaemonSet.

  4. Inicializa variables comunes:

    export CLUSTER_NAME=CLUSTER_NAME
    export CLUSTER_LOCATION=COMPUTE_REGION
    

    Reemplaza lo siguiente:

    • CLUSTER_NAME: El nombre de tu clúster.
    • COMPUTE_REGION: La región de Compute Engine del clúster. Para los clústeres zonales, usa la zona.
  5. Implementa el DaemonSet, el ConfigMap y el Espacio de nombres de registro:

    envsubst '$CLUSTER_NAME,$CLUSTER_LOCATION' < cos-auditd-logging.yaml \
    | kubectl apply -f -
    
  6. Verifica que los pods de registro se hayan iniciado. Si definiste un espacio de nombres diferente en tus manifiestos, reemplaza cos-auditd por el nombre del espacio de nombres que usas.

    kubectl get pods --namespace=cos-auditd
    

    Si los Pods están en ejecución, el resultado será el siguiente:

    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
    

    Se implementa un pod en cada nodo del clúster; en este caso, el clúster tiene tres nodos.

  7. Ahora, puedes acceder a los registros de auditoría en Logging. En el Explorador de registros, filtra los resultados con la siguiente consulta:

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

    Como alternativa, puedes usar la CLI de gcloud (usa --limit porque el conjunto de resultados puede ser muy grande):

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

Exporta registros

Para obtener información sobre cómo enrutar tus registros a destinos compatibles, consulta Configura y administra receptores.

Limpieza

Para inhabilitar el registro auditd, borra el DaemonSet de registro y reinicia los nodos. La configuración de auditoría se bloquea una vez habilitada y solo se puede cambiar si se vuelve a crear el nodo.

  1. Borra el DaemonSet, ConfigMap y su Namespace del clúster:

    kubectl delete -f cos-auditd-logging.yaml
    
  2. Reinicia los nodos de tu clúster. Primero, obtén el grupo de instancias al que pertenecen:

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

    Luego, obtén las instancias:

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

    Finalmente, vuelve a crear las instancias:

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

¿Qué sigue?