Recopila registros de CyberArk EPM
En este documento, se explica cómo transferir registros de CyberArk EPM a Google Security Operations con AWS S3. El analizador transforma los datos de registro de CyberArk EPM en un modelo de datos unificado (UDM). Itera cada evento del registro, asigna los campos pertinentes a sus campos correspondientes del UDM, controla estructuras de datos específicas como exposedUsers
y enriquece el resultado con información estática del proveedor y del producto.
Antes de comenzar
- Asegúrate de tener una instancia de Google Security Operations.
- Asegúrate de tener acceso con privilegios a AWS.
- Asegúrate de tener acceso con privilegios a la consola de administración del servidor de EPM.
Configura AWS IAM para la transferencia de datos de Google SecOps
- Crea un usuario siguiendo esta guía del usuario: Cómo crear un usuario de IAM.
- Selecciona el usuario creado.
- Selecciona la pestaña Credenciales de seguridad.
- Haz clic en Crear clave de acceso en la sección Claves de acceso.
- Selecciona Servicio de terceros como el Caso de uso.
- Haz clic en Siguiente.
- Opcional: Agrega 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.
- Haz clic en Agregar permisos en la sección Políticas de permisos .
- Selecciona Agregar permisos.
- Selecciona Adjuntar políticas directamente.
- Busca y selecciona la política AmazonS3FullAccess.
- Haz clic en Siguiente.
- Haz clic en Agregar permisos.
Configura CyberArk EPM para el acceso a la API
- Accede a la consola web de CyberArk EPM como administrador.
- Ve a Administración > Administración de cuentas.
- Haz clic en + Agregar usuario.
- Proporciona los siguientes detalles:
- Nombre de usuario: epm_api_user
- Contraseña: Secreto seguro
- Correo electrónico/Nombre completo: Opcional
- En Permissions, otorga ViewOnlySetAdmin en cada Set de registros extraídos.
- Haz clic en Guardar.
- Opcional: Extiende el tiempo de espera de la sesión:
- Ve a Administración > Configuración de la cuenta.
- Establece Tiempo de espera para sesión inactiva en 60 minutos.
- Haz clic en Guardar.
- Ve a Política y conjuntos > selecciona tu conjunto > Propiedades.
- Copia y guarda el ID del conjunto (un GUID). Lo usarás en la secuencia de comandos como EPM_SET_ID.
Crea un bucket de AWS S3
- Accede a la consola de administración de AWS.
- Ve a Consola de AWS > Servicios > S3 > Crear bucket.
- Proporciona los siguientes detalles de configuración:
- Nombre del bucket: my-cyberark-epm-logs
- Región: Tu elección > Crear
Crea un rol de IAM para EC2
- Accede a 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 IAM, haz clic en Roles.
- Haz clic en Crear rol.
- Proporciona los siguientes detalles de configuración:
- Entidad de confianza: Servicio de AWS > EC2 > Siguiente.
- Attach permission: AmazonS3FullAccess (o una política con alcance para tu bucket) > Next
- Nombre del rol: EC2-S3-EPM-Writer > Crear rol
Opcional: Inicia y configura tu VM del recopilador de EC2
- Accede a 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 EC2, haz clic en Instances.
- Haz clic en Launch instances.
- Proporciona los siguientes detalles de configuración:
- Nombre: Ingresa
EPM-Log-Collector
. - AMI: Selecciona
Ubuntu Server 22.04 LTS
. - Tipo de instancia: Elige t3.micro (o una más grande) y, luego, haz clic en Siguiente.
- Red: Asegúrate de que el parámetro de configuración de red esté establecido en tu VPC predeterminada.
- Rol de IAM: Selecciona el rol de IAM EC2-S3-EPM-Writer` en el menú.
- Asignar automáticamente IP pública: Establece este parámetro en Habilitar. Si te conectarás a través de una VPN, puedes dejar esta opción inhabilitada.
- Add Storage: Deja la configuración de almacenamiento predeterminada (8 GiB) y, luego, haz clic en Next.
- Selecciona Crear un grupo de seguridad nuevo.
- Regla de entrada: Haz clic en Agregar regla.
- Tipo: Selecciona SSH.
- Puerto: 22
- Origen: Tu IP
- Haz clic en Revisar y lanzar.
- Selecciona o crea 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 a través de SSH.
- Nombre: Ingresa
Conéctate a tu máquina virtual (VM) con SSH:
chmod 400 ~/Downloads/your-key.pem ssh -i ~/Downloads/your-key.pem ubuntu@<EC2_PUBLIC_IP>
Instala 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
Implementa la secuencia de comandos del recopilador
Crea la carpeta del proyecto:
mkdir ~/epm-collector && cd ~/epm-collector
Establece las 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 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
Automatiza con Cron
Abre crontab:
crontab -e
Agrega el trabajo diario:
0 0 * * * cd ~/epm-collector && source ~/epm-venv/bin/activate && python collector.py >> ~/epm-collector/epm.log 2>&1
Configura un feed en Google SecOps para transferir registros de Cyberark EPM
- Ve a SIEM Settings > Feeds.
- Haz clic en Agregar nueva.
- En el campo Nombre del feed, ingresa un nombre para el feed (por ejemplo,
Cyberark EPM Logs
). - Selecciona Amazon S3 como el Tipo de fuente.
- Selecciona Cyberark EPM como el Tipo de registro.
- Haz clic en Siguiente.
Especifica valores para los siguientes parámetros de entrada:
- Región: Es la región en la que se encuentra el bucket de Amazon S3.
- URI de S3: Es el URI del bucket (el formato debe ser
s3://your-log-bucket-name/
). Reemplaza lo siguiente:your-log-bucket-name
: el nombre del bucket.
- El URI es un: Selecciona Directorio o Directorio que incluye subdirectorios.
- Opciones de borrado de la fuente: Selecciona la opción de borrado según tu preferencia.
- ID de clave de acceso: Es la clave de acceso del usuario con acceso al bucket de S3.
- Clave de acceso secreta: Es la clave secreta del usuario con acceso al bucket de S3.
- Espacio de nombres del recurso: Es el espacio de nombres del recurso.
- Etiquetas de transferencia: Es la etiqueta que se aplicará a los eventos de este feed.
Haz clic en Siguiente.
Revisa la nueva configuración del feed en la pantalla Finalizar y, luego, haz 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 | Mapea directamente el campo computerName. |
displayName | metadata.description | Asigna directamente el campo displayName. |
eventType | metadata.product_event_type | Mapea 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 | Mapea directamente el campo filePath. |
hash | target.file.sha1 | Mapea directamente el campo 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. |
publicador | additional.fields | Crea un campo con la clave "Publisher" y el valor string_value del campo publisher. |
sourceProcessCommandLine | target.process.parent_process.command_line | Mapea 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 string_value del campo sourceProcessSigner. |
threatProtectionAction | security_result.action_details | Asigna directamente el campo threatProtectionAction. |
metadata.event_timestamp | Establece la marca de tiempo del evento en el valor de create_time de la entrada de registro. | |
metadata.event_type | Está codificado como "STATUS_UPDATE". | |
metadata.log_type | Se codifica de forma rígida como "CYBERARK_EPM". | |
metadata.product_name | Se codifica de forma rígida como "EPM". | |
metadata.vendor_name | Está codificado como "CYBERARK". | |
security_result.alert_state | Se codificó como "ALERTING". | |
userName | principal.user.userid | Mapea directamente el campo userName. |
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.