Skip to content

Respuesta a ControlCase — Logsink de Kubernetes

CampoValor
SolicitanteElswick Lai — ControlCase Cumplimiento y Ciberseguridad
Fecha2026-05-08
TipoReceptor de logs para Kubernetes (mismo patrón que DB logsink)
EstadoRESUELTO — Configuración aplicada y verificada

Resumen ejecutivo: Se desplegó Fluent Bit como DaemonSet en el cluster fintrix-production-k8s para recolectar logs de todos los pods y nodos, enviándolos al collector centralizado en el puerto 5141 (distinto del 6514 usado para PostgreSQL). El receptor rsyslog del collector procesa y almacena los logs para análisis por Wazuh SIEM.


1. Información del Cluster Kubernetes

CampoValor
Cluster ID (DigitalOcean)a19e81ac-537a-44ed-a228-8010f561a530
Cluster Namefintrix-production-k8s
EngineDigitalOcean Kubernetes (DOKS)
Versionv1.34.5
RegionNYC1
Pod CIDR10.116.0.0/16
Service CIDR10.117.0.0/19
VPC402acbe1-7336-4fde-ad20-e890013b8214

Node Pools

PoolNodosIPs PrivadasPCI Scope
system210.100.0.4-5No
cde210.100.0.6-7Sí — CDE
app210.100.0.8-9Sí — connected

2. Diferencia con el logsink de PostgreSQL

AspectoDB Logsink (Postgres)K8s Logsink (este)
RecursoDigitalOcean Managed PostgreSQLDigitalOcean Kubernetes (DOKS)
API nativaSí — /v2/databases/{id}/logsinkNo disponible
Mecanismorsyslog logsink nativo de DOFluent Bit DaemonSet
Puerto en collector65145141
Formatorfc5424RFC5424 vía syslog output
Origen de logsCluster PostgreSQLPods + Kubelet + Containerd

Nota técnica: DigitalOcean no expone una API nativa de logsink para clusters DOKS (a diferencia de Managed Databases). Por eso, la solución estándar es desplegar un agente de log forwarding como Fluent Bit que envíe los logs al collector vía syslog.


3. Configuración del Collector (rsyslog)

Archivo: /etc/rsyslog.d/11-fintrixs-kubernetes-logsink.conf

bash
# Fintrixs Collector — Kubernetes Logs Reception (PCI 10.3)
# Receives logs from Fluent Bit DaemonSet on K8s cluster
# Port: 5141 (TCP/UDP)

input(type="imtcp" port="5141" ruleset="k8s_logs")
input(type="imudp" port="5141" ruleset="k8s_logs")

template(name="K8sFullLog" type="string"
  string="%TIMESTAMP:::date-rfc3339% from-pod=%fromhost-ip% %msg%\n")

ruleset(name="k8s_logs") {
  action(type="omfile"
    file="/var/log/remote/kubernetes/k8s-cluster.log"
    template="K8sFullLog"
    fileCreateMode="0640"
    fileOwner="syslog"
    fileGroup="adm")
  stop
}

Reglas de firewall

fintrix-production-collector-fw:
  + Inbound TCP 5141 from 10.100.0.0/16 (VPC nodes)
  + Inbound TCP 5141 from 10.116.0.0/16 (K8s pod CIDR)
  + Inbound UDP 5141 from 10.100.0.0/16 (VPC nodes)
  + Inbound UDP 5141 from 10.116.0.0/16 (K8s pod CIDR)

4. Fluent Bit DaemonSet

Namespace: loggingDaemonSet: fluent-bit (4 pods, uno por nodo) Imagen: fluent/fluent-bit:3.1

Inputs (fuentes de logs)

SourcePathTag
Container logs/var/log/containers/*.logkube.*
systemd kubelet_SYSTEMD_UNIT=kubelet.servicehost.*
systemd containerd_SYSTEMD_UNIT=containerd.servicehost.*

Filtros aplicados

  • kubernetes filter: enriquece cada log con metadata del pod (namespace, labels, container ID)
  • Resolución de pod desde kubernetes.default.svc
  • Service Account con permisos get/list/watch sobre pods, nodes, namespaces

Output (destino: collector)

yaml
[OUTPUT]
    Name             syslog
    Match            *
    Host             10.100.0.10        # Collector privado
    Port             5141               # Puerto K8s logsink
    Mode             tcp
    Syslog_Format    rfc5424
    Syslog_MaxSize   2048
    Syslog_Severity_Key  severity
    Syslog_Hostname_Key  kubernetes_host
    Syslog_Appname_Key   kubernetes_pod_name
    Syslog_Message_Key   log

Estado actual del DaemonSet

NAME               READY   STATUS    NODE         IP
fluent-bit-5bhjb   1/1     Running   cde-3nt74u   10.116.1.201
fluent-bit-5wpdj   1/1     Running   app-3nt70b   10.116.2.238
fluent-bit-cg424   1/1     Running   app-3nt70w   10.116.2.85
fluent-bit-mt27s   1/1     Running   cde-3nt74c   10.116.1.26

5. Ubicación de los logs en el collector

PathPropósito
/var/log/remote/kubernetes/k8s-cluster.logLogs unificados de todos los pods + kubelet + containerd

Cada línea tiene formato:

<timestamp-rfc3339> from-pod=<pod-ip> <log-message>

Ejemplo real de logs capturados

2026-05-08T18:42:07.366499Z from-pod=10.116.1.196 {"hostname":"app-3nt70w","output":"18:41:06.584664144: Warning Sensitive file read (user=root file=/var/run/secrets/kubernetes.io/serviceaccount/token container=cilium-agent ns=kube-system)","priority":"Warning","rule":"PCI - Sensitive File Read","tags":["filesystem","pci_dss","req_10.2.4"],"time":"2026-05-08T18:41:06.584664144Z"}

2026-05-08T18:42:07.366564Z from-pod=10.116.1.196 {"hostname":"app-3nt70w","output":"18:41:36.799248979: Warning Shell spawned in container (user=root command=sh -c -- df -P container=wazuh-agent pod=wazuh-agent-m52k9 ns=wazuh)","priority":"Warning","rule":"PCI - Shell Spawned in Container","tags":["container","pci_dss","req_10.2.2","shell"]}

Cada evento incluye:

  • Timestamp UTC (RFC3339)
  • Source pod IP
  • Hostname del nodo K8s
  • Container ID, name, image
  • Pod name, namespace
  • PCI DSS tags (cuando aplica)
  • Severity y rule name (de Falco IDS)

6. Cumplimiento con Requisitos PCI DSS

RequisitoCómo se cumple
10.2.1 — Log access to cardholder dataLogs de pods CDE (card-vault, tokenization, auth) capturados
10.2.2 — Log admin actionskubectl exec/attach detectado por Falco + capturado en logs
10.2.5 — Log auth mechanismsEventos de SA token usage logged
10.2.7 — Object creation/deletionPod create/delete events capturados via kubelet logs
10.3 — Audit trail entriesConfigurado para todos los namespaces (kube-system, default, falco, wazuh, logging, etc.)
10.5.3 — CentralizationTodos los logs van al collector central

7. Verificación End-to-End

ItemEstado
Cluster K8s en VPC compartida402acbe1-7336-4fde-ad20-e890013b8214
Puerto 5141 abierto en firewall✓ TCP+UDP desde VPC y Pod CIDR
rsyslog escuchando en 5141✓ Activo
Fluent Bit DaemonSet✓ 4 pods Running
Conectividad pod → collector✓ Verificada (nc -zv 10.100.0.10 5141)
Logs llegando al archivo✓ Crecimiento continuo verificado

8. Comandos útiles para el auditor

Ver logs en tiempo real desde el collector

bash
ssh [email protected]
tail -f /var/log/remote/kubernetes/k8s-cluster.log

Filtrar por severidad PCI

bash
grep -E "Critical|Warning" /var/log/remote/kubernetes/k8s-cluster.log

# Solo eventos PCI DSS
grep "pci_dss" /var/log/remote/kubernetes/k8s-cluster.log

Estado del DaemonSet

bash
kubectl get pods -n logging -o wide
kubectl logs -n logging -l app=fluent-bit --tail=20

Ver desde Wazuh dashboard

URL: https://134.209.213.133/app/threat-hunting

DQL filter:

location: "/var/log/remote/kubernetes/k8s-cluster.log"

Historial de revisiones

FechaRevisorCambios
2026-05-08Equipo FintrixsCreación inicial — Fluent Bit DaemonSet desplegado en 4 nodos

Documentación Confidencial — Solo para uso interno y auditoría PCI DSS