CyberArk EPM-Logs erfassen
In diesem Dokument wird beschrieben, wie Sie CyberArk EPM-Logs mit AWS S3 in Google Security Operations aufnehmen. Der Parser transformiert CyberArk EPM-Logdaten in ein einheitliches Datenmodell (Unified Data Model, UDM). Es durchläuft jedes Ereignis im Log, ordnet relevante Felder den entsprechenden UDM-Feldern zu, verarbeitet bestimmte Datenstrukturen wie exposedUsers
und ergänzt die Ausgabe mit statischen Anbieter- und Produktinformationen.
Hinweise
- Prüfen Sie, ob Sie eine Google Security Operations-Instanz haben.
- Prüfen Sie, ob Sie privilegierten Zugriff auf AWS haben.
- Sie benötigen privilegierten Zugriff auf die EPM Server Management Console.
AWS IAM für die Google SecOps-Aufnahme konfigurieren
- Erstellen Sie einen Nutzer gemäß dieser Anleitung: IAM-Nutzer erstellen.
- Wählen Sie den erstellten Nutzer aus.
- Wählen Sie den Tab Sicherheitsanmeldedaten aus.
- Klicken Sie im Abschnitt Zugriffsschlüssel auf Zugriffsschlüssel erstellen.
- Wählen Sie als Anwendungsfall Drittanbieterdienst aus.
- Klicken Sie auf Weiter.
- Optional: Fügen Sie ein Beschreibungstag hinzu.
- Klicken Sie auf Zugriffsschlüssel erstellen.
- Klicken Sie auf CSV-Datei herunterladen, um den Access Key (Zugriffsschlüssel) und den Secret Access Key (geheimer Zugriffsschlüssel) zur späteren Verwendung zu speichern.
- Klicken Sie auf Fertig.
- Wählen Sie den Tab Berechtigungen aus.
- Klicken Sie im Bereich Berechtigungsrichtlinien auf Berechtigungen hinzufügen .
- Wählen Sie Berechtigungen hinzufügen aus.
- Wählen Sie Richtlinien direkt anhängen aus.
- Suchen Sie nach der Richtlinie AmazonS3FullAccess und wählen Sie sie aus.
- Klicken Sie auf Weiter.
- Klicken Sie auf Berechtigungen hinzufügen.
CyberArk EPM für den API-Zugriff konfigurieren
- Melden Sie sich als Administrator in der CyberArk EPM-Webkonsole an.
- Klicken Sie auf Verwaltung > Kontoverwaltung.
- Klicken Sie auf + Nutzer hinzufügen.
- Geben Sie die folgenden Informationen ein:
- Nutzername: epm_api_user
- Passwort: starkes Secret
- E-Mail-Adresse/Vor- und Nachname: optional
- Gewähren Sie unter Berechtigungen für jeden abgerufenen Satz von Logs die Berechtigung ViewOnlySetAdmin.
- Klicken Sie auf Speichern.
- Optional: Zeitüberschreitung für Sitzungen verlängern:
- Klicken Sie auf Verwaltung > Kontokonfiguration.
- Legen Sie Zeitlimit für inaktive Sitzung auf 60 Minuten fest.
- Klicken Sie auf Speichern.
- Gehen Sie zu Richtlinie und Sets > wählen Sie Ihr Set aus > „Eigenschaften“.
- Kopieren und speichern Sie die Set-ID (eine GUID). Sie verwenden sie im Skript als EPM_SET_ID.
AWS S3-Bucket erstellen
- Melden Sie sich bei der AWS Management Console an.
- Rufen Sie die AWS-Konsole > Dienste > S3 > Bucket erstellen auf.
- Geben Sie die folgenden Konfigurationsdetails an:
- Bucket-Name: my-cyberark-epm-logs
- Region: Ihre Auswahl > Erstellen
IAM-Rolle für EC2 erstellen
- Melden Sie sich bei der AWS Management Console an.
- Rufen Sie Dienste auf.
- Geben Sie in die Suchleiste
IAM
ein und wählen Sie die Option aus. - Klicken Sie im IAM-Dashboard auf Rollen.
- Klicken Sie auf Rolle erstellen.
- Geben Sie die folgenden Konfigurationsdetails an:
- Vertrauenswürdige Identität: AWS-Dienst > EC2 > Weiter.
- Berechtigung anhängen: AmazonS3FullAccess (oder eine Richtlinie mit eingeschränktem Umfang für Ihren Bucket) > Weiter.
- Rollenname: EC2-S3-EPM-Writer > Rolle erstellen.
Optional: EC2 Collector-VM starten und konfigurieren
- Melden Sie sich in der AWS Management Console an.
- Rufen Sie Dienste auf.
- Geben Sie in der Suchleiste „EC2“ ein und wählen Sie das Ergebnis aus.
- Klicken Sie im EC2-Dashboard auf Instances (Instanzen).
- Klicken Sie auf Instanzen starten.
- Geben Sie die folgenden Konfigurationsdetails an:
- Name: Geben Sie
EPM-Log-Collector
ein. - AMI: Wählen Sie
Ubuntu Server 22.04 LTS
aus. - Instanztyp: Wählen Sie t3.micro (oder größer) aus und klicken Sie dann auf Weiter.
- Netzwerk: Achten Sie darauf, dass die Netzwerkeinstellung auf Ihr Standard-VPC-Netzwerk festgelegt ist.
- IAM-Rolle: Wählen Sie im Menü die IAM-Rolle EC2-S3-EPM-Writer aus.
- Öffentliche IP-Adresse automatisch zuweisen: Stellen Sie diese Option auf Aktivieren ein. Wenn Sie eine Verbindung über ein VPN herstellen, können Sie diese Option deaktiviert lassen.
- Speicher hinzufügen: Behalten Sie die Standardspeicherkonfiguration (8 GiB) bei und klicken Sie auf Weiter.
- Wählen Sie Neue Sicherheitsgruppe erstellen aus.
- Regel für eingehenden Traffic: Klicken Sie auf Regel hinzufügen.
- Typ: Wählen Sie „SSH“ aus.
- Port: 22
- Quelle: Ihre IP-Adresse
- Klicken Sie auf Überprüfen und starten.
- Wählen Sie ein Schlüsselpaar aus oder erstellen Sie eines.
- Klicken Sie auf Schlüsselpaar herunterladen.
- Speichern Sie die heruntergeladene PEM-Datei. Sie benötigen diese Datei, um über SSH eine Verbindung zu Ihrer Instanz herzustellen.
- Name: Geben Sie
Stellen Sie über SSH eine Verbindung zu Ihrer VM her:
chmod 400 ~/Downloads/your-key.pem ssh -i ~/Downloads/your-key.pem ubuntu@<EC2_PUBLIC_IP>
Collector-Voraussetzungen installieren
Aktualisieren Sie das Betriebssystem:
# 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
Verzeichnis und Statusdatei erstellen:
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
Initialisieren Sie sie (z. B. auf vor einer Stunde):
echo "$(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ)" > /var/lib/epm-collector/last_run.txt
Collector-Script bereitstellen
Projektordner erstellen:
mkdir ~/epm-collector && cd ~/epm-collector
Legen Sie Umgebungsvariablen fest (z. B. 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/"
Erstellen Sie die Datei „collector.py“ und fügen Sie Folgendes ein:
#!/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()
Machen Sie das Skript ausführbar:
chmod +x collector.py
Mit Cron automatisieren
Öffnen Sie crontab:
crontab -e
Tagesjob hinzufügen:
0 0 * * * cd ~/epm-collector && source ~/epm-venv/bin/activate && python collector.py >> ~/epm-collector/epm.log 2>&1
Feed in Google SecOps konfigurieren, um Cyberark EPM-Logs aufzunehmen
- Rufen Sie die SIEM-Einstellungen> Feeds auf.
- Klicken Sie auf Neu hinzufügen.
- Geben Sie im Feld Feed name einen Namen für den Feed ein, z. B.
Cyberark EPM Logs
. - Wählen Sie Amazon S3 als Quelltyp aus.
- Wählen Sie Cyberark EPM als Logtyp aus.
- Klicken Sie auf Weiter.
Geben Sie Werte für die folgenden Eingabeparameter an:
- Region: Die Region, in der sich der Amazon S3-Bucket befindet.
- S3-URI: Der Bucket-URI (das Format sollte
s3://your-log-bucket-name/
sein). Ersetzen Sie Folgendes:your-log-bucket-name
: der Name des Buckets.
- URI ist ein: Wählen Sie Verzeichnis oder Verzeichnis mit Unterverzeichnissen aus.
- Optionen zum Löschen von Quellen: Wählen Sie die gewünschte Option aus.
- Zugriffsschlüssel-ID: Der Nutzerzugriffsschlüssel mit Zugriff auf den S3-Bucket.
- Secret Access Key (Geheimer Zugriffsschlüssel): Der geheime Schlüssel des Nutzers mit Zugriff auf den S3-Bucket.
- Asset-Namespace: der Asset-Namespace.
- Aufnahmelabels: Das Label, das auf die Ereignisse aus diesem Feed angewendet werden soll.
Klicken Sie auf Weiter.
Prüfen Sie die neue Feedkonfiguration auf dem Bildschirm Abschließen und klicken Sie dann auf Senden.
UDM-Zuordnungstabelle
Logfeld | UDM-Zuordnung | Logik |
---|---|---|
agentId | principal.asset.asset_id | Verkettet „agentId:“ mit dem Wert des Felds „agentId“. |
computerName | principal.hostname | Das Feld „computerName“ wird direkt zugeordnet. |
displayName | metadata.description | Wird direkt dem Feld „displayName“ zugeordnet. |
eventType | metadata.product_event_type | Wird direkt dem Feld „eventType“ zugeordnet. |
exposedUsers.[].accountName | target.user.attribute.labels | Erstellt ein Label mit dem Schlüssel „accountName_[index]“ und dem Wert aus „exposedUsers.[index].accountName“. |
exposedUsers.[].domain | target.user.attribute.labels | Erstellt ein Label mit dem Schlüssel „domain_[index]“ und dem Wert aus „exposedUsers.[index].domain“. |
exposedUsers.[].username | target.user.attribute.labels | Erstellt ein Label mit dem Schlüssel „username_[index]“ und dem Wert aus exposedUsers.[index].username. |
filePath | target.file.full_path | Ordnet das Feld „filePath“ direkt zu. |
Hash | target.file.sha1 | Ordnet das Hash-Feld direkt zu. |
operatingSystemType | principal.platform | Ordnet „Windows“ „WINDOWS“ zu, wenn das Feld „operatingSystemType“ „Windows“ enthält. |
policyName | security_result.rule_name | Wird direkt dem Feld „policyName“ zugeordnet. |
processCommandLine | target.process.command_line | Wird direkt dem Feld „processCommandLine“ zugeordnet. |
Publisher | additional.fields | Erstellt ein Feld mit dem Schlüssel „Publisher“ und dem string_value aus dem Feld „Publisher“. |
sourceProcessCommandLine | target.process.parent_process.command_line | Wird direkt dem Feld „sourceProcessCommandLine“ zugeordnet. |
sourceProcessHash | target.process.parent_process.file.sha1 | Ordnet das Feld „sourceProcessHash“ direkt zu. |
sourceProcessSigner | additional.fields | Erstellt ein Feld mit dem Schlüssel „sourceProcessSigner“ und dem string_value-Wert aus dem Feld „sourceProcessSigner“. |
threatProtectionAction | security_result.action_details | Wird direkt dem Feld „threatProtectionAction“ zugeordnet. |
metadata.event_timestamp | Legt den Ereigniszeitstempel auf „create_time“ des Logeintrags fest. | |
metadata.event_type | Fest codiert auf „STATUS_UPDATE“. | |
metadata.log_type | Fest codiert auf „CYBERARK_EPM“. | |
metadata.product_name | Fest codiert auf „EPM“. | |
metadata.vendor_name | Fest codiert auf „CYBERARK“. | |
security_result.alert_state | Fest codiert auf „ALERTING“. | |
userName | principal.user.userid | Ordnet das Feld „userName“ direkt zu. |
Benötigen Sie weitere Hilfe? Antworten von Community-Mitgliedern und Google SecOps-Experten erhalten