CyberArk EPM-Logs erfassen

Unterstützt in:

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

  1. Erstellen Sie einen Nutzer gemäß dieser Anleitung: IAM-Nutzer erstellen.
  2. Wählen Sie den erstellten Nutzer aus.
  3. Wählen Sie den Tab Sicherheitsanmeldedaten aus.
  4. Klicken Sie im Abschnitt Zugriffsschlüssel auf Zugriffsschlüssel erstellen.
  5. Wählen Sie als Anwendungsfall Drittanbieterdienst aus.
  6. Klicken Sie auf Weiter.
  7. Optional: Fügen Sie ein Beschreibungstag hinzu.
  8. Klicken Sie auf Zugriffsschlüssel erstellen.
  9. 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.
  10. Klicken Sie auf Fertig.
  11. Wählen Sie den Tab Berechtigungen aus.
  12. Klicken Sie im Bereich Berechtigungsrichtlinien auf Berechtigungen hinzufügen .
  13. Wählen Sie Berechtigungen hinzufügen aus.
  14. Wählen Sie Richtlinien direkt anhängen aus.
  15. Suchen Sie nach der Richtlinie AmazonS3FullAccess und wählen Sie sie aus.
  16. Klicken Sie auf Weiter.
  17. Klicken Sie auf Berechtigungen hinzufügen.

CyberArk EPM für den API-Zugriff konfigurieren

  1. Melden Sie sich als Administrator in der CyberArk EPM-Webkonsole an.
  2. Klicken Sie auf Verwaltung > Kontoverwaltung.
  3. Klicken Sie auf + Nutzer hinzufügen.
  4. Geben Sie die folgenden Informationen ein:
    • Nutzername: epm_api_user
    • Passwort: starkes Secret
    • E-Mail-Adresse/Vor- und Nachname: optional
  5. Gewähren Sie unter Berechtigungen für jeden abgerufenen Satz von Logs die Berechtigung ViewOnlySetAdmin.
  6. Klicken Sie auf Speichern.
  7. 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.
  8. Gehen Sie zu Richtlinie und Sets > wählen Sie Ihr Set aus > „Eigenschaften“.
  9. Kopieren und speichern Sie die Set-ID (eine GUID). Sie verwenden sie im Skript als EPM_SET_ID.

AWS S3-Bucket erstellen

  1. Melden Sie sich bei der AWS Management Console an.
  2. Rufen Sie die AWS-Konsole > Dienste > S3 > Bucket erstellen auf.
  3. Geben Sie die folgenden Konfigurationsdetails an:
    • Bucket-Name: my-cyberark-epm-logs
    • Region: Ihre Auswahl > Erstellen

IAM-Rolle für EC2 erstellen

  1. Melden Sie sich bei der AWS Management Console an.
  2. Rufen Sie Dienste auf.
  3. Geben Sie in die Suchleiste IAM ein und wählen Sie die Option aus.
  4. Klicken Sie im IAM-Dashboard auf Rollen.
  5. Klicken Sie auf Rolle erstellen.
  6. 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

  1. Melden Sie sich in der AWS Management Console an.
  2. Rufen Sie Dienste auf.
  3. Geben Sie in der Suchleiste „EC2“ ein und wählen Sie das Ergebnis aus.
  4. Klicken Sie im EC2-Dashboard auf Instances (Instanzen).
  5. Klicken Sie auf Instanzen starten.
  6. 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.
  7. 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

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

  1. Projektordner erstellen:

    mkdir ~/epm-collector && cd ~/epm-collector
    
  2. 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/"
    
  3. 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()
    
  4. Machen Sie das Skript ausführbar:

    chmod +x collector.py
    

Mit Cron automatisieren

  1. Öffnen Sie crontab:

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

  1. Rufen Sie die SIEM-Einstellungen> Feeds auf.
  2. Klicken Sie auf Neu hinzufügen.
  3. Geben Sie im Feld Feed name einen Namen für den Feed ein, z. B. Cyberark EPM Logs.
  4. Wählen Sie Amazon S3 als Quelltyp aus.
  5. Wählen Sie Cyberark EPM als Logtyp aus.
  6. Klicken Sie auf Weiter.
  7. 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.
  8. Klicken Sie auf Weiter.

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