Slack-Audit-Logs erfassen

Unterstützt in:

In diesem Dokument wird beschrieben, wie Sie Slack-Audit-Logs mit Google Cloud Run-Funktionen in Google Security Operations aufnehmen. Der Parser verarbeitet zwei Formate von Slack-Audit-Logs. Zuerst werden boolesche Werte normalisiert und vordefinierte Felder gelöscht. Anschließend wird das Feld „message“ als JSON geparst. Nicht-JSON-Nachrichten werden verworfen. Je nach Vorhandensein bestimmter Felder (date_create und user_id) wendet der Parser unterschiedliche Logik an, um Rohlogfelder dem UDM zuzuordnen, einschließlich Metadaten, Prinzipal, Netzwerk, Ziel und Informationen zu, und erstellt ein Sicherheitsergebnis.

Hinweise

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

  • Eine Google SecOps-Instanz
  • Privilegierter Zugriff auf den Slack Enterprise Grid-Mandanten und die Admin-Konsole
  • Privilegierter Zugriff auf GCP Cloud Run Functions und Cloud Scheduler

Voraussetzungen für das Erfassen von Slack-Audit-Logs (App-ID, OAuth-Token, Organisations-ID)

  1. Melden Sie sich in der Slack-Admin-Konsole für Ihre Enterprise Grid-Organisation an.
  2. Rufen Sie https://api.slack.com/apps auf und klicken Sie auf Create New App > From scratch (Neue App erstellen > Von Grund auf).
  3. Geben Sie den App-Namen ein und wählen Sie Ihren Slack-Entwicklungsarbeitsbereich aus.
  4. Klicken Sie auf Anwendung erstellen.
  5. Rufen Sie in der linken Seitenleiste OAuth & Permissions (OAuth und Berechtigungen) auf.
  6. Rufen Sie den Abschnitt Bereiche auf und fügen Sie den folgenden Bereich für Nutzer-Token hinzu:
    • auditlogs:read
  7. Klicken Sie auf Im Workspace installieren> Zulassen.
  8. Nach der Installation gehen Sie zu Apps auf Organisationsebene> In Organisation installieren.
  9. Autorisieren Sie die App mit einem Organisationsinhaber-/Administratorkonto.
  10. Kopieren Sie das User OAuth Token, das mit xoxp- beginnt, und speichern Sie es sicher (dies ist Ihr SLACK_ADMIN_TOKEN).
  11. Kopieren Sie Ihre Organisations-ID. Sie finden sie in der Slack-Admin-Konsole unter Einstellungen & Berechtigungen > Organisationseinstellungen.

Verzeichnis einrichten

  1. Erstellen Sie auf Ihrem lokalen Computer ein neues Verzeichnis für die Bereitstellung der Cloud Run-Funktion.
  2. Laden Sie die folgenden Dateien aus dem GitHub-Repository für Chronicle-Aufnahmeskripts herunter:
    • Laden Sie aus dem Ordner slack Folgendes herunter:
      • .env.yml
      • main.py
      • requirements.txt
    • Laden Sie das gesamte Verzeichnis common mit allen Dateien aus dem Stammverzeichnis des Repositorys herunter:
      • common/__init__.py
      • common/auth.py
      • common/env_constants.py
      • common/ingest.py
      • common/status.py
      • common/utils.py
  3. Legen Sie alle heruntergeladenen Dateien in Ihrem Bereitstellungsverzeichnis ab.

Die Verzeichnisstruktur sollte so aussehen:

  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 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 für das Chronicle-Dienstkonto an:
    • Name: Geben Sie chronicle-service-account ein.
    • Secret-Wert: Fügen Sie den Inhalt Ihrer JSON-Datei für die Google SecOps-Aufnahmeauthentifizierung ein.
  4. Klicken Sie auf Secret erstellen.
  5. Kopieren Sie den Namen der Secret-Ressource im folgenden Format:

    projects/<PROJECT_ID>/secrets/chronicle-service-account/versions/latest
    
  6. Klicken Sie noch einmal auf Secret erstellen, um ein zweites Secret zu erstellen.

  7. Geben Sie die folgenden Konfigurationsdetails für das Slack-Token an:

    • Name: Geben Sie slack-admin-token ein.
    • Geheimer Schlüsselwert: Fügen Sie Ihr Slack-Nutzer-OAuth-Token (beginnend mit xoxp-) ein.
  8. Klicken Sie auf Secret erstellen.

  9. Kopieren Sie den Namen der Secret-Ressource im folgenden Format:

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

Erforderliche Laufzeit-Umgebungsvariablen festlegen

  1. Öffnen Sie die Datei .env.yml in Ihrem Bereitstellungsverzeichnis.
  2. Konfigurieren Sie die Umgebungsvariablen mit Ihren Werten:

    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"
    
    • Dabei gilt:
      • <your-chronicle-customer-id>: Ihre Google SecOps-Kunden-ID.
      • <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: Häufigkeitsintervall (in Minuten), in dem die Funktion ausgeführt wird. Diese Dauer muss mit dem Intervall des Cloud Scheduler-Jobs übereinstimmen.
  3. Speichern Sie die Datei .env.yml.

Cloud Run-Funktion bereitstellen

  1. Öffnen Sie in der Google Cloud Console ein Terminal oder eine Cloud Shell.
  2. Wechseln Sie zu Ihrem Bereitstellungsverzeichnis:

    cd /path/to/deployment_directory
    
  3. Führen Sie den folgenden Befehl aus, um die Cloud Run-Funktion bereitzustellen:

    gcloud functions deploy slack-audit-to-chronicle \
      --entry-point main \
      --trigger-http \
      --runtime python39 \
      --env-vars-file .env.yml \
      --timeout 300s \
      --memory 512MB \
      --service-account <SERVICE_ACCOUNT_EMAIL>
    
    • Ersetzen Sie <SERVICE_ACCOUNT_EMAIL> durch die E-Mail-Adresse des Dienstkontos, das von Ihrer Cloud Run-Funktion verwendet werden soll.
  4. Warten Sie, bis die Bereitstellung abgeschlossen ist.

  5. Notieren Sie sich nach der Bereitstellung die Funktions-URL aus der Ausgabe.

Cloud Scheduler einrichten

  1. Rufen Sie in der Google Cloud Console Cloud Scheduler > Job erstellen auf.
  2. Geben Sie die folgenden Konfigurationsdetails an:
    • Name: Geben Sie slack-audit-scheduler ein.
    • Region: Wählen Sie dieselbe Region aus, in der Sie die Cloud Run-Funktion bereitgestellt haben.
    • Häufigkeit: Geben Sie */5 * * * * ein (wird alle 5 Minuten ausgeführt, passend zum Wert POLL_INTERVAL).
    • Zeitzone: Wählen Sie UTC aus.
    • Zieltyp: Wählen Sie HTTP aus.
    • URL: Geben Sie die Cloud Run-Funktions-URL aus der Bereitstellungsausgabe ein.
    • HTTP-Methode: Wählen Sie POST aus.
    • Auth-Header: Wählen Sie OIDC-Token hinzufügen aus.
    • Dienstkonto: Wählen Sie dasselbe Dienstkonto aus, das für die Cloud Run-Funktion verwendet wird.
  3. Klicken Sie auf Erstellen.

UDM-Zuordnungstabelle

Logfeld UDM-Zuordnung Logik
action metadata.product_event_type Direkt aus dem Feld action im Rohlog zugeordnet.
actor.type principal.labels.value Direkt aus dem Feld actor.type zugeordnet, mit dem Schlüssel actor.type.
actor.user.email principal.user.email_addresses Direkt aus dem Feld actor.user.email zugeordnet.
actor.user.id principal.user.product_object_id Direkt aus dem Feld actor.user.id zugeordnet.
actor.user.id principal.user.userid Direkt aus dem Feld actor.user.id zugeordnet.
actor.user.name principal.user.user_display_name Direkt aus dem Feld actor.user.name zugeordnet.
actor.user.team principal.user.group_identifiers Direkt aus dem Feld actor.user.team zugeordnet.
context.ip_address principal.ip Direkt aus dem Feld context.ip_address zugeordnet.
context.location.domain about.resource.attribute.labels.value Direkt aus dem Feld context.location.domain zugeordnet, mit dem Schlüssel context.location.domain.
context.location.id about.resource.id Direkt aus dem Feld context.location.id zugeordnet.
context.location.name about.resource.name Direkt aus dem Feld context.location.name zugeordnet.
context.location.name about.resource.attribute.labels.value Direkt aus dem Feld context.location.name zugeordnet, mit dem Schlüssel context.location.name.
context.location.type about.resource.resource_subtype Direkt aus dem Feld context.location.type zugeordnet.
context.session_id network.session_id Direkt aus dem Feld context.session_id zugeordnet.
context.ua network.http.user_agent Direkt aus dem Feld context.ua zugeordnet.
context.ua network.http.parsed_user_agent Geprüfte User-Agent-Informationen, die aus dem Feld context.ua mit dem Filter parseduseragent abgeleitet wurden.
country principal.location.country_or_region Direkt aus dem Feld country zugeordnet.
date_create metadata.event_timestamp.seconds Der Epoch-Zeitstempel aus dem Feld date_create wird in ein Zeitstempelobjekt konvertiert.
details.inviter.email target.user.email_addresses Direkt aus dem Feld details.inviter.email zugeordnet.
details.inviter.id target.user.product_object_id Direkt aus dem Feld details.inviter.id zugeordnet.
details.inviter.name target.user.user_display_name Direkt aus dem Feld details.inviter.name zugeordnet.
details.inviter.team target.user.group_identifiers Direkt aus dem Feld details.inviter.team zugeordnet.
details.reason security_result.description Direkt aus dem Feld details.reason zugeordnet oder, falls es sich um ein Array handelt, durch Kommas verkettet.
details.type about.resource.attribute.labels.value Direkt aus dem Feld details.type zugeordnet, mit dem Schlüssel details.type.
details.type security_result.summary Direkt aus dem Feld details.type zugeordnet.
entity.app.id target.resource.id Direkt aus dem Feld entity.app.id zugeordnet.
entity.app.name target.resource.name Direkt aus dem Feld entity.app.name zugeordnet.
entity.channel.id target.resource.id Direkt aus dem Feld entity.channel.id zugeordnet.
entity.channel.name target.resource.name Direkt aus dem Feld entity.channel.name zugeordnet.
entity.channel.privacy target.resource.attribute.labels.value Direkt aus dem Feld entity.channel.privacy zugeordnet, mit dem Schlüssel entity.channel.privacy.
entity.file.filetype target.resource.attribute.labels.value Direkt aus dem Feld entity.file.filetype zugeordnet, mit dem Schlüssel entity.file.filetype.
entity.file.id target.resource.id Direkt aus dem Feld entity.file.id zugeordnet.
entity.file.name target.resource.name Direkt aus dem Feld entity.file.name zugeordnet.
entity.file.title target.resource.attribute.labels.value Direkt aus dem Feld entity.file.title zugeordnet, mit dem Schlüssel entity.file.title.
entity.huddle.date_end about.resource.attribute.labels.value Direkt aus dem Feld entity.huddle.date_end zugeordnet, mit dem Schlüssel entity.huddle.date_end.
entity.huddle.date_start about.resource.attribute.labels.value Direkt aus dem Feld entity.huddle.date_start zugeordnet, mit dem Schlüssel entity.huddle.date_start.
entity.huddle.id about.resource.attribute.labels.value Direkt aus dem Feld entity.huddle.id zugeordnet, mit dem Schlüssel entity.huddle.id.
entity.huddle.participants.0 about.resource.attribute.labels.value Direkt aus dem Feld entity.huddle.participants.0 zugeordnet, mit dem Schlüssel entity.huddle.participants.0.
entity.huddle.participants.1 about.resource.attribute.labels.value Direkt aus dem Feld entity.huddle.participants.1 zugeordnet, mit dem Schlüssel entity.huddle.participants.1.
entity.type target.resource.resource_subtype Direkt aus dem Feld entity.type zugeordnet.
entity.user.email target.user.email_addresses Direkt aus dem Feld entity.user.email zugeordnet.
entity.user.id target.user.product_object_id Direkt aus dem Feld entity.user.id zugeordnet.
entity.user.name target.user.user_display_name Direkt aus dem Feld entity.user.name zugeordnet.
entity.user.team target.user.group_identifiers Direkt aus dem Feld entity.user.team zugeordnet.
entity.workflow.id target.resource.id Direkt aus dem Feld entity.workflow.id zugeordnet.
entity.workflow.name target.resource.name Direkt aus dem Feld entity.workflow.name zugeordnet.
id metadata.product_log_id Direkt aus dem Feld id zugeordnet.
ip principal.ip Direkt aus dem Feld ip zugeordnet. Wird durch Logik basierend auf dem Feld action bestimmt. Der Standardwert ist USER_COMMUNICATION. Er ändert sich jedoch in andere Werte wie USER_CREATION, USER_LOGIN, USER_LOGOUT, USER_RESOURCE_ACCESS, USER_RESOURCE_UPDATE_PERMISSIONS oder USER_CHANGE_PERMISSIONS, je nach Wert von action. Fest codiert auf „SLACK_AUDIT“. Auf „Enterprise Grid“ festlegen, wenn date_create vorhanden ist, andernfalls auf „Audit-Logs“, wenn user_id vorhanden ist. Fest codiert auf „Slack“. Fest codiert auf „REMOTE“. Auf „SSO“ festgelegt, wenn action „user_login“ oder „user_logout“ enthält. Andernfalls auf „MACHINE“ setzen. In den bereitgestellten Beispielen nicht zugeordnet. Der Standardwert ist „ALLOW“, wird aber auf „BLOCK“ gesetzt, wenn action „user_login_failed“ ist. Auf „Slack“ setzen, wenn date_create vorhanden ist, andernfalls auf „SLACK“, wenn user_id vorhanden ist.
user_agent network.http.user_agent Direkt aus dem Feld user_agent zugeordnet.
user_id principal.user.product_object_id Direkt aus dem Feld user_id zugeordnet.
username principal.user.product_object_id Direkt aus dem Feld username zugeordnet.

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