Recoger registros de CyberArk EPM
En este documento se explica cómo ingerir registros de CyberArk EPM en Google Security Operations mediante AWS S3. El analizador transforma los datos de registro de CyberArk EPM en un modelo de datos unificado (UDM). Recorre cada evento del registro, asigna los campos pertinentes a sus campos de UDM correspondientes, gestiona estructuras de datos específicas, como exposedUsers
, y enriquece el resultado con información estática del proveedor y del producto.
Antes de empezar
- Asegúrate de que tienes una instancia de Google Security Operations.
- Asegúrate de que tienes acceso con privilegios a AWS.
- Asegúrate de que tienes acceso con privilegios a la consola de gestión del servidor EPM.
Configurar la gestión de identidades y accesos de AWS para la ingestión de Google SecOps
- Crea un usuario siguiendo esta guía: Crear un usuario de gestión de identidades y accesos.
- Selecciona el usuario creado.
- Selecciona la pestaña Credenciales de seguridad.
- En la sección Claves de acceso, haz clic en Crear clave de acceso.
- Selecciona Servicio de terceros como Caso práctico.
- Haz clic en Siguiente.
- Opcional: añade una etiqueta de descripción.
- Haz clic en Crear clave de acceso.
- Haz clic en Descargar archivo CSV para guardar la clave de acceso y la clave de acceso secreta para usarlas más adelante.
- Haz clic en Listo.
- Selecciona la pestaña Permisos.
- En la sección Políticas de permisos, haz clic en Añadir permisos .
- Selecciona Añadir permisos.
- Seleccione Adjuntar políticas directamente.
- Busca y selecciona la política AmazonS3FullAccess.
- Haz clic en Siguiente.
- Haz clic en Añadir permisos.
Configurar CyberArk EPM para el acceso a la API
- Inicia sesión en la consola web de CyberArk EPM como administrador.
- Ve a Administración > Gestión de cuentas.
- Haz clic en + Añadir usuario.
- Proporcione los siguientes datos:
- Nombre de usuario: epm_api_user
- Contraseña: secreto seguro
- Correo o nombre completo: opcional
- En Permisos, concede el permiso ViewOnlySetAdmin en cada conjunto de registros extraídos.
- Haz clic en Guardar.
- Opcional: Ampliar el tiempo de espera de la sesión:
- Vaya a Administración > Configuración de la cuenta.
- Define Tiempo de espera de las sesiones inactivas en 60 minutos.
- Haz clic en Guardar.
- Ve a Política y conjuntos > selecciona tu conjunto > Propiedades.
- Copia y guarda el ID de conjunto (un GUID). Lo usarás en la secuencia de comandos como EPM_SET_ID.
Crear un segmento de AWS S3
- Inicia sesión en la consola de administración de AWS.
- Ve a Consola de AWS > Servicios > S3 > Crear un bucket.
- Proporcione los siguientes detalles de configuración:
- Nombre del segmento: my-cyberark-epm-logs
- Región: la que elijas > Crear
Crear un rol de gestión de identidades y accesos para EC2
- Inicia sesión en la consola de administración de AWS.
- Ve a Servicios.
- En la barra de búsqueda, escribe
IAM
y selecciónalo. - En el panel de control IAM, haga clic en Roles.
- Haz clic en Crear rol.
- Proporcione los siguientes detalles de configuración:
- Entidad de confianza: Servicio de AWS > EC2 > Siguiente.
- Adjuntar permiso: AmazonS3FullAccess (o una política con ámbito a tu bucket) > Siguiente.
- Nombre del rol: EC2-S3-EPM-Writer > Crear rol.
Opcional: Inicia y configura tu VM de EC2 Collector
- Inicia sesión en la consola de administración de AWS.
- Ve a Servicios.
- En la barra de búsqueda, escribe EC2 y selecciónalo.
- En el panel de control de EC2, haz clic en Instances (Instancias).
- Haz clic en Lanzar instancias.
- Proporcione los siguientes detalles de configuración:
- Name (Nombre): escribe
EPM-Log-Collector
. - AMI selecciona
Ubuntu Server 22.04 LTS
. - Tipo de instancia: elige t3.micro (o un tipo más grande) y, a continuación, haz clic en Siguiente.
- Red: comprueba que el ajuste Red esté configurado en tu VPC predeterminada.
- Rol de gestión de identidades y accesos: selecciona el rol de gestión de identidades y accesos EC2-S3-EPM-Writer` en el menú.
- Asignar automáticamente IP pública: selecciona Habilitar. Si te vas a conectar a través de una VPN, puedes dejar esta opción inhabilitada.
- Añadir almacenamiento: deje la configuración de almacenamiento predeterminada (8 GiB) y, a continuación, haga clic en Siguiente.
- Selecciona Crear un grupo de seguridad.
- Regla de entrada: haz clic en Añadir regla.
- Tipo: selecciona SSH.
- Puerto: 22.
- Fuente: tu IP
- Haga clic en Revisar y publicar.
- Seleccione o cree un par de claves.
- Haz clic en Descargar par de claves.
- Guarda el archivo PEM descargado. Necesitarás este archivo para conectarte a tu instancia mediante SSH.
- Name (Nombre): escribe
Conéctate a tu máquina virtual (VM) mediante SSH:
chmod 400 ~/Downloads/your-key.pem ssh -i ~/Downloads/your-key.pem ubuntu@<EC2_PUBLIC_IP>
Instalar los requisitos previos del recopilador
Actualiza el sistema operativo:
# Update OS sudo apt update && sudo apt upgrade -y # Install Python, Git sudo apt install -y python3 python3-venv python3-pip git # Create & activate virtualenv python3 -m venv ~/epm-venv source ~/epm-venv/bin/activate # Install libraries pip install requests boto3
Crea el directorio y el archivo de estado:
sudo mkdir -p /var/lib/epm-collector sudo touch /var/lib/epm-collector/last_run.txt sudo chown ubuntu:ubuntu /var/lib/epm-collector/last_run.txt
Inicialízalo (por ejemplo, hace 1 hora):
echo "$(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ)" > /var/lib/epm-collector/last_run.txt
Implementar la secuencia de comandos del recopilador
Crear carpeta de proyecto:
mkdir ~/epm-collector && cd ~/epm-collector
Define variables de entorno (por ejemplo, en ~/.bashrc):
export EPM_URL="https://epm.mycompany.com" export EPM_USER="epm_api_user" export EPM_PASS="YourPasswordHere" export EPM_SET_ID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" export S3_BUCKET="my-cyberark-epm-logs" export S3_PREFIX="epm/"
Crea el archivo collector.py y pega lo siguiente:
#!/usr/bin/env python3 import os import sys import json import boto3 import requests from datetime import datetime, timezone, timedelta # ── LOAD CONFIG FROM ENV ─────────────────────────────────────────────────────── def must_env(var): v = os.getenv(var) if not v: print(f"ERROR: environment variable {var} is required", file=sys.stderr) sys.exit(1) return v EPM_URL = must_env("EPM_URL") # for example, https://epm.mycompany.com USERNAME = must_env("EPM_USER") # API username PASSWORD = must_env("EPM_PASS") # API password SET_ID = must_env("EPM_SET_ID") # GUID of the Set to pull S3_BUCKET = must_env("S3_BUCKET") # for example, my-cyberark-epm-logs S3_PREFIX = os.getenv("S3_PREFIX", "") # optional, for example "epm/" STATE_FILE = os.getenv("STATE_FILE", "/var/lib/epm-collector/last_run.txt") PAGE_SIZE = int(os.getenv("PAGE_SIZE", "100")) # ── END CONFIG ──────────────────────────────────────────────────────────────── def read_last_run(): try: ts = open(STATE_FILE).read().strip() return datetime.fromisoformat(ts.replace("Z","+00:00")) except: # default to 1 hour ago return datetime.now(timezone.utc) - timedelta(hours=1) def write_last_run(dt): with open(STATE_FILE, "w") as f: f.write(dt.strftime("%Y-%m-%dT%H:%M:%SZ")) def logon(): r = requests.post( f"{EPM_URL}/REST/EPMService.svc/Logon", json={"username": USERNAME, "password": PASSWORD}, headers={"Content-Type": "application/json"} ) r.raise_for_status() return r.json().get("SessionToken") def logoff(token): requests.post( f"{EPM_URL}/REST/EPMService.svc/Logoff", headers={"Authorization": f"Bearer {token}"} ) def fetch_raw_events(token, start, end): headers = {"Authorization": f"Bearer {token}"} page = 1 while True: params = { "setId": SET_ID, "startDate": start, "endDate": end, "pageSize": PAGE_SIZE, "pageNumber": page } resp = requests.get( f"{EPM_URL}/REST/EPMService.svc/GetRawEvents", headers=headers, params=params ) resp.raise_for_status() events = resp.json().get("RawEvents", []) if not events: break yield from events page += 1 def upload_to_s3(obj, key): boto3.client("s3").put_object( Bucket=S3_BUCKET, Key=key, Body=json.dumps(obj).encode("utf-8") ) def main(): # determine time window start_dt = read_last_run() end_dt = datetime.now(timezone.utc) START = start_dt.strftime("%Y-%m-%dT%H:%M:%SZ") END = end_dt.strftime("%Y-%m-%dT%H:%M:%SZ") token = logon() try: for idx, raw_evt in enumerate(fetch_raw_events(token, START, END), start=1): key = f"{S3_PREFIX}{end_dt.strftime('%Y/%m/%d')}/raw_{int(end_dt.timestamp())}_{idx}.json" upload_to_s3(raw_evt, key) print(f"Uploaded raw event to {key}") finally: logoff(token) # persist for next run write_last_run(end_dt) if __name__ == "__main__": main()
Haz que la secuencia de comandos sea ejecutable:
chmod +x collector.py
Automatizar con Cron
Abre crontab:
crontab -e
Añade la tarea diaria:
0 0 * * * cd ~/epm-collector && source ~/epm-venv/bin/activate && python collector.py >> ~/epm-collector/epm.log 2>&1
Configurar un feed en Google SecOps para ingerir registros de Cyberark EPM
- Ve a Configuración de SIEM > Feeds.
- Haz clic en Añadir nuevo.
- En el campo Nombre del feed, introduce un nombre para el feed (por ejemplo,
Cyberark EPM Logs
). - Selecciona Amazon S3 como Tipo de fuente.
- Selecciona Cyberark EPM como Tipo de registro.
- Haz clic en Siguiente.
Especifique los valores de los siguientes parámetros de entrada:
- Región: la región en la que se encuentra el segmento de Amazon S3.
- URI de S3: el URI del contenedor (el formato debe ser
s3://your-log-bucket-name/
). Sustituye lo siguiente:your-log-bucket-name
: el nombre del segmento.
- El URI es un: selecciona Directorio o Directorio que incluye subdirectorios.
- Opciones de eliminación de la fuente: selecciona la opción de eliminación que prefieras.
- ID de clave de acceso: la clave de acceso del usuario con acceso al segmento de S3.
- Clave de acceso secreta: la clave secreta del usuario con acceso al segmento de S3.
- Espacio de nombres de recursos: el espacio de nombres de recursos.
- Etiquetas de ingestión: etiqueta que se aplicará a los eventos de este feed.
Haz clic en Siguiente.
Revise la configuración de la nueva fuente en la pantalla Finalizar y, a continuación, haga clic en Enviar.
Tabla de asignación de UDM
Campo de registro | Asignación de UDM | Lógica |
---|---|---|
agentId | principal.asset.asset_id | Concatena "agentId:" con el valor del campo agentId. |
computerName | principal.hostname | Asigna directamente el campo computerName. |
displayName | metadata.description | Asigna directamente el campo displayName. |
eventType | metadata.product_event_type | Asigna directamente el campo eventType. |
exposedUsers.[].accountName | target.user.attribute.labels | Crea una etiqueta con la clave "accountName_[index]" y el valor de exposedUsers.[index].accountName. |
exposedUsers.[].domain | target.user.attribute.labels | Crea una etiqueta con la clave "domain_[index]" y el valor de exposedUsers.[index].domain. |
exposedUsers.[].username | target.user.attribute.labels | Crea una etiqueta con la clave "username_[index]" y el valor de exposedUsers.[index].username. |
filePath | target.file.full_path | Asigna directamente el campo filePath. |
hash | target.file.sha1 | Asigna directamente el campo de hash. |
operatingSystemType | principal.platform | Asigna "Windows" a "WINDOWS" si el campo operatingSystemType es "Windows". |
policyName | security_result.rule_name | Asigna directamente el campo policyName. |
processCommandLine | target.process.command_line | Asigna directamente el campo processCommandLine. |
editor | additional.fields | Crea un campo con la clave "Publisher" y el valor string_value del campo publisher. |
sourceProcessCommandLine | target.process.parent_process.command_line | Asigna directamente el campo sourceProcessCommandLine. |
sourceProcessHash | target.process.parent_process.file.sha1 | Asigna directamente el campo sourceProcessHash. |
sourceProcessSigner | additional.fields | Crea un campo con la clave "sourceProcessSigner" y el valor string_value del campo sourceProcessSigner. |
threatProtectionAction | security_result.action_details | Asigna directamente el campo threatProtectionAction. |
metadata.event_timestamp | Define la marca de tiempo del evento como el valor de create_time de la entrada de registro. | |
metadata.event_type | Codificado como "STATUS_UPDATE". | |
metadata.log_type | Codificado como "CYBERARK_EPM". | |
metadata.product_name | Codificado como "EPM". | |
metadata.vendor_name | Codificado como "CYBERARK". | |
security_result.alert_state | Codificado como "ALERTING". | |
userName | principal.user.userid | Asigna directamente el campo userName. |
¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.