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.yaml
de 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_labels
Reinicia 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=Syslog
Guarda 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.