Raccogli i log di CyberArk EPM
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
- Crea un utente seguendo questa guida dell'utente: Creare un utente IAM.
- Seleziona l'utente creato.
- Seleziona la scheda Credenziali di sicurezza.
- Fai clic su Crea chiave di accesso nella sezione Chiavi di accesso.
- Seleziona Servizio di terze parti come Caso d'uso.
- Fai clic su Avanti.
- (Facoltativo) Aggiungi un tag di descrizione.
- Fai clic su Crea chiave di accesso.
- Fai clic su Scarica file CSV per salvare la chiave di accesso e la chiave di accesso segreta per utilizzarle in un secondo momento.
- Fai clic su Fine.
- Seleziona la scheda Autorizzazioni.
- Fai clic su Aggiungi autorizzazioni nella sezione Norme relative alle autorizzazioni .
- Seleziona Aggiungi autorizzazioni.
- Seleziona Collega direttamente i criteri.
- Cerca e seleziona il criterio AmazonS3FullAccess.
- Fai clic su Avanti.
- Fai clic su Aggiungi autorizzazioni.
Configura CyberArk EPM per l'accesso API
- Accedi alla console web CyberArk EPM come amministratore.
- Vai ad Amministrazione > Gestione dell'account.
- Fai clic su + Aggiungi utente.
- Fornisci i seguenti dettagli:
- Nome utente: epm_api_user
- Password: un secret efficace
- Email/Nome e cognome: facoltativo
- In Autorizzazioni, concedi ViewOnlySetAdmin a ogni Set di log estratto.
- Fai clic su Salva.
- (Facoltativo) Estendi il timeout sessione:
- Vai ad Amministrazione > Configurazione account.
- Imposta Timeout per sessione inattiva su 60 minuti.
- Fai clic su Salva.
- Vai a Criteri e insiemi > seleziona il tuo insieme > Proprietà.
- Copia e salva l'ID set (un GUID). Lo utilizzerai nello script come EPM_SET_ID.
Crea un bucket AWS S3
- Accedi alla AWS Management Console.
- Vai a Console AWS > Servizi > S3 > Crea bucket.
- Fornisci i seguenti dettagli di configurazione:
- Nome bucket: my-cyberark-epm-logs
- Regione: la tua scelta > Crea
Crea un ruolo IAM per EC2
- Accedi alla AWS Management Console.
- Vai a Servizi.
- Nella barra di ricerca, digita
IAM
e selezionalo. - Nella dashboard IAM, fai clic su Ruoli.
- Fai clic su Crea ruolo.
- 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
- Accedi alla AWS Management Console.
- Vai a Servizi.
- Nella barra di ricerca, digita EC2 e selezionala.
- Nella dashboard di EC2, fai clic su Istanze.
- Fai clic su Avvia istanze.
- 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.
- Nome: inserisci
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
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
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
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
Crea la cartella del progetto:
mkdir ~/epm-collector && cd ~/epm-collector
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/"
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()
Rendi eseguibile lo script:
chmod +x collector.py
Automatizza con Cron
Apri crontab:
crontab -e
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
- Vai a Impostazioni SIEM > Feed.
- Fai clic su Aggiungi nuovo.
- Nel campo Nome feed, inserisci un nome per il feed (ad esempio
Cyberark EPM Logs
). - Seleziona Amazon S3 come Tipo di origine.
- Seleziona Cyberark EPM come Tipo di log.
- Fai clic su Avanti.
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.
Fai clic su Avanti.
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.