Slack-Audit-Logs erfassen

Unterstützt in:

In diesem Dokument wird beschrieben, wie Sie Slack-Audit-Logs mit Google Cloud Run-Funktionen oder Amazon S3 mit AWS Lambda in Google Security Operations aufnehmen.

Slack-Audit-Logs enthalten detaillierte Informationen zu sicherheitsrelevanten Ereignissen in Ihrer Slack Enterprise Grid-Organisation. Mit der Audit Logs API können Sie Nutzeraktionen wie Log-ins, Dateidownloads, App-Installationen und administrative Änderungen zu Compliance- und Sicherheitsüberwachungszwecken überwachen.

Hinweis

Prüfen Sie, ob folgende Voraussetzungen erfüllt sind:

  • Eine Google SecOps-Instanz.
  • Ein Slack Enterprise Grid-Abo mit Zugriff als Organisationsinhaber.

  • Privilegierter Zugriff auf:

    • Google Cloud (für Option 1: Cloud Run Functions und Cloud Scheduler) oder
    • AWS (für Option 2: S3, IAM, Lambda, EventBridge).

Slack-Anmeldedaten erfassen

Slack-App erstellen

Für die Slack Audit Logs API ist ein User OAuth-Token mit dem Bereich auditlogs:read erforderlich. Dieses Token muss durch die Installation einer App auf Organisationsebene des Enterprise Grid und nicht auf Arbeitsbereichsebene abgerufen werden.

  1. Melden Sie sich als Inhaber Ihrer Enterprise Grid-Organisation in Slack an.
  2. Rufen Sie die Seite Slack API Apps auf.
  3. Klicken Sie auf Neue App erstellen.
  4. Wählen Sie From scratch (Von Grund auf) aus.
  5. Geben Sie die folgenden Konfigurationsdetails an:
    • App-Name: Geben Sie einen aussagekräftigen Namen ein, z. B. Google SecOps Audit Integration.
    • Workspace für die Entwicklung Ihrer App auswählen: Wählen Sie Ihren Slack-Workspace für die Entwicklung aus (beliebiger Workspace in der Organisation).
  6. Klicken Sie auf Anwendung erstellen.

OAuth-Bereiche konfigurieren

  1. Wählen Sie auf der Einstellungsseite Ihrer App im linken Navigationsbereich OAuth & Berechtigungen aus.
  2. Wechseln Sie zum Abschnitt Bereiche.
  3. Klicken Sie unter User Token Scopes (NICHT „Bot Token Scopes“) auf Add an OAuth Scope.
  4. Fügen Sie den folgenden Bereich hinzu:
    • auditlogs:read: Mit diesem Bereich kann auf die Audit Logs API für die Enterprise Grid-Organisation zugegriffen werden.
  5. Klicken Sie unter Bot Token Scopes (Bot-Token-Bereiche) auf Add an OAuth Scope (OAuth-Bereich hinzufügen).
  6. Fügen Sie den folgenden Bereich hinzu:
    • users:read: Vorhanden, damit die App auf Organisationsebene installiert werden kann.

App in der Enterprise-Organisation installieren

Die Audit Logs API liest Ereignisse für die gesamte Enterprise-Organisation. Die App muss daher auf Organisationsebene und nicht in einem einzelnen Arbeitsbereich installiert werden. Slack bietet zwei Möglichkeiten dafür. Beide Methoden führen zum selben OAuth-Token für Nutzer auf Organisationsebene. Verwenden Sie eine davon.

Option A: Über die App-Einstellungen installieren (App auf Organisationsebene)

Dies ist der Pfad von der Seite Developing apps for Enterprise orgs (Apps für Enterprise-Organisationen entwickeln) von Slack. Es ist keine Weiterleitungs-URL, keine öffentliche Verteilung und kein Webdienst erforderlich.

  1. Wählen Sie auf der Einstellungsseite Ihrer App im linken Navigationsbereich Apps auf Organisationsebene aus.
  2. Klicken Sie auf Aktivieren.
  3. Klicken Sie bei der Bestätigungsaufforderung auf Ja, Opt‑in.

  4. Melden Sie sich als Inhaber der Enterprise-Organisation an.

  5. Wählen Sie im linken Navigationsbereich OAuth & Berechtigungen aus.

  6. Klicken Sie auf Für Organisation installieren.

  7. Prüfen Sie die angeforderten Berechtigungen auf dem Bestätigungsbildschirm und klicken Sie auf Zulassen.

Option B: Öffentliche Verteilung und die freigabefähige URL

Dies ist der Pfad von der Seite Audit Logs API von Slack. Durch die Aktivierung der öffentlichen Verteilung wird die App nicht im Slack App Marketplace aufgeführt. Sie ermöglicht lediglich die Installation außerhalb des Entwickler-Arbeitsbereichs.

  1. Wählen Sie auf der Einstellungsseite Ihrer App im linken Navigationsbereich OAuth & Berechtigungen aus.
  2. Klicken Sie im Bereich Weiterleitungs-URLs auf Neue Weiterleitungs-URL hinzufügen, geben Sie eine URL ein, klicken Sie auf Hinzufügen und dann auf URLs speichern.

    aus.
  3. Wählen Sie im linken Navigationsbereich Verteilung verwalten aus.

  4. Prüfen Sie unter App für andere Arbeitsbereiche freigeben, ob in allen vier Checklistenabschnitten ein grünes Häkchen angezeigt wird. Wenn in einem Abschnitt ein rotes X angezeigt wird, maximieren Sie ihn und führen Sie die erforderliche Aktion aus.

  5. Wählen Sie das Kästchen Ich habe alle fest codierten Informationen überprüft und entfernt aus.

  6. Klicken Sie auf Öffentliche Bereitstellung aktivieren.

  7. Melden Sie sich als Inhaber der Unternehmensorganisation an.

  8. Kopieren Sie unter App für Ihren Arbeitsbereich freigeben die freigabefähige URL und öffnen Sie sie in Ihrem Browser.

  9. Öffnen Sie auf dem Installationsbildschirm das Drop-down-Menü oben rechts und wählen Sie die Unternehmensorganisation und nicht einen einzelnen Arbeitsbereich aus.

  10. Prüfen Sie die angeforderten Berechtigungen und klicken Sie auf Zulassen.

Anmeldedaten abrufen

  1. Nach Abschluss der Installation kehren Sie zur Seite OAuth und Berechtigungen zurück.
  2. Suchen Sie im Bereich OAuth-Tokens nach dem OAuth-Token für Nutzer.
  3. Das Token beginnt mit xoxp-.
  4. Klicken Sie auf Kopieren und speichern Sie dieses Token sicher.

    Wichtig: Dies ist Ihr SLACK_ADMIN_TOKEN für die Cloud Run-Funktion oder Lambda-Funktion. Bewahren Sie es sicher auf. Sie bietet Lesezugriff auf alle Audit-Logs in Ihrer Enterprise Grid-Organisation.

  5. Notieren Sie sich Ihre Organisations-ID:

    1. Öffnen Sie Slack in einem Webbrowser über die URL Ihrer Organisation (z. B. acmeinc.enterprise.slack.com).
    2. Lesen Sie die URL, nachdem die Seite geladen wurde. Das Format ist https://app.slack.com/client/EXXXXXXX/CXXXXXXX.
    3. Kopieren Sie den String, der mit E beginnt. Das ist Ihre Organisations-ID.

Berechtigungen prüfen

So prüfen Sie, ob Ihre App die erforderlichen Berechtigungen hat:

  1. Rufen Sie die Seite Slack API Apps auf.
  2. Wählen Sie Ihre App aus.
  3. Wählen Sie im linken Navigationsbereich OAuth & Berechtigungen aus.
  4. Prüfen Sie unter OAuth-Tokens, ob ein OAuth-Token für Nutzer angezeigt wird (beginnt mit xoxp-).
  5. Prüfen Sie unter Bereiche, ob auditlogs:read unter Bereiche für Nutzer-Token angezeigt wird.

API-Zugriff testen

  • Testen Sie Ihr Token, bevor Sie mit der Integration fortfahren:

    SLACK_TOKEN="xoxp-your-token-here"
    
    curl -H "Authorization: Bearer $SLACK_TOKEN" \
      "https://api.slack.com/audit/v1/logs?limit=1"
    

Eine erfolgreiche Antwort enthält ein entries-Array mit Audit-Log-Ereignissen. Wenn Sie einen invalid_auth- oder missing_scope-Fehler erhalten, überprüfen Sie Ihr Token und Ihre Bereiche.

Option 1: Slack-Audit-Logs-Export mit Google Cloud Run Functions konfigurieren

Bei dieser Option werden Google Cloud Run Functions und Cloud Scheduler verwendet, um Slack-Audit-Logs zu erfassen und mit den Google SecOps-Aufnahmeskripten direkt in Google SecOps aufzunehmen.

Vorbereitung (Option 1)

Prüfen Sie, ob die folgenden zusätzlichen Voraussetzungen erfüllt sind:

  • Ein Google Cloud -Projekt mit den folgenden aktivierten APIs:
    • Cloud Run Admin API
    • Eventarc API
    • Pub/Sub API
    • Cloud Scheduler API
    • Secret Manager API
  • Berechtigungen zum Erstellen von Cloud Run-Funktionen, Pub/Sub-Themen, Eventarc-Triggern, Cloud Scheduler-Jobs und Secrets in Secret Manager.
  • Eine JSON-Datei für ein Google SecOps-Dienstkonto.

Google SecOps-Dienstkonto abrufen

  1. Melden Sie sich in der Google SecOps-Konsole an.
  2. Rufen Sie die SIEM-Einstellungen > Collection Agent auf.
  3. Klicken Sie auf Herunterladen, um die Datei zur Authentifizierung der Aufnahme herunterzuladen.
  4. Speichern Sie die JSON-Datei sicher. Sie laden diese als Secret in Google Secret Manager hoch.

Funktionscode vorbereiten

Laden Sie die Bereitstellungsdateien aus dem GitHub-Repository für Google SecOps-Aufnahmeskripts herunter:

  1. Laden Sie aus dem Ordner slack Folgendes herunter:
    • .env.yml
    • main.py
    • requirements.txt
  2. Laden Sie das gesamte Verzeichnis common mit allen Dateien aus dem Stammverzeichnis des Repositorys herunter.

    Ihr Bereitstellungsverzeichnis sollte die folgende Struktur haben:

        ```
        deployment_directory/
        ├── common/
        │   ├── __init__.py
        │   ├── auth.py
        │   ├── env_constants.py
        │   ├── ingest.py
        │   ├── status.py
        │   └── utils.py
        ├── .env.yml
        ├── main.py
        └── requirements.txt
        ```
    

Secrets in Google Secret Manager konfigurieren

Speichern Sie vertrauliche Anmeldedaten in Secret Manager, damit die Cloud Run-Funktion sicher darauf zugreifen kann.

Secret für das Google SecOps-Dienstkonto erstellen

  1. Wechseln Sie in der Google Cloud -Konsole zu Sicherheit > Secret Manager.
  2. Klicken Sie auf Secret erstellen.
  3. Geben Sie die folgenden Konfigurationsdetails an:
    • Name: Geben Sie chronicle-service-account ein.
    • Geheimer Wert: Fügen Sie den gesamten Inhalt der JSON-Datei des Google SecOps-Dienstkontos ein.
  4. Klicken Sie auf Secret erstellen.
  5. Kopieren Sie den Ressourcennamen des Secrets. Das Format dafür ist:

    projects/PROJECT_ID/secrets/chronicle-service-account/versions/latest
    

Secret für das Slack-Token erstellen

  1. Klicken Sie auf der Seite Secret Manager auf Secret erstellen.
  2. Geben Sie die folgenden Konfigurationsdetails an:
    • Name: Geben Sie slack-admin-token ein.
    • Secret-Wert: Fügen Sie das Slack-Nutzer-OAuth-Token ein (beginnt mit xoxp-).
  3. Klicken Sie auf Secret erstellen.
  4. Kopieren Sie den Ressourcennamen des Secrets. Das Format dafür ist:

    projects/PROJECT_ID/secrets/slack-admin-token/versions/latest
    

Umgebungsvariablen konfigurieren

  1. Öffnen Sie die Datei .env.yml in Ihrem Bereitstellungsverzeichnis und konfigurieren Sie die Umgebungsvariablen:

    CHRONICLE_CUSTOMER_ID: "<your-chronicle-customer-id>"
    CHRONICLE_REGION: "us"
    CHRONICLE_SERVICE_ACCOUNT: "projects/<PROJECT_ID>/secrets/chronicle-service-account/versions/latest"
    CHRONICLE_NAMESPACE: ""
    POLL_INTERVAL: "5"
    SLACK_ADMIN_TOKEN: "projects/<PROJECT_ID>/secrets/slack-admin-token/versions/latest"
    
    • Ersetzen Sie Folgendes:

      • <your-chronicle-customer-id>: Ihre Google SecOps-Kundennummer.
      • <PROJECT_ID>: Ihre Google Cloud Projekt-ID
      • CHRONICLE_REGION: Auf Ihre Google SecOps-Region festgelegt. Gültige Werte: us, asia-northeast1, asia-south1, asia-southeast1, australia-southeast1, europe, europe-west2, europe-west3, europe-west6, europe-west9, europe-west12, me-central1, me-central2, me-west1, northamerica-northeast2, southamerica-east1.
      • POLL_INTERVAL: Das Häufigkeitsintervall (in Minuten), in dem die Funktion ausgeführt wird. Diese Dauer muss mit dem Intervall des Cloud Scheduler-Jobs übereinstimmen.
  2. Speichern Sie die Datei .env.yml.

Pub/Sub-Thema erstellen

Cloud Scheduler löst die Cloud Run-Funktion über ein Pub/Sub-Thema aus.

  1. Rufen Sie in der GCP Console Pub/Sub > Themen auf.
  2. Klicken Sie auf Thema erstellen.
  3. Geben Sie im Feld Themen-ID den Wert slack-audit-trigger ein.
  4. Klicken Sie auf Erstellen.

Cloud Run-Funktion bereitstellen

  1. Öffnen Sie ein Terminal oder Cloud Shell in der Google Cloud Console. Wechseln Sie zu Ihrem Bereitstellungsverzeichnis und führen Sie den folgenden Befehl aus:

    gcloud run deploy slack-audit-to-chronicle \
      --source . \
      --function main \
      --base-image google-22/python312 \
      --region <REGION> \
      --service-account <SERVICE_ACCOUNT_EMAIL> \
      --env-vars-file .env.yml \
      --memory 512Mi \
      --timeout 540 \
      --max-instances 1 \
      --no-allow-unauthenticated
    
    • Ersetzen Sie <REGION> durch die Region (z. B. us-central1) und <SERVICE_ACCOUNT_EMAIL> durch die E-Mail-Adresse des Dienstkontos, das Ihre Cloud Run-Funktion verwenden soll.
  2. Erstellen Sie den Pub/Sub-Trigger für die Funktion so:

    gcloud eventarc triggers create slack-audit-trigger \
      --location <REGION> \
      --destination-run-service slack-audit-to-chronicle \
      --destination-run-region <REGION> \
      --event-filters "type=google.cloud.pubsub.topic.v1.messagePublished" \
      --transport-topic projects/<PROJECT_ID>/topics/slack-audit-trigger \
      --service-account <SERVICE_ACCOUNT_EMAIL>
    
    • Ersetzen Sie dabei <PROJECT_ID> durch die ID Ihres Projekts in Google Cloud .
  3. Warten Sie, bis die Bereitstellung abgeschlossen ist.

Cloud Scheduler einrichten

  1. Rufen Sie in der GCP Console Cloud Scheduler > Job erstellen auf.
  2. Geben Sie die folgenden Konfigurationsdetails an:

    Einstellung Wert
    Name slack-audit-scheduler
    Region Wählen Sie dieselbe Region aus, in der Sie die Cloud Run-Funktion bereitgestellt haben.
    Frequenz */5 * * * * (alle 5 Minuten, entsprechend dem Wert POLL_INTERVAL)
    Zeitzone Zeitzone auswählen (UTC empfohlen)
  3. Klicken Sie auf Weiter.

  4. Im Abschnitt Ausführung konfigurieren:

    • Zieltyp: Wählen Sie Pub/Sub aus.
    • Thema: Wählen Sie slack-audit-trigger aus.
    • Inhalt der Nachricht: Geben Sie run ein.
  5. Klicken Sie auf Erstellen.

Optionen für die Häufigkeit des Zeitplans

Wählen Sie die Häufigkeit basierend auf dem Logvolumen und den Latenzanforderungen aus:

Häufigkeit Cron-Ausdruck Anwendungsfall
Alle 5 Minuten */5 * * * * Standard (empfohlen)
Alle 15 Minuten */15 * * * * Mittleres Suchvolumen
Stündlich 0 * * * * Geringe Lautstärke

Integration testen (Option 1)

  1. Suchen Sie in der Cloud Scheduler-Konsole nach Ihrem Job (slack-audit-scheduler).
  2. Klicken Sie auf Ausführung erzwingen, um den Job manuell auszulösen.
  3. Warten Sie einige Sekunden.
  4. Rufen Sie Cloud Run auf.
  5. Klicken Sie auf den Dienstnamen (slack-audit-to-chronicle).
  6. Klicken Sie auf den Tab Logs.
  7. Prüfen Sie, ob die Funktion erfolgreich ausgeführt wurde. Darauf sollten Sie achten:

    Retrieving the Slack Audit logs since: YYYY-MM-DDTHH:MM:SSZ
    Processing logs...
    Retrieved X audit logs from the API call
    Logs processed successfully.
    

Option 2: Export von Slack-Audit-Logs mit AWS S3 konfigurieren

Bei dieser Option werden AWS Lambda verwendet, um Slack-Audit-Logs zu erfassen und in Amazon S3 zu speichern. Anschließend wird ein Google SecOps-Feed konfiguriert, um die Logs aufzunehmen.

Vorbereitung (Option 2)

Prüfen Sie, ob die folgenden zusätzlichen Voraussetzungen erfüllt sind:

  • Ein AWS-Konto mit Berechtigungen zum Erstellen von S3-Buckets, IAM-Nutzern/Rollen/Richtlinien, Lambda-Funktionen und EventBridge-Regeln.

Amazon S3-Bucket erstellen

  1. Erstellen Sie einen Amazon S3-Bucket gemäß der Anleitung im Nutzerhandbuch zum Erstellen eines Buckets.
  2. Speichern Sie den Namen und die Region des Buckets für die spätere Verwendung (z. B. slack-audit-logs).

IAM-Richtlinie und ‑Rollen für S3-Uploads konfigurieren

  1. Rufen Sie in der AWS Console den Tab IAM > Richtlinien > Richtlinie erstellen > JSON auf.
  2. Kopieren Sie die folgende Richtlinie und fügen Sie sie ein. Ersetzen Sie slack-audit-logs, wenn Sie einen anderen Bucket-Namen verwendet haben:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "AllowPutObjects",
          "Effect": "Allow",
          "Action": "s3:PutObject",
          "Resource": "arn:aws:s3:::slack-audit-logs/*"
        },
        {
          "Sid": "AllowGetStateObject",
          "Effect": "Allow",
          "Action": "s3:GetObject",
          "Resource": "arn:aws:s3:::slack-audit-logs/slack-audit-state.json"
        }
      ]
    }
    
  3. Klicken Sie auf Weiter.

  4. Geben Sie den Richtliniennamen SlackAuditS3Policy ein.

  5. Klicken Sie auf Richtlinie erstellen.

  6. Klicken Sie auf IAM > Rollen > Rolle erstellen > AWS-Service > Lambda.

  7. Hängen Sie die neu erstellte Richtlinie SlackAuditS3Policy an.

  8. Geben Sie der Rolle den Namen SlackAuditToS3Role und klicken Sie auf Rolle erstellen.

Lambda-Funktion erstellen

  1. Rufen Sie in der AWS Console Lambda > Funktionen > Funktion erstellen auf.
  2. Klicken Sie auf Von Grund auf erstellen.
  3. Geben Sie die folgenden Konfigurationsdetails an:

    Einstellung Wert
    Name slack_audit_to_s3
    Laufzeit Python 3.13
    Architektur x86_64
    Ausführungsrolle SlackAuditToS3Role
  4. Klicken Sie auf Funktion erstellen.

  5. Nachdem die Funktion erstellt wurde, öffnen Sie den Tab Code, löschen Sie den Stub und fügen Sie den folgenden Code (slack_audit_to_s3.py) ein.

    #!/usr/bin/env python3
    # Lambda: Pull Slack Audit Logs (Enterprise Grid) to S3 (JSONL format)
    import os, json, time, urllib.parse
    from urllib.request import Request, urlopen
    from urllib.error import HTTPError, URLError
    import boto3
    
    BASE_URL = "https://api.slack.com/audit/v1/logs"
    TOKEN = os.environ["SLACK_AUDIT_TOKEN"]
    BUCKET = os.environ["S3_BUCKET"]
    PREFIX = os.environ.get("S3_PREFIX", "slack/audit/")
    STATE_KEY = os.environ.get("STATE_KEY", "slack-audit-state.json")
    LIMIT = int(os.environ.get("LIMIT", "200"))
    MAX_PAGES = int(os.environ.get("MAX_PAGES", "20"))
    LOOKBACK_SEC = int(os.environ.get("LOOKBACK_SECONDS", "3600"))
    HTTP_TIMEOUT = int(os.environ.get("HTTP_TIMEOUT", "60"))
    HTTP_RETRIES = int(os.environ.get("HTTP_RETRIES", "3"))
    RETRY_AFTER_DEFAULT = int(os.environ.get("RETRY_AFTER_DEFAULT", "2"))
    # Optional server-side filters (comma-separated 'action' values)
    ACTIONS = os.environ.get("ACTIONS", "").strip()
    
    s3 = boto3.client("s3")
    
    def _get_state() -> dict:
        try:
            obj = s3.get_object(Bucket=BUCKET, Key=STATE_KEY)
            st = json.loads(obj["Body"].read() or b"{}")
            return {"cursor": st.get("cursor")}
        except Exception:
            return {"cursor": None}
    
    def _put_state(state: dict) -> None:
        body = json.dumps(state, separators=(",", ":")).encode("utf-8")
        s3.put_object(
            Bucket=BUCKET, Key=STATE_KEY, Body=body, ContentType="application/json"
        )
    
    def _http_get(params: dict) -> dict:
        qs = urllib.parse.urlencode(params, doseq=True)
        url = f"{BASE_URL}?{qs}" if qs else BASE_URL
        req = Request(url, method="GET")
        req.add_header("Authorization", f"Bearer {TOKEN}")
        req.add_header("Accept", "application/json")
        attempt = 0
        while True:
            try:
                with urlopen(req, timeout=HTTP_TIMEOUT) as r:
                    return json.loads(r.read().decode("utf-8"))
            except HTTPError as e:
                # Respect Retry-After on 429/5xx
                if e.code in (429, 500, 502, 503, 504) and attempt < HTTP_RETRIES:
                    retry_after = 0
                    try:
                        retry_after = int(
                            e.headers.get("Retry-After", RETRY_AFTER_DEFAULT)
                        )
                    except Exception:
                        retry_after = RETRY_AFTER_DEFAULT
                    time.sleep(max(1, retry_after))
                    attempt += 1
                    continue
                raise
            except URLError:
                if attempt < HTTP_RETRIES:
                    time.sleep(RETRY_AFTER_DEFAULT)
                    attempt += 1
                    continue
                raise
    
    def _write_page(data: dict, page_idx: int) -> str:
        """Extract entries from Slack API response and write as JSONL."""
        entries = data.get("entries") or []
        if not entries:
            return None
        lines = [json.dumps(entry, separators=(",", ":")) for entry in entries]
        body = "\n".join(lines).encode("utf-8")
        ts = time.strftime("%Y/%m/%d/%H%M%S", time.gmtime())
        key = f"{PREFIX}{ts}-slack-audit-p{page_idx:05d}.json"
        s3.put_object(
            Bucket=BUCKET, Key=key, Body=body, ContentType="application/json"
        )
        return key
    
    def lambda_handler(event=None, context=None):
        state = _get_state()
        cursor = state.get("cursor")
        params = {"limit": LIMIT}
        if ACTIONS:
            params["action"] = [a.strip() for a in ACTIONS.split(",") if a.strip()]
        if cursor:
            params["cursor"] = cursor
        else:
            # First run (or reset): fetch a recent window by time
            params["oldest"] = int(time.time()) - LOOKBACK_SEC
        pages = 0
        total = 0
        last_cursor = None
        while pages < MAX_PAGES:
            data = _http_get(params)
            _write_page(data, pages)
            entries = data.get("entries") or []
            total += len(entries)
            # Cursor for next page
            meta = data.get("response_metadata") or {}
            next_cursor = meta.get("next_cursor") or data.get("next_cursor")
            if next_cursor:
                params = {"limit": LIMIT, "cursor": next_cursor}
                if ACTIONS:
                    params["action"] = [
                        a.strip() for a in ACTIONS.split(",") if a.strip()
                    ]
                last_cursor = next_cursor
                pages += 1
                continue
            break
        if last_cursor:
            _put_state({"cursor": last_cursor})
        return {
            "ok": True,
            "pages": pages + (1 if total or last_cursor else 0),
            "entries": total,
            "cursor": last_cursor,
        }
    
    if __name__ == "__main__":
        print(lambda_handler())
    

Lambda-Umgebungsvariablen konfigurieren

  1. Gehen Sie zu Konfiguration > Umgebungsvariablen > Bearbeiten > Umgebungsvariable hinzufügen.
  2. Geben Sie die folgenden Umgebungsvariablen ein und ersetzen Sie die Platzhalter durch Ihre Werte:

    Schlüssel Beispielwert
    SLACK_AUDIT_TOKEN xoxp-... (Nutzer-Token auf Organisationsebene mit auditlogs:read)
    S3_BUCKET slack-audit-logs
    S3_PREFIX slack/audit/
    STATE_KEY slack-audit-state.json
    LIMIT 200
    MAX_PAGES 20
    LOOKBACK_SECONDS 3600
    HTTP_TIMEOUT 60
    HTTP_RETRIES 3
    RETRY_AFTER_DEFAULT 2
    ACTIONS (optional, kommagetrennter Aktionsfilter)
  3. Klicken Sie auf Speichern.

  4. Wählen Sie den Tab Konfiguration aus. Klicken Sie im Bereich Allgemeine Konfiguration auf Bearbeiten.

  5. Ändern Sie Zeitüberschreitung in 5 minutes (300 Sekunden) und klicken Sie auf Speichern.

EventBridge-Zeitplan erstellen

  1. Gehen Sie zu Amazon EventBridge > Scheduler > Create schedule (Amazon EventBridge > Scheduler > Zeitplan erstellen).
  2. Geben Sie die folgenden Konfigurationsdetails an:
    • Name: Geben Sie slack-audit-1h ein.
    • Wiederkehrender Zeitplan: Wählen Sie Ratenbasierter Zeitplan aus.
    • Preisausdruck: Geben Sie 1 hours ein.
    • Flexibles Zeitfenster: Wählen Sie Aus aus.
  3. Klicken Sie auf Weiter.
  4. Ziel auswählen:
    • Ziel-API: Wählen Sie AWS Lambda Invoke aus.
    • Lambda-Funktion: Wählen Sie slack_audit_to_s3 aus.
  5. Klicken Sie auf Weiter.
  6. Klicken Sie auf Weiter (optionale Einstellungen überspringen).
  7. Prüfen Sie den Zeitplan und klicken Sie auf Zeitplan erstellen.

Optional: IAM-Nutzer mit Lesezugriff für Google SecOps erstellen

  1. Rufen Sie die AWS-Konsole > IAM > Nutzer > Nutzer erstellen auf.
  2. Geben Sie die folgenden Konfigurationsdetails an:
    • Nutzername: Geben Sie secops-reader ein.
    • Zugriffstyp: Wählen Sie Programmatischer Zugriff aus.
  3. Klicken Sie auf Weiter.
  4. Wählen Sie Richtlinien direkt anhängen aus.
  5. Klicken Sie auf Richtlinie erstellen. Fügen Sie auf dem Tab JSON Folgendes ein:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": ["s3:GetObject"],
          "Resource": "arn:aws:s3:::slack-audit-logs/*"
        },
        {
          "Effect": "Allow",
          "Action": ["s3:ListBucket"],
          "Resource": "arn:aws:s3:::slack-audit-logs"
        }
      ]
    }
    
  6. Klicken Sie auf Weiter.

  7. Geben Sie den Richtliniennamen secops-reader-policy ein.

  8. Klicken Sie auf Richtlinie erstellen.

  9. Kehren Sie zur Seite zur Nutzererstellung zurück, aktualisieren Sie die Richtlinienliste und wählen Sie secops-reader-policy aus.

  10. Klicken Sie auf Weiter.

  11. Klicken Sie auf Nutzer erstellen.

  12. Wählen Sie den erstellten Nutzer secops-reader aus.

  13. Gehen Sie zu Sicherheitsanmeldedaten > Zugriffsschlüssel > Zugriffsschlüssel erstellen.

  14. Wählen Sie Drittanbieterdienst aus.

  15. Klicken Sie auf Weiter.

  16. Klicken Sie auf Zugriffsschlüssel erstellen.

  17. Klicken Sie auf CSV-Datei herunterladen, um die Anmeldedaten zu speichern.

Feed in Google SecOps konfigurieren, um Slack-Audit-Logs aufzunehmen

  1. Rufen Sie die SIEM-Einstellungen > Feeds auf.
  2. Klicken Sie auf Neuen Feed hinzufügen.
  3. Klicken Sie auf Einzelnen Feed konfigurieren.
  4. Geben Sie im Feld Feedname einen Namen für den Feed ein, z. B. Slack Audit Logs.
  5. Wählen Sie Amazon S3 V2 als Quelltyp aus.
  6. Wählen Sie Slack Audit als Log type (Protokolltyp) aus.
  7. Klicken Sie auf Weiter.
  8. Geben Sie Werte für die folgenden Eingabeparameter an:

    • S3-URI: Geben Sie den S3-Bucket-URI mit dem Präfixpfad ein:

      ```
      s3://slack-audit-logs/slack/audit/
      ```
      
      Replace `slack-audit-logs` with your actual S3 bucket name.
      
    • Option zum Löschen der Quelle: Wählen Sie die gewünschte Option zum Löschen aus.

    • Maximales Dateialter: Dateien einschließen, die in den letzten Tagen geändert wurden. Der Standardwert ist 180 Tage.

    • Zugriffsschlüssel-ID: Nutzerzugriffsschlüssel mit Zugriff auf den S3-Bucket (vom secops-reader-IAM-Nutzer).

    • Geheimer Zugriffsschlüssel: Der geheime Schlüssel des Nutzers mit Zugriff auf den S3-Bucket (vom secops-reader-IAM-Nutzer).

    • Asset-Namespace: Der Asset-Namespace.

    • Aufnahmelabels: Das Label, das auf die Ereignisse aus diesem Feed angewendet werden soll.

  9. Klicken Sie auf Weiter.

  10. Prüfen Sie die neue Feedkonfiguration auf dem Bildschirm Abschließen und klicken Sie dann auf Senden.

UDM-Zuordnungstabelle

Logfeld UDM-Zuordnung Logik
action metadata.product_event_type Direkt aus dem Feld action zugeordnet
actor.type principal.labels Direkt mit dem Schlüssel actor.type zugeordnet
actor.user.email principal.user.email_addresses Direkt zugeordnet
actor.user.id principal.user.product_object_id Direkt zugeordnet
actor.user.id principal.user.userid Direkt zugeordnet
actor.user.name principal.user.user_display_name Direkt zugeordnet
actor.user.team principal.user.group_identifiers Direkt zugeordnet
context.ip_address principal.ip Direkt zugeordnet
context.location.domain about.resource.attribute.labels Direkt mit dem Schlüssel context.location.domain zugeordnet
context.location.id about.resource.id Direkt zugeordnet
context.location.name about.resource.name Direkt zugeordnet
context.location.name about.resource.attribute.labels Direkt mit dem Schlüssel context.location.name zugeordnet
context.location.type about.resource.resource_subtype Direkt zugeordnet
context.session_id network.session_id Direkt zugeordnet
context.ua network.http.user_agent Direkt zugeordnet
context.ua network.http.parsed_user_agent Geparster User-Agent, der aus dem Feld context.ua abgeleitet wurde
country principal.location.country_or_region Direkt zugeordnet
date_create metadata.event_timestamp.seconds In Zeitstempelobjekt konvertierter Epoch-Zeitstempel
details.inviter.email target.user.email_addresses Direkt zugeordnet
details.inviter.id target.user.product_object_id Direkt zugeordnet
details.inviter.name target.user.user_display_name Direkt zugeordnet
details.inviter.team target.user.group_identifiers Direkt zugeordnet
details.reason security_result.description Direkt zugeordnet; bei einem Array durch Kommas getrennt
details.type about.resource.attribute.labels Direkt mit dem Schlüssel details.type zugeordnet
details.type security_result.summary Direkt zugeordnet
entity.app.id target.resource.id Direkt zugeordnet
entity.app.name target.resource.name Direkt zugeordnet
entity.channel.id target.resource.id Direkt zugeordnet
entity.channel.name target.resource.name Direkt zugeordnet
entity.channel.privacy target.resource.attribute.labels Direkt mit dem Schlüssel entity.channel.privacy zugeordnet
entity.file.filetype target.resource.attribute.labels Direkt mit dem Schlüssel entity.file.filetype zugeordnet
entity.file.id target.resource.id Direkt zugeordnet
entity.file.name target.resource.name Direkt zugeordnet
entity.file.title target.resource.attribute.labels Direkt mit dem Schlüssel entity.file.title zugeordnet
entity.huddle.date_end about.resource.attribute.labels Direkt mit dem Schlüssel entity.huddle.date_end zugeordnet
entity.huddle.date_start about.resource.attribute.labels Direkt mit dem Schlüssel entity.huddle.date_start zugeordnet
entity.huddle.id about.resource.attribute.labels Direkt mit dem Schlüssel entity.huddle.id zugeordnet
entity.huddle.participants.0 about.resource.attribute.labels Direkt mit dem Schlüssel entity.huddle.participants.0 zugeordnet
entity.huddle.participants.1 about.resource.attribute.labels Direkt mit dem Schlüssel entity.huddle.participants.1 zugeordnet
entity.type target.resource.resource_subtype Direkt zugeordnet
entity.user.email target.user.email_addresses Direkt zugeordnet
entity.user.id target.user.product_object_id Direkt zugeordnet
entity.user.name target.user.user_display_name Direkt zugeordnet
entity.user.team target.user.group_identifiers Direkt zugeordnet
entity.workflow.id target.resource.id Direkt zugeordnet
entity.workflow.name target.resource.name Direkt zugeordnet
id metadata.product_log_id Direkt zugeordnet
ip principal.ip Direkt zugeordnet
user_agent network.http.user_agent Direkt zugeordnet
user_id principal.user.product_object_id Direkt zugeordnet
username principal.user.product_object_id Direkt zugeordnet
metadata.event_type Standardmäßig USER_COMMUNICATION; auf USER_CREATION festlegen, wenn die Aktion user_created ist, USER_LOGIN, wenn die Aktion user_login oder user_login_failed ist, USER_LOGOUT, wenn die Aktion user_logout ist, USER_RESOURCE_ACCESS, wenn die Aktion mit file_ übereinstimmt, USER_RESOURCE_UPDATE_PERMISSIONS, wenn die Aktion mit app_, private_, public_ oder auth_policy_ übereinstimmt, USER_CHANGE_PERMISSIONS, wenn die Aktion mit pref, legal_hold_, workflow_, channel_, user_deactivated, user_reactivated, role_change_ oder user_channel_ übereinstimmt
metadata.log_type Fest codiert auf SLACK_AUDIT
metadata.product_name Wird auf Enterprise Grid gesetzt, wenn date_create vorhanden ist, andernfalls auf Audit Logs, wenn user_id vorhanden ist.
metadata.vendor_name Fest codiert auf Slack
extensions.auth.mechanism Fest codiert auf REMOTE
extensions.auth.type Wird auf SSO gesetzt, wenn die Aktion user_login oder user_logout enthält, andernfalls auf MACHINE.
security_result.action Der Standardwert ist ALLOW. Wenn die Aktion user_login_failed ist, wird der Wert auf BLOCK festgelegt.
target.application Wird auf Slack gesetzt, wenn date_create vorhanden ist, andernfalls auf SLACK, wenn user_id vorhanden ist.

Änderungsprotokoll

Änderungsprotokoll für diesen Parser ansehen

Benötigen Sie weitere Hilfe? Antworten von Community-Mitgliedern und Google SecOps-Experten erhalten