איסוף יומנים של התראות Dataminr

גרסת מנתח הנתונים: 2.0

נתמך ב:

במאמר הזה מוסבר איך להטמיע יומני Dataminr Alerts ב-Google Security Operations באמצעות Google Cloud Storage V2, פונקציה של Cloud Run ו-Cloud Scheduler.

‫Dataminr Pulse מספקת תובנות בזמן אמת שמבוססות על AI מתוך יותר מ-500,000 מקורות נתונים ציבוריים גלובליים, כולל הרשת העמוקה והאפלה. הפלטפורמה מספקת אזהרות מוקדמות לגבי איומי סייבר חדשים, נקודות חולשה, מתקפות של תוכנות כופר, פרצות אבטחה וסיכונים דיגיטליים שמשפיעים על הארגון ועל צדדים שלישיים. ה-API של Dataminr Pulse משתמש באימות של פרטי כניסה של לקוח OAuth 2.0 ובחלוקה לעמודים מבוססת-סמן כדי לאחזר התראות.

לפני שמתחילים

חשוב לוודא שמתקיימות הדרישות המוקדמות הבאות:

  • מופע של Google SecOps
  • פרויקט ב-Google Cloud עם ממשקי ה-API הבאים שמופעלים בו:
    • Cloud Storage API
    • Cloud Run functions API
    • Cloud Scheduler API
    • Cloud Pub/Sub API
  • הרשאות ליצירה ולניהול של קטגוריות GCS, פונקציות Cloud Run, נושאי Pub/Sub ועבודות Cloud Scheduler
  • הרשאות לניהול מדיניות IAM בקטגוריות GCS
  • חשבון פעיל ב-Dataminr Pulse עם גישה ל-API
  • פרטי הכניסה ל-Dataminr Pulse API (מזהה לקוח וסוד לקוח)
  • לפחות רשימת התראות אחת של Dataminr Pulse שהוגדרה בחשבון Dataminr

יצירת קטגוריה של Google Cloud Storage

  1. נכנסים אל מסוף Google Cloud.
  2. בוחרים פרויקט או יוצרים פרויקט חדש.
  3. בתפריט הניווט, עוברים אל Cloud Storage > Buckets.
  4. לוחצים על Create bucket.
  5. מזינים את פרטי ההגדרה הבאים:

    הגדרה ערך
    Name your bucket (שם הקטגוריה) מזינים שם ייחודי גלובלית (לדוגמה, dataminr-alert-logs)
    סוג מיקום בוחרים לפי הצרכים שלכם (אזור, בשני אזורים, במספר אזורים)
    Location בוחרים את המיקום (לדוגמה, us-central1).
    סוג אחסון (storage class) רגיל (מומלץ ליומנים שמתבצעת אליהם גישה לעיתים קרובות)
    בקרת גישה אחיד (מומלץ)
    כלים להגנה אופציונלי: הפעלת ניהול גרסאות של אובייקטים או מדיניות שמירת נתונים
  6. לוחצים על יצירה.

איסוף פרטי הכניסה ל-Dataminr

כדי לאפשר לפונקציית Cloud Run לאחזר נתוני התראות, צריך לקבל מנציג Dataminr בחשבון שלכם פרטי כניסה ל-API עם אימות פרטי לקוח OAuth 2.0.

קבלת פרטי כניסה ל-API

  1. כדי לבקש גישה ל-API, צריך לפנות לנציג התמיכה או לאיש הקשר שאחראי לחשבון שלכם ב-Dataminr.
  2. מציינים את הפרטים הבאים:
    • שם הארגון
    • תרחיש לדוגמה: שילוב עם Google Chronicle SIEM
    • הגישה הנדרשת: Dataminr Pulse API for Cyber Risk
  3. Dataminr מספקת פרטי כניסה ל-API ונותנת לכם:

    • Client ID: מזהה הלקוח הייחודי שלכם ב-OAuth 2.0
    • סוד הלקוח: מפתח הסוד של לקוח OAuth 2.0

אימות פרטי הכניסה ל-API

  • כדי לוודא שהפרטים שלכם תקינים, מריצים את הפקודה הבאה:

    curl -X POST https://gateway.dataminr.com/auth/2/token \
      -H "Content-Type: application/x-www-form-urlencoded" \
      -d "client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&grant_type=api_key"
    

    תגובה מוצלחת מחזירה אובייקט JSON שמכיל שדה access_token:

    {
      "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI...",
      "token_type": "Bearer",
      "expire": 3600
    }
    

איסוף מזהים של רשימת התראות

  1. נכנסים לאפליקציית האינטרנט Dataminr Pulse בכתובת https://app.dataminr.com.
  2. עוברים לרשימות ההתראות (רשימות המעקב) שהגדרתם.
  3. רושמים את המזהים של רשימות ההתראות שרוצים להעביר ל-Google SecOps.

יצירת חשבון שירות לפונקציית Cloud Run

  1. ב-מסוף Google Cloud, עוברים אל IAM & Admin > חשבונות שירות.
  2. לוחצים על יצירת חשבון שירות.
  3. מזינים את פרטי ההגדרה הבאים:
    • שם חשבון השירות: מזינים dataminr-alert-collector
    • תיאור חשבון השירות: מזינים Service account for Dataminr Alerts Cloud Run function to write alert data to GCS
  4. לוחצים על יצירה והמשך.
  5. בקטע Grant this service account access to project (מתן גישה של חשבון השירות הזה לפרויקט), מוסיפים את התפקידים הבאים:
    1. לוחצים על Select a role, מחפשים את התפקיד Storage Object Admin ובוחרים בו.
    2. לוחצים על Add Another Role (הוספת תפקיד נוסף), מחפשים את התפקיד Cloud Run Invoker (הפעלת Cloud Run) ובוחרים בו.
  6. לוחצים על Continue.
  7. לוחצים על סיום.

מתן הרשאות IAM בקטגוריית GCS

  1. נכנסים אל Cloud Storage > Buckets (קטגוריות).
  2. לוחצים על שם הקטגוריה (לדוגמה, dataminr-alert-logs).
  3. עוברים לכרטיסייה Permissions.
  4. לוחצים על הענקת גישה.
  5. מזינים את פרטי ההגדרה הבאים:
    • Add principals (הוספת ישויות מורשות): מזינים את כתובת האימייל בחשבון השירות (לדוגמה, dataminr-alert-collector@PROJECT_ID.iam.gserviceaccount.com).
    • הקצאת תפקידים: בוחרים באפשרות אדמין של אובייקטים באחסון.
  6. לוחצים על Save.

יוצרים נושא Pub/Sub

נושא Pub/Sub מפעיל את פונקציית Cloud Run כש-Cloud Scheduler מפרסם הודעה.

  1. במסוף Google Cloud, עוברים אל Pub/Sub > Topics.
  2. לוחצים על יצירת נושא.
  3. מזינים את פרטי ההגדרה הבאים:
    • מזהה הנושא: מזינים dataminr-alert-trigger
    • הוספת מינוי ברירת מחדל: משאירים את התיבה מסומנת
  4. לוחצים על יצירה.

יצירת פונקציית Cloud Run

  1. במסוף Google Cloud, עוברים אל Cloud Run functions.
  2. לוחצים על יצירת פונקציה.
  3. מזינים את פרטי ההגדרה הבאים:

    הגדרה ערך
    סביבה דור שני
    שם הפונקציה dataminr-alert-collector
    אזור בוחרים את אותו אזור כמו בדלי GCS
    סוג הטריגר Cloud Pub/Sub
    נושא Pub/Sub dataminr-alert-trigger
    הזיכרון שהוקצה ‫512 MiB
    פסק זמן ‫540 שניות
    חשבון שירות בזמן ריצה dataminr-alert-collector
  4. לוחצים על הבא.

  5. מגדירים את Runtime ל-Python 3.12.

  6. מגדירים את Entry point ל-main.

  7. מוסיפים את יחסי התלות הבאים לקובץ requirements.txt:

    functions-framework==3.*
    google-cloud-storage==2.*
    requests==2.*
    
  8. בקובץ main.py, מדביקים את הקוד הבא:

    import functions_framework
    import json
    import os
    import logging
    import time
    from datetime import datetime, timedelta, timezone
    from google.cloud import storage
    import requests
    
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.INFO)
    
    storage_client = storage.Client()
    
    TOKEN_URL = "https://gateway.dataminr.com/auth/2/token"
    ALERTS_URL = "https://gateway.dataminr.com/api/3/alerts"
    
    def _get_access_token(client_id: str, client_secret: str) -> str:
        """Obtain an OAuth 2.0 access token from Dataminr."""
        payload = {
            "client_id": client_id,
            "client_secret": client_secret,
            "grant_type": "api_key",
        }
        headers = {"Content-Type": "application/x-www-form-urlencoded"}
        resp = requests.post(TOKEN_URL, data=payload, headers=headers, timeout=30)
        resp.raise_for_status()
        token_data = resp.json()
        access_token = token_data.get("access_token")
        if not access_token:
            raise ValueError("No access_token in token response")
        logger.info("Successfully obtained Dataminr access token.")
        return access_token
    
    def _load_state(bucket_name: str, state_key: str) -> dict:
        """Load the last cursor (alertId) from GCS."""
        try:
            bucket = storage_client.bucket(bucket_name)
            blob = bucket.blob(state_key)
            if blob.exists():
                data = json.loads(blob.download_as_text())
                logger.info(f"Loaded state: {data}")
                return data
        except Exception as e:
            logger.warning(f"State read error: {e}")
        logger.info("No previous state found.")
        return {}
    
    def _save_state(bucket_name: str, state_key: str, state: dict) -> None:
        """Save the cursor state to GCS."""
        bucket = storage_client.bucket(bucket_name)
        blob = bucket.blob(state_key)
        blob.upload_from_string(
            json.dumps(state), content_type="application/json"
        )
        logger.info(f"Saved state: {state}")
    
    def _fetch_alerts(
        access_token: str,
        alert_lists: str,
        page_size: int,
        cursor: str = None,
    ) -> tuple:
        """Fetch a page of alerts from the Dataminr Pulse API."""
        headers = {
            "Authorization": f"Bearer {access_token}",
            "Accept": "application/json",
        }
        params = {
            "lists": alert_lists,
            "num": page_size,
        }
        if cursor:
            params["from"] = cursor
    
        resp = requests.get(
            ALERTS_URL, headers=headers, params=params, timeout=60
        )
    
        # Handle rate limiting via response headers
        rate_remaining = resp.headers.get("x-ratelimit-remaining")
        rate_reset = resp.headers.get("x-ratelimit-reset")
    
        if resp.status_code == 429:
            reset_time = int(rate_reset) if rate_reset else 60
            wait_seconds = max(reset_time - int(time.time()), 1)
            logger.warning(
                f"Rate limited. Waiting {wait_seconds}s before retry."
            )
            time.sleep(wait_seconds)
            resp = requests.get(
                ALERTS_URL, headers=headers, params=params, timeout=60
            )
    
        resp.raise_for_status()
    
        if rate_remaining is not None:
            logger.info(
                f"Rate limit remaining: {rate_remaining}, reset: {rate_reset}"
            )
    
        data = resp.json()
        alerts = data if isinstance(data, list) else data.get("data", [])
        return alerts
    
    @functions_framework.cloud_event
    def main(cloud_event):
        """Cloud Run function entry point triggered by Pub/Sub."""
        bucket_name = os.environ["GCS_BUCKET"]
        prefix = os.environ.get("GCS_PREFIX", "dataminr_alerts")
        state_key = os.environ.get("STATE_KEY", "dataminr_state/cursor.json")
        client_id = os.environ["CLIENT_ID"]
        client_secret = os.environ["CLIENT_SECRET"]
        alert_lists = os.environ["ALERT_LISTS"]
        max_records = int(os.environ.get("MAX_RECORDS", "1000"))
        page_size = min(int(os.environ.get("PAGE_SIZE", "40")), 40)
        lookback_hours = int(os.environ.get("LOOKBACK_HOURS", "24"))
    
        try:
            access_token = _get_access_token(client_id, client_secret)
            state = _load_state(bucket_name, state_key)
            cursor = state.get("last_cursor")
            is_first_run = cursor is None
    
            all_alerts = []
            total_fetched = 0
            pages_fetched = 0
    
            while total_fetched < max_records:
                logger.info(
                    f"Fetching page {pages_fetched + 1} (cursor: {cursor})..."
                )
                alerts = _fetch_alerts(
                    access_token, alert_lists, page_size, cursor=cursor
                )
    
                if not alerts:
                    logger.info("No more alerts returned. Stopping pagination.")
                    break
    
                # Filter by lookback window on first run (no prior cursor)
                if is_first_run:
                    cutoff_ms = int(
                        (
                            datetime.now(timezone.utc)
                            - timedelta(hours=lookback_hours)
                        ).timestamp()
                        * 1000
                    )
                    alerts = [
                        a for a in alerts if a.get("eventTime", 0) >= cutoff_ms
                    ]
    
                all_alerts.extend(alerts)
                total_fetched += len(alerts)
                pages_fetched += 1
    
                # Update cursor to the last alertId in this page
                last_alert = alerts[-1] if alerts else None
                if last_alert and "alertId" in last_alert:
                    cursor = last_alert["alertId"]
                else:
                    break
    
                # Stop if we received fewer alerts than requested
                if len(alerts) < page_size:
                    logger.info("Received partial page. Stopping pagination.")
                    break
    
            logger.info(
                f"Collected {len(all_alerts)} alerts across {pages_fetched} pages."
            )
    
            if not all_alerts:
                logger.info("No new alerts to write.")
                return "No new alerts", 200
    
            # Write alerts as NDJSON to GCS
            now_str = datetime.now(timezone.utc).strftime("%Y%m%dT%H%M%SZ")
            blob_path = f"{prefix}/{now_str}.ndjson"
            ndjson_body = "\n".join(
                json.dumps(alert, separators=(",", ":")) for alert in all_alerts
            )
    
            bucket = storage_client.bucket(bucket_name)
            blob = bucket.blob(blob_path)
            blob.upload_from_string(
                ndjson_body, content_type="application/x-ndjson"
            )
    
            _save_state(
                bucket_name,
                state_key,
                {
                    "last_cursor": cursor,
                    "last_run": datetime.now(timezone.utc).isoformat(),
                },
            )
    
            msg = (
                f"Wrote {len(all_alerts)} alerts to "
                f"gs://{bucket_name}/{blob_path}"
            )
            logger.info(msg)
            return msg, 200
    
        except Exception as e:
            logger.error(f"Error collecting Dataminr alerts: {e}")
            raise
    
  9. לוחצים על פריסה.

  10. מחכים שהפונקציה תופעל. הסטטוס משתנה לסימן וי ירוק כשהפריסה מסתיימת.

הגדרת משתני סביבה

  1. אחרי שהפונקציה נפרסת, עוברים אל Cloud Run Functions > dataminr-alert-collector.
  2. לוחצים על עריכה ופריסה של גרסה חדשה.
  3. לוחצים על הכרטיסייה Variables and Secrets (משתנים וסודות) (או מרחיבים את Runtime, build, connections and security settings (הגדרות של זמן ריצה, build, חיבורים ואבטחה) בדור הראשון).
  4. מוסיפים את משתני הסביבה הבאים:

    מפתח ערך לדוגמה
    GCS_BUCKET dataminr-alert-logs
    GCS_PREFIX dataminr_alerts
    STATE_KEY dataminr_state/cursor.json
    CLIENT_ID מזהה הלקוח שלכם ב-OAuth 2.0 של Dataminr
    CLIENT_SECRET הסוד של לקוח OAuth 2.0 של Dataminr
    ALERT_LISTS רשימה של מזהי התראות של Dataminr, מופרדים בפסיקים
    MAX_RECORDS 1000
    PAGE_SIZE 40
    LOOKBACK_HOURS 24
  5. לוחצים על פריסה.

יצירת משימה ב-Cloud Scheduler

‫Cloud Scheduler מפרסם הודעה בנושא Pub/Sub לפי לוח זמנים, וכך מפעיל את פונקציית Cloud Run כדי לבצע סקר ב-Dataminr Pulse לגבי התראות חדשות.

  1. במסוף Google Cloud, עוברים אל Cloud Scheduler.
  2. לוחצים על יצירת משימה.
  3. מזינים את פרטי ההגדרה הבאים:

    הגדרה ערך
    שם dataminr-alert-poll
    אזור בוחרים את אותו אזור כמו הפונקציה
    תדירות */5 * * * * (כל 5 דקות)
    אזור זמן בוחרים את אזור הזמן (לדוגמה, UTC)
  4. לוחצים על Continue.

  5. בקטע Configure the execution (הגדרת ההפעלה):

    • Target type (סוג היעד): בוחרים באפשרות Pub/Sub.
    • נושא: בוחרים באפשרות dataminr-alert-trigger
    • גוף ההודעה: מזינים {"poll": true}
  6. לוחצים על יצירה.

אימות פונקציית Cloud Run

  1. ב-Cloud Scheduler, מאתרים את המשימה dataminr-alert-poll.
  2. לוחצים על הפעלה מאולצת כדי להפעיל ביצוע מיידי.
  3. עוברים אל Cloud Run Functions > dataminr-alert-collector > Logs.
  4. כדי לוודא שהפונקציה בוצעה בהצלחה, בודקים אם יש רשומות ביומן כמו:

    Successfully obtained Dataminr access token.
    Fetching page 1 (cursor: None)...
    Collected 35 alerts across 1 pages.
    Wrote 35 alerts to gs://dataminr-alert-logs/dataminr_alerts/20250115T103000Z.ndjson
    
  5. עוברים אל Cloud Storage > Buckets > dataminr-alert-logs.

  6. עוברים לקידומת dataminr_alerts/.

  7. מוודאים שקובצי NDJSON נוצרים עם נתוני התראות של Dataminr.

אחזור חשבון השירות של Google SecOps והגדרת הפיד

‫Google SecOps משתמש בחשבון שירות ייחודי כדי לקרוא נתונים ממאגר GCS שלכם. צריך להעניק לחשבון השירות הזה גישה לדלי.

קבלת כתובת האימייל בחשבון השירות

  1. עוברים אל SIEM Settings > Feeds (הגדרות SIEM > פידים).
  2. לוחצים על הוספת פיד חדש.
  3. לוחצים על הגדרת פיד יחיד.
  4. בשדה שם הפיד, מזינים שם לפיד (לדוגמה, Dataminr Alerts).
  5. בוחרים באפשרות Google Cloud Storage V2 בתור סוג המקור.
  6. בוחרים באפשרות Dataminr Alerts (התראות Dataminr) בתור סוג היומן.
  7. לוחצים על Get Service Account (קבלת חשבון שירות).
  8. תוצג כתובת האימייל בחשבון שירות ייחודי, לדוגמה:

    chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com
    
  9. מעתיקים את כתובת האימייל הזו לשימוש בקטע הבא.

  10. לוחצים על הבא.

  11. מציינים ערכים לפרמטרים הבאים של הקלט:

    • כתובת ה-URL של קטגוריית האחסון: מזינים את ה-URI של קטגוריית GCS עם נתיב הקידומת:

      gs://dataminr-alert-logs/dataminr_alerts/
      
    • אפשרות למחיקת המקור: בוחרים את אפשרות המחיקה לפי ההעדפה שלכם:

      • אף פעם: לא נמחקים קבצים אחרי ההעברה (מומלץ לבדיקות).
      • מחיקת קבצים שהועברו: הקבצים נמחקים אחרי שההעברה מסתיימת בהצלחה.
      • מחיקת קבצים שהועברו וספריות ריקות: מחיקת קבצים וספריות ריקות אחרי שההעברה מסתיימת בהצלחה.

    • הגיל המקסימלי של הקובץ: כולל קבצים ששונו במספר הימים האחרון (ברירת המחדל היא 180 ימים).

    • מרחב שמות של נכס: asset namespace.

    • תוויות להעלאת נתונים: התווית שתצורף לאירועים מהפיד הזה (לדוגמה, DATAMINR_ALERT).

  12. לוחצים על הבא.

  13. בודקים את ההגדרות של הפיד החדש במסך סיום ולוחצים על שליחה.

הענקת הרשאות IAM לחשבון השירות של Google SecOps

לחשבון השירות של Google SecOps צריכה להיות ההרשאה צפייה באובייקט אחסון בקטגוריה של GCS.

  1. נכנסים אל Cloud Storage > Buckets (קטגוריות).
  2. לוחצים על שם הקטגוריה (לדוגמה, dataminr-alert-logs).
  3. עוברים לכרטיסייה Permissions.
  4. לוחצים על הענקת גישה.
  5. מזינים את פרטי ההגדרה הבאים:
    • Add principals (הוספת ישויות מורשות): מדביקים את כתובת האימייל בחשבון של חשבון השירות של Google SecOps.
    • הקצאת תפקידים: בוחרים באפשרות צפייה באובייקט אחסון.
  6. לוחצים על Save.

טבלת מיפוי UDM

שדה היומן מיפוי UDM לוגיקה
alertId metadata.product_log_id הערך הועתק ישירות
alertType.color about.labels.alertType_color הערך הועתק ישירות
alertType.id about.labels.alertType_id הערך הועתק ישירות
alertType.name about.labels.alertType_name הערך הועתק ישירות
availableRelatedAlerts about.labels.availableRelatedAlerts הומר למחרוזת
כיתוב metadata.description הערך הועתק ישירות
cat.name security_result.category_details הערך הועתק ישירות
cat.id security_result.detection_fields.categories_id הערך הועתק ישירות
cat.idStr security_result.detection_fields.categories_idStr הערך הועתק ישירות
cat.path security_result.detection_fields.categories_path הערך הועתק ישירות
cat.requested security_result.detection_fields.categories_requested הערך הועתק ישירות
cat.retired security_result.detection_fields.categories_retired הומר למחרוזת
cat.topicType about.labels.categories_topicType הערך הועתק ישירות
cat.name security_result.category ‫POLICY_VIOLATION אם cat.name == "Cybersecurity - Policy";‏ NETWORK_MALICIOUS אם in ["Cybersecurity - Threats & Vulnerabilities", "Cybersecurity - Crime & Malicious Activity", "Threats & Precautions", "Threats"];‏ NETWORK_SUSPICIOUS אם =~ "Cybersecurity";‏ MAIL_PHISHING אם =~ "Email and Web Servers";‏ DATA_EXFILTRATION אם =~ "Data Exposure and Breaches";‏ POLICY_VIOLATION אם =~ "Government, Policy, & Political Affairs";‏ PHISHING אם =~ "(Malware
comp.dm_bucket.name security_result.about.resource.attribute.labels.dmbucket%{bucket.id} הערך הועתק ישירות
comp.dm_sector.name security_result.about.resource.attribute.labels.dmsector%{sector.id} הערך הועתק ישירות
comp.id security_result.about.resource.attribute.labels.companies_id הערך הועתק ישירות
comp.idStr security_result.about.resource.attribute.labels.companies_idStr הערך הועתק ישירות
comp.locations.city security_result.about.location.city הערך מ-loc.city אם loc_index == 0
comp.locations.country, comp.locations.state.symbol security_result.about.location.country_or_region המחרוזת המחוברת היא %{loc.country} - %{loc.state.symbol} אם loc_index == 0 ושני הערכים לא ריקים
comp.locations.postalCode security_result.about.resource.attribute.labels.locations_postalCode הערך מועתק ישירות אם loc_index == 0 והוא לא ריק
comp.locations.state.name security_result.about.location.state הערך מועתק ישירות אם loc_index == 0
comp.locations.city about.labels.loc_%{loc_index}_city הערך מועתק ישירות אם loc_index != 0 והוא לא ריק
comp.locations.country, comp.locations.state.symbol about.labels.loc_%{loc_index}_country_or_region המחרוזת המחוברת היא %{loc.country} - %{loc.state.symbol} אם loc_index != 0 ושני הערכים לא ריקים
comp.locations.postalCode securityresult.about.resource.attribute.labels.locations%{loc_index}_postalCode הערך מועתק ישירות אם loc_index != 0 והוא לא ריק
comp.locations.state.name about.labels.loc_%{loc_index}_state_name הערך מועתק ישירות אם loc_index != 0 והוא לא ריק
comp.name security_result.about.resource.name הערך הועתק ישירות
comp.requested security_result.about.resource.attribute.labels.companies_requested הערך הועתק ישירות
comp.retired security_result.about.resource.attribute.labels.companies_retired הומר למחרוזת
comp.ticker security_result.about.resource.attribute.labels.companies_ticker הערך הועתק ישירות
comp.topicType security_result.about.resource.attribute.labels.companies_topicType הערך הועתק ישירות
eventLocation.coordinates.0 principal.location.region_coordinates.latitude הערך הועתק ישירות
eventLocation.coordinates.1 principal.location.region_coordinates.longitude הערך הועתק ישירות
eventLocation.name principal.location.name הערך הועתק ישירות
eventLocation.places principal.labels.location_places הצטרפות ממערך עם מפריד פסיק
eventLocation.probability principal.labels.eventLocation_probability הומר למחרוזת
eventLocation.radius principal.labels.eventLocation_radius הומר למחרוזת
eventMapLargeURL principal.labels.eventMapLargeURL הערך הועתק ישירות
eventMapSmallURL principal.labels.eventMapSmallURL הערך הועתק ישירות
eventTime @timestamp ההמרה בוצעה מ-epoch ms לחותמת זמן
eventVolume about.labels.eventVolume הומר למחרוזת
expandAlertURL metadata.url_back_to_product הערך הועתק ישירות
expandMapURL principal.labels.expandMapURL הערך הועתק ישירות
headerColor about.labels.headerColor הערך הועתק ישירות
headerLabel about.labels.headerLabel הערך הועתק ישירות
metadata.cyber.addresses.ip principal.ip הערך מחולץ באמצעות תבנית grok אם index == 0
metadata.cyber.addresses.port principal.port הערך מועתק ישירות אם index == 0, מומר למספר שלם
metadata.cyber.addresses.port principal.labels.addresses_%{index}_port הערך מועתק ישירות אם האינדקס שונה מ-0
metadata.cyber.addresses.version principal.labels.metadata_cyberaddresses%{index}_version הערך הועתק ישירות
metadata.cyber.asns network.asn הערך מועתק ישירות אם index == 0
metadata.cyber.asns about.labels.metadatacyber%{index}_asn הערך מועתק ישירות אם האינדקס שונה מ-0
metadata.cyber.hashValues.value security_result.about.file.sha1 הערך מועתק ישירות אם הסוג הוא SHA1, באותיות קטנות
metadata.cyber.hashValues.value security_result.about.file.sha256 הערך מועתק ישירות אם הסוג הוא SHA256, באותיות קטנות
metadata.cyber.malwares security_result.associations.name הערך הועתק ישירות
metadata.cyber.malwares security_result.associations.type הגדרה ל-MALWARE
metadata.cyber.orgs network.organization_name הערך מועתק ישירות אם index == 0
metadata.cyber.orgs about.labels.metadatacyber%{index}_orgs הערך מועתק ישירות אם האינדקס שונה מ-0
metadata.cyber.products principal.application הערך מועתק ישירות אם index == 0
metadata.cyber.products principal.labels.metadata_cyberproducts%{index} הערך מועתק ישירות אם האינדקס שונה מ-0
metadata.cyber.threats security_result.threat_name הערך מועתק ישירות אם index == 0
metadata.cyber.threats security_result.about.labels.metadata_cyberthreats%{index} הערך מועתק ישירות אם האינדקס שונה מ-0
metadata.cyber.URLs security_result.about.url הערך מועתק ישירות אם index == 0
metadata.cyber.URLs securityresult.about.labels.url%{index} הערך מועתק ישירות אם האינדקס שונה מ-0
metadata.cyber.malwares.0 security_result.category הערך הוא SOFTWARE_MALICIOUS אם הוא קיים
metadata.cyber.vulnerabilities.cvss extensions.vulns.vulnerabilities.cvss_base_score הערך הועתק ישירות
metadata.cyber.vulnerabilities.exploitPocLinks extensions.vulns.vulnerabilities.cve_description הצטרף ממערך עם מפריד ' n'
metadata.cyber.vulnerabilities.id extensions.vulns.vulnerabilities.cve_id הערך הועתק ישירות
metadata.cyber.vulnerabilities.products.productName extensions.vulns.vulnerabilities.about.application הערך מועתק ישירות אם index == 0
metadata.cyber.vulnerabilities.products.productVendor extensions.vulns.vulnerabilities.vendor הערך מועתק ישירות אם index == 0
metadata.cyber.vulnerabilities.products.productVersion extensions.vulns.vulnerabilities.about.platform_version הערך מועתק ישירות אם האינדקס == 0, הרווחים מוסרים
metadata.cyber.vulnerabilities.products.productName extensions.vulns.vulnerabilities.about.labels.productName_%{index} הערך מועתק ישירות אם האינדקס שונה מ-0
metadata.cyber.vulnerabilities.products.productVendor extensions.vulns.vulnerabilities.about.labels.productVendor_%{index} הערך מועתק ישירות אם האינדקס שונה מ-0
metadata.cyber.vulnerabilities.products.productVersion extensions.vulns.vulnerabilities.about.labels.productVersion_%{index} הערך מועתק ישירות אם האינדקס שונה מ-0, הרווחים מוסרים
parentAlertId about.labels.parentAlertId הערך הועתק ישירות
post.languages.lang target.labels.post_languageslang%{index} הערך הועתק ישירות
post.languages.position target.labels.post_languagesposition%{index} הומר למחרוזת
post.link target.labels.post_link הערך הועתק ישירות
post.media.link principal.resource.name הערך מועתק ישירות אם index == 0
post.media.description target.resource.attribute.labels.post_media_description הערך מועתק ישירות אם index == 0
post.media.display_url target.resource.attribute.labels.post_media_display_url הערך מועתק ישירות אם index == 0
post.media.isSafe target.resource.attribute.labels.post_media_isSafe הומר למחרוזת אם index == 0
post.media.media_url target.resource.attribute.labels.post_media_media_url הערך מועתק ישירות אם index == 0
post.media.sizes.large.h target.resource.attribute.labels.post_media_sizes_large_h הומר למחרוזת אם index == 0
post.media.sizes.large.resize target.resource.attribute.labels.post_media_sizes_large_resize הערך מועתק ישירות אם index == 0
post.media.sizes.large.w target.resource.attribute.labels.post_media_sizes_large_w הומר למחרוזת אם index == 0
post.media.sizes.medium.h target.resource.attribute.labels.post_media_sizes_medium_h הומר למחרוזת אם index == 0
post.media.sizes.medium.resize target.resource.attribute.labels.post_media_sizes_medium_resize הערך מועתק ישירות אם index == 0
post.media.sizes.medium.w target.resource.attribute.labels.post_media_sizes_medium_w הומר למחרוזת אם index == 0
post.media.sizes.small.h target.resource.attribute.labels.post_media_sizes_small_h הומר למחרוזת אם index == 0
post.media.sizes.small.resize target.resource.attribute.labels.post_media_sizes_small_resize הערך מועתק ישירות אם index == 0
post.media.sizes.small.w target.resource.attribute.labels.post_media_sizes_small_w הומר למחרוזת אם index == 0
post.media.sizes.thumb.h target.resource.attribute.labels.post_media_sizes_thumb_h הומר למחרוזת אם index == 0
post.media.sizes.thumb.resize target.resource.attribute.labels.post_media_sizes_thumb_resize הערך מועתק ישירות אם index == 0
post.media.sizes.thumb.w target.resource.attribute.labels.post_media_sizes_thumb_w הומר למחרוזת אם index == 0
post.media.source target.resource.attribute.labels.post_media_source הערך מועתק ישירות אם index == 0
post.media.thumbnail target.resource.attribute.labels.post_media_thumbnail הערך מועתק ישירות אם index == 0
post.media.title target.resource.attribute.labels.post_media_title הערך מועתק ישירות אם index == 0
post.media.url target.resource.attribute.labels.post_media_url הערך מועתק ישירות אם index == 0
post.media.video_info.duration_millis target.resource.attribute.labels.post_media_video_info_duration_millis הומר למחרוזת אם index == 0
post.media.video_info.aspect_ratio target.resource.attribute.labels.post_media_video_info_aspect_ratio מחוברות כמחרוזת כ- %{med.video_info.aspect_ratio.0}, %{med.video_info.aspect_ratio.1} אם index == 0
post.media.video_info.variants.bitrate target.resource.attribute.labels.post_media_video_info_variantsbitrate%{var_index} הומר למחרוזת
post.media.video_info.variants.content_type target.resource.attribute.labels.post_media_video_info_variants_contenttype%{var_index} הערך הועתק ישירות
post.media.video_info.variants.url target.resource.attribute.labels.post_media_video_info_variantsurl%{var_index} הערך הועתק ישירות
post.media.type principal.resource.resource_subtype הערך מועתק ישירות אם index == 0
post.media.link about.resource.name הערך מועתק ישירות אם האינדקס שונה מ-0
post.media.description about.resource.attribute.labels.post_media_description הערך מועתק ישירות אם האינדקס שונה מ-0
post.media.display_url about.resource.attribute.labels.post_media_display_url הערך מועתק ישירות אם האינדקס שונה מ-0
post.media.isSafe about.resource.attribute.labels.post_media_isSafe הערך מומר למחרוזת אם index != 0
post.media.media_url about.resource.attribute.labels.post_media_media_url הערך מועתק ישירות אם האינדקס שונה מ-0
post.media.sizes.large.h about.resource.attribute.labels.post_media_sizes_large_h הערך מומר למחרוזת אם index != 0
post.media.sizes.large.resize about.resource.attribute.labels.post_media_sizes_large_resize הערך מועתק ישירות אם האינדקס שונה מ-0
post.media.sizes.large.w about.resource.attribute.labels.post_media_sizes_large_w הערך מומר למחרוזת אם index != 0
post.media.sizes.medium.h about.resource.attribute.labels.post_media_sizes_medium_h הערך מומר למחרוזת אם index != 0
post.media.sizes.medium.resize about.resource.attribute.labels.post_media_sizes_medium_resize הערך מועתק ישירות אם האינדקס שונה מ-0
post.media.sizes.medium.w about.resource.attribute.labels.post_media_sizes_medium_w הערך מומר למחרוזת אם index != 0
post.media.sizes.small.h about.resource.attribute.labels.post_media_sizes_small_h הערך מומר למחרוזת אם index != 0
post.media.sizes.small.resize about.resource.attribute.labels.post_media_sizes_small_resize הערך מועתק ישירות אם האינדקס שונה מ-0
post.media.sizes.small.w about.resource.attribute.labels.post_media_sizes_small_w הערך מומר למחרוזת אם index != 0
post.media.sizes.thumb.h about.resource.attribute.labels.post_media_sizes_thumb_h הערך מומר למחרוזת אם index != 0
post.media.sizes.thumb.resize about.resource.attribute.labels.post_media_sizes_thumb_resize הערך מועתק ישירות אם האינדקס שונה מ-0
post.media.sizes.thumb.w about.resource.attribute.labels.post_media_sizes_thumb_w הערך מומר למחרוזת אם index != 0
post.media.source about.resource.attribute.labels.post_media_source הערך מועתק ישירות אם האינדקס שונה מ-0
post.media.thumbnail about.resource.attribute.labels.post_media_thumbnail הערך מועתק ישירות אם האינדקס שונה מ-0
post.media.title about.resource.attribute.labels.post_media_title הערך מועתק ישירות אם האינדקס שונה מ-0
post.media.url about.resource.attribute.labels.post_media_url הערך מועתק ישירות אם האינדקס שונה מ-0
post.media.video_info.duration_millis about.resource.attribute.labels.post_media_video_info_duration_millis הערך מומר למחרוזת אם index != 0
post.media.video_info.aspect_ratio about.resource.attribute.labels.post_media_video_info_aspect_ratio הערכים מחוברים כמחרוזת %{med.video_info.aspect_ratio.0}, %{med.video_info.aspect_ratio.1} אם index != 0
post.media.video_info.variants.bitrate about.resource.attribute.labels.post_media_video_info_variantsbitrate%{var_index} הומר למחרוזת
post.media.video_info.variants.content_type about.resource.attribute.labels.post_media_video_info_variants_contenttype%{var_index} הערך הועתק ישירות
post.media.video_info.variants.url about.resource.attribute.labels.post_media_video_info_variantsurl%{var_index} הערך הועתק ישירות
post.media.type about.resource.resource_subtype הערך מועתק ישירות אם האינדקס שונה מ-0
post.translatedText target.labels.post_translatedText הערך הועתק ישירות
post.text target.labels.post_text הערך הועתק ישירות
post.timestamp target.resource.attribute.creation_time ההמרה בוצעה מ-epoch ms לחותמת זמן
publisherCategory.color target.labels.publisherCategory_color הערך הועתק ישירות
publisherCategory.name target.labels.publisherCategory_name הערך הועתק ישירות
publisherCategory.shortName target.labels.publisherCategory_shortName הערך הועתק ישירות
relatedTerms.url principal.labels.relatedTerms_%{terms.text} הערך הועתק ישירות
relatedTermsQueryURL principal.labels.relatedTermsQueryURL הערך הועתק ישירות
sect.id about.labels.sectors_id הערך הועתק ישירות
sect.idStr about.labels.sectors_idStr הערך הועתק ישירות
sect.name about.labels.sectors_name הערך הועתק ישירות
sect.retired about.labels.sectors_retired הומר למחרוזת
sect.topicType about.labels.sectors_topicType הערך הועתק ישירות
source.channels.0 principal.application הערך הועתק ישירות
source.displayName principal.user.user_display_name הערך הועתק ישירות
source.link principal.url הערך הועתק ישירות
source.verified principal.labels.source_verified הומר למחרוזת
subCaption.bullets.content about.labels.subCaption_bullets_content הערך הועתק ישירות
subCaption.bullets.media about.labels.subCaption_bullets_media הערך הועתק ישירות
subCaption.bullets.source about.labels.subCaption_bullets_source הערך הועתק ישירות
watchlist.id about.labels.watchlistsMatchedByType_id הערך הועתק ישירות
watchlist.externalTopicIds about.labels.watchlistsMatchedByType_externalTopicIds הצטרפות ממערך עם מפריד פסיק
watchlist.name about.labels.watchlistsMatchedByType_name הערך הועתק ישירות
watchlist.type about.labels.watchlistsMatchedByType_type הערך הועתק ישירות
watchlist.userProperties.omnilist about.labels.watchlistsMatchedByType_userProperties_omnilist הערך הועתק ישירות
watchlist.userProperties.uiListType about.labels.watchlistsMatchedByType_userProperties_uiListType הערך הועתק ישירות
watchlist.userProperties.watchlistColor about.labels.watchlistsMatchedByType_userProperties_watchlistColor הערך הועתק ישירות
watchlist.locationGroups.locations.id about.labels.watchlistsMatchedByTypelocationGroups%{lg_i}_locationsid%{loc_i} הערך הועתק ישירות
watchlist.locationGroups.locations.lng about.labels.watchlistsMatchedByTypelocationGroups%{lg_i}_locationslng%{loc_i} הערך מומר למחרוזת אם lg_i != 0 או loc_i != 0
watchlist.locationGroups.locations.lat about.labels.watchlistsMatchedByTypelocationGroups%{lg_i}_locationslat%{loc_i} הערך מומר למחרוזת אם lg_i != 0 או loc_i != 0
watchlist.locationGroups.locations.name about.labels.watchlistsMatchedByTypelocationGroups%{lg_i}_locationsname%{loc_i} הערך מועתק ישירות אם lg_i != 0 או loc_i != 0
watchlist.locationGroups.id about.labels.watchlistsMatchedByType_locationGroupsid%{lg_i} הערך הועתק ישירות
watchlist.locationGroups.name about.labels.watchlistsMatchedByType_locationGroupsname%{lg_i} הערך הועתק ישירות
watchlist.locationGroups.locations.lng about.location.region_coordinates.longitude הערך מועתק ישירות אם lg_i == 0 ו-loc_i == 0
watchlist.locationGroups.locations.lat about.location.region_coordinates.latitude הערך מועתק ישירות אם lg_i == 0 ו-loc_i == 0
watchlist.locationGroups.locations.name about.location.name הערך מועתק ישירות אם lg_i == 0 ו-loc_i == 0
source.entityName principal.hostname הערך הועתק ישירות
metadata.event_type הערך שמוגדר הוא GENERIC_EVENT. אם principal_ip או principal.hostname לא ריקים, הערך משתנה ל-SCAN_HOST.

שנה רישום

צפייה ביומן השינויים של כלי הניתוח הזה

הבעיה עדיין לא נפתרה? קבלת תשובות מחברי הקהילה וממומחי Google SecOps.