Recoger registros de CyberArk EPM

Disponible en:

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

  1. Crea un usuario siguiendo esta guía: Crear un usuario de gestión de identidades y accesos.
  2. Selecciona el usuario creado.
  3. Selecciona la pestaña Credenciales de seguridad.
  4. En la sección Claves de acceso, haz clic en Crear clave de acceso.
  5. Selecciona Servicio de terceros como Caso práctico.
  6. Haz clic en Siguiente.
  7. Opcional: añade una etiqueta de descripción.
  8. Haz clic en Crear clave de acceso.
  9. Haz clic en Descargar archivo CSV para guardar la clave de acceso y la clave de acceso secreta para usarlas más adelante.
  10. Haz clic en Listo.
  11. Selecciona la pestaña Permisos.
  12. En la sección Políticas de permisos, haz clic en Añadir permisos .
  13. Selecciona Añadir permisos.
  14. Seleccione Adjuntar políticas directamente.
  15. Busca y selecciona la política AmazonS3FullAccess.
  16. Haz clic en Siguiente.
  17. Haz clic en Añadir permisos.

Configurar CyberArk EPM para el acceso a la API

  1. Inicia sesión en la consola web de CyberArk EPM como administrador.
  2. Ve a Administración > Gestión de cuentas.
  3. Haz clic en + Añadir usuario.
  4. Proporcione los siguientes datos:
    • Nombre de usuario: epm_api_user
    • Contraseña: secreto seguro
    • Correo o nombre completo: opcional
  5. En Permisos, concede el permiso ViewOnlySetAdmin en cada conjunto de registros extraídos.
  6. Haz clic en Guardar.
  7. 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.
  8. Ve a Política y conjuntos > selecciona tu conjunto > Propiedades.
  9. 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

  1. Inicia sesión en la consola de administración de AWS.
  2. Ve a Consola de AWS > Servicios > S3 > Crear un bucket.
  3. 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

  1. Inicia sesión en la consola de administración de AWS.
  2. Ve a Servicios.
  3. En la barra de búsqueda, escribe IAM y selecciónalo.
  4. En el panel de control IAM, haga clic en Roles.
  5. Haz clic en Crear rol.
  6. 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

  1. Inicia sesión en la consola de administración de AWS.
  2. Ve a Servicios.
  3. En la barra de búsqueda, escribe EC2 y selecciónalo.
  4. En el panel de control de EC2, haz clic en Instances (Instancias).
  5. Haz clic en Lanzar instancias.
  6. 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.
  7. 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

  1. 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
    
  2. 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
    
  3. 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

  1. Crear carpeta de proyecto:

    mkdir ~/epm-collector && cd ~/epm-collector
    
  2. 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/"
    
  3. 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()
    
  4. Haz que la secuencia de comandos sea ejecutable:

    chmod +x collector.py
    

Automatizar con Cron

  1. Abre crontab:

    crontab -e
    
  2. 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

  1. Ve a Configuración de SIEM > Feeds.
  2. Haz clic en Añadir nuevo.
  3. En el campo Nombre del feed, introduce un nombre para el feed (por ejemplo, Cyberark EPM Logs).
  4. Selecciona Amazon S3 como Tipo de fuente.
  5. Selecciona Cyberark EPM como Tipo de registro.
  6. Haz clic en Siguiente.
  7. 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.
  8. Haz clic en Siguiente.

  9. 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.