Okta Advanced Server Access-Logs erfassen

Unterstützt in:

In diesem Dokument wird beschrieben, wie Sie Okta Advanced Server Access-Logs mit Google Cloud Storage V2 in Google Security Operations aufnehmen.

Okta Advanced Server Access (früher ScaleFT) ist eine Lösung für die Verwaltung des privilegierten Zugriffs, die SSH- und RDP-Zugriff auf Server mit kurzlebigen Zertifikaten und umfassender Audit-Protokollierung bietet. Die Plattform behält Audit-Log-Ereignisse 90 Tage lang bei und bietet eine API zum Abrufen dieser Ereignisse für die langfristige Speicherung und Analyse auf SIEM-Plattformen.

Hinweis

Folgende Voraussetzungen müssen erfüllt sein:

  • Eine Google SecOps-Instanz
  • Ein GCP-Projekt mit aktivierten Cloud Storage, Cloud Run, Pub/Sub und Cloud Scheduler APIs
  • Berechtigungen zum Erstellen und Verwalten von GCS-Buckets
  • Berechtigungen zum Verwalten von IAM-Richtlinien für GCS-Buckets
  • Berechtigungen zum Erstellen von Cloud Run-Diensten, Pub/Sub-Themen und Cloud Scheduler-Jobs
  • Administratorzugriff auf Ihr Okta Advanced Server Access-Team
  • Dienstkonten und API-Schlüssel in Advanced Server Access erstellen

Okta Advanced Server Access-API-Zugriff konfigurieren

Damit Google SecOps Audit-Ereignisse abrufen kann, müssen Sie einen Dienstnutzer erstellen und einen API-Schlüssel generieren. Dienstnutzer sind spezielle Konten, die für die Automatisierung und API-Integrationen entwickelt wurden.

Dienstnutzer erstellen

  1. Melden Sie sich im Dashboard für den erweiterten Serverzugriff an.
  2. Gehen Sie zu Nutzer.
  3. Wählen Sie den Tab Dienstnutzer aus.
  4. Klicken Sie auf Create Service User (Dienstnutzer erstellen).
  5. Geben Sie im Feld Nutzername einen beschreibenden Namen für den Dienstnutzer ein, z. B. chronicle-integration.

  6. Klicken Sie auf Create Service User (Dienstnutzer erstellen).

API-Schlüssel generieren

  1. Klicken Sie auf der Seite mit den Details zum Dienstnutzer auf API-Schlüssel erstellen.
  2. Kopieren und speichern Sie die folgenden Anmeldedaten sofort:

    • API-Schlüssel-ID: Eine UUID, die den API-Schlüssel identifiziert (z. B. 6052868b-1b04-4a14-8288-e6496d7f2f4b)
    • API-Schlüssel-Secret: Ein base64-codierter Secret-String, der zur Authentifizierung von API-Anfragen verwendet wird.
  3. Klicken Sie auf Fertig.

Weisen Sie den Dienstnutzer einer Gruppe mit den entsprechenden Berechtigungen zu.

Dienstnutzer müssen Mitglieder einer Gruppe mit entsprechenden teamweiten Rollen sein, um auf die Audits API zugreifen zu können.

  1. Rufen Sie im Advanced Server Access-Dashboard Groups (Gruppen) auf.
  2. Wählen Sie eine vorhandene Gruppe aus oder erstellen Sie eine neue Gruppe für den API-Zugriff.
  3. Klicken Sie auf den Gruppennamen, um die Gruppendetails aufzurufen.
  4. Klicken Sie auf den Tab Nutzer.
  5. Klicken Sie auf Add User (Nutzer hinzufügen).
  6. Suchen Sie nach dem Dienstnutzer (z. B. chronicle-integration) und wählen Sie ihn aus.
  7. Klicken Sie auf Hinzufügen.
  8. Wählen Sie den Tab Rollen aus.
  9. Die Gruppe muss eine der folgenden teamweiten Rollen haben:

    • reporting_user: Lesezugriff auf alle Endpunkte (empfohlen für die Protokollaufnahme)
    • access_admin: Vollständiger Administratorzugriff (gewährt alle CRUD-Berechtigungen)
  10. Wenn die erforderliche Rolle nicht zugewiesen ist, klicken Sie auf Rolle hinzufügen, wählen Sie reporting_user oder access_admin aus und klicken Sie auf Speichern.

Berechtigungen prüfen

So prüfen Sie, ob der Dienstnutzer die erforderlichen Berechtigungen hat:

  1. Rufen Sie im Advanced Server Access-Dashboard Groups (Gruppen) auf.
  2. Klicken Sie auf die Gruppe, die den Dienstnutzer enthält (z. B. chronicle-integration).
  3. Wählen Sie den Tab Rollen aus.
  4. Prüfen Sie, ob die Rolle reporting_user oder access_admin aufgeführt ist.
  5. Wenn Sie den Tab „Rollen“ nicht sehen, wenden Sie sich an Ihren Administrator, um entsprechenden Zugriff zu erhalten.

API-Zugriff testen

  • Testen Sie Ihre Anmeldedaten, bevor Sie mit der Integration fortfahren:

    # Replace with your actual credentials
    TEAM_NAME="your-team-name"
    KEY_ID="your-api-key-id"
    KEY_SECRET="your-api-key-secret"
    
    # Obtain bearer token
    TOKEN=$(curl -s -X POST "https://app.scaleft.com/v1/teams/${TEAM_NAME}/service_token" \
        -H "Content-Type: application/json" \
        -d "{\"key_id\": \"${KEY_ID}\", \"key_secret\": \"${KEY_SECRET}\"}" \
        | python3 -c "import sys,json; print(json.load(sys.stdin)['bearer_token'])")
    
    # Test audit events access
    curl -s -H "Authorization: Bearer ${TOKEN}" \
        "https://app.scaleft.com/v1/teams/${TEAM_NAME}/auditsV2?count=5" \
        | python3 -m json.tool
    

Bei einer erfolgreichen Antwort wird ein JSON-Array mit den letzten Audit-Ereignissen zurückgegeben.

Google Cloud Storage-Bucket erstellen

  1. Gehen Sie zur Google Cloud Console.
  2. Wählen Sie Ihr Projekt aus oder erstellen Sie ein neues.
  3. Rufen Sie im Navigationsmenü Cloud Storage > Buckets auf.
  4. Klicken Sie auf Bucket erstellen.
  5. Geben Sie die folgenden Konfigurationsdetails an:

    Einstellung Wert
    Bucket benennen Geben Sie einen global eindeutigen Namen ein, z. B. okta-asa-audit-logs.
    Standorttyp Wählen Sie die Option aus, die am besten zu Ihren Anforderungen passt (Region, Dual-Region, Multi-Region).
    Standort Wählen Sie den Speicherort aus, z. B. us-central1.
    Speicherklasse Standard (empfohlen für Logs, auf die häufig zugegriffen wird)
    Zugriffskontrolle Einheitlich (empfohlen)
    Schutztools Optional: Objektversionierung oder Aufbewahrungsrichtlinie aktivieren
  6. Klicken Sie auf Erstellen.

Dienstkonto für Cloud Run-Funktion erstellen

  1. Wechseln Sie in der GCP Console zu IAM und Verwaltung > Dienstkonten.
  2. Klicken Sie auf Dienstkonto erstellen.
  3. Geben Sie die folgenden Konfigurationsdetails an:
    • Name des Dienstkontos: Geben Sie okta-asa-collector-sa ein.
    • Beschreibung des Dienstkontos: Geben Sie Service account for Cloud Run function to collect Okta Advanced Server Access audit logs ein.
  4. Klicken Sie auf Erstellen und fortfahren.
  5. Fügen Sie im Abschnitt Diesem Dienstkonto Zugriff auf das Projekt erteilen die folgenden Rollen hinzu:
    1. Klicken Sie auf Rolle auswählen.
    2. Suchen Sie nach Storage Object Admin und wählen Sie die Rolle aus.
    3. Klicken Sie auf + Weitere Rolle hinzufügen.
    4. Suchen Sie nach Cloud Run Invoker und wählen Sie die Rolle aus.
    5. Klicken Sie auf + Weitere Rolle hinzufügen.
    6. Suchen Sie nach Cloud Functions Invoker und wählen Sie die Rolle aus.
  6. Klicken Sie auf Weiter.
  7. Klicken Sie auf Fertig.

IAM-Berechtigungen für GCS-Bucket erteilen

  1. Rufen Sie Cloud Storage > Buckets auf.
  2. Klicken Sie auf den Namen Ihres Buckets (okta-asa-audit-logs).
  3. Wechseln Sie zum Tab Berechtigungen.
  4. Klicken Sie auf Zugriff erlauben.
  5. Geben Sie die folgenden Konfigurationsdetails an:
    • Hauptkonten hinzufügen: Geben Sie die E‑Mail-Adresse des Dienstkontos (okta-asa-collector-sa@PROJECT_ID.iam.gserviceaccount.com) ein.
    • Rollen zuweisen: Wählen Sie Storage Object Admin aus.
  6. Klicken Sie auf Speichern.

Pub/Sub-Thema erstellen

  1. Wechseln Sie in der GCP Console zu Pub/Sub > Themen.
  2. Klicken Sie auf Thema erstellen.
  3. Geben Sie die folgenden Konfigurationsdetails an:
    • Themen-ID: Geben Sie okta-asa-audit-trigger ein.
    • Übernehmen Sie die anderen Einstellungen.
  4. Klicken Sie auf Erstellen.

Cloud Run-Funktion zum Erfassen von Logs erstellen

Die Cloud Run-Funktion wird durch Pub/Sub-Nachrichten von Cloud Scheduler ausgelöst, um Logs von der Okta Advanced Server Access Audits API abzurufen und in GCS zu schreiben.

  1. Rufen Sie in der GCP Console Cloud Run auf.
  2. Klicken Sie auf Dienst erstellen.
  3. Wählen Sie Funktion aus (Funktion mit einem Inline-Editor erstellen).
  4. Geben Sie im Abschnitt Konfigurieren die folgenden Konfigurationsdetails an:

    Einstellung Wert
    Dienstname okta-asa-collector
    Region Wählen Sie die Region aus, die Ihrem GCS-Bucket entspricht (z. B. us-central1).
    Laufzeit Wählen Sie Python 3.12 oder höher aus.
  5. Im Abschnitt Trigger (optional):

    1. Klicken Sie auf + Trigger hinzufügen.
    2. Wählen Sie Cloud Pub/Sub aus.
    3. Wählen Sie unter Cloud Pub/Sub-Thema auswählen die Option okta-asa-audit-trigger aus.
    4. Klicken Sie auf Speichern.
  6. Im Abschnitt Authentifizierung:

    1. Wählen Sie Authentifizierung erforderlich aus.
    2. Prüfen Sie Identity and Access Management (IAM).
  7. Scrollen Sie nach unten und maximieren Sie Container, Netzwerk, Sicherheit.

  8. Rufen Sie den Tab Sicherheit auf:

    • Dienstkonto: Wählen Sie okta-asa-collector-sa aus.
  9. Rufen Sie den Tab Container auf:

    1. Klicken Sie auf Variablen und Secrets.
    2. Klicken Sie für jede Umgebungsvariable auf + Variable hinzufügen:
    Variablenname Beispielwert Beschreibung
    GCS_BUCKET okta-asa-audit-logs Name des GCS-Buckets
    GCS_PREFIX okta-asa-audit Präfix für Logdateien
    STATE_KEY okta-asa-audit/state.json Pfad der Statusdatei
    ASA_TEAM_NAME your-team-name Name des Advanced Server Access-Teams
    ASA_KEY_ID your-api-key-id ID des API-Schlüssels des Dienstnutzers
    ASA_KEY_SECRET your-api-key-secret Secret des API-Schlüssels des Dienstnutzers
    MAX_RECORDS 5000 Maximale Anzahl von Datensätzen pro Ausführung
    PAGE_SIZE 1000 Datensätze pro API-Seite (max. 1.000)
    LOOKBACK_HOURS 24 Anfänglicher Rückschauzeitraum
  10. Scrollen Sie im Bereich Variablen und Secrets nach unten zu Anfragen:

    • Zeitüberschreitung bei Anfrage: Geben Sie 600 Sekunden (10 Minuten) ein.
  11. Gehen Sie zum Tab Einstellungen:

    • Im Abschnitt Ressourcen:
      • Arbeitsspeicher: Wählen Sie 512 MiB oder höher aus.
      • CPU: Wählen Sie 1 aus.
  12. Im Abschnitt Versionsskalierung:

    • Mindestanzahl von Instanzen: Geben Sie 0 ein.
    • Maximale Anzahl von Instanzen: Geben Sie 100 ein.
  13. Klicken Sie auf Erstellen.

  14. Warten Sie, bis der Dienst erstellt wurde (1–2 Minuten).

  15. Nachdem der Dienst erstellt wurde, wird der Inline-Code-Editor automatisch geöffnet.

Funktionscode hinzufügen

  1. Geben Sie main in das Feld Einstiegspunkt ein.
  2. Erstellen Sie im Inline-Code-Editor zwei Dateien:

    • main.py:

      import functions_framework
      from google.cloud import storage
      import json
      import os
      import urllib3
      from datetime import datetime, timezone, timedelta
      import time
      
      http = urllib3.PoolManager(
        timeout=urllib3.Timeout(connect=10.0, read=60.0),
        retries=False,
      )
      
      storage_client = storage.Client()
      
      GCS_BUCKET = os.environ.get('GCS_BUCKET')
      GCS_PREFIX = os.environ.get('GCS_PREFIX', 'okta-asa-audit')
      STATE_KEY = os.environ.get('STATE_KEY', 'okta-asa-audit/state.json')
      ASA_TEAM_NAME = os.environ.get('ASA_TEAM_NAME')
      ASA_KEY_ID = os.environ.get('ASA_KEY_ID')
      ASA_KEY_SECRET = os.environ.get('ASA_KEY_SECRET')
      MAX_RECORDS = int(os.environ.get('MAX_RECORDS', '5000'))
      PAGE_SIZE = int(os.environ.get('PAGE_SIZE', '1000'))
      LOOKBACK_HOURS = int(os.environ.get('LOOKBACK_HOURS', '24'))
      
      ASA_API_BASE = 'https://app.scaleft.com'
      
      @functions_framework.cloud_event
      def main(cloud_event):
        if not all([GCS_BUCKET, ASA_TEAM_NAME, ASA_KEY_ID, ASA_KEY_SECRET]):
          print('Error: Missing required environment variables')
          return
      
        try:
          bucket = storage_client.bucket(GCS_BUCKET)
          state = load_state(bucket)
          now = datetime.now(timezone.utc)
      
          if isinstance(state, dict) and state.get('last_offset'):
            last_offset = state['last_offset']
          else:
            last_offset = None
      
          print(f"Starting audit log collection (last_offset={last_offset})")
      
          token = get_bearer_token()
      
          records, newest_offset = fetch_audit_events(
            token=token,
            last_offset=last_offset,
            page_size=PAGE_SIZE,
            max_records=MAX_RECORDS,
          )
      
          if not records:
            print("No new audit records found.")
            return
      
          timestamp = now.strftime('%Y%m%d_%H%M%S')
          object_key = f"{GCS_PREFIX}/okta_asa_audit_{timestamp}.ndjson"
          blob = bucket.blob(object_key)
      
          ndjson = '\n'.join(
            [json.dumps(record, ensure_ascii=False) for record in records]
          ) + '\n'
          blob.upload_from_string(ndjson, content_type='application/x-ndjson')
      
          print(f"Wrote {len(records)} records to gs://{GCS_BUCKET}/{object_key}")
      
          if newest_offset:
            save_state(bucket, newest_offset)
      
          print(f"Successfully processed {len(records)} records")
      
        except Exception as e:
          print(f'Error processing logs: {str(e)}')
          raise
      
      def get_bearer_token():
        url = f"{ASA_API_BASE}/v1/teams/{ASA_TEAM_NAME}/service_token"
        body = json.dumps({
          'key_id': ASA_KEY_ID,
          'key_secret': ASA_KEY_SECRET
        }).encode('utf-8')
      
        response = http.request(
          'POST', url,
          body=body,
          headers={'Content-Type': 'application/json'}
        )
      
        if response.status != 200:
          raise Exception(
            f"Service token request failed: {response.status} - "
            f"{response.data.decode('utf-8')}"
          )
      
        data = json.loads(response.data.decode('utf-8'))
        token = data.get('bearer_token')
        if not token:
          raise Exception("No bearer_token in service token response")
      
        print("Successfully obtained ASA bearer token")
        return token
      
      def fetch_audit_events(token, last_offset, page_size, max_records):
        endpoint = f"{ASA_API_BASE}/v1/teams/{ASA_TEAM_NAME}/auditsV2"
      
        headers = {
          'Authorization': f'Bearer {token}',
          'Accept': 'application/json',
        }
      
        records = []
        page_num = 0
        backoff = 1.0
        current_offset = last_offset
      
        while True:
          page_num += 1
      
          if len(records) >= max_records:
            print(f"Reached max_records limit ({max_records})")
            break
      
          params = [f"count={page_size}"]
          if current_offset:
            params.append(f"offset={current_offset}")
      
          url = f"{endpoint}?{'&'.join(params)}"
      
          try:
            response = http.request('GET', url, headers=headers)
      
            if response.status == 429:
              retry_after = int(response.headers.get('Retry-After', str(int(backoff))))
              print(f"Rate limited (429). Retrying after {retry_after}s...")
              time.sleep(retry_after)
              backoff = min(backoff * 2, 30.0)
              continue
      
            backoff = 1.0
      
            if response.status == 401:
              print("Token expired (401). Refreshing bearer token...")
              token = get_bearer_token()
              headers['Authorization'] = f'Bearer {token}'
              continue
      
            if response.status != 200:
              print(f"HTTP Error: {response.status}")
              response_text = response.data.decode('utf-8')
              print(f"Response body: {response_text}")
              return records, current_offset
      
            data = json.loads(response.data.decode('utf-8'))
      
            page_results = data.get('list', [])
      
            if not page_results:
              print(f"No more results (empty page)")
              break
      
            print(f"Page {page_num}: Retrieved {len(page_results)} events")
            records.extend(page_results)
      
            # Extract next offset from Link header for pagination
            link_header = response.headers.get('Link', '')
            next_offset = extract_next_offset(link_header)
      
            if next_offset:
              current_offset = next_offset
            else:
              print("No more pages (no next link)")
              break
      
          except Exception as e:
            print(f"Error fetching audit events: {e}")
            return records, current_offset
      
        print(f"Retrieved {len(records)} total records from {page_num} pages")
        return records, current_offset
      
      def extract_next_offset(link_header):
        if not link_header:
          return None
      
        parts = link_header.split(',')
        for part in parts:
          if 'rel="next"' in part:
            url_part = part.split(';')[0].strip().strip('<>')
            if 'offset=' in url_part:
              for param in url_part.split('?')[-1].split('&'):
                if param.startswith('offset='):
                  return param.split('=', 1)[1]
        return None
      
      def load_state(bucket):
        try:
          blob = bucket.blob(STATE_KEY)
          if blob.exists():
            return json.loads(blob.download_as_text())
        except Exception as e:
          print(f"Warning: Could not load state: {e}")
        return {}
      
      def save_state(bucket, last_offset):
        try:
          state = {
            'last_offset': last_offset,
            'last_run': datetime.now(timezone.utc).isoformat()
          }
          blob = bucket.blob(STATE_KEY)
          blob.upload_from_string(
            json.dumps(state, indent=2),
            content_type='application/json'
          )
          print(f"Saved state: last_offset={last_offset}")
        except Exception as e:
          print(f"Warning: Could not save state: {e}")
      
    • requirements.txt:

      functions-framework==3.*
      google-cloud-storage==2.*
      urllib3>=2.0.0
      
  3. Klicken Sie auf Bereitstellen, um die Funktion zu speichern und bereitzustellen.

  4. Warten Sie, bis die Bereitstellung abgeschlossen ist (2–3 Minuten).

Cloud Scheduler-Job erstellen

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

    Einstellung Wert
    Name okta-asa-collector-hourly
    Region Dieselbe Region wie die Cloud Run-Funktion auswählen
    Frequenz 0 * * * * (stündlich zur vollen Stunde)
    Zeitzone Zeitzone auswählen (UTC empfohlen)
    Zieltyp Pub/Sub
    Thema okta-asa-audit-trigger auswählen
    Inhalt der Nachricht {} (leeres JSON-Objekt)
  4. 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 * * * * Hohes Volumen, niedrige Latenz
Alle 15 Minuten */15 * * * * Mittleres Suchvolumen
Stündlich 0 * * * * Standard (empfohlen)
Alle 6 Stunden 0 */6 * * * Geringes Volumen, Batchverarbeitung
Täglich 0 0 * * * Erhebung von Verlaufsdaten

Integration testen

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

    Starting audit log collection (last_offset=None)
    Successfully obtained ASA bearer token
    Page 1: Retrieved X events
    Wrote X records to gs://okta-asa-audit-logs/okta-asa-audit/okta_asa_audit_YYYYMMDD_HHMMSS.ndjson
    Successfully processed X records
    
  8. Rufen Sie Cloud Storage > Buckets auf.

  9. Klicken Sie auf okta-asa-audit-logs.

  10. Rufen Sie den Ordner okta-asa-audit/ auf.

  11. Prüfen Sie, ob eine neue .ndjson-Datei mit dem aktuellen Zeitstempel erstellt wurde.

Wenn in den Logs Fehler angezeigt werden:

  • HTTP 401: Prüfen Sie, ob die Umgebungsvariablen ASA_KEY_ID und ASA_KEY_SECRET korrekt sind.
  • HTTP 403: Prüfen Sie, ob der Dienstnutzer die Rolle reporting_user oder access_admin hat.
  • HTTP 429: Ratenbegrenzung – die Funktion wird automatisch mit exponentiellem Backoff wiederholt.
  • Fehlende Umgebungsvariablen: Prüfen Sie, ob alle erforderlichen Variablen in der Konfiguration der Cloud Run-Funktion festgelegt sind.

Google SecOps-Dienstkonto abrufen

  1. Rufen Sie die SIEM-Einstellungen > Feeds auf.
  2. Klicken Sie auf Neuen Nachrichten-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. Okta ASA Audit Logs.
  5. Wählen Sie Google Cloud Storage V2 als Quelltyp aus.
  6. Wählen Sie Okta Advanced Server Access als Logtyp aus.
  7. Klicken Sie auf Dienstkonto abrufen.
  8. Eine eindeutige E‑Mail-Adresse des Dienstkontos wird angezeigt. Beispiel:

    chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com
    
  9. Kopieren Sie diese E‑Mail-Adresse für den nächsten Schritt.

  10. Klicken Sie auf Weiter.

  11. Geben Sie Werte für die folgenden Eingabeparameter an:

    • Storage-Bucket-URL: Geben Sie den GCS-Bucket-URI mit dem Präfixpfad ein:

      gs://okta-asa-audit-logs/okta-asa-audit/
      
    • Option zum Löschen der Quelle: Wählen Sie die gewünschte Option zum Löschen aus:

      • Nie: Löscht nach Übertragungen nie Dateien (empfohlen für Tests).
      • Übertragene Dateien löschen: Dateien werden nach der erfolgreichen Übertragung gelöscht.
      • Übertragene Dateien und leere Verzeichnisse löschen: Löscht Dateien und leere Verzeichnisse nach der erfolgreichen Übertragung.

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

    • Asset-Namespace: Der Asset-Namespace

    • Labels für Datenaufnahme: Das Label, das auf die Ereignisse aus diesem Feed angewendet werden soll

  12. Klicken Sie auf Weiter.

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

Dem Google SecOps-Dienstkonto IAM-Berechtigungen gewähren

  1. Rufen Sie Cloud Storage > Buckets auf.
  2. Klicken Sie auf okta-asa-audit-logs.
  3. Wechseln Sie zum Tab Berechtigungen.
  4. Klicken Sie auf Zugriff erlauben.
  5. Geben Sie die folgenden Konfigurationsdetails an:
    • Hauptkonten hinzufügen: Fügen Sie die E‑Mail-Adresse des Google SecOps-Dienstkontos ein.
    • Rollen zuweisen: Wählen Sie Storage Object Viewer aus.
  6. Klicken Sie auf Speichern.

UDM-Zuordnungstabelle

Logfeld UDM-Zuordnung Logik
details.actor.details.email principal.user.email_addresses Wert direkt kopiert
details.actor.details.first_name principal.user.first_name Wert direkt kopiert
details.actor.details.full_name principal.user.user_display_name Wert direkt kopiert
details.actor.details.last_name principal.user.last_name Wert direkt kopiert
details.actor.details.user_type principal.user.attribute.roles Wert direkt kopiert
details.actor.id principal.user.employee_id Wert direkt kopiert
details.actor.name principal.user.userid Wert aus details.actor.name, falls nicht leer, andernfalls details.unix_user_name
details.unix_user_name principal.user.userid
details.actor.status principal.user.attribute.labels Zusammengeführt als Label mit dem Schlüssel „actor_status“
details.actor.team_name principal.user.department Wert direkt kopiert
details.actor.user_type principal.user.attribute.labels Zusammengeführt als Label mit dem Schlüssel „actor_user_type“
details.client.description principal.application Wert direkt kopiert
details.client.encrypted principal.asset.attribute.labels In String konvertiert, als Label mit dem Schlüssel „details_client_encrypted“ zusammengeführt
details.client.hostname hauptkonto.hostname, hauptkonto.asset.hostname Wert direkt kopiert
details.client.id principal.user.product_object_id Wert direkt kopiert
details.client.os principal.platform Wird auf WINDOWS gesetzt, wenn (?i)Win|win übereinstimmt; auf LINUX, wenn (?i)Lin|lin übereinstimmt; auf MAC, wenn (?i)Mac|ios|mac übereinstimmt; auf ANDROID, wenn (?i)Android|android übereinstimmt
details.client.os principal.platform_version Extrahierte major.minor.patch aus dem Betriebssystemstring mit grok
details.client.state principal.resource.attribute.labels Zusammengeführt als Label mit dem Schlüssel „client_state“
details.client.user_name target.user.userid Wert direkt kopiert
details.client_ip principal.ip, principal.asset.ip Extrahierte IP-Adresse mit Grok-Muster
details.from_address principal.ip, principal.asset.ip Extrahierte IP-Adresse mit Grok-Muster
details.project.create_server_users target.resource.attribute.labels In String konvertiert, als Label mit dem Schlüssel „project_create_server_users“ zusammengeführt
details.project.force_shared_ssh_users target.resource.attribute.labels In String konvertiert, als Label mit dem Schlüssel „project_force_shared_ssh_users“ zusammengeführt
details.project.forward_traffic target.resource.attribute.labels In String konvertiert, als Label mit dem Schlüssel „project_forward_traffic“ zusammengeführt
details.project.id target.resource.id Wert direkt kopiert
details.project.name target.resource.name Wert direkt kopiert
details.project.next_unix_gid target.resource.attribute.labels In String konvertiert, als Label mit dem Schlüssel „next_unix_gid“ zusammengeführt
details.project.next_unix_uid target.resource.attribute.labels In String konvertiert, als Label mit dem Schlüssel „next_unix_uid“ zusammengeführt
details.project.rdp_session_recording target.resource.attribute.labels In String konvertiert, als Label mit dem Schlüssel „project_rdp_session_recording“ zusammengeführt
details.project.require_preauth_for_creds target.resource.attribute.labels In String konvertiert, als Label mit dem Schlüssel „project_require_preauth_for_creds“ zusammengeführt
details.project.ssh_certificate_type target.resource.attribute.labels Zusammengeführt als Label mit dem Schlüssel „project_ssh_certificate_type“
details.project.ssh_session_recording target.resource.attribute.labels In String konvertiert, als Label mit dem Schlüssel „project_ssh_session_recording“ zusammengeführt
details.project.team target.resource.attribute.labels Als Label mit dem Schlüssel „project_team“ zusammengeführt
details.server.alt_names target.hostname, target.asset.hostname, target.resource.attribute.labels Erster alt_name auf target.hostname und target.asset.hostname gesetzt, andere als Labels mit dem Schlüssel „alt_name“ zusammengeführt
details.server.hostname intermediary_value.hostname Wert direkt kopiert
details.server.id intermediary_value.resource.attribute.labels Zusammengeführt als Label mit dem Schlüssel „details_server_id“
details.server.os intermediary_value.platform_version Wert direkt kopiert
details.server.os intermediary_value.resource.attribute.labels Zusammengeführt als Label mit dem Schlüssel „details_server_os“
details.server.os_type intermediary_value.platform Auf LINUX gesetzt, wenn (?i)linux übereinstimmt; auf WINDOWS gesetzt, wenn (?i)windows übereinstimmt; auf MAC gesetzt, wenn (?i)mac übereinstimmt.
details.server.services intermediary_value.resource.attribute.labels Zusammengeführt als Labels mit dem Schlüssel „server_services {index}“
details.server.source intermediary_value.resource.attribute.labels Zusammengeführt als Label mit dem Schlüssel „server_source“
details.server.source_details.cloud_account intermediary_value.resource.attribute.labels Zusammengeführt als Label mit dem Schlüssel „server_source_details_cloud_account“
details.server.source_details.cloud_provider intermediary_value.resource.attribute.labels Zusammengeführt als Label mit dem Schlüssel „server_source_details_cloud_provider“
details.server.source_details.instance_id intermediary_value.resource.attribute.labels Zusammengeführt als Label mit dem Schlüssel „server_source_details_instance_id“
details.server.state target.asset.attribute.labels In String konvertiert, als Label mit dem Schlüssel „server_state“ zusammengeführt
details.server.team_name intermediary_value.user.department Wert direkt kopiert
details.server_hostnames target.hostname, target.resource.attribute.labels Der erste Hostname wird auf „target.hostname“ gesetzt, die anderen werden als Labels mit dem Schlüssel „server_hostname {index}“ zusammengeführt.
details.server_id target.resource.attribute.labels Zusammengeführt als Label mit dem Schlüssel „details_server_id“
details.server_os target.platform_version Wert direkt kopiert
details.server_os_type target.platform Wird auf LINUX gesetzt, wenn (?i)linux übereinstimmt; WINDOWS, wenn (?i)windows übereinstimmt; MAC, wenn (?i)mac übereinstimmt
details.server_state target.resource.attribute.labels Zusammengeführt als Label mit dem Schlüssel „details_server_state“
details.session_type extensions.auth.auth_details Wert direkt kopiert
details.session_type security_result.detection_fields Zusammengeführt als Label mit dem Schlüssel „session_type“
details.servers Vermittler Als Zwischenobjekt verarbeitet und zusammengeführt
details.ssh_algorithm network.tls.cipher Wert direkt kopiert
details.ssh_key_fingerprint target.asset.attribute.labels Zusammengeführt als Label mit dem Schlüssel „ssh_key_fingerprint“
details.ssh_public_key security_result.detection_fields Zusammengeführt als Label mit dem Schlüssel „ssh_public_key“
details.target_server target.application Wert direkt kopiert
details.team_id principal.resource.id Wert direkt kopiert
details.team_id target.resource.id Wert direkt kopiert
details.team_name additional.fields Zusammengeführt als Label mit dem Schlüssel „team_name“
details.trace_id network.session_id Wert direkt kopiert
details.type metadata.product_event_type Wert direkt kopiert
details.username target.user.user_display_name Wert direkt kopiert
details.via network.session_id Wert direkt kopiert
details_server intermediary_value Verarbeitet und als intermediary_value-Objekt zusammengeführt
id additional.fields Als Label mit dem Schlüssel „id“ zusammengeführt
timestamp metadata.event_timestamp Konvertiert im ISO8601-Format
extensions.auth.type extensions.auth.type Auf „SSO“ festlegen, wenn metadata.event_type USER_LOGIN ist
intermediary_value Vermittler Wird aus „intermediary_value“ zusammengeführt, wenn nicht leer
has_principal_user metadata.event_type Auf USER_LOGIN gesetzt, wenn has_principal_user und has_target_user oder has_principal_user und has_target vorhanden sind und details_type mit „login“ übereinstimmt; andernfalls USER_UNCATEGORIZED, wenn has_principal_user vorhanden ist; andernfalls STATUS_UPDATE, wenn has_principal vorhanden ist.
has_target_user metadata.event_type
metadata.product_name metadata.product_name Legen Sie diesen Wert auf „OKTA_SCALEFT“ fest.
metadata.vendor_name metadata.vendor_name Auf „OKTA_SCALEFT“ festgelegt
desc event.idm.read_only_udm.metadata.description Aus dem Änderungsprotokoll zugeordnet
asset_id event.idm.read_only_udm.target.asset.asset_id Aus dem Änderungsprotokoll zugeordnet
details.hostname event.idm.read_only_udm.principal.hostname und event.idm.read_only_udm.principal.asset.hostname Aus dem Änderungsprotokoll zugeordnet
details.actor event.idm.read_only_udm.principal.user.userid Aus dem Änderungsprotokoll zugeordnet
details.client event.idm.read_only_udm.principal.hostname und event.idm.read_only_udm.principal.asset.hostname Aus dem Änderungsprotokoll zugeordnet
details.username event.idm.read_only_udm.target.user.user_display_name Aus Änderungsprotokoll zugeordnet
details.server.server_accounts.username event.idm.read_only_udm.target.user.user_display_name Aus Änderungsprotokoll zugeordnet
details.project event.idm.read_only_udm.target.resource.attribute.cloud.project.name Aus Änderungsprotokoll zugeordnet
details.server.server_accounts event.idm.read_only_udm.target.asset.attribute.labels Aus Änderungsprotokoll zugeordnet
"id" event.idm.read_only_udm.additional.fields Aus Änderungsprotokoll zugeordnet
"details.from_address" event.idm.read_only_udm.principal.ip Aus Änderungsprotokoll zugeordnet
"details.client_ip" event.idm.read_only_udm.principal.ip Aus Änderungsprotokoll zugeordnet
"details.from_address" event.idm.read_only_udm.principal.asset.ip Aus Änderungsprotokoll zugeordnet
"details.client_ip" event.idm.read_only_udm.principal.asset.ip Aus Änderungsprotokoll zugeordnet
"details.type" event.idm.read_only_udm.metadata.product_event_type Aus Änderungsprotokoll zugeordnet
"details.actor.status" event.idm.read_only_udm.principal.user.attribute.labels Aus Änderungsprotokoll zugeordnet
"details.actor.user_type" event.idm.read_only_udm.principal.user.attribute.labels Aus Änderungsprotokoll zugeordnet
"details.session_type" event.idm.read_only_udm.extensions.auth.auth_details Aus Änderungsprotokoll zugeordnet
"details.actor.name" event.idm.read_only_udm.principal.user.userid Aus Änderungsprotokoll zugeordnet
"details.unix_user_name" event.idm.read_only_udm.principal.user.userid Aus Änderungsprotokoll zugeordnet
"details.actor.details.full_name" event.idm.read_only_udm.principal.user.user_display_name Aus Änderungsprotokoll zugeordnet
"details.actor.details.first_name" event.idm.read_only_udm.principal.user.first_name Aus Änderungsprotokoll zugeordnet
"details.actor.details.last_name" event.idm.read_only_udm.principal.user.last_name Aus Änderungsprotokoll zugeordnet
"details.actor.id" event.idm.read_only_udm.principal.user.employee_id Aus Änderungsprotokoll zugeordnet
"details.actor.team_name" event.idm.read_only_udm.principal.user.department Aus Änderungsprotokoll zugeordnet
"details.client.hostname" event.idm.read_only_udm.principal.hostname Aus Änderungsprotokoll zugeordnet
"details.client.hostname" event.idm.read_only_udm.principal.asset.hostname Aus Änderungsprotokoll zugeordnet
"details.client.id" event.idm.read_only_udm.principal.user.product_object_id Aus Änderungsprotokoll zugeordnet
"details.client.description" event.idm.read_only_udm.principal.application Aus Änderungsprotokoll zugeordnet
"details.client.os" event.idm.read_only_udm.principal.platform Aus Änderungsprotokoll zugeordnet
"details_client_os" event.idm.read_only_udm.principal.platform_version Aus Änderungsprotokoll zugeordnet
"details.actor.details.email" event.idm.read_only_udm.principal.user.email_addresses Aus Änderungsprotokoll zugeordnet
"details.team_id" event.idm.read_only_udm.target.resource.id Aus Änderungsprotokoll zugeordnet
"details.project.id" event.idm.read_only_udm.target.resource.id Aus Änderungsprotokoll zugeordnet
"details.team_name" event.idm.read_only_udm.additional.fields Aus Änderungsprotokoll zugeordnet
"details.client.state" event.idm.read_only_udm.principal.resource.attribute.labels Aus Änderungsprotokoll zugeordnet
"details.target_server" event.idm.read_only_udm.target.application Aus Änderungsprotokoll zugeordnet
"details.via" event.idm.read_only_udm.network.session_id Aus Änderungsprotokoll zugeordnet
"details.trace_id" event.idm.read_only_udm.network.session_id Aus Änderungsprotokoll zugeordnet
"details_session_type" event.idm.read_only_udm.security_result.detection_fields Aus Änderungsprotokoll zugeordnet
"details.ssh_public_key" event.idm.read_only_udm.security_result.detection_fields Aus Änderungsprotokoll zugeordnet
"details.actor.details.user_type" event.idm.read_only_udm.principal.user.attribute.roles Aus Änderungsprotokoll zugeordnet
"details.project.name" event.idm.read_only_udm.target.resource.name Aus Änderungsprotokoll zugeordnet
"details.server.id" event.idm.read_only_udm.target.resource.attribute.labels Aus Änderungsprotokoll zugeordnet
"details.server.state" event.idm.read_only_udm.target.resource.attribute.labels Aus Änderungsprotokoll zugeordnet
"details.project.team" event.idm.read_only_udm.target.resource.attribute.labels Aus Änderungsprotokoll zugeordnet
"details.project.create_server_users" event.idm.read_only_udm.target.resource.attribute.labels Aus Änderungsprotokoll zugeordnet
"details.project.force_shared_ssh_users" event.idm.read_only_udm.target.resource.attribute.labels Aus Änderungsprotokoll zugeordnet
"details.project.forward_traffic" event.idm.read_only_udm.target.resource.attribute.labels Aus Änderungsprotokoll zugeordnet
"details.project.next_unix_gid" event.idm.read_only_udm.target.resource.attribute.labels Aus Änderungsprotokoll zugeordnet
"details.project.next_unix_uid" event.idm.read_only_udm.target.resource.attribute.labels Aus Änderungsprotokoll zugeordnet
"details.project.rdp_session_recording" event.idm.read_only_udm.target.resource.attribute.labels Aus Änderungsprotokoll zugeordnet
"details.project.require_preauth_for_creds" event.idm.read_only_udm.target.resource.attribute.labels Aus Änderungsprotokoll zugeordnet
"details.project.ssh_certificate_type" event.idm.read_only_udm.target.resource.attribute.labels Aus Änderungsprotokoll zugeordnet
"details.project.ssh_session_recording" event.idm.read_only_udm.target.resource.attribute.labels Aus Änderungsprotokoll zugeordnet
"serverhostname" event.idm.read_only_udm.target.resource.attribute.labels Aus Änderungsprotokoll zugeordnet
"alt_name" event.idm.read_only_udm.target.resource.attribute.labels Aus Änderungsprotokoll zugeordnet
"details.ssh_key_fingerprint" event.idm.read_only_udm.target.resource.attribute.labels Aus Änderungsprotokoll zugeordnet
"details.server.os" event.idm.read_only_udm.target.platform_version Aus Änderungsprotokoll zugeordnet
"detailsserver.os" event.idm.read_only_udm.target.platform_version Aus Änderungsprotokoll zugeordnet
"details.server.os_type" event.idm.read_only_udm.target.platform Aus Änderungsprotokoll zugeordnet
"detailsserver.os_type" event.idm.read_only_udm.target.platform Aus Änderungsprotokoll zugeordnet
"details_team_id" event.idm.read_only_udm.principal.resource.id Aus Änderungsprotokoll zugeordnet
"details.client.encrypted" event.idm.read_only_udm.principal.asset.attribute.labels Aus Änderungsprotokoll zugeordnet
"details.client.user_name" event.idm.read_only_udm.target.user.userid Aus Änderungsprotokoll zugeordnet
"timestamp" event.idm.read_only_udm.metadata.event_timestamp Aus Änderungsprotokoll zugeordnet
"serverhostname" event.idm.read_only_udm.target.hostname Aus Änderungsprotokoll zugeordnet
"alt_name" event.idm.read_only_udm.target.hostname Aus Änderungsprotokoll zugeordnet
"alt_name" event.idm.read_only_udm.target.asset.hostname Aus Änderungsprotokoll zugeordnet
"intermediary" event.idm.read_only_udm.intermediary Aus Änderungsprotokoll zugeordnet
"intermediary_value" event.idm.read_only_udm.intermediary Aus Änderungsprotokoll zugeordnet
"detailsserver.sftd_version" event.idm.read_only_udm.metadata.product_version Aus Änderungsprotokoll zugeordnet
"details.server.sftd_version" event.idm.read_only_udm.metadata.product_version Aus Änderungsprotokoll zugeordnet
"detailsserver.state" event.idm.read_only_udm.target.asset.attribute.labels Aus Änderungsprotokoll zugeordnet
"detailsserver.managed" event.idm.read_only_udm.target.asset.attribute.labels Aus Änderungsprotokoll zugeordnet
"detailsserver.ssh_key_fingerprint" event.idm.read_only_udm.target.asset.attribute.labels Aus Änderungsprotokoll zugeordnet
"details.username" event.idm.read_only_udm.target.user.user_display_name Aus Änderungsprotokoll zugeordnet
"details.ssh_algorithm" event.idm.read_only_udm.network.tls.cipher Aus dem Änderungsprotokoll zugeordnet

Änderungsprotokoll

Änderungsprotokoll für diesen Parser ansehen

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