Censys-Logs erfassen

Unterstützt in:

In diesem Dokument wird beschrieben, wie Sie Censys-Logs mithilfe von Amazon S3 in Google Security Operations aufnehmen. Censys bietet über seine API umfassendes Attack Surface Management und Internet-Intelligence. Mit dieser Integration können Sie Host-Erkennungsereignisse, Risikoereignisse und Asset-Änderungen aus Censys ASM erfassen und zur Analyse und Überwachung an Google SecOps weiterleiten. Der Parser wandelt Rohlogs in ein strukturiertes Format um, das dem Google SecOps-UDM entspricht. Felder werden aus der Rohprotokollnachricht extrahiert, Datentypkonvertierungen werden durchgeführt und die extrahierten Informationen werden entsprechenden UDM-Feldern zugeordnet. Die Daten werden mit zusätzlichem Kontext und Labels angereichert.

Hinweise

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

  • Google SecOps-Instanz
  • Privilegierter Zugriff auf Censys ASM
  • Privilegierter Zugriff auf AWS (S3, IAM, Lambda, EventBridge)

Voraussetzungen für Censys (API-Anmeldedaten)

  1. Melden Sie sich unter app.censys.io in der Censys ASM Console an.
  2. Klicken Sie oben auf der Seite auf Integrationen.
  3. Kopieren und speichern Sie Ihren API-Schlüssel und Ihre Organisations-ID.
  4. Notieren Sie sich die API-Basis-URL: https://api.platform.censys.io.

AWS S3-Bucket und IAM für Google SecOps konfigurieren

  1. Erstellen Sie einen Amazon S3-Bucket. Folgen Sie dazu dieser Anleitung: Bucket erstellen.
  2. Speichern Sie den Namen und die Region des Buckets zur späteren Verwendung (z. B. censys-logs).
  3. Erstellen Sie einen Nutzer gemäß dieser Anleitung: IAM-Nutzer erstellen.
  4. Wählen Sie den erstellten Nutzer aus.
  5. Wählen Sie den Tab Sicherheitsanmeldedaten aus.
  6. Klicken Sie im Abschnitt Zugriffsschlüssel auf Zugriffsschlüssel erstellen.
  7. Wählen Sie als Anwendungsfall Drittanbieterdienst aus.
  8. Klicken Sie auf Weiter.
  9. Optional: Fügen Sie ein Beschreibungstag hinzu.
  10. Klicken Sie auf Zugriffsschlüssel erstellen.
  11. Klicken Sie auf CSV-Datei herunterladen, um den Access Key (Zugriffsschlüssel) und den Secret Access Key (geheimer Zugriffsschlüssel) zur späteren Verwendung zu speichern.
  12. Klicken Sie auf Fertig.
  13. Wählen Sie den Tab Berechtigungen aus.
  14. Klicken Sie im Bereich Berechtigungsrichtlinien auf Berechtigungen hinzufügen.
  15. Wählen Sie Berechtigungen hinzufügen aus.
  16. Wählen Sie Richtlinien direkt anhängen aus.
  17. Suchen Sie nach der Richtlinie AmazonS3FullAccess und wählen Sie sie aus.
  18. Klicken Sie auf Weiter.
  19. Klicken Sie auf Berechtigungen hinzufügen.

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

  1. Rufen Sie in der AWS-Konsole IAM > Richtlinien > Richtlinie erstellen > Tab „JSON“ auf.
  2. Geben Sie die folgende Richtlinie ein:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "AllowPutObjects",
          "Effect": "Allow",
          "Action": "s3:PutObject",
          "Resource": "arn:aws:s3:::censys-logs/*"
        },
        {
          "Sid": "AllowGetStateObject",
          "Effect": "Allow",
          "Action": "s3:GetObject",
          "Resource": "arn:aws:s3:::censys-logs/censys/state.json"
        }
      ]
    }
    
    • Ersetzen Sie censys-logs, wenn Sie einen anderen Bucket-Namen eingegeben haben.
  3. Klicken Sie auf Weiter > Richtlinie erstellen.

  4. Rufen Sie IAM > Rollen > Rolle erstellen > AWS-Service > Lambda auf.

  5. Hängen Sie die neu erstellte Richtlinie und die verwaltete Richtlinie AWSLambdaBasicExecutionRole (für den Zugriff auf CloudWatch Logs) an.

  6. Geben Sie der Rolle den Namen censys-lambda-role 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 censys-data-collector
Laufzeit Python 3.13
Architektur x86_64
Ausführungsrolle censys-lambda-role
  1. Nachdem die Funktion erstellt wurde, öffnen Sie den Tab Code, löschen Sie den Stub und geben Sie den folgenden Code ein (censys-data-collector.py):

    import json
    import boto3
    import urllib3
    import gzip
    import logging
    import os
    from datetime import datetime, timedelta, timezone
    from typing import Dict, List, Any, Optional
    from urllib.parse import urlencode
    
    # Configure logging
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    
    # AWS S3 client
    s3_client = boto3.client('s3')
    # HTTP client
    http = urllib3.PoolManager()
    
    # Environment variables
    S3_BUCKET = os.environ['S3_BUCKET']
    S3_PREFIX = os.environ['S3_PREFIX']
    STATE_KEY = os.environ['STATE_KEY']
    CENSYS_API_KEY = os.environ['CENSYS_API_KEY']
    CENSYS_ORG_ID = os.environ['CENSYS_ORG_ID']
    API_BASE = os.environ.get('API_BASE', 'https://api.platform.censys.io')
    
    class CensysCollector:
        def __init__(self):
            self.headers = {
                'Authorization': f'Bearer {CENSYS_API_KEY}',
                'X-Organization-ID': CENSYS_ORG_ID,
                'Content-Type': 'application/json'
            }
    
        def get_last_collection_time(self) -> Optional[datetime]:
            """Get the last collection timestamp from S3 state file."""
            try:
                response = s3_client.get_object(Bucket=S3_BUCKET, Key=STATE_KEY)
                state = json.loads(response['Body'].read().decode('utf-8'))
                return datetime.fromisoformat(state.get('last_collection_time', '2024-01-01T00:00:00Z'))
            except Exception as e:
                logger.info(f"No state file found or error reading state: {e}")
                return datetime.now(timezone.utc) - timedelta(hours=1)
    
        def save_collection_time(self, collection_time: datetime):
            """Save the current collection timestamp to S3 state file."""
            state = {'last_collection_time': collection_time.strftime('%Y-%m-%dT%H:%M:%SZ')}
            s3_client.put_object(
                Bucket=S3_BUCKET,
                Key=STATE_KEY,
                Body=json.dumps(state),
                ContentType='application/json'
            )
    
        def collect_logbook_events(self, cursor: str = None) -> List[Dict[str, Any]]:
            """Collect logbook events from Censys ASM API using cursor-based pagination."""
            events = []
            url = f"{API_BASE}/v3/logbook"
    
            # Use cursor-based pagination as per Censys API documentation
            params = {}
            if cursor:
                params['cursor'] = cursor
    
            try:
                query_string = urlencode(params) if params else ''
                full_url = f"{url}?{query_string}" if query_string else url
    
                response = http.request('GET', full_url, headers=self.headers)
    
                if response.status != 200:
                    logger.error(f"API request failed with status {response.status}: {response.data}")
                    return []
    
                data = json.loads(response.data.decode('utf-8'))
                events.extend(data.get('logbook_entries', []))
    
                # Handle cursor-based pagination
                next_cursor = data.get('next_cursor')
                if next_cursor:
                    events.extend(self.collect_logbook_events(next_cursor))
    
                logger.info(f"Collected {len(events)} logbook events")
                return events
    
            except Exception as e:
                logger.error(f"Error collecting logbook events: {e}")
                return []
    
        def collect_risks_events(self) -> List[Dict[str, Any]]:
            """Collect risk events from Censys ASM API."""
            events = []
            url = f"{API_BASE}/v3/risks"
    
            try:
                response = http.request('GET', url, headers=self.headers)
    
                if response.status != 200:
                    logger.error(f"API request failed with status {response.status}: {response.data}")
                    return []
    
                data = json.loads(response.data.decode('utf-8'))
                events.extend(data.get('risks', []))
    
                logger.info(f"Collected {len(events)} risk events")
                return events
    
            except Exception as e:
                logger.error(f"Error collecting risk events: {e}")
                return []
    
        def save_events_to_s3(self, events: List[Dict[str, Any]], event_type: str):
            """Save events to S3 in compressed NDJSON format."""
            if not events:
                return
    
            timestamp = datetime.now(timezone.utc).strftime('%Y%m%d_%H%M%S')
            filename = f"{S3_PREFIX}{event_type}_{timestamp}.json.gz"
    
            try:
                # Convert events to newline-delimited JSON
                ndjson_content = 'n'.join(json.dumps(event, separators=(',', ':')) for event in events)
    
                # Compress with gzip
                gz_bytes = gzip.compress(ndjson_content.encode('utf-8'))
    
                s3_client.put_object(
                    Bucket=S3_BUCKET,
                    Key=filename,
                    Body=gz_bytes,
                    ContentType='application/gzip',
                    ContentEncoding='gzip'
                )
    
                logger.info(f"Saved {len(events)} {event_type} events to {filename}")
    
            except Exception as e:
                logger.error(f"Error saving {event_type} events to S3: {e}")
                raise
    
    def lambda_handler(event, context):
        """AWS Lambda handler function."""
        try:
            collector = CensysCollector()
    
            # Get last collection time for cursor state management
            last_collection_time = collector.get_last_collection_time()
            current_time = datetime.now(timezone.utc)
    
            logger.info(f"Collecting events since {last_collection_time}")
    
            # Collect different types of events
            logbook_events = collector.collect_logbook_events()
            risk_events = collector.collect_risks_events()
    
            # Save events to S3
            collector.save_events_to_s3(logbook_events, 'logbook')
            collector.save_events_to_s3(risk_events, 'risks')
    
            # Update state
            collector.save_collection_time(current_time)
    
            return {
                'statusCode': 200,
                'body': json.dumps({
                    'message': 'Censys data collection completed successfully',
                    'logbook_events': len(logbook_events),
                    'risk_events': len(risk_events),
                    'collection_time': current_time.strftime('%Y-%m-%dT%H:%M:%SZ')
                })
            }
    
        except Exception as e:
            logger.error(f"Lambda execution failed: {str(e)}")
            return {
                'statusCode': 500,
                'body': json.dumps({
                    'error': str(e)
                })
            }
    
  2. Klicken Sie auf Konfiguration> Umgebungsvariablen> Bearbeiten> Neue Umgebungsvariable hinzufügen.

  3. Geben Sie die folgenden Umgebungsvariablen ein und ersetzen Sie die Platzhalter durch Ihre Werte:

    Schlüssel Beispielwert
    S3_BUCKET censys-logs
    S3_PREFIX censys/
    STATE_KEY censys/state.json
    CENSYS_API_KEY <your-censys-api-key>
    CENSYS_ORG_ID <your-organization-id>
    API_BASE https://api.platform.censys.io
  4. Bleiben Sie nach dem Erstellen der Funktion auf der zugehörigen Seite oder öffnen Sie Lambda > Funktionen > Ihre Funktion.

  5. Wählen Sie den Tab Konfiguration aus.

  6. Klicken Sie im Bereich Allgemeine Konfiguration auf Bearbeiten.

  7. Ändern Sie Zeitlimit in 5 Minuten (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:
    • Wiederkehrender Zeitplan: Preis (1 hour).
    • Ziel: Ihre Lambda-Funktion censys-data-collector.
    • Name: censys-data-collector-1h.
  3. Klicken Sie auf Zeitplan erstellen.

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

  1. Rufen Sie in der AWS-Konsole IAM > Nutzer > Nutzer hinzufügen auf.
  2. Klicken Sie auf Add users (Nutzer hinzufügen).
  3. Geben Sie die folgenden Konfigurationsdetails an:
    • Nutzer: secops-reader.
    • Zugriffstyp: Zugriffsschlüssel – programmatischer Zugriff.
  4. Klicken Sie auf Nutzer erstellen.
  5. Minimale Leseberechtigung (benutzerdefiniert) anhängen: Nutzer > secops-reader > Berechtigungen > Berechtigungen hinzufügen > Richtlinien direkt anhängen > Richtlinie erstellen.
  6. Geben Sie im JSON-Editor die folgende Richtlinie ein:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": ["s3:GetObject"],
          "Resource": "arn:aws:s3:::censys-logs/*"
        },
        {
          "Effect": "Allow",
          "Action": ["s3:ListBucket"],
          "Resource": "arn:aws:s3:::censys-logs"
        }
      ]
    }
    
  7. Legen Sie secops-reader-policy als Name fest.

  8. Gehen Sie zu Richtlinie erstellen> suchen/auswählen > Weiter > Berechtigungen hinzufügen.

  9. Rufen Sie Sicherheitsanmeldedaten > Zugriffsschlüssel > Zugriffsschlüssel erstellen auf.

  10. Laden Sie die CSV herunter (diese Werte werden in den Feed eingegeben).

Feed in Google SecOps konfigurieren, um Censys-Logs aufzunehmen

  1. Rufen Sie die SIEM-Einstellungen > Feeds auf.
  2. Klicken Sie auf + Neuen Feed hinzufügen.
  3. Geben Sie im Feld Feed name (Feedname) einen Namen für den Feed ein, z. B. Censys logs.
  4. Wählen Sie Amazon S3 V2 als Quelltyp aus.
  5. Wählen Sie CENSYS als Logtyp aus.
  6. Klicken Sie auf Weiter.
  7. Geben Sie Werte für die folgenden Eingabeparameter an:
    • S3-URI: s3://censys-logs/censys/
    • Optionen zum Löschen von Quellen: 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: Zugriffsschlüssel des Nutzers mit Zugriff auf den S3-Bucket.
    • Secret Access Key (Geheimer Zugriffsschlüssel): Geheimer Nutzersicherheitsschlüssel mit Zugriff auf den S3-Bucket.
    • Asset-Namespace: der Asset-Namespace.
    • Aufnahmelabels: Das Label, das auf die Ereignisse aus diesem Feed angewendet wird.
  8. Klicken Sie auf Weiter.
  9. Prüfen Sie die neue Feedkonfiguration auf dem Bildschirm Abschließen und klicken Sie dann auf Senden.

UDM-Zuordnungstabelle

Logfeld UDM-Zuordnung Logik
assetId read_only_udm.principal.asset.hostname Wenn das Feld „assetId“ keine IP-Adresse ist, wird es „principal.asset.hostname“ zugeordnet.
assetId read_only_udm.principal.asset.ip Wenn das Feld „assetId“ eine IP-Adresse ist, wird es „principal.asset.ip“ zugeordnet.
assetId read_only_udm.principal.hostname Wenn das Feld „assetId“ keine IP-Adresse ist, wird es „principal.hostname“ zugeordnet.
assetId read_only_udm.principal.ip Wenn das Feld „assetId“ eine IP-Adresse ist, wird es „principal.ip“ zugeordnet.
associatedAt read_only_udm.security_result.detection_fields.value Das Feld „associatedAt“ wird „security_result.detection_fields.value“ zugeordnet.
autonomousSystem.asn read_only_udm.additional.fields.value.string_value Das Feld „autonomousSystem.asn“ wird in einen String konvertiert und mit dem Schlüssel „autonomousSystem_asn“ dem Feld „additional.fields.value.string_value“ zugeordnet.
autonomousSystem.bgpPrefix read_only_udm.additional.fields.value.string_value Das Feld „autonomousSystem.bgpPrefix“ wird mit dem Schlüssel „autonomousSystem_bgpPrefix“ dem Feld „additional.fields.value.string_value“ zugeordnet.
Banner read_only_udm.principal.resource.attribute.labels.value Das Bannerfeld wird mit dem Schlüssel „banner“ dem Feld „principal.resource.attribute.labels.value“ zugeordnet.
Cloud read_only_udm.metadata.vendor_name Das Cloud-Feld wird metadata.vendor_name zugeordnet.
comments.refUrl read_only_udm.network.http.referral_url Das Feld „comments.refUrl“ wird „network.http.referral_url“ zugeordnet.
data.cve read_only_udm.additional.fields.value.string_value Das Feld „data.cve“ wird „additional.fields.value.string_value“ mit dem Schlüssel „data_cve“ zugeordnet.
data.cvss read_only_udm.additional.fields.value.string_value Das Feld „data.cvss“ wird mit dem Schlüssel „data_cvss“ dem Feld „additional.fields.value.string_value“ zugeordnet.
data.ipAddress read_only_udm.principal.asset.ip Wenn das Feld „data.ipAddress“ nicht mit dem Feld „assetId“ übereinstimmt, wird es „principal.asset.ip“ zugeordnet.
data.ipAddress read_only_udm.principal.ip Wenn das Feld „data.ipAddress“ nicht mit dem Feld „assetId“ übereinstimmt, wird es „principal.ip“ zugeordnet.
data.location.city read_only_udm.principal.location.city Wenn das Feld „location.city“ leer ist, wird das Feld „data.location.city“ dem Feld „principal.location.city“ zugeordnet.
data.location.countryCode read_only_udm.principal.location.country_or_region Wenn das Feld „location.country“ leer ist, wird das Feld „data.location.countryCode“ dem Feld „principal.location.country_or_region“ zugeordnet.
data.location.latitude read_only_udm.principal.location.region_coordinates.latitude Wenn die Felder „location.coordinates.latitude“ und „location.geoCoordinates.latitude“ leer sind, wird das Feld „data.location.latitude“ in einen Gleitkommawert konvertiert und „principal.location.region_coordinates.latitude“ zugeordnet.
data.location.longitude read_only_udm.principal.location.region_coordinates.longitude Wenn die Felder „location.coordinates.longitude“ und „location.geoCoordinates.longitude“ leer sind, wird das Feld „data.location.longitude“ in einen Gleitkommawert konvertiert und „principal.location.region_coordinates.longitude“ zugeordnet.
data.location.province read_only_udm.principal.location.state Wenn das Feld „location.province“ leer ist, wird das Feld „data.location.province“ dem Feld „principal.location.state“ zugeordnet.
data.mailServers read_only_udm.additional.fields.value.list_value.values.string_value Jedes Element im Array „data.mailServers“ wird einem separaten „additional.fields“-Eintrag mit dem Schlüssel „Mail Servers“ und dem Wert „value.list_value.values.string_value“ zugeordnet, der auf den Elementwert festgelegt ist.
data.names.forwardDns[].name read_only_udm.network.dns.questions.name Jedes Element im Array „data.names.forwardDns“ wird einem separaten Eintrag „network.dns.questions“ zugeordnet, wobei das Feld „name“ auf das Feld „name“ des Elements festgelegt ist.
data.nameServers read_only_udm.additional.fields.value.list_value.values.string_value Jedes Element im Array „data.nameServers“ wird einem separaten „additional.fields“-Eintrag mit dem Schlüssel „Name nameServers“ und dem Wert „value.list_value.values.string_value“ zugeordnet, der auf den Elementwert festgelegt ist.
data.protocols[].transportProtocol read_only_udm.network.ip_protocol Wenn das Feld „data.protocols[].transportProtocol“ einen der folgenden Werte hat: TCP, EIGRP, ESP, ETHERIP, GRE, ICMP, IGMP, IP6IN4, PIM, UDP oder VRRP, wird es dem Feld „network.ip_protocol“ zugeordnet.
data.protocols[].transportProtocol read_only_udm.principal.resource.attribute.labels.value Das Feld „data.protocols[].transportProtocol“ wird mit dem Schlüssel „data_protocols {index}“ dem Feld „principal.resource.attribute.labels.value“ zugeordnet.
http.request.headers[].key, http.request.headers[].value.headers.0 read_only_udm.network.http.user_agent Wenn das Feld „http.request.headers[].key“ „User-Agent“ ist, wird das entsprechende Feld „http.request.headers[].value.headers.0“ dem Feld „network.http.user_agent“ zugeordnet.
http.request.headers[].key, http.request.headers[].value.headers.0 read_only_udm.network.http.parsed_user_agent Wenn das Feld „http.request.headers[].key“ „User-Agent“ ist, wird das entsprechende Feld „http.request.headers[].value.headers.0“ als User-Agent-String geparst und „network.http.parsed_user_agent“ zugeordnet.
http.request.headers[].key, http.request.headers[].value.headers.0 read_only_udm.principal.resource.attribute.labels.key, read_only_udm.principal.resource.attribute.labels.value Für jedes Element im Array „http.request.headers“ wird das Schlüsselfeld „key“ dem Feld „principal.resource.attribute.labels.key“ und das Feld „value.headers.0“ dem Feld „principal.resource.attribute.labels.value“ zugeordnet.
http.request.uri read_only_udm.principal.asset.hostname Der Hostname des Felds „http.request.uri“ wird extrahiert und „principal.asset.hostname“ zugeordnet.
http.request.uri read_only_udm.principal.hostname Der Hostname des Felds „http.request.uri“ wird extrahiert und „principal.hostname“ zugeordnet.
http.response.body read_only_udm.principal.resource.attribute.labels.value Das Feld „http.response.body“ wird mit dem Schlüssel „http_response_body“ dem Feld „principal.resource.attribute.labels.value“ zugeordnet.
http.response.headers[].key, http.response.headers[].value.headers.0 read_only_udm.target.hostname Wenn das Feld „http.response.headers[].key“ „Server“ ist, wird das entsprechende Feld „http.response.headers[].value.headers.0“ dem Feld „target.hostname“ zugeordnet.
http.response.headers[].key, http.response.headers[].value.headers.0 read_only_udm.principal.resource.attribute.labels.key, read_only_udm.principal.resource.attribute.labels.value Für jedes Element im Array „http.response.headers“ wird das Feld „key“ dem Feld „principal.resource.attribute.labels.key“ und das Feld „value.headers.0“ dem Feld „principal.resource.attribute.labels.value“ zugeordnet.
http.response.statusCode read_only_udm.network.http.response_code Das Feld „http.response.statusCode“ wird in eine Ganzzahl konvertiert und „network.http.response_code“ zugeordnet.
ip read_only_udm.target.asset.ip Das Feld „ip“ wird „target.asset.ip“ zugeordnet.
ip read_only_udm.target.ip Das Feld „ip“ wird „target.ip“ zugeordnet.
isSeed read_only_udm.additional.fields.value.string_value Das Feld „isSeed“ wird in einen String konvertiert und dem Feld „additional.fields.value.string_value“ mit dem Schlüssel „isSeed“ zugeordnet.
location.city read_only_udm.principal.location.city Das Feld „location.city“ wird „principal.location.city“ zugeordnet.
location.continent read_only_udm.additional.fields.value.string_value Das Feld „location.continent“ wird mit dem Schlüssel „location_continent“ dem Feld „additional.fields.value.string_value“ zugeordnet.
location.coordinates.latitude read_only_udm.principal.location.region_coordinates.latitude Das Feld „location.coordinates.latitude“ wird in einen Gleitkommawert konvertiert und „principal.location.region_coordinates.latitude“ zugeordnet.
location.coordinates.longitude read_only_udm.principal.location.region_coordinates.longitude Das Feld „location.coordinates.longitude“ wird in einen Gleitkommawert umgewandelt und „principal.location.region_coordinates.longitude“ zugeordnet.
location.country read_only_udm.principal.location.country_or_region Das Feld „location.country“ wird „principal.location.country_or_region“ zugeordnet.
location.geoCoordinates.latitude read_only_udm.principal.location.region_coordinates.latitude Wenn das Feld „location.coordinates.latitude“ leer ist, wird das Feld „location.geoCoordinates.latitude“ in einen Gleitkommawert konvertiert und „principal.location.region_coordinates.latitude“ zugeordnet.
location.geoCoordinates.longitude read_only_udm.principal.location.region_coordinates.longitude Wenn das Feld „location.coordinates.longitude“ leer ist, wird das Feld „location.geoCoordinates.longitude“ in einen Gleitkommawert umgewandelt und „principal.location.region_coordinates.longitude“ zugeordnet.
location.postalCode read_only_udm.additional.fields.value.string_value Das Feld „location.postalCode“ wird mit dem Schlüssel „Postal code“ dem Feld „additional.fields.value.string_value“ zugeordnet.
location.province read_only_udm.principal.location.state Das Feld „location.province“ wird dem Feld „principal.location.state“ zugeordnet.
Vorgang read_only_udm.security_result.action_details Das Feld „operation“ wird „security_result.action_details“ zugeordnet.
perspectiveId read_only_udm.principal.group.product_object_id Das Feld „perspectiveId“ wird „principal.group.product_object_id“ zugeordnet.
Port read_only_udm.principal.port Das Portfeld wird in eine Ganzzahl konvertiert und principal.port zugeordnet.
risks[].severity, risks[].title read_only_udm.security_result.category_details Das Feld „risks[].severity“ wird mit dem Feld „risks[].title“ verkettet und „security_result.category_details“ zugeordnet.
serviceName read_only_udm.network.application_protocol Wenn das Feld „serviceName“ „HTTP“ oder „HTTPS“ ist, wird es „network.application_protocol“ zugeordnet.
sourceIp read_only_udm.principal.asset.ip Das Feld „sourceIp“ wird „principal.asset.ip“ zugeordnet.
sourceIp read_only_udm.principal.ip Das Feld „sourceIp“ wird „principal.ip“ zugeordnet.
timestamp read_only_udm.metadata.event_timestamp Das Zeitstempelfeld wird als Zeitstempel geparst und metadata.event_timestamp zugeordnet.
transportFingerprint.id read_only_udm.metadata.product_log_id Das Feld „transportFingerprint.id“ wird in einen String konvertiert und „metadata.product_log_id“ zugeordnet.
transportFingerprint.raw read_only_udm.additional.fields.value.string_value Das Feld „transportFingerprint.raw“ wird „additional.fields.value.string_value“ mit dem Schlüssel „transportFingerprint_raw“ zugeordnet.
Typ read_only_udm.metadata.product_event_type Das Feld „type“ wird „metadata.product_event_type“ zugeordnet.
- read_only_udm.metadata.product_name Der Wert „CENSYS_ASM“ wird metadata.product_name zugewiesen.
- read_only_udm.metadata.vendor_name Der Wert „CENSYS“ wird metadata.vendor_name zugewiesen.
- read_only_udm.metadata.event_type Der Ereignistyp wird anhand des Vorhandenseins bestimmter Felder bestimmt: NETWORK_CONNECTION, wenn „has_princ_machine_id“ und „has_target_machine“ „true“ sind und „has_network_flow“ „false“ ist, NETWORK_DNS, wenn „has_network_flow“ „true“ ist, STATUS_UPDATE, wenn „has_princ_machine_id“ „true“ ist, und GENERIC_EVENT andernfalls.

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