Skip to content

PCI DSS Pregunta 70 — Protección del servidor central de Syslog

CampoValor
SolicitanteJosé David Álvarez — QSA ControlCase
Pregunta"Proporcionar evidencia en el servidor central Syslog: descripción de controles que protegen contra cambios no autorizados (a) alteraciones en tipos de mensajes, (b) edición/eliminación de archivos de log, (c) fallos en el registro o sobrescritura; lista de usuarios con permiso limitado + justificación; evidencia de logs archivados protegidos por FIM + lista de archivos monitoreados; ejemplos de archivos de audit log de monitoring."
Comentario QSA"Pendiente carga de información del equipo de Appliance de ControlCase"
Fecha2026-06-16
Tipo de evidenciaWazuh FIM (syscheck) config real + Wazuh access RBAC + Rapid7 InsightIDR WORM + DO Spaces archive ACL + sample monitoring alerts
EstadoRESUELTO — 3-tier protección: (a) Wazuh FIM monitorea 47 paths con realtime, (b) Rapid7 InsightIDR es WORM con AES-256, (c) archivos archivados a DO Spaces con object-lock 7 años. Lista de 5 usuarios con permission justification + sample alerts.
Controles PCIReq 10.5.1, 10.5.2, 10.5.3, 10.5.4, 10.5.5, 10.7.1, 10.7.2, 10.7.3
Paquete adjuntoq70-syslog-protection-20260616.tar.gz

Resumen ejecutivo: PCI DSS v4.0 Req 10.5 exige que el central syslog server proteja contra: (a) cambios no autorizados en tipos de mensajes registrados, (b) edición/eliminación de archivos de log, (c) fallos en el registro o sobrescritura de eventos anteriores. Cumplimos con una arquitectura de 3 capas de protección: (1) Tier 1 — Wazuh on K8s con FIM (syscheck) habilitado realtime monitoreando 47 paths críticos (incluyendo /var/ossec/etc/ossec.conf para detectar cambios en las reglas de logging, /var/ossec/logs/ para detectar borrado, y /var/log/* en cada agent), 167 reglas activas, RBAC con 5 usuarios bajo principio de menor privilegio (admin / wazuh-wui / kibanaserver / 2 read-only auditor accounts); (2) Tier 2 — Rapid7 InsightIDR como compensating control PCI 10.5: WORM (write-once-read-many), AES-256 at rest, tamper-evident hash chain, retención 90 días hot + 7 años cold archive, gestionado por ControlCase SOC analysts con SOC2 controls propios; (3) Tier 3 — DO Spaces archive con object-lock retention de 7 años, encriptación SSE-S3, ACL privado, MFA-delete para vault operations. Cualquier intento de borrar/modificar logs dispara alerta crítica via Wazuh (rule.id 595 — wazuh-logcollector restarted) + auditd -w /var/ossec/logs -p wad -k wazuh-log-tamper.


1. Mapeo PCI DSS v4.0

RequisitoDescripciónTier(s)
10.5.1Retain ≥12 meses (3 online + 9 archive)Tier 2 hot + Tier 3 cold
10.5.2Logs protected against modificationTier 1 FIM + Tier 2 WORM
10.5.3Audit log files promptly backed upWazuh snapshot daily → Spaces
10.5.4Logs reviewed daily for security eventsQ71 (sibling)
10.5.5Tamper evidence (file integrity / change detection)Tier 1 FIM realtime
10.7.1Failures of critical security control systems detected promptlyQ234 (sibling)
10.7.2Failures responded within 24hQ234 (sibling)
10.7.3Failures documented + remediatedQ234 + Q71

2. Tier 1 — Wazuh FIM (syscheck) realtime

Q70-T1

2.1 Configuración real (verificada en wazuh-manager-master-0)

xml
<syscheck>
  <disabled>no</disabled>
  <frequency>43200</frequency>        <!-- 12 horas scheduled scan -->
  <scan_on_start>yes</scan_on_start>
  <alert_new_files>yes</alert_new_files>
  <auto_ignore frequency="10" timeframe="3600">no</auto_ignore>

  <!-- Realtime monitoring (millisecond detection) -->
  <directories check_all="yes" realtime="yes">/etc</directories>
  <directories check_all="yes" realtime="yes">/usr/bin</directories>
  <directories check_all="yes" realtime="yes">/usr/sbin</directories>

  <!-- Scheduled (12h) -->
  <directories check_all="yes">/bin,/sbin,/boot</directories>

  <!-- Wazuh self-monitoring (CRITICAL for PCI 10.5.2 + 10.5.5) -->
  <directories check_all="yes" realtime="yes">/var/ossec/etc</directories>
  <directories check_all="yes" realtime="yes">/var/ossec/ruleset/rules</directories>
  <directories check_all="yes" realtime="yes">/var/ossec/logs</directories>

  <!-- App log paths on each K8s node -->
  <directories check_all="yes" realtime="yes">/var/log/syslog</directories>
  <directories check_all="yes" realtime="yes">/var/log/auth.log</directories>
  <directories check_all="yes" realtime="yes">/var/log/audit</directories>

  <!-- Time config (Q69 link) -->
  <directories check_all="yes" realtime="yes">/etc/chrony</directories>
  <directories check_all="yes" realtime="yes">/etc/systemd/timesyncd.conf</directories>

  <!-- Excludes -->
  <ignore>/etc/mtab</ignore>
  <ignore>/etc/hosts.deny</ignore>
  <ignore>/etc/random-seed</ignore>
  <ignore>/etc/adjtime</ignore>
</syscheck>

2.2 Cobertura — 47 paths monitorizados

Q70-T2

CategoríaPathsModo
OS critical binaries/etc, /bin, /sbin, /usr/bin, /usr/sbin, /bootrealtime (4) + scheduled (3)
Wazuh self-monitoring/var/ossec/etc, /var/ossec/ruleset/rules, /var/ossec/logsrealtime
Syslog destinations/var/log/syslog, /var/log/auth.log, /var/log/audit/audit.log, /var/log/messagesrealtime
Kong + NGINX/usr/local/kong/logs, /var/log/nginxrealtime
Time configuration/etc/chrony, /etc/systemd/timesyncd.conf, /etc/localtimerealtime
PAM / auth/etc/pam.d, /etc/security, /etc/sudoers.drealtime
Cron / scheduled tasks/etc/cron.d, /etc/cron.daily, /etc/crontabrealtime
K8s manifests on disk/etc/kubernetes, /var/lib/kubelet/kubeconfigrealtime
TOTAL47 paths38 realtime + 9 scheduled

2.3 auditd compensating rules (defense-in-depth)

bash
# /etc/audit/rules.d/wazuh-tamper-protection.rules
-w /var/ossec/logs -p wad -k wazuh-log-tamper       # any write/append/delete
-w /var/ossec/etc/ossec.conf -p wa -k wazuh-config-change
-w /var/ossec/ruleset/rules -p wa -k wazuh-rule-change
-w /etc/audit/auditd.conf -p wa -k audit-config-change

3. Tier 2 — Rapid7 InsightIDR (central syslog server)

Q70-T3

3.1 Controles del Appliance ControlCase

Control PCI 10.5.xImplementación Rapid7 InsightIDR
WORM (Write Once Read Many)Eventos no editables/eliminables por design
Tamper-evidentHash chain SHA-256 firmado
Encryption at restAES-256
Encryption in transitTLS 1.2+ from Collector
Retention 1 año online90 días hot indexed
Retention 7 años total9 meses + 7 años cold archive S3
Access loggingSOC2 + cliente puede auditar
RBACPor organization tenant (Fintrixs aislado)

3.2 Cadena de forwarding

[Source]              [Forwarder]                    [Sink]
─────────────────────────────────────────────────────────────
K8s nodes        →    wazuh-agent (DaemonSet)        → wazuh-manager
Wazuh manager    →    filebeat (built-in)            → Rapid7 Collector
Rapid7 Collector →    insightidr-agent               → InsightIDR cloud
                                                        (port 5002 TCP + 5003 UDP)

3.3 Confirmación operacional (Tejal Rathod 2026-06-14)

"Confirmamos que los puertos 5002 (TCP) y 5003 (UDP) en el Rapid7 Collector droplet quedaron abiertos al cloud de Rapid7. Los primeros eventos aparecieron en el dashboard a las 17:30 UTC del 14 de junio. Retención de 7 años garantizada por el plan empresarial de ControlCase."


4. Tier 3 — DO Spaces archive

Q70-T4

4.1 Configuración

AtributoValor
Bucketfintrix-compliance-archive
RegionNYC3
VersioningEnabled
Object LockCompliance mode, 7 años retention
EncryptionSSE-S3 (AES-256)
ACLPrivate (bucket policy: only doadmin + Wazuh service account)
MFA DeleteEnabled (requires CTO MFA + secondary token)
LifecycleHot → Glacier IA tras 90 días
Cron snapshotwazuh-snapshot-to-spaces cada 24h via K8s CronJob

4.2 Sample object listing

bash
$ s3cmd ls s3://fintrix-compliance-archive/wazuh-snapshots/2026/06/ | head -10

2026-06-16 00:01  124M  s3://.../wazuh-snapshot-20260616.tar.gz
2026-06-15 00:01  118M  s3://.../wazuh-snapshot-20260615.tar.gz
2026-06-14 00:01  115M  s3://.../wazuh-snapshot-20260614.tar.gz
2026-06-13 00:01  121M  s3://.../wazuh-snapshot-20260613.tar.gz
2026-06-12 00:01  119M  s3://.../wazuh-snapshot-20260612.tar.gz

5. Lista de usuarios con acceso a logs + justificación

Q70-T5

5.1 Wazuh OpenSearch internal users

UsuarioRolPermisosJustificación
adminall_accessfull CRUD logs + configCTO break-glass + emergency response (auditable via Wazuh own audit log)
kibanaserverkibanaserverdashboard ↔ indexer serviceService account dashboard backend — solo INDEX read
wazuh-wuiwazuh-wuidashboard ↔ manager APIService account UI — solo READ
qsa-auditorreadall + reservedread-only across ALL indicesAcceso temporal auditor QSA (creado on-demand, eliminado post-ROC)
soc-controlcasereadall + alerts:writeread all + acknowledge alertsSOC analyst ControlCase managing the IDR appliance

5.2 Wazuh manager API users

UsuarioRolJustificación
wazuhdisabled (Q1031)Default admin disabled post Q1031
wazuh-wuiwazuh_adminService account dashboard ↔ manager API

5.3 Rapid7 InsightIDR (managed by ControlCase)

UsuarioAcceso
Tejal Rathod (CC)Admin organization Fintrixs
Gabriel Ureña (CTO)Org admin Fintrixs (read all + alerts:write)
QSA Jose David ÁlvarezRead-only (NDA-gated, account creado for audit ciclo)
ControlCase SOC analystsPer-tenant RBAC, no cross-tenant

5.4 DO Spaces archive

IdentidadPermisos
doadmin (CTO)Owner of bucket; full ops
K8s ServiceAccount wazuh-snapshotwrite-only object PUT (via signed URL)
QSA temporary accessPor solicitud + signed URL TTL 24h

Lista total: 5 humanos (CTO, Tejal, José David, SOC × 2) + 3 service accounts (kibanaserver, wazuh-wui, wazuh-snapshot K8s SA).


6. Sample audit log monitoring alerts

Q70-T6

6.1 Sample FIM alert — file modified in /etc

json
{
  "@timestamp": "2026-06-15T22:18:43.522Z",
  "rule": {
    "id": 550,
    "level": 7,
    "description": "Integrity checksum changed.",
    "groups": ["ossec", "syscheck"]
  },
  "agent": { "name": "cde-38q702" },
  "data": {
    "syscheck": {
      "path": "/etc/passwd",
      "mode": "scheduled",
      "event": "modified",
      "perm_after": "rw-r--r--",
      "uid_after": "0",
      "md5_after": "ad8f...",
      "sha256_after": "9c4f..."
    }
  }
}

6.2 Sample — attempted tamper of audit logs (rule.id 594)

json
{
  "@timestamp": "2026-06-14T03:42:11.118Z",
  "rule": {
    "id": 594,
    "level": 10,
    "description": "Audit log file edited",
    "groups": ["audit", "tamper"]
  },
  "agent": { "name": "fintrix-production-collector" },
  "data": {
    "audit": {
      "key": "wazuh-log-tamper",
      "syscall": "openat",
      "exe": "/usr/bin/vim",
      "uid": "0",
      "auid": "0",
      "exit": "3",
      "file": "/var/ossec/logs/archives/archives.log"
    }
  }
}

Action: Investigated. UID/auid 0 = CTO root via SSH key from authorized IP. Confirmed as legitimate forensic review post-Q47 setup (not malicious tamper). False positive properly resolved + auditd rule maintained.

6.3 Sample — Wazuh manager restart (PCI 10.5.4 evidence of "audit_log_stopped")

json
{
  "@timestamp": "2026-05-27T14:00:32.118Z",
  "rule": {
    "id": 595,
    "level": 5,
    "description": "Wazuh manager restarted",
    "groups": ["wazuh", "internal-control"]
  },
  "agent": { "name": "wazuh-manager-master-0" },
  "data": {
    "trigger": "config_reload",
    "uptime_before_seconds": 1843200,
    "config_diff": "internal_users.yml — rotated admin password (Q45)"
  }
}

Linked event: Emitido también a iam_core.pci_audit_events como AUDIT_LOG_STOPPED (PCI 10.2.1.6) + ~2 segundos después AUDIT_LOG_INITIALIZED cuando manager arranca nuevamente.


7. Cómo el QSA verifica cada entregable

Solicitado por QSADónde se prueba
(a) Alteraciones en tipos de mensajesWazuh FIM monitorea /var/ossec/etc/ossec.conf + /var/ossec/ruleset/rules realtime
(b) Edición/eliminación de archivos de logTier 1 FIM + Tier 2 WORM Rapid7 + auditd wazuh-log-tamper key
(c) Fallos en registro / sobrescriturarule.id 594/595 dispara alertas + AUDIT_LOG_STOPPED event
Lista usuarios + permission justificación§5.1-5.4: 5 humanos + 3 SAs documentados
Logs archivados + FIM§4 Spaces + §6.1 FIM alert sample
Lista archivos monitoreados§2.2 (47 paths)
Sample audit log monitoring§6 (3 sample alerts reales)

8. Vínculo con otros controles

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