Guía de integración de PowerDMARC y Splunk
PowerDMARC → Página principal de la solución → Integraciones → SIEM
Gracias a la integración de PowerDMARC con Splunk, podrás importar y supervisar los datos de autenticación del correo electrónico y de seguridad de los dominios directamente desde tu entorno de Splunk. Al aprovechar la API de PowerDMARC, las organizaciones pueden crear una integración SIEM optimizada sin configuraciones complejas: solo hay que conectarse, ponerla en marcha y obtener una visibilidad centralizada del estado de seguridad del correo electrónico en todos los dominios.
Esta guía se centra en la configuración y la importación de datos. Los paneles de control de Splunk y las visualizaciones avanzadas quedan fuera del alcance de esta guía.
Documentación de la API
Documentación de Swagger: https://app.powerdmarc.com/swagger-ui/index.html
Documentación alternativa: https://api.powerdmarc.com/
Nota: Las convenciones de nomenclatura (nombres de índices, tipos de fuente, rutas de archivos) son sugerencias, no requisitos. Adáptalas para que se ajusten a las normas de tu entorno.
Qué recopila el script
El script de integración extrae dos conjuntos de datos de la API de PowerDMARC:
Se recopilan informes agregados para cada dominio de tu cuenta, en todo el que cumplen, fallidosy reenviados . Los dominios se enumeran automáticamente a través de /api/v1/domains.
Descripción general de la arquitectura
API PowerDMARC
↓
Script de Python (programado mediante cron, el temporizador de systemd o el Programador de tareas)
↓
Splunk HTTP Event Collector (HEC)
↓
Splunk (búsqueda, paneles de control, alertas, correlación)
Splunk recibe datos a través de su punto final HTTP Event Collector (HEC), que permite la ingesta segura de datos desde fuentes externas.
El script también admite la escritura de archivos JSON delimitados por saltos de línea en lugar de —o además de— HEC, para entornos en los que no se permite el tráfico HTTPS saliente hacia el puerto HEC de Splunk. Véase Alternativa: Ingesta mediante File Monitor.
Requisitos previos
Splunk Enterprise o Splunk Cloud con acceso de administrador
Permiso para crear tokens HEC, crear índices y configurar las entradas de datos
Python 3.7 o una versión posterior en el sistema en el que se ejecuta el script
Un token de tipo «bearer» de la API de PowerDMARC con permiso para acceder a los registros de auditoría y a los informes agregados
Conectividad de red desde el servidor del script a:
API de PowerDMARC — https://app.powerdmarc.com (TCP 443)
Tu punto de conexión HEC de Splunk (TCP 8088 para Splunk Enterprise, TCP 443 para Splunk Cloud)
Configuración de Splunk
Paso 1: Crear un índice dedicado
Vaya a Configuración → Índices
Haga clic en Nuevo índice
Configurar:
Nombre del índice: powerdmarc
Tipo de datos del índice: Eventos
Aplicación: buscar (o tu aplicación preferida)
Deja el resto de ajustes en sus valores predeterminados o modifícalos según tus necesidades de retención.
Haga clic en Guardar
Paso 2: Habilitar el recopilador de eventos HTTP (HEC)
Navega a Configuración → Entradas de datos
Haga clic en Recopilador de eventos HTTP
Haga clic en Configuración global
Configurar:
Todos los tokens: Habilitado
Habilitar SSL: Habilitado (recomendado)
Número de puerto HTTP: 8088 (por defecto)
Haga clic en Guardar
Clientes de Splunk Cloud: HEC está habilitado de forma predeterminada y escucha en el puerto 443. No es necesario modificar la configuración global, aunque es posible que tengas que enviar una solicitud de asistencia para habilitar HEC en algunos tipos de pila.
Paso 3: Crear el token HEC
Todavía en Configuración → Entradas de datos → Recopilador de eventos HTTP, haz clic en Nuevo token
Configurar los ajustes del token:
Nombre: PowerDMARC_Integration
Anulación del nombre de la fuente: powerdmarc:api
Descripción: Token para la importación de registros de auditoría y de informes agregados de PowerDMARC
Haga clic Siguiente
Configuración de entrada:
Tipo de fuente: Seleccionar Automático
Índices permitidos: include powerdmarc
Índice predeterminado: powerdmarc
Haz clic «Revisar»y, a continuación, Enviar
Importante: Copia y guarda el valor del token inmediatamente; no podrás recuperarlo más adelante.
Por qué es importante la opción «Automático»: el script establece un tipo de fuente por evento (dmarc:audit o dmarc:aggregate) en la carga útil de HEC. Seleccionar un tipo de fuente fijo en el token anularía esos valores y fusionaría ambos conjuntos de datos en un único tipo de fuente.
Configuración del script de integración
Paso 4: Preparar el entorno Python
El script tiene una única dependencia de terceros: requests.
Opción A — Instalación en línea (recomendada)
pip3 install requests
Opción B — Instalación sin conexión
En un ordenador con conexión a Internet:
pip3 download requests -d ./packages
Transfiere los paquetes al sistema de destino y, a continuación:
pip3 install --no-index --find-links=./packages requests
Comprueba la instalación:
python3 -c "import requests; print(requests.__version__)"
Cualquier versión razonablemente reciente (2.25 o posterior) es válida.
Paso 5: Implementar el script
Crea una cuenta de servicio específica y una estructura de directorios, en lugar de ejecutar la integración como root:
sudo useradd -r -s /usr/sbin/nologin dmarc
sudo mkdir -p /opt/dmarc /etc/dmarc /var/lib/dmarc /var/log/dmarc
sudo chown dmarc:dmarc /var/lib/dmarc /var/log/dmarc
sudo chmod 750 /var/lib/dmarc /var/log/dmarc
Copiar dmarc_to_splunk.py en su ubicación correspondiente:
sudo install -o dmarc -g dmarc -m 750 dmarc_to_splunk.py /opt/dmarc/
Paso 6: Configurar el script
Cada parámetro se puede configurar editando el archivo diccionario en main() o estableciendo una variable de entorno. Se recomienda encarecidamente el uso de variables de entorno para que las credenciales nunca se almacenen dentro del archivo de script.
Formatos de URL de los puntos finales de HEC:
Splunk Enterprise / en las propias instalaciones: https://your-splunk-instance:8088/services/collector/event
Splunk Cloud: https://http-inputs-<your-stack>.splunkcloud.com/services/collector/event
Splunk Cloud hostnames vary by stack age and type — some use http-inputs-<stack>.splunkcloud.com on port 443, others use a .splunkcloud.com:8088 form. Confirm yours under Settings → Data inputs → HTTP Event Collector in your Splunk Cloud console rather than assuming.
Crea el archivo de credenciales:
sudo tee /etc/dmarc/splunk.env >/dev/null <<'EOF'
DMARC_API_KEY=tu_token_bearer_de_powerdmarc
SPLUNK_HEC_URL=https://your-splunk-instance:8088/services/collector/event
SPLUNK_HEC_TOKEN=tu_token_hec
SPLUNK_INDEX=powerdmarc
DMARC_DAYS_TO_FETCH=7
Fin de archivo
sudo chown root:dmarc /etc/dmarc/splunk.env
sudo chmod 640 /etc/dmarc/splunk.env
Paso 7: Comprobar la conectividad
El script acepta un --test que envía un único evento de prueba a HEC y se cierra. Esto valida el token, la URL, la cadena TLS y la ruta del cortafuegos sin esperar a que se complete una ejecución de recopilación completa:
sudo -u dmarc bash -c 'set -a; . /etc/dmarc/splunk.env; set +a; python3 /opt/dmarc/dmarc_to_splunk.py --test'
Resultado esperado:
============================================================
Integración de PowerDMARC con Splunk
Modo de salida: hec
============================================================
Comprobando la conectividad de Splunk HEC...
Se ha enviado un lote de 1 evento dmarc:audit (1/1)
Resumen de HEC para dmarc:audit — enviados: 1, fallidos: 0, total: 1
Confirma que la sonda ha llegado:
index=powerdmarc action="prueba_de_integración_y_conectividad"
Paso 8: Ejecutar una recopilación completa
sudo -u dmarc bash -c 'set -a; . /etc/dmarc/splunk.env; set +a; python3 /opt/dmarc/dmarc_to_splunk.py'
Resultado esperado (abreviado):
============================================================
Integración de PowerDMARC con Splunk
Modo de salida: hec
============================================================
Procesando informes agregados de DMARC...
Recuperación de informes agregados del 30 de enero de 2026 al 6 de febrero de 2026
Recuperando todos los dominios...
Página 1 recuperada: 24 dominios (total hasta ahora: 24)
Se han recuperado 24 dominios en total
Avance: 1,4 % (1/72) | Dominio 1/24: example.com | Tiempo estimado restante: 4,7 min
...
Se han procesado 318 eventos únicos del informe agregado
Se ha enviado un lote de 318 eventos dmarc:aggregate (318/318)
Resumen de HEC para dmarc:aggregate — enviados: 318, fallidos: 0, total: 318
Procesando los registros de auditoría...
Recuperación de los registros de auditoría del 30 de enero de 2026 al 6 de febrero de 2026
Se han recuperado un total de 15 entradas del registro de auditoría
Se han procesado 15 eventos únicos del registro de auditoría de los últimos 7 días
Resumen de HEC para dmarc:audit — enviados: 15, fallidos: 0, total: 15
============================================================
La integración se ha completado correctamente
============================================================
La primera ejecución será la más larga, ya que recopila toda la ventana de retrospectiva. Las ejecuciones posteriores omiten todo lo que ya se haya importado (véase Deduplicación).
Programar ejecución automatizada
Linux/Unix (cron)
sudo crontab -u dmarc -e
Por hora:
0 * * * * set -a; . /etc/dmarc/splunk.env; set +a; /usr/bin/python3 /opt/dmarc/dmarc_to_splunk.py >> /var/log/dmarc/run.log 2>&1
El script envía los mensajes de registro a la salida estándar, por lo que la redirección anterior es la que recoge el registro de ejecución. Añade un regla de logrotate para /var/log/dmarc/run.log en el entorno de producción.
Determinación de la duración del intervalo. El script se regula para mantener un intervalo de aproximadamente 2 segundos entre las llamadas a la API, con el fin de respetar el límite de frecuencia de PowerDMARC, y realiza tres solicitudes en total por dominio. Una estimación aproximada del tiempo total de recopilación es de dominios × 3 × 4 segundos —unos 5 minutos para 25 dominios, pero casi 2 horas para 500—. Si tu cuenta tiene más de unos 100 dominios, una programación por horas se solapará consigo misma. Puedes optar por:
Divide la programación: ejecuta la recogida del registro de auditoría cada hora y la recogida agregada una vez al día, o
Añade un archivo de bloqueo (flock) para que las ejecuciones solapadas finalicen correctamente:
0 * * * * /usr/bin/flock -n /tmp/dmarc-splunk.lock -c 'set -a; . /etc/dmarc/splunk.env; set +a; /usr/bin/python3 /opt/dmarc/dmarc_to_splunk.py' >> /var/log/dmarc/run.log 2>&1
Linux (temporizador de systemd)
Para esta carga de trabajo, suele ser preferible utilizar un temporizador de systemd en lugar de cron, ya que gestiona el archivo de entorno de forma nativa, evita que las ejecuciones se solapen y envía la salida al diario.
/etc/systemd/system/dmarc-splunk.service:
[Unidad]
Descripción=Ingestión de datos de PowerDMARC a Splunk
After=network-online.target
[Servicio]
Tipo=oneshot
Usuario=dmarc
Grupo=dmarc
EnvironmentFile=/etc/dmarc/splunk.env
ExecStart=/usr/bin/python3 /opt/dmarc/dmarc_to_splunk.py
/etc/systemd/system/dmarc-splunk.timer:
[Unidad]
Descripción=Ejecutar la importación de PowerDMARC a Splunk cada hora
[Temporizador]
OnCalendar=hourly
Persistent=true
[Instalar]
WantedBy=timers.target
Actívalo:
sudo systemctl daemon-reload
sudo systemctl activar --now dmarc-splunk.timer
sudo systemctl list-timers dmarc-splunk.timer
journalctl -u dmarc-splunk.service -f
Windows (Programador de tareas)
Abrir el Programador de tareas y haz clic en «Crear tarea»
Pestaña «General»:
Nombre: Integración de PowerDMARC con Splunk
Opciones de seguridad: Ejecutar independientemente de si el usuario ha iniciado sesión o no.
Pestaña «Desencadenantes»: Nuevo → Inicio: Según un horario → Diariamente, repetir cada hora
Pestaña «Acciones»: Nuevo → Iniciar un programa
Programa: python.exe
Argumentos: C:\dmarc\dmarc_to_splunk.py
Haga clic en Aceptar
En Windows, establece los valores de configuración en el archivo diccionario de configuración directamente o define las variables de entorno a nivel del equipo, y cambia output_dir / state_file por rutas de Windows como C:\dmarc\logs y C:\dmarc\state\state.json.
Validar la ingesta de datos en Splunk
Registros de auditoría
index=powerdmarc sourcetype=dmarc:audit
| ordenar - _time
| cabeza 20
| tabla _time, nombre_de_usuario, acción, dirección_IP, nombre_de_usuario_de_administrador
Campos que deberías ver:
nombre_de_usuario — usuario que realizó la acción
acción — descripción de la acción realizada
dirección_IP — Dirección IP del usuario
admin_username — cuenta de administrador, cuando proceda
marca de tiempo — hora original del evento de PowerDMARC
Informes agregados
index=powerdmarc sourcetype=dmarc:aggregate
| stats sum(email_volume) como volume, avg(dmarc_pass_percentage) como avg_pass por domain_name
| ordenar - volumen
Los eventos agregados incluyen recuentos y porcentajes por dominio y por fuente de envío para DMARC, SPF y DKIM, además de la política que se ha aplicado realmente.
Ejemplos de estructuras de eventos
dmarc:audit
{
«sourcetype»: «dmarc:audit»,
«marca de tiempo»: «4 de febrero de 2026, 14:29:24»,
«user_name»: «John Doe»,
«acción»: «Dominios adjuntos actualizados»,
«dirección_IP»: «12.111.67.123»,
«admin_username»: «N/A»,
«other_info»: «N/A»
}
dmarc:agregado (abreviado)
{
«sourcetype»: «dmarc:aggregate»,
«marca de tiempo»: «2026-02-06»,
«report_date_from»: "30-01-2026",
"fecha_de_informe_a": "2026-02-06",
«domain_id»: 1234,
«nombre_de_dominio»: "ejemplo.com",
«sending_source»: «Google»,
«estado»: «conforme»,
«email_volume»: 4821,
«dmarc_pass_count»: 4810,
«dmarc_pass_percentage»: 99,77,
«spf_align_percentage»: 99,77,
«dkim_align_percentage»: 100.0
}
Marcas de tiempo de los eventos
El script establece el HEC campo «HEC» a partir de la marca de tiempo de cada evento, siempre que pueda extraerla, de modo que _time refleja cuándo ocurrió el evento en lugar de cuándo se incorporó. Esto es importante en la primera ejecución: sin ello, un relleno retrospectivo de siete días se situaría íntegramente en el minuto actual y se vería incorrecto en todos los paneles de series temporales.
Desduplicación
El script mantiene un archivo de estado (por defecto /var/lib/dmarc/state.json) que contiene las huellas SHA-256 de todos los eventos ya entregados. En cada ejecución, se omiten los eventos que coincidan con una huella almacenada. Las huellas con más de 14 días de antigüedad se eliminan automáticamente para evitar que el archivo crezca sin límite.
Las huellas dactilares solo se registran una vez que que la entrega se haya realizado con éxito, por lo que un POST de HEC fallido hace que esos eventos puedan reintentarse en la siguiente ejecución, en lugar de descartarlos sin previo aviso.
Dos consecuencias operativas:
El archivo de estado debe conservarse entre ejecuciones y reinicios. No lo guardes en /tmp ni dentro de una capa de contenedor que se elimine.
Si se elimina el archivo de estado, en la siguiente ejecución se volverá a importar toda la ventana de retrospectiva. Esa es la forma correcta de forzar un relleno retrospectivo, pero ten en cuenta que aparecerán duplicados en Splunk si los datos ya se encuentran allí.
Alternativa: Captura de datos mediante File Monitor
Si no se dispone de acceso de salida al puerto HEC, configura DMARC_OUTPUT_MODE=file (o ambos). El script escribe datos JSON delimitados por saltos de línea en directorio_de_salida, un archivo por ejecución y por conjunto de datos:
/var/log/dmarc/dmarc_aggregate_20260206_140312.json
/var/log/dmarc/audit_logs_20260206_140312.json
Configura un forwarder de Splunk para supervisar ese directorio. En $SPLUNK_HOME/etc/system/local/inputs.conf:
[monitor:///var/log/dmarc/dmarc_aggregate_*.json]
desactivado = falso
índice = powerdmarc
sourcetype = dmarc:aggregate
[monitor:///var/log/dmarc/audit_logs_*.json]
desactivado = falso
índice = powerdmarc
sourcetype = dmarc:audit
Y en props.conf, para que los eventos se dividan en líneas separadas y se marquen correctamente con la fecha y la hora:
[dmarc:aggregate]
INDEXED_EXTRACTIONS = json
KV_MODE = none
SHOULD_LINEMERGE = false
TIME_PREFIX = "fecha_del_informe_hasta":\s*"
TIME_FORMAT = %Y-%m-%d
[dmarc:audit]
INDEXED_EXTRACTIONS = json
KV_MODE = none
SHOULD_LINEMERGE = false
TIME_PREFIX = "timestamp":\s*"
TIME_FORMAT = %Y-%m-%d %H:%M:%S
El usuario de Splunk necesita acceso de lectura al directorio; añádelo al archivo grupo dmarc , o bien relaja el modo del directorio a 0755. Añade una tarea de limpieza (find /var/log/dmarc -name '*.json' -mtime +7 -delete) para que no se acumulen los archivos de salida antiguos.
Solución de problemas
No aparecen datos en Splunk
Ejecutar con --test primero para determinar si el problema está en HEC o en PowerDMARC
Comprueba que el token HEC sea correcto y está activado (Configuración → Entradas de datos → Recopilador de eventos HTTP)
Comprueba que los índices permitidos del token incluyan powerdmarc
Comprueba que el índice exista y que tu rol tenga acceso para realizar búsquedas en él
Comprueba que las reglas del cortafuegos permitan el tráfico HTTPS saliente desde el servidor del script hacia el punto final de HEC.
Revisa el registro de ejecución de HEC devolvió HTTP… — El cuerpo del error de Splunk indica el problema concreto
Error HTTP 403 «Token no válido» de HEC
The token value is wrong, disabled, or belongs to a different Splunk stack. Note that the header format is Authorization: Splunk <token> — not Bearer.
HTTP 400 «Índice incorrecto»
El token no permite el índice al que apunta el script. Añade powerdmarc a la lista de índices permitidos del token, o bien cambia SPLUNK_INDEX por un índice que el token ya permita.
Errores de certificados SSL
Instala un certificado en el que confíe el servidor del script: esta es la solución correcta. Como medida temporal y únicamente en entornos que no sean de producción, configura SPLUNK_VERIFY_SSL=false. Nunca lo haga en producción, ya que desactiva la protección que hace que HEC sobre TLS sea eficaz.
Errores de autenticación en la API de PowerDMARC
Comprueba que el token de la API sea válido y no haya caducado
Comprueba que el token tenga permiso tanto para los registros de auditoría como para los informes agregados
Comprueba que se pueda acceder a la URL base de la API desde el servidor
El script se ejecuta, pero no se han recuperado los registros
Comprueba si realmente existen registros de auditoría correspondientes al período de revisión.
Aumentar DMARC_DAYS_TO_FETCH de forma temporal
Recuerda que la deduplicación elimina los eventos ya importados: un proceso de generación de informes Se han procesado 0 eventos únicos del registro de auditoría tras una ejecución anterior satisfactoria es normal, no es un error
Permiso denegado al iniciar el sistema
La cuenta de servicio no puede crear ni escribir en /var/lib/dmarc ni /var/log/dmarc. Crea previamente ambos directorios y ejecuta asigna a la cuenta con la que se ejecuta el script, tal y como se muestra en el paso 5.
La ejecución tarda más de lo previsto en el intervalo programado
Consulta la nota sobre tallas en Programar la ejecución automática. Añade flock o dividir la programación de la recogida.
Próximos pasos
Con el flujo de datos, puedes:
Crea paneles personalizados para analizar las tendencias de cumplimiento de DMARC por dominio y origen de envío
Avisar de eventos de auditoría, como cambios en las políticas o inicios de sesión desde rangos de IP inesperados
Alerta sobre retrocesos en el cumplimiento: una fuente de envío cuyo dmarc_pass_percentage desciende drásticamente de una semana a otra
Correlacionar los datos de PowerDMARC con otros registros de seguridad (puerta de enlace de correo, identidad, EDR)
Elaborar informes de cumplimiento normativo y para la dirección a partir del conjunto de datos agregados
Mejoras recomendadas
Puntos de conexión adicionales de la API: amplía el script para obtener informes forenses o datos de configuración por dominio
Rotación de registros: añade un regla de logrotate para el registro de ejecución del script en producción
Notificaciones de fallos: envuelve el script en una llamada que avise en caso de un estado de salida distinto de cero, o genera una alerta en Splunk si no se alcanza el volumen de eventos por hora esperado
Empaquetar como complemento tecnológico de Splunk: agrupa las entradas, las propiedades y la configuración en el momento de la indexación en un complemento tecnológico para facilitar su distribución
Gestión de secretos: sustituye el archivo de entorno por un gestor de secretos (Vault, AWS Secrets Manager, credenciales de systemd) cuando esté disponible.
Consideraciones de seguridad
Guarda las credenciales fuera del script. Utiliza el archivo de entorno (modo 640, propiedad de root:dmarc) o un gestor de secretos. Nunca incluyas tokens en el control de versiones.
Mantén activada la verificación TLS. SPLUNK_VERIFY_SSL tiene por defecto el valor true por una razón.
Ejecutar como una cuenta dedicada sin privilegios. La integración no requiere privilegios de root.
Restringe el token HEC. Limítalo a índice .
Rotar ambos tokens según un calendario — el token de portador de PowerDMARC y el token HEC de Splunk.
Supervisar la ejecución. Avisar en caso de ejecuciones fallidas y de interrupciones inesperadas en la ingesta de datos.
Revisa los controles de acceso de Splunk. Los datos del registro de auditoría identifican a los usuarios y las direcciones IP de origen; restrinja el índice a los roles que lo necesiten.
Asistencia y recursos
Documentación de la API de PowerDMARC: https://api.powerdmarc.com/
Documentación de Splunk HEC: https://docs.splunk.com/Documentation/Splunk/latest/Data/UsetheHTTPEventCollector
Splunk Answers: https://community.splunk.com/