Raccogli i log di CyberArk EPM

Supportato in:

Questo documento spiega come importare i log di CyberArk EPM in Google Security Operations utilizzando AWS S3. Il parser trasforma i dati dei log di CyberArk EPM in un modello dei dati unificato (UDM). Esegue l'iterazione di ogni evento nel log, mappa i campi pertinenti ai relativi campi UDM, gestisce strutture di dati specifiche come exposedUsers e arricchisce l'output con informazioni statiche su fornitori e prodotti.

Prima di iniziare

  • Assicurati di avere un'istanza Google Security Operations.
  • Assicurati di disporre dell'accesso con privilegi ad AWS.
  • Assicurati di disporre dell'accesso privilegiato alla console di gestione del server EPM.

Configurare AWS IAM per l'importazione di Google SecOps

  1. Crea un utente seguendo questa guida dell'utente: Creare un utente IAM.
  2. Seleziona l'utente creato.
  3. Seleziona la scheda Credenziali di sicurezza.
  4. Fai clic su Crea chiave di accesso nella sezione Chiavi di accesso.
  5. Seleziona Servizio di terze parti come Caso d'uso.
  6. Fai clic su Avanti.
  7. (Facoltativo) Aggiungi un tag di descrizione.
  8. Fai clic su Crea chiave di accesso.
  9. Fai clic su Scarica file CSV per salvare la chiave di accesso e la chiave di accesso segreta per utilizzarle in un secondo momento.
  10. Fai clic su Fine.
  11. Seleziona la scheda Autorizzazioni.
  12. Fai clic su Aggiungi autorizzazioni nella sezione Norme relative alle autorizzazioni .
  13. Seleziona Aggiungi autorizzazioni.
  14. Seleziona Collega direttamente i criteri.
  15. Cerca e seleziona il criterio AmazonS3FullAccess.
  16. Fai clic su Avanti.
  17. Fai clic su Aggiungi autorizzazioni.

Configura CyberArk EPM per l'accesso API

  1. Accedi alla console web CyberArk EPM come amministratore.
  2. Vai ad Amministrazione > Gestione dell'account.
  3. Fai clic su + Aggiungi utente.
  4. Fornisci i seguenti dettagli:
    • Nome utente: epm_api_user
    • Password: un secret efficace
    • Email/Nome e cognome: facoltativo
  5. In Autorizzazioni, concedi ViewOnlySetAdmin a ogni Set di log estratto.
  6. Fai clic su Salva.
  7. (Facoltativo) Estendi il timeout sessione:
    • Vai ad Amministrazione > Configurazione account.
    • Imposta Timeout per sessione inattiva su 60 minuti.
    • Fai clic su Salva.
  8. Vai a Criteri e insiemi > seleziona il tuo insieme > Proprietà.
  9. Copia e salva l'ID set (un GUID). Lo utilizzerai nello script come EPM_SET_ID.

Crea un bucket AWS S3

  1. Accedi alla AWS Management Console.
  2. Vai a Console AWS > Servizi > S3 > Crea bucket.
  3. Fornisci i seguenti dettagli di configurazione:
    • Nome bucket: my-cyberark-epm-logs
    • Regione: la tua scelta > Crea

Crea un ruolo IAM per EC2

  1. Accedi alla AWS Management Console.
  2. Vai a Servizi.
  3. Nella barra di ricerca, digita IAM e selezionalo.
  4. Nella dashboard IAM, fai clic su Ruoli.
  5. Fai clic su Crea ruolo.
  6. Fornisci i seguenti dettagli di configurazione:
    • Entità attendibile: Servizio AWS > EC2 > Avanti.
    • Allega autorizzazione: AmazonS3FullAccess (o un criterio basato su ambito al bucket) > Avanti.
    • Nome del ruolo: EC2-S3-EPM-Writer > Crea ruolo.

(Facoltativo) Avvia e configura la VM del raccoglitore EC2

  1. Accedi alla AWS Management Console.
  2. Vai a Servizi.
  3. Nella barra di ricerca, digita EC2 e selezionala.
  4. Nella dashboard di EC2, fai clic su Istanze.
  5. Fai clic su Avvia istanze.
  6. Fornisci i seguenti dettagli di configurazione:
    • Nome: inserisci EPM-Log-Collector.
    • AMI: seleziona Ubuntu Server 22.04 LTS.
    • Tipo di istanza: scegli t3.micro (o una versione successiva) e poi fai clic su Avanti
    • Rete: assicurati che l'impostazione Rete sia impostata sulla VPC predefinita.
    • Ruolo IAM: seleziona il ruolo IAM EC2-S3-EPM-Writer dal menu.
    • Assegnazione automatica IP pubblico: imposta questa opzione su Attiva. Se ti connetti tramite una VPN, puoi lasciare questa opzione disattivata.
    • Aggiungi spazio di archiviazione: lascia la configurazione dello spazio di archiviazione predefinita (8 GB) e fai clic su Avanti.
    • Seleziona Crea un nuovo gruppo di sicurezza.
    • Regola in entrata: fai clic su Aggiungi regola.
    • Tipo: seleziona SSH.
    • Porta: 22.
    • Sorgente: il tuo IP
    • Fai clic su Esamina e lancia.
    • Seleziona o crea una coppia di chiavi.
    • Fai clic su Scarica coppia di chiavi.
    • Salva il file PEM scaricato. Ti servirà questo file per connetterti all'istanza tramite SSH.
  7. Connettiti alla tua macchina virtuale (VM) tramite SSH:

    chmod 400 ~/Downloads/your-key.pem
    ssh -i ~/Downloads/your-key.pem ubuntu@<EC2_PUBLIC_IP>
    

Installa i prerequisiti del raccoglitore

  1. Aggiorna il 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 la directory e il file di stato:

    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. Inizializzalo (ad esempio 1 ora fa):

    echo "$(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ)" > /var/lib/epm-collector/last_run.txt
    

Esegui il deployment dello script del raccoglitore

  1. Crea la cartella del progetto:

    mkdir ~/epm-collector && cd ~/epm-collector
    
  2. Imposta le variabili di ambiente (ad esempio in ~/.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 collector.py e incolla quanto segue:

    #!/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. Rendi eseguibile lo script:

    chmod +x collector.py
    

Automatizza con Cron

  1. Apri crontab:

    crontab -e
    
  2. Aggiungi il job giornaliero:

    0 0 * * * cd ~/epm-collector && source ~/epm-venv/bin/activate && python collector.py >> ~/epm-collector/epm.log 2>&1
    

Configura un feed in Google SecOps per importare i log EPM di Cyberark

  1. Vai a Impostazioni SIEM > Feed.
  2. Fai clic su Aggiungi nuovo.
  3. Nel campo Nome feed, inserisci un nome per il feed (ad esempio Cyberark EPM Logs).
  4. Seleziona Amazon S3 come Tipo di origine.
  5. Seleziona Cyberark EPM come Tipo di log.
  6. Fai clic su Avanti.
  7. Specifica i valori per i seguenti parametri di input:

    • Regione: la regione in cui si trova il bucket Amazon S3.
    • URI S3: l'URI del bucket (il formato deve essere: s3://your-log-bucket-name/). Sostituisci quanto segue:
      • your-log-bucket-name: il nome del bucket.
    • L'URI è una: seleziona Directory o Directory che include sottodirectory.
    • Opzioni di eliminazione dell'origine: seleziona l'opzione di eliminazione in base alle tue preferenze.
    • ID chiave di accesso: la chiave di accesso utente con accesso al bucket S3.
    • Chiave di accesso segreta: la chiave segreta dell'utente con accesso al bucket S3.
    • Spazio dei nomi dell'asset: lo spazio dei nomi dell'asset.
    • Etichette di importazione: l'etichetta da applicare agli eventi di questo feed.
  8. Fai clic su Avanti.

  9. Rivedi la configurazione del nuovo feed nella schermata Concludi e poi fai clic su Invia.

Tabella di mappatura UDM

Campo log Mappatura UDM Logica
agentId principal.asset.asset_id Concatena "agentId:" con il valore del campo agentId.
computerName principal.hostname Mappa direttamente il campo computerName.
displayName metadata.description Mappa direttamente il campo displayName.
eventType metadata.product_event_type Mappa direttamente il campo eventType.
exposedUsers.[].accountName target.user.attribute.labels Crea un'etichetta con la chiave "accountName_[index]" e il valore da exposedUsers.[index].accountName.
exposedUsers.[].domain target.user.attribute.labels Crea un'etichetta con la chiave "domain_[index]" e il valore da exposedUsers.[index].domain.
exposedUsers.[].username target.user.attribute.labels Crea un'etichetta con la chiave "username_[index]" e il valore da exposedUsers.[index].username.
filePath target.file.full_path Mappa direttamente il campo filePath.
hash target.file.sha1 Mappa direttamente il campo dell'hash.
operatingSystemType principal.platform Mappa "Windows" a "WINDOWS" se il campo operatingSystemType è "Windows".
policyName security_result.rule_name Mappa direttamente il campo policyName.
processCommandLine target.process.command_line Mappa direttamente il campo processCommandLine.
publisher additional.fields Crea un campo con chiave "Editore" e string_value dal campo editore.
sourceProcessCommandLine target.process.parent_process.command_line Mappa direttamente il campo sourceProcessCommandLine.
sourceProcessHash target.process.parent_process.file.sha1 Mappa direttamente il campo sourceProcessHash.
sourceProcessSigner additional.fields Crea un campo con la chiave "sourceProcessSigner" e il valore stringa dal campo sourceProcessSigner.
threatProtectionAction security_result.action_details Mappa direttamente il campo threatProtectionAction.
metadata.event_timestamp Imposta il timestamp dell'evento su create_time della voce di log.
metadata.event_type Hardcoded to "STATUS_UPDATE".
metadata.log_type Hardcoded su "CYBERARK_EPM".
metadata.product_name Hardcoded su "EPM".
metadata.vendor_name Hardcoded su "CYBERARK".
security_result.alert_state Hardcoded su "ALERTING".
userName principal.user.userid Mappa direttamente il campo userName.

Modifiche

2023-08-22

  • Parser appena creato

Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.