Tema
Respuesta a ControlCase — Logsink de Kubernetes
| Campo | Valor |
|---|---|
| Solicitante | Elswick Lai — ControlCase Cumplimiento y Ciberseguridad |
| Fecha | 2026-05-08 |
| Tipo | Receptor de logs para Kubernetes (mismo patrón que DB logsink) |
| Estado | RESUELTO — Configuración aplicada y verificada |
Resumen ejecutivo: Se desplegó Fluent Bit como DaemonSet en el cluster
fintrix-production-k8spara 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
| Campo | Valor |
|---|---|
| Cluster ID (DigitalOcean) | a19e81ac-537a-44ed-a228-8010f561a530 |
| Cluster Name | fintrix-production-k8s |
| Engine | DigitalOcean Kubernetes (DOKS) |
| Version | v1.34.5 |
| Region | NYC1 |
| Pod CIDR | 10.116.0.0/16 |
| Service CIDR | 10.117.0.0/19 |
| VPC | 402acbe1-7336-4fde-ad20-e890013b8214 |
Node Pools
| Pool | Nodos | IPs Privadas | PCI Scope |
|---|---|---|---|
| system | 2 | 10.100.0.4-5 | No |
| cde | 2 | 10.100.0.6-7 | Sí — CDE |
| app | 2 | 10.100.0.8-9 | Sí — connected |
2. Diferencia con el logsink de PostgreSQL
| Aspecto | DB Logsink (Postgres) | K8s Logsink (este) |
|---|---|---|
| Recurso | DigitalOcean Managed PostgreSQL | DigitalOcean Kubernetes (DOKS) |
| API nativa | Sí — /v2/databases/{id}/logsink | No disponible |
| Mecanismo | rsyslog logsink nativo de DO | Fluent Bit DaemonSet |
| Puerto en collector | 6514 | 5141 |
| Formato | rfc5424 | RFC5424 vía syslog output |
| Origen de logs | Cluster PostgreSQL | Pods + 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)
| Source | Path | Tag |
|---|---|---|
| Container logs | /var/log/containers/*.log | kube.* |
| systemd kubelet | _SYSTEMD_UNIT=kubelet.service | host.* |
| systemd containerd | _SYSTEMD_UNIT=containerd.service | host.* |
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/watchsobrepods,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 logEstado 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.265. Ubicación de los logs en el collector
| Path | Propósito |
|---|---|
/var/log/remote/kubernetes/k8s-cluster.log | Logs 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
| Requisito | Cómo se cumple |
|---|---|
| 10.2.1 — Log access to cardholder data | Logs de pods CDE (card-vault, tokenization, auth) capturados |
| 10.2.2 — Log admin actions | kubectl exec/attach detectado por Falco + capturado en logs |
| 10.2.5 — Log auth mechanisms | Eventos de SA token usage logged |
| 10.2.7 — Object creation/deletion | Pod create/delete events capturados via kubelet logs |
| 10.3 — Audit trail entries | Configurado para todos los namespaces (kube-system, default, falco, wazuh, logging, etc.) |
| 10.5.3 — Centralization | Todos los logs van al collector central |
7. Verificación End-to-End
| Item | Estado |
|---|---|
| Cluster K8s en VPC compartida | ✓ 402acbe1-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.logFiltrar 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.logEstado del DaemonSet
bash
kubectl get pods -n logging -o wide
kubectl logs -n logging -l app=fluent-bit --tail=20Ver 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
| Fecha | Revisor | Cambios |
|---|---|---|
| 2026-05-08 | Equipo Fintrixs | Creación inicial — Fluent Bit DaemonSet desplegado en 4 nodos |
