Recopilar registros de PAM de CyberArk
Este código de analizador primero extrae campos de los mensajes syslog de CyberArk Privileged Access Manager (PAM) mediante expresiones regulares. A continuación, asigna los campos extraídos a un modelo de datos unificado (UDM), lo que enriquece los datos con contexto adicional y estandariza el tipo de evento en función de criterios específicos.
Antes de empezar
- Asegúrate de que tienes una instancia de Google Security Operations.
- Asegúrate de que usas Windows 2016 o una versión posterior, o un host Linux con systemd.
- Si se ejecuta a través de un proxy, asegúrate de que los puertos del cortafuegos estén abiertos.
Obtener el archivo de autenticación de ingestión de Google SecOps
- Inicia sesión en la consola de Google SecOps.
- Ve a Configuración de SIEM > Agentes de recogida.
- Descarga el archivo de autenticación de ingestión.
Obtener el ID de cliente de Google SecOps
- Inicia sesión en la consola de Google SecOps.
- Ve a Configuración de SIEM > Perfil.
- Copia y guarda el ID de cliente de la sección Detalles de la organización.
Instalar el agente de Bindplane
- Para instalar en Windows, ejecuta la siguiente secuencia de comandos:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet - Para instalar Linux, ejecuta la siguiente secuencia de comandos:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh - Puedes consultar otras opciones de instalación en esta guía de instalación.
Configurar el agente de Bindplane para ingerir Syslog y enviarlo a Google SecOps
- Accede al equipo en el que está instalado el agente de Bindplane.
Edita el archivo
config.yamlde la siguiente manera:receivers: tcplog: # Replace the below port <54525> and IP <0.0.0.0> with your specific values listen_address: "0.0.0.0:54525" exporters: chronicle/chronicle_w_labels: compression: gzip # Adjust the creds location below according the placement of the credentials file you downloaded creds: '{ json file for creds }' # Replace <customer_id> below with your actual ID that you copied customer_id: <customer_id> endpoint: malachiteingestion-pa.googleapis.com # You can apply ingestion labels below as preferred ingestion_labels: log_type: SYSLOG namespace: Cyberark_PAM raw_log_field: body service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - tcplog exporters: - chronicle/chronicle_w_labelsReinicia el agente de Bindplane para aplicar los cambios:
sudo systemctl restart bindplane
Configurar la exportación de Syslog para CyberArk Vault
- Inicia sesión en el servidor de Vault.
- Abre el archivo de configuración
dbparm.ini, que se encuentra enC:\Program Files (x86)\CyberArk\Vault\Server\dbparm.ini. Añade o modifica los siguientes parámetros:
SyslogServer=<syslog_server_ip> SyslogPort=<syslog_server_port> SyslogProtocol=<TCP or UDP> SyslogFormat=SyslogGuarda el archivo
dbparm.ini.Reinicia el servidor de Vault:
net stop CyberArkVault net start CyberArkVault
Configurar la exportación de Syslog en PVWA
- Inicia sesión en el servidor PVWA.
- Abre el archivo
Web.config, que se encuentra enC:\inetpub\wwwroot\PasswordVault\. Añade o modifica las siguientes claves:
<add key="SyslogServer" value="<syslog_server_ip>" /> <add key="SyslogPort" value="<syslog_server_port>" /> <add key="SyslogProtocol" value="<TCP or UDP>" /> <add key="SyslogFormat" value="Syslog" />Guarda los cambios en el archivo
Web.config.Reinicia el servicio IIS:
iisreset
Configurar la exportación de Syslog en PTA
- Accede al servidor PTA mediante SSH.
- Abre el archivo
application.properties, que se encuentra en/opt/cta/config/application.properties. Añade o modifica las siguientes líneas:
syslog.server.ip=<syslog_server_ip> syslog.server.port=<syslog_server_port> syslog.protocol=<TCP or UDP>Guarda el archivo
application.properties.Reinicia el servicio PTA para aplicar los cambios:
sudo service pta restart
Tabla de asignación de UDM
| Campo de registro | Asignación de UDM | Lógica |
|---|---|---|
| actuar | metadata.description | Se asigna directamente desde el campo act. |
| cn1 | additional.fields.value.string_value | Se asigna directamente desde el campo cn1 cuando cn1Label no está vacío. |
| cn1Label | additional.fields.key | Se asigna directamente desde el campo cn1Label cuando cn1 no está vacío. |
| cn2 | additional.fields.value.string_value | Se asigna directamente desde el campo cn2 cuando cn2Label no está vacío. |
| cn2Label | additional.fields.key | Se asigna directamente desde el campo cn2Label cuando cn2 no está vacío. |
| cs1 | additional.fields.value.string_value | Se asigna directamente desde el campo cs1 cuando cs1Label no está vacío. |
| cs1Label | additional.fields.key | Se asigna directamente desde el campo cs1Label cuando cs1 no está vacío. |
| cs2 | additional.fields.value.string_value | Se asigna directamente desde el campo cs2 cuando cs2Label no está vacío. |
| cs2Label | additional.fields.key | Se asigna directamente desde el campo cs2Label cuando cs2 no está vacío. |
| cs3 | additional.fields.value.string_value | Se asigna directamente desde el campo cs3 cuando cs3Label no está vacío. |
| cs3Label | additional.fields.key | Se asigna directamente desde el campo cs3Label cuando cs3 no está vacío. |
| cs4 | additional.fields.value.string_value | Se asigna directamente desde el campo cs4 cuando cs4Label no está vacío. |
| cs4Label | additional.fields.key | Se asigna directamente desde el campo cs4Label cuando cs4 no está vacío. |
| cs5 | additional.fields.value.string_value | Se asigna directamente desde el campo cs5 cuando cs5Label no está vacío. |
| cs5Label | additional.fields.key | Se asigna directamente desde el campo cs5Label cuando cs5 no está vacío. |
| dhost | target.hostname | Se asigna desde el campo dhost si no es una dirección IP. Si dhost está vacío, se asigna desde shost (IP o nombre de host). |
| dhost | target.asset.hostname | Se asigna desde el campo dhost si no es una dirección IP. Si dhost está vacío, se asigna desde shost (IP o nombre de host). |
| dhost | target.ip | Se asigna desde el campo dhost si es una dirección IP. |
| dhost | target.asset.ip | Se asigna desde el campo dhost si es una dirección IP. |
| duser | target.user.userid | Se asigna directamente desde el campo duser. |
| dvc | intermediary.ip | Se asigna desde el campo dvc si es una dirección IP. |
| externalId | metadata.product_log_id | Se asigna directamente desde el campo externalId. |
| fname | target.file.full_path | Se asigna directamente desde el campo fname. |
| name | metadata.event_type | Se usa para determinar el event_type en función de la combinación de los campos name, shost y dhost. Valores posibles: USER_CHANGE_PASSWORD, FILE_READ, USER_LOGIN, FILE_OPEN y FILE_DELETION. Si no se encuentra ninguna coincidencia y has_principal es true y has_target es false, event_type se define como STATUS_UPDATE. De lo contrario, se asigna el valor predeterminado GENERIC_EVENT. |
| prin_hostname | principal.hostname | Se asigna directamente desde el campo prin_hostname. Si está vacío, se asigna desde shost si shost no es una dirección IP. |
| prin_hostname | principal.asset.hostname | Se asigna directamente desde el campo prin_hostname. Si está vacío, se asigna desde shost si shost no es una dirección IP. |
| prin_ip | principal.ip | Se asigna directamente desde el campo prin_ip. Si está vacío, se asigna desde shost si shost es una dirección IP. |
| prin_ip | principal.asset.ip | Se asigna directamente desde el campo prin_ip. Si está vacío, se asigna desde shost si shost es una dirección IP. |
| producto | metadata.product_name | Se asigna directamente desde el campo product. Si no está presente en el registro, el valor predeterminado es "PAM". |
| reason | security_result.description | Se asigna directamente desde el campo reason. |
| gravedad | security_result.severity | Se asigna desde el campo severity según la siguiente lógica: 1-3: INFORMATIONAL, 4: ERROR, 5: CRITICAL. |
| shost | principal.hostname | Se asigna a prin_hostname si prin_hostname está vacío y shost no es una dirección IP. |
| shost | principal.asset.hostname | Se asigna a prin_hostname si prin_hostname está vacío y shost no es una dirección IP. |
| shost | principal.ip | Se asigna a prin_ip si prin_ip está vacío y shost es una dirección IP. |
| shost | principal.asset.ip | Se asigna a prin_ip si prin_ip está vacío y shost es una dirección IP. |
| shost | target.hostname | Se asigna a target.hostname si dhost está vacío y shost no es una dirección IP. |
| shost | target.asset.hostname | Se asigna a target.hostname si dhost está vacío y shost no es una dirección IP. |
| shost | target.ip | Se asigna a target.ip si dhost está vacío y shost es una dirección IP. |
| shost | target.asset.ip | Se asigna a target.ip si dhost está vacío y shost es una dirección IP. |
| status | additional.fields.value.string_value | Se asigna directamente desde el campo status. |
| suser | principal.user.userid | Asignado desde el campo suser. Si duser está vacío, se considera el ID de usuario de destino. |
| Tiempo | metadata.event_timestamp.seconds | Se asigna directamente desde el campo time después de convertirlo al formato de marca de tiempo. |
| Tiempo | metadata.event_timestamp.nanos | Se asigna directamente desde el campo time después de convertirlo al formato de marca de tiempo. |
| vendor | metadata.vendor_name | Se asigna directamente desde el campo vendor. Si no está presente en el registro, el valor predeterminado es "CYBERARK". |
| version | metadata.product_version | Se asigna directamente desde el campo version. |
| metadata.log_type | Codificado como "CYBERARK_PAM". | |
| extensions.auth.mechanism | Se asigna el valor "USERNAME_PASSWORD" si event_type es "USER_LOGIN". |
¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.