SailPoint IAM-Protokolle erfassen
In diesem Dokument wird beschrieben, wie Sie SailPoint IAM-Logs (Identity and Access Management) mit Amazon S3 in Google Security Operations aufnehmen können. Der Parser verarbeitet die Logs im JSON- und XML-Format und wandelt sie in das einheitliche Datenmodell (Unified Data Model, UDM) um. Es wird zwischen einzelnen UDM-Ereignissen (ProvisioningPlan, AccountRequest, SOAP-ENV), mehreren UDM-Ereignissen (ProvisioningProject) und UDM-Entitäten (Identity) unterschieden. Für jedes werden spezifische Parsing-Logik und Feldzuordnungen angewendet, einschließlich der generischen Ereignisverarbeitung für Nicht-XML-Daten.
Hinweise
Prüfen Sie, ob folgende Voraussetzungen erfüllt sind:
- Eine Google SecOps-Instanz.
- Berechtigter Zugriff auf die SailPoint Identity Security Cloud.
- Privilegierter Zugriff auf AWS (S3, IAM, Lambda, EventBridge).
SailPoint IAM-Voraussetzungen erfassen (IDs, API-Schlüssel, Organisations-IDs, Tokens)
- Melden Sie sich als Administrator in der SailPoint Identity Security Cloud Admin Console an.
- Klicken Sie auf Global > Sicherheitseinstellungen > API-Verwaltung.
- Klicken Sie auf API-Client erstellen.
- Wählen Sie Clientanmeldedaten als Grant-Typ aus.
- Geben Sie die folgenden Konfigurationsdetails an:
- Name: Geben Sie einen aussagekräftigen Namen ein, z. B.
Google SecOps Export API
. - Beschreibung: Geben Sie eine Beschreibung für den API-Client ein.
- Bereiche: Wählen Sie
sp:scopes:all
aus.
- Name: Geben Sie einen aussagekräftigen Namen ein, z. B.
- Klicken Sie auf Erstellen und speichern Sie die generierten API-Anmeldedaten an einem sicheren Ort.
- Notieren Sie die Basis-URL Ihres SailPoint-Mandanten (z. B.
https://tenant.api.identitynow.com
). - Kopieren Sie die folgenden Details und speichern Sie sie an einem sicheren Ort:
- IDN_CLIENT_ID.
- IDN_CLIENT_SECRET.
- IDN_BASE
AWS S3-Bucket und IAM für Google SecOps konfigurieren
- Erstellen Sie einen Amazon S3-Bucket. Folgen Sie dazu der Anleitung unter Bucket erstellen.
- Speichern Sie den Namen und die Region des Buckets zur späteren Verwendung (z. B.
sailpoint-iam-logs
). - Erstellen Sie einen Nutzer gemäß dieser Anleitung: IAM-Nutzer erstellen.
- Wählen Sie den erstellten Nutzer aus.
- Wählen Sie den Tab Sicherheitsanmeldedaten aus.
- Klicken Sie im Abschnitt Zugriffsschlüssel auf Zugriffsschlüssel erstellen.
- Wählen Sie Drittanbieterdienst als Anwendungsfall aus.
- Klicken Sie auf Weiter.
- Optional: Fügen Sie ein Beschreibungstag hinzu.
- Klicken Sie auf Zugriffsschlüssel erstellen.
- Klicken Sie auf CSV-Datei herunterladen, um den Access Key (Zugriffsschlüssel) und den Secret Access Key (geheimer Zugriffsschlüssel) für die zukünftige Verwendung zu speichern.
- Klicken Sie auf Fertig.
- Wählen Sie den Tab Berechtigungen aus.
- Klicken Sie im Bereich Berechtigungsrichtlinien auf Berechtigungen hinzufügen.
- Wählen Sie Berechtigungen hinzufügen aus.
- Wählen Sie Richtlinien direkt anhängen aus.
- Suchen Sie nach der Richtlinie AmazonS3FullAccess.
- Wählen Sie die Richtlinie aus.
- Klicken Sie auf Weiter.
- Klicken Sie auf Berechtigungen hinzufügen.
IAM-Richtlinie und ‑Rolle für S3-Uploads konfigurieren
- Rufen Sie in der AWS-Konsole IAM > Richtlinien auf.
- Klicken Sie auf Richtlinie erstellen> Tab „JSON“.
- Kopieren Sie die folgende Richtlinie und fügen Sie sie ein.
Policy JSON (ersetzen Sie
sailpoint-iam-logs
, wenn Sie einen anderen Bucket-Namen eingegeben haben):{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutObjects", "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::sailpoint-iam-logs/*" }, { "Sid": "AllowGetStateObject", "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::sailpoint-iam-logs/sailpoint/iam/state.json" } ] }
Klicken Sie auf Weiter > Richtlinie erstellen.
Rufen Sie IAM > Rollen > Rolle erstellen > AWS-Service > Lambda auf.
Hängen Sie die neu erstellte Richtlinie an.
Geben Sie der Rolle den Namen
SailPointIamToS3Role
und klicken Sie auf Rolle erstellen.
Lambda-Funktion erstellen
- Rufen Sie in der AWS Console Lambda > Funktionen > Funktion erstellen auf.
- Klicken Sie auf Von Grund auf erstellen.
Geben Sie die folgenden Konfigurationsdetails an:
Einstellung Wert Name sailpoint_iam_to_s3
Laufzeit Python 3.13 Architektur x86_64 Ausführungsrolle SailPointIamToS3Role
Nachdem die Funktion erstellt wurde, öffnen Sie den Tab Code, löschen Sie den Stub und fügen Sie den folgenden Code (
sailpoint_iam_to_s3.py
) ein.#!/usr/bin/env python3 # Lambda: Pull SailPoint Identity Security Cloud audit events and store raw JSON payloads to S3 # - Uses /v3/search API with pagination for audit events. # - Preserves vendor-native JSON format for identity events. # - Retries with exponential backoff; unique S3 keys to avoid overwrites. import os, json, time, uuid, urllib.parse from urllib.request import Request, urlopen from urllib.error import URLError, HTTPError import boto3 S3_BUCKET = os.environ["S3_BUCKET"] S3_PREFIX = os.environ.get("S3_PREFIX", "sailpoint/iam/") STATE_KEY = os.environ.get("STATE_KEY", "sailpoint/iam/state.json") WINDOW_SEC = int(os.environ.get("WINDOW_SECONDS", "3600")) # default 1h HTTP_TIMEOUT= int(os.environ.get("HTTP_TIMEOUT", "60")) IDN_BASE = os.environ["IDN_BASE"] # e.g. https://tenant.api.identitynow.com CLIENT_ID = os.environ["IDN_CLIENT_ID"] CLIENT_SECRET = os.environ["IDN_CLIENT_SECRET"] SCOPE = os.environ.get("IDN_SCOPE", "sp:scopes:all") PAGE_SIZE = int(os.environ.get("PAGE_SIZE", "250")) MAX_PAGES = int(os.environ.get("MAX_PAGES", "20")) MAX_RETRIES = int(os.environ.get("MAX_RETRIES", "3")) USER_AGENT = os.environ.get("USER_AGENT", "sailpoint-iam-to-s3/1.0") s3 = boto3.client("s3") def _load_state(): try: obj = s3.get_object(Bucket=S3_BUCKET, Key=STATE_KEY) return json.loads(obj["Body"].read()) except Exception: return {} def _save_state(st): s3.put_object( Bucket=S3_BUCKET, Key=STATE_KEY, Body=json.dumps(st, separators=(",", ":")).encode("utf-8"), ContentType="application/json", ) def _iso(ts: float) -> str: return time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(ts)) def _get_oauth_token() -> str: """Get OAuth2 access token using Client Credentials flow""" token_url = f"{IDN_BASE.rstrip('/')}/oauth/token" data = urllib.parse.urlencode({ 'grant_type': 'client_credentials', 'client_id': CLIENT_ID, 'client_secret': CLIENT_SECRET, 'scope': SCOPE }).encode('utf-8') req = Request(token_url, data=data, method="POST") req.add_header("Content-Type", "application/x-www-form-urlencoded") req.add_header("User-Agent", USER_AGENT) with urlopen(req, timeout=HTTP_TIMEOUT) as r: response = json.loads(r.read()) return response["access_token"] def _search_events(access_token: str, created_from: str, search_after: list = None) -> list: """Search for audit events using SailPoint's /v3/search API""" search_url = f"{IDN_BASE.rstrip('/')}/v3/search" # Build search query for events created after specified time query_str = f'created:">={created_from}"' payload = { "indices": ["events"], "query": {"query": query_str}, "sort": ["created", "+id"], "limit": PAGE_SIZE } if search_after: payload["searchAfter"] = search_after attempt = 0 while True: req = Request(search_url, data=json.dumps(payload).encode('utf-8'), method="POST") req.add_header("Content-Type", "application/json") req.add_header("Accept", "application/json") req.add_header("Authorization", f"Bearer {access_token}") req.add_header("User-Agent", USER_AGENT) try: with urlopen(req, timeout=HTTP_TIMEOUT) as r: response = json.loads(r.read()) # Handle different response formats if isinstance(response, list): return response return response.get("results", response.get("data", [])) except (HTTPError, URLError) as e: attempt += 1 print(f"HTTP error on attempt {attempt}: {e}") if attempt > MAX_RETRIES: raise # exponential backoff with jitter time.sleep(min(60, 2 ** attempt) + (time.time() % 1)) def _put_events_data(events: list, from_ts: float, to_ts: float, page_num: int) -> str: # Create unique S3 key for events data ts_path = time.strftime("%Y/%m/%d", time.gmtime(to_ts)) uniq = f"{int(time.time()*1e6)}_{uuid.uuid4().hex[:8]}" key = f"{S3_PREFIX}{ts_path}/sailpoint_iam_{int(from_ts)}_{int(to_ts)}_p{page_num:03d}_{uniq}.json" s3.put_object( Bucket=S3_BUCKET, Key=key, Body=json.dumps(events, separators=(",", ":")).encode("utf-8"), ContentType="application/json", Metadata={ 'source': 'sailpoint-iam', 'from_timestamp': str(int(from_ts)), 'to_timestamp': str(int(to_ts)), 'page_number': str(page_num), 'events_count': str(len(events)) } ) return key def _get_item_id(item: dict) -> str: """Extract ID from event item, trying multiple possible fields""" for field in ("id", "uuid", "eventId", "_id"): if field in item and item[field]: return str(item[field]) return "" def lambda_handler(event=None, context=None): st = _load_state() now = time.time() from_ts = float(st.get("last_to_ts") or (now - WINDOW_SEC)) to_ts = now # Get OAuth token access_token = _get_oauth_token() created_from = _iso(from_ts) print(f"Fetching SailPoint IAM events from: {created_from}") # Handle pagination state last_created = st.get("last_created") last_id = st.get("last_id") search_after = [last_created, last_id] if (last_created and last_id) else None pages = 0 total_events = 0 written_keys = [] newest_created = last_created or created_from newest_id = last_id or "" while pages < MAX_PAGES: events = _search_events(access_token, created_from, search_after) if not events: break # Write page to S3 key = _put_events_data(events, from_ts, to_ts, pages + 1) written_keys.append(key) total_events += len(events) # Update pagination state from last item last_event = events[-1] last_event_created = last_event.get("created") or last_event.get("metadata", {}).get("created") last_event_id = _get_item_id(last_event) if last_event_created: newest_created = last_event_created if last_event_id: newest_id = last_event_id search_after = [newest_created, newest_id] pages += 1 # If we got less than page size, we're done if len(events) < PAGE_SIZE: break print(f"Successfully retrieved {total_events} events across {pages} pages") # Save state for next run st["last_to_ts"] = to_ts st["last_created"] = newest_created st["last_id"] = newest_id st["last_successful_run"] = now _save_state(st) return { "statusCode": 200, "body": { "success": True, "pages": pages, "total_events": total_events, "s3_keys": written_keys, "from_timestamp": from_ts, "to_timestamp": to_ts, "last_created": newest_created, "last_id": newest_id } } if __name__ == "__main__": print(lambda_handler())
Rufen Sie Konfiguration > Umgebungsvariablen auf.
Klicken Sie auf Bearbeiten> Neue Umgebungsvariable hinzufügen.
Geben Sie die in der folgenden Tabelle angegebenen Umgebungsvariablen ein und ersetzen Sie die Beispielwerte durch Ihre Werte.
Umgebungsvariablen
Schlüssel Beispielwert S3_BUCKET
sailpoint-iam-logs
S3_PREFIX
sailpoint/iam/
STATE_KEY
sailpoint/iam/state.json
WINDOW_SECONDS
3600
HTTP_TIMEOUT
60
MAX_RETRIES
3
USER_AGENT
sailpoint-iam-to-s3/1.0
IDN_BASE
https://tenant.api.identitynow.com
IDN_CLIENT_ID
your-client-id
(aus Schritt 2)IDN_CLIENT_SECRET
your-client-secret
(aus Schritt 2)IDN_SCOPE
sp:scopes:all
PAGE_SIZE
250
MAX_PAGES
20
Bleiben Sie nach dem Erstellen der Funktion auf der zugehörigen Seite oder öffnen Sie Lambda > Funktionen > Ihre Funktion.
Wählen Sie den Tab Konfiguration aus.
Klicken Sie im Bereich Allgemeine Konfiguration auf Bearbeiten.
Ändern Sie Zeitlimit in 5 Minuten (300 Sekunden) und klicken Sie auf Speichern.
EventBridge-Zeitplan erstellen
- Gehen Sie zu Amazon EventBridge > Scheduler > Create schedule (Amazon EventBridge > Scheduler > Zeitplan erstellen).
- Geben Sie die folgenden Konfigurationsdetails an:
- Wiederkehrender Zeitplan: Preis (
1 hour
). - Ziel: Ihre Lambda-Funktion
sailpoint_iam_to_s3
. - Name:
sailpoint-iam-1h
.
- Wiederkehrender Zeitplan: Preis (
- Klicken Sie auf Zeitplan erstellen.
(Optional) IAM-Nutzer mit Lesezugriff und Schlüssel für Google SecOps erstellen
- Rufen Sie die AWS-Konsole > IAM > Nutzer auf.
- Klicken Sie auf Add users (Nutzer hinzufügen).
- Geben Sie die folgenden Konfigurationsdetails an:
- Nutzer: Geben Sie
secops-reader
ein. - Zugriffstyp: Wählen Sie Zugriffsschlüssel – programmatischer Zugriff aus.
- Nutzer: Geben Sie
- Klicken Sie auf Nutzer erstellen.
- Minimale Leseberechtigung (benutzerdefiniert) anhängen: Nutzer > secops-reader > Berechtigungen > Berechtigungen hinzufügen > Richtlinien direkt anhängen > Richtlinie erstellen.
JSON:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject"], "Resource": "arn:aws:s3:::sailpoint-iam-logs/*" }, { "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": "arn:aws:s3:::sailpoint-iam-logs" } ] }
Name =
secops-reader-policy
.Klicken Sie auf Richtlinie erstellen> suchen/auswählen> Weiter> Berechtigungen hinzufügen.
Erstellen Sie einen Zugriffsschlüssel für
secops-reader
: Sicherheitsanmeldedaten > Zugriffsschlüssel.Klicken Sie auf Zugriffsschlüssel erstellen.
Laden Sie die Datei
.CSV
herunter. Sie fügen diese Werte in den Feed ein.
Feed in Google SecOps konfigurieren, um SailPoint-IAM-Logs aufzunehmen
- Rufen Sie die SIEM-Einstellungen > Feeds auf.
- Klicken Sie auf + Neuen Feed hinzufügen.
- Geben Sie im Feld Feedname einen Namen für den Feed ein, z. B.
SailPoint IAM logs
. - Wählen Sie Amazon S3 V2 als Quelltyp aus.
- Wählen Sie SailPoint IAM als Logtyp aus.
- Klicken Sie auf Weiter.
- Geben Sie Werte für die folgenden Eingabeparameter an:
- S3-URI:
s3://sailpoint-iam-logs/sailpoint/iam/
- Optionen 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.
- 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 wird.
- S3-URI:
- Klicken Sie auf Weiter.
- Prüfen Sie die neue Feedkonfiguration auf dem Bildschirm Abschließen und klicken Sie dann auf Senden.
UDM-Zuordnungstabelle
Logfeld | UDM-Zuordnung | Logik |
---|---|---|
action |
metadata.description |
Der Wert des Felds action aus dem Rohlog. |
actor.name |
principal.user.user_display_name |
Der Wert des Felds actor.name aus dem Rohlog. |
attributes.accountName |
principal.user.group_identifiers |
Der Wert des Felds attributes.accountName aus dem Rohlog. |
attributes.appId |
target.asset_id |
„App-ID: “ gefolgt vom Wert des Felds attributes.appId aus dem Rohlog. |
attributes.attributeName |
additional.fields[0].value.string_value |
Der Wert des Felds attributes.attributeName aus dem Rohlog, der in ein additional.fields -Objekt eingefügt wird. Der Schlüssel ist auf „Attributname“ festgelegt. |
attributes.attributeValue |
additional.fields[1].value.string_value |
Der Wert des Felds attributes.attributeValue aus dem Rohlog, der in ein additional.fields -Objekt eingefügt wird. Der Schlüssel ist auf „Attributwert“ festgelegt. |
attributes.cloudAppName |
target.application |
Der Wert des Felds attributes.cloudAppName aus dem Rohlog. |
attributes.hostName |
target.hostname , target.asset.hostname |
Der Wert des Felds attributes.hostName aus dem Rohlog. |
attributes.interface |
additional.fields[2].value.string_value |
Der Wert des Felds attributes.interface aus dem Rohlog, der in ein additional.fields -Objekt eingefügt wird. Der Schlüssel ist auf „Interface“ gesetzt. |
attributes.operation |
security_result.action_details |
Der Wert des Felds attributes.operation aus dem Rohlog. |
attributes.previousValue |
additional.fields[3].value.string_value |
Der Wert des Felds attributes.previousValue aus dem Rohlog, der in ein additional.fields -Objekt eingefügt wird. Der Schlüssel ist auf „Previous Value“ (Vorheriger Wert) festgelegt. |
attributes.provisioningResult |
security_result.detection_fields.value |
Der Wert des Felds attributes.provisioningResult aus dem Rohlog, der in ein security_result.detection_fields -Objekt eingefügt wird. Der Schlüssel ist auf „Provisioning Result“ festgelegt. |
attributes.sourceId |
principal.labels[0].value |
Der Wert des Felds attributes.sourceId aus dem Rohlog, der in ein principal.labels -Objekt eingefügt wird. Der Schlüssel ist auf „Source Id“ (Quell-ID) festgelegt. |
attributes.sourceName |
principal.labels[1].value |
Der Wert des Felds attributes.sourceName aus dem Rohlog, der in ein principal.labels -Objekt eingefügt wird. Der Schlüssel ist auf „Quellname“ festgelegt. |
auditClassName |
metadata.product_event_type |
Der Wert des Felds auditClassName aus dem Rohlog. |
created |
metadata.event_timestamp.seconds , metadata.event_timestamp.nanos |
Der Wert des Felds created aus dem Rohlog, in einen Zeitstempel konvertiert, wenn instant.epochSecond nicht vorhanden ist. |
id |
metadata.product_log_id |
Der Wert des Felds id aus dem Rohlog. |
instant.epochSecond |
metadata.event_timestamp.seconds |
Der Wert des Felds instant.epochSecond aus dem Rohlog, der für den Zeitstempel verwendet wird. |
ipAddress |
principal.asset.ip , principal.ip |
Der Wert des Felds ipAddress aus dem Rohlog. |
interface |
additional.fields[0].value.string_value |
Der Wert des Felds interface aus dem Rohlog, der in ein additional.fields -Objekt eingefügt wird. Der Schlüssel ist auf „interface“ gesetzt. |
loggerName |
intermediary.application |
Der Wert des Felds loggerName aus dem Rohlog. |
message |
metadata.description , security_result.description |
Wird für verschiedene Zwecke verwendet, z. B. zum Festlegen der Beschreibung in Metadaten und security_result sowie zum Extrahieren von XML-Inhalten. |
name |
security_result.description |
Der Wert des Felds name aus dem Rohlog. |
operation |
target.resource.attribute.labels[0].value , metadata.product_event_type |
Der Wert des Felds operation aus dem Rohlog, der in ein target.resource.attribute.labels -Objekt eingefügt wird. Der Schlüssel ist auf „operation“ gesetzt. Wird auch für metadata.product_event_type verwendet. |
org |
principal.administrative_domain |
Der Wert des Felds org aus dem Rohlog. |
pod |
principal.location.name |
Der Wert des Felds pod aus dem Rohlog. |
referenceClass |
additional.fields[1].value.string_value |
Der Wert des Felds referenceClass aus dem Rohlog, der in ein additional.fields -Objekt eingefügt wird. Der Schlüssel ist auf „referenceClass“ festgelegt. |
referenceId |
additional.fields[2].value.string_value |
Der Wert des Felds referenceId aus dem Rohlog, der in ein additional.fields -Objekt eingefügt wird. Der Schlüssel ist auf „referenceId“ festgelegt. |
sailPointObjectName |
additional.fields[3].value.string_value |
Der Wert des Felds sailPointObjectName aus dem Rohlog, der in ein additional.fields -Objekt eingefügt wird. Der Schlüssel ist auf „sailPointObjectName“ festgelegt. |
serverHost |
principal.hostname , principal.asset.hostname |
Der Wert des Felds serverHost aus dem Rohlog. |
stack |
additional.fields[4].value.string_value |
Der Wert des Felds stack aus dem Rohlog, der in ein additional.fields -Objekt eingefügt wird. Der Schlüssel ist auf „Stack“ gesetzt. |
status |
security_result.severity_details |
Der Wert des Felds status aus dem Rohlog. |
target |
additional.fields[4].value.string_value |
Der Wert des Felds target aus dem Rohlog, der in ein additional.fields -Objekt eingefügt wird. Der Schlüssel ist auf „target“ gesetzt. |
target.name |
principal.user.userid |
Der Wert des Felds target.name aus dem Rohlog. |
technicalName |
security_result.summary |
Der Wert des Felds technicalName aus dem Rohlog. |
thrown.cause.message |
xml_body , detailed_message |
Der Wert des Felds thrown.cause.message aus dem Rohlog, der zum Extrahieren von XML-Inhalten verwendet wird. |
thrown.message |
xml_body , detailed_message |
Der Wert des Felds thrown.message aus dem Rohlog, der zum Extrahieren von XML-Inhalten verwendet wird. |
trackingNumber |
additional.fields[5].value.string_value |
Der Wert des Felds trackingNumber aus dem Rohlog, der in ein additional.fields -Objekt eingefügt wird. Der Schlüssel ist auf „Tracking Number“ (Trackingnummer) festgelegt. |
type |
metadata.product_event_type |
Der Wert des Felds type aus dem Rohlog. |
_version |
metadata.product_version |
Der Wert des Felds _version aus dem Rohlog. |
– | metadata.event_timestamp |
Abgeleitet aus den Feldern instant.epochSecond oder created . |
– | metadata.event_type |
Wird durch die Parserlogik anhand verschiedener Felder bestimmt, darunter has_principal_user , has_target_application , technicalName und action . Der Standardwert ist „GENERIC_EVENT“. |
– | metadata.log_type |
Legen Sie diesen Wert auf „SAILPOINT_IAM“ fest. |
– | metadata.product_name |
Legen Sie IAM fest. |
– | metadata.vendor_name |
Legen Sie diesen Wert auf „SAILPOINT“ fest. |
– | extensions.auth.type |
Unter bestimmten Umständen auf „AUTHTYPE_UNSPECIFIED“ festgelegt. |
– | target.resource.attribute.labels[0].key |
Legen Sie diesen Wert auf „operation“ fest. |
Benötigen Sie weitere Hilfe? Antworten von Community-Mitgliedern und Google SecOps-Experten erhalten