איסוף תוצאות מ-DomainTools Iris Investigate

גרסת המנתח: 1.0

נתמך ב:

במסמך הזה מוסבר איך להטמיע תוצאות של DomainTools Iris Investigate ב-Google Security Operations באמצעות Google Cloud Storage. המנתח ממיר נתוני JSON גולמיים מ-Iris API של DomainTools לפורמט מובנה שתואם למודל הנתונים המאוחד (UDM) של Google SecOps. הוא מחלץ מידע שקשור לפרטי הדומיין, פרטים ליצירת קשר, סיכוני אבטחה, אישורי SSL ומאפיינים רלוונטיים אחרים, וממפה אותם לשדות UDM תואמים כדי לבצע ניתוח עקבי ומודיעין איומי סייבר.

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

ודאו שאתם עומדים בדרישות המוקדמות הבאות:

  • מכונה של Google SecOps
  • גישה מיוחדת לחשבון ארגוני ב-DomainTools (גישה ל-API של Iris Investigate)
  • פרויקט ב-GCP שבו מופעל Cloud Storage API
  • הרשאות ליצירה ולניהול של קטגוריות ב-GCS
  • הרשאות לניהול מדיניות IAM בקטגוריות של GCS
  • הרשאות ליצירת שירותי Cloud Run, נושאי Pub/Sub ומשימות ב-Cloud Scheduler

קבלת מפתח API ונקודת קצה (endpoint) של DomainTools

  1. נכנסים אל מרכז הבקרה של DomainTools API (רק החשבון שמוגדר כבעלים של ה-API יכול לאפס את מפתח ה-API).
  2. בקטע My Account (החשבון שלי), לוחצים על הקישור View API Dashboard (הצגת מרכז הבקרה של ה-API) בכרטיסייה Account Summary (סיכום החשבון).
  3. עוברים לקטע API Username (שם משתמש ב-API) כדי לקבל את שם המשתמש.
  4. באותה כרטיסייה, מאתרים את מפתח ה-API.
  5. מעתיקים את המפתח ושומרים אותו במקום מאובטח. אם אתם צריכים מפתח חדש, לחצו על איפוס מפתח ה-API.

  6. שימו לב לנקודת הקצה של Iris Investigate: ‏https://api.domaintools.com/v1/iris-investigate/.

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

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

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

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

לפונקציית Cloud Run נדרש חשבון שירות עם הרשאות כתיבה בקטגוריית GCS, וצריך להפעיל אותה באמצעות Pub/Sub.

יצירת חשבון שירות

  1. במסוף GCP, נכנסים לדף IAM & Admin > Service Accounts.
  2. לוחצים על Create Service Account.
  3. מזינים את פרטי ההגדרה הבאים:
    • שם חשבון השירות: מזינים domaintools-iris-collector-sa.
    • Service account description: מזינים Service account for Cloud Run function to collect DomainTools Iris Investigate logs.
  4. לוחצים על יצירה והמשך.
  5. בקטע Grant this service account access to project, מוסיפים את התפקידים הבאים:
    1. לוחצים על בחירת תפקיד.
    2. מחפשים את התפקיד Storage Object Admin ובוחרים אותו.
    3. לוחצים על + הוספת תפקיד.
    4. מחפשים את התפקיד Cloud Run Invoker ובוחרים בו.
    5. לוחצים על + הוספת תפקיד.
    6. מחפשים את התפקיד Cloud Functions Invoker ובוחרים אותו.
  6. לוחצים על Continue.
  7. לוחצים על סיום.

התפקידים האלה נדרשים כדי:

  • אדמין של אובייקט אחסון: כתיבת יומנים לקטגוריית GCS וניהול קובצי תמונת מצב
  • Cloud Run Invoker: מאפשר ל-Pub/Sub להפעיל את הפונקציה
  • מפעיל פונקציות של Cloud Functions: מאפשר להפעיל פונקציות

הענקת הרשאות IAM בקטגוריית GCS

נותנים לחשבון השירות הרשאות כתיבה בקטגוריה של GCS:

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

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

יוצרים נושא Pub/Sub ש-Cloud Scheduler יפרסם בו ופונקציית Cloud Run תירשם אליו.

  1. במסוף GCP, נכנסים לדף Pub/Sub > Topics.
  2. לוחצים על Create topic.
  3. מזינים את פרטי ההגדרה הבאים:
    • מזהה הנושא: מזינים את הערך domaintools-iris-trigger.
    • משאירים את ההגדרות האחרות כברירת מחדל.
  4. לוחצים על יצירה.

יצירת פונקציית Cloud Run לאיסוף יומנים

פונקציית Cloud Run מופעלת על ידי הודעות Pub/Sub מ-Cloud Scheduler כדי לאחזר יומנים מ-DomainTools Iris Investigate API וכותבת אותם ב-GCS.

  1. במסוף GCP, נכנסים ל-Cloud Run.
  2. לוחצים על Create service.
  3. בוחרים באפשרות Function (שימוש בעורך ישיר כדי ליצור פונקציה).
  4. בקטע Configure, מזינים את פרטי ההגדרה הבאים:

    הגדרה ערך
    שם השירות domaintools-iris-collector
    אזור בוחרים את האזור שתואם לקטגוריית ה-GCS (לדוגמה, us-central1)
    זמן ריצה בוחרים באפשרות Python 3.12 או גרסה עדכנית יותר.
  5. בקטע טריגר (אופציונלי):

    1. לוחצים על + הוספת טריגר.
    2. בוחרים באפשרות Cloud Pub/Sub.
    3. בקטע Select a Cloud Pub/Sub topic, בוחרים את הנושא ב-Pub/Sub‏ (domaintools-iris-trigger).
    4. לוחצים על Save.
  6. בקטע אימות:

    1. לוחצים על דרישת אימות.
    2. בודקים את ניהול הזהויות והרשאות הגישה (IAM).
  7. גוללים למטה ומרחיבים את הקטע Containers, Networking, Security.

  8. עוברים לכרטיסייה אבטחה:

    • ‫Service account: בוחרים את חשבון השירות (domaintools-iris-collector-sa).
  9. עוברים לכרטיסייה מאגרי תגים:

    1. לוחצים על Variables & Secrets.
    2. לוחצים על ‎+ Add variable לכל משתנה סביבה:
    שם משתנה ערך לדוגמה תיאור
    GCS_BUCKET domaintools-iris שם הקטגוריה ב-GCS שבה הנתונים יאוחסנו.
    GCS_PREFIX domaintools/iris/ קידומת GCS אופציונלית (תיקיית משנה) לאובייקטים.
    STATE_KEY domaintools/iris/state.json מפתח אופציונלי של קובץ מצב/נקודת ביקורת.
    DT_API_KEY DT-XXXXXXXXXXXXXXXXXXXX מפתח API של DomainTools.
    USE_MODE HASH בוחרים באיזה מצב להשתמש: HASH,‏ DOMAINS או QUERY (רק מצב אחד פעיל בכל פעם).
    SEARCH_HASHES hash1;hash2;hash3 חובה אם USE_MODE=HASH. רשימה מופרדת בנקודה-פסיק של גיבובי חיפוש שמורים מממשק המשתמש של Iris.
    DOMAINS example.com;domaintools.com חובה אם USE_MODE=DOMAINS. רשימת דומיינים שמופרדים באמצעות נקודה ופסיק.
    QUERY_LIST ip=1.1.1.1;ip=8.8.8.8;domain=example.org חובה אם USE_MODE=QUERY. רשימה של מחרוזות שאילתה שמופרדות באמצעות נקודה-פסיק (k=v&k2=v2).
    PAGE_SIZE 500 שורות בכל דף (ברירת המחדל היא 500).
    MAX_PAGES 20 מספר הדפים המקסימלי לכל בקשה.
  10. בקטע Variables & Secrets, גוללים למטה אל Requests:

    • ‫Request timeout: מזינים 900 שניות (15 דקות).
  11. עוברים לכרטיסייה הגדרות:

    • בקטע Resources:
      • זיכרון: בוחרים באפשרות ‎512 MiB או יותר.
      • מעבד (CPU): בוחרים באפשרות 1.
  12. בקטע Revision scaling:

    • מספר מינימלי של מכונות: מזינים 0.
    • Maximum number of instances: מזינים 100 (או משנים בהתאם לעומס הצפוי).
  13. לוחצים על יצירה.

  14. ממתינים ליצירת השירות (דקה או שתיים).

  15. אחרי שיוצרים את השירות, עורך הקוד המוטבע נפתח באופן אוטומטי.

הוספת קוד פונקציה

  1. מזינים main בשדה Function entry point.
  2. בעורך הקוד, יוצרים שני קבצים:

    • הקובץ הראשון: main.py:
    import functions_framework
    from google.cloud import storage
    import json
    import os
    import urllib.parse
    from urllib.request import Request, urlopen
    from urllib.error import HTTPError
    import time
    from datetime import datetime, timezone
    
    # Initialize Storage client
    storage_client = storage.Client()
    
    # Environment variables
    GCS_BUCKET = os.environ.get("GCS_BUCKET", "").strip()
    GCS_PREFIX = os.environ.get("GCS_PREFIX", "domaintools/iris/").strip()
    STATE_KEY = os.environ.get("STATE_KEY", "domaintools/iris/state.json").strip()
    DT_API_KEY = os.environ.get("DT_API_KEY", "").strip()
    USE_MODE = os.environ.get("USE_MODE", "HASH").strip().upper()
    SEARCH_HASHES = [h.strip() for h in os.environ.get("SEARCH_HASHES", "").split(";") if h.strip()]
    DOMAINS = [d.strip() for d in os.environ.get("DOMAINS", "").split(";") if d.strip()]
    QUERY_LIST = [q.strip() for q in os.environ.get("QUERY_LIST", "").split(";") if q.strip()]
    PAGE_SIZE = int(os.environ.get("PAGE_SIZE", "500"))
    MAX_PAGES = int(os.environ.get("MAX_PAGES", "20"))
    USE_NEXT = os.environ.get("USE_NEXT", "true").lower() == "true"
    HTTP_TIMEOUT = int(os.environ.get("HTTP_TIMEOUT", "60"))
    RETRIES = int(os.environ.get("HTTP_RETRIES", "2"))
    
    BASE_URL = "https://api.domaintools.com/v1/iris-investigate/"
    HDRS = {
        "X-Api-Key": DT_API_KEY,
        "Accept": "application/json",
    }
    
    def _http_post(url: str, body: dict) -> dict:
        """Make HTTP POST request with form-encoded body."""
        req = Request(url, method="POST")
        for k, v in HDRS.items():
            req.add_header(k, v)
        req.add_header("Content-Type", "application/x-www-form-urlencoded")
    
        encoded_body = urllib.parse.urlencode(body, doseq=True).encode('utf-8')
    
        attempt = 0
        while True:
            try:
                with urlopen(req, data=encoded_body, timeout=HTTP_TIMEOUT) as r:
                    return json.loads(r.read().decode("utf-8"))
            except HTTPError as e:
                if e.code in (429, 500, 502, 503, 504) and attempt < RETRIES:
                    delay = int(e.headers.get("Retry-After", "2"))
                    time.sleep(max(1, delay))
                    attempt += 1
                    continue
                raise
    
    def _write_page(bucket, obj: dict, label: str, page: int) -> str:
        ts = time.strftime("%Y/%m/%d/%H%M%S", time.gmtime())
        key = f"{GCS_PREFIX.rstrip('/')}/{ts}-{label}-p{page:05d}.json"
        blob = bucket.blob(key)
        blob.upload_from_string(
            json.dumps(obj, separators=(",", ":")),
            content_type="application/json"
        )
        return key
    
    def _first_page_params() -> dict:
        params = {"page_size": str(PAGE_SIZE)}
        if USE_NEXT:
            params["next"] = "true"
        return params
    
    def _paginate(bucket, label: str, params: dict) -> tuple:
        pages = 0
        total = 0
    
        while pages < MAX_PAGES:
            data = _http_post(BASE_URL, params)
            _write_page(bucket, data, label, pages)
            resp = data.get("response") or {}
            results = resp.get("results") or []
            total += len(results)
            pages += 1
    
            next_url = resp.get("next") if isinstance(resp, dict) else None
            if next_url:
                parsed = urllib.parse.urlparse(next_url)
                params = dict(urllib.parse.parse_qsl(parsed.query))
                continue
    
            if resp.get("has_more_results") and resp.get("position"):
                base = _first_page_params()
                base.pop("next", None)
                base["position"] = resp["position"]
                params = base
                continue
            break
        return pages, total
    
    def run_hashes(bucket, hashes: list) -> dict:
        agg_pages = agg_results = 0
        for h in hashes:
            params = _first_page_params()
            params["search_hash"] = h
            p, r = _paginate(bucket, f"hash-{h}", params)
            agg_pages += p
            agg_results += r
        return {"pages": agg_pages, "results": agg_results}
    
    def run_domains(bucket, domains: list) -> dict:
        agg_pages = agg_results = 0
        for d in domains:
            params = _first_page_params()
            params["domain"] = d
            p, r = _paginate(bucket, f"domain-{d}", params)
            agg_pages += p
            agg_results += r
        return {"pages": agg_pages, "results": agg_results}
    
    def run_queries(bucket, queries: list) -> dict:
        agg_pages = agg_results = 0
        for q in queries:
            base = _first_page_params()
            for k, v in urllib.parse.parse_qsl(q, keep_blank_values=True):
                base.setdefault(k, v)
            p, r = _paginate(bucket, f"query-{q.replace('=', '-')}", base)
            agg_pages += p
            agg_results += r
        return {"pages": agg_pages, "results": agg_results}
    
    @functions_framework.cloud_event
    def main(cloud_event):
        """
        Cloud Run function triggered by Pub/Sub to fetch DomainTools Iris Investigate results and write to GCS.
    
        Args:
            cloud_event: CloudEvent object containing Pub/Sub message
        """
    
        if not GCS_BUCKET:
            print("Error: GCS_BUCKET environment variable not set")
            return
    
        try:
            bucket = storage_client.bucket(GCS_BUCKET)
    
            if USE_MODE == "HASH" and SEARCH_HASHES:
                res = run_hashes(bucket, SEARCH_HASHES)
            elif USE_MODE == "DOMAINS" and DOMAINS:
                res = run_domains(bucket, DOMAINS)
            elif USE_MODE == "QUERY" and QUERY_LIST:
                res = run_queries(bucket, QUERY_LIST)
            else:
                raise ValueError(
                    "Invalid USE_MODE or missing parameters. Set USE_MODE to HASH | DOMAINS | QUERY "
                    "and provide SEARCH_HASHES | DOMAINS | QUERY_LIST accordingly."
                )
    
            print(f"Successfully processed: {json.dumps({'ok': True, 'mode': USE_MODE, **res})}")
    
        except Exception as e:
            print(f"Error processing DomainTools Iris data: {str(e)}")
            raise
    
    • הקובץ השני: requirements.txt:
    functions-framework==3.*
    google-cloud-storage==2.*
    
  3. לוחצים על Deploy כדי לשמור ולפרוס את הפונקציה.

  4. מחכים שהפריסה תסתיים (2-3 דקות).

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

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

  1. במסוף GCP, נכנסים ל-Cloud Scheduler.
  2. לוחצים על Create Job.
  3. ממלאים את פרטי ההגדרה הבאים:

    הגדרה ערך
    שם domaintools-iris-1h
    אזור בוחרים את אותו אזור כמו של פונקציית Cloud Run.
    תדירות ‫0 * * * * (כל שעה, בשעה עגולה)
    אזור זמן בחירת אזור זמן (מומלץ לבחור ב-UTC)
    סוג היעד Pub/Sub
    נושא בוחרים את נושא Pub/Sub (domaintools-iris-trigger)
    גוף ההודעה ‫{} (אובייקט JSON ריק)
  4. לוחצים על יצירה.

אפשרויות לתדירות התזמון

  • בוחרים את התדירות בהתאם לנפח היומן ולדרישות לגבי זמן האחזור:

    תדירות ביטוי Cron תרחיש לדוגמה
    כל 5 דקות */5 * * * * נפח גבוה, זמן אחזור נמוך
    כל 15 דקות */15 * * * * נפח חיפושים בינוני
    כל שעה 0 * * * * רגיל (מומלץ)
    כל 6 שעות 0 */6 * * * נפח נמוך, עיבוד ברצף (batch processing)
    יומי 0 0 * * * איסוף נתונים היסטוריים

בדיקת השילוב

  1. במסוף Cloud Scheduler, מוצאים את המשימה.
  2. לוחצים על Force run כדי להפעיל את המשימה באופן ידני.
  3. מחכים כמה שניות.
  4. נכנסים לדף Cloud Run > Services.
  5. לוחצים על שם הפונקציה (domaintools-iris-collector).
  6. לוחצים על הכרטיסייה Logs.
  7. מוודאים שהפונקציה בוצעה בהצלחה. מחפשים את הדברים הבאים:

    Successfully processed: {"ok": true, "mode": "HASH", "pages": X, "results": Y}
    
  8. נכנסים לדף Cloud Storage > Buckets.

  9. לוחצים על שם הקטגוריה.

  10. עוברים לתיקיית הקידומת (domaintools/iris/).

  11. מוודאים שנוצרו קובצי .json חדשים עם חותמת הזמן הנוכחית.

אם מופיעות שגיאות ביומנים:

  • ‫HTTP 401: בודקים את פרטי הכניסה ל-API של DomainTools במשתני הסביבה
  • ‫HTTP 403: צריך לוודא שלחשבון יש את ההרשאות הנדרשות ל-Iris Investigate API
  • ‫HTTP 429: הגבלת קצב של יצירת בקשות – הפונקציה תנסה שוב באופן אוטומטי עם השהיה (backoff)
  • חסרים משתני סביבה: צריך לוודא שכל המשתנים הנדרשים מוגדרים
  • ‫USE_MODE לא תקין: צריך לוודא שהערך של USE_MODE מוגדר כ-HASH, ‏ DOMAINS או QUERY, ושהפרמטרים המתאימים צוינו

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

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

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

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

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

מתן הרשאות IAM לחשבון השירות של Google SecOps

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

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

הגדרת פיד ב-Google SecOps כדי להטמיע את תוצאות החקירה של DomainTools Iris

  1. עוברים אל הגדרות > ניהול נתונים > פידים. אם אתם משתמשים בפלטפורמה של SIEM בלבד, עוברים אל הגדרות > פידים.
  2. לוחצים על הוספת פיד חדש.
  3. לוחצים על הגדרת פיד יחיד.
  4. בשדה שם הפיד, מזינים שם לפיד (לדוגמה, DomainTools Iris Investigate).
  5. בוחרים באפשרות Google Cloud Storage V2 בתור סוג המקור.
  6. בוחרים באפשרות DomainTools מודיעין איומי סייבר בתור Log type.
  7. לוחצים על הבא.
  8. מציינים ערכים לפרמטרים הבאים של הקלט:

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

      gs://domaintools-iris/domaintools/iris/
      
      • מחליפים את:

        • ‫domaintools-iris: השם של קטגוריית GCS.
        • ‫domaintools/iris/: נתיב אופציונלי לתיקייה או לתחילית שבהם נשמרים היומנים (משאירים ריק בשביל תיקיית הבסיס).
      • לדוגמה:

        • קטגוריית הבסיס: gs://domaintools-iris/
        • עם הקידומת: gs://domaintools-iris/domaintools/iris/
    • אפשרות מחיקת המקור: בוחרים את אפשרות המחיקה המועדפת:

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

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

    • מרחב השמות של הנכס: domaintools.threat_intel

    • תוויות הטמעה: התווית שתתווסף לאירועים מהפיד הזה.

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

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

יומנים לדוגמה שנתמכים ב-DomainTools Iris Investigate

  • העשרת דומיינים רגילה (בסיסית)

    {
      "domain": "example-sanitized-01.com",
      "whois_url": "https://whois.domaintools.com/example-sanitized-01.com",
      "active": false,
      "admin_contact": {
        "name": {
          "value": "REDACTED_NAME"
        },
        "org": {
          "value": "Sanitized Corp"
        },
        "email": [
          {
            "value": "admin@example-sanitized.com"
          }
        ]
      },
      "ip": [
        {
          "address": {
            "value": "192.168.1.100"
          },
          "asn": [
            {
              "value": 12345
            }
          ],
          "isp": {
            "value": "Generic ISP"
          }
        }
      ],
      "domain_risk": {
        "risk_score": 46,
        "components": [
          {
            "name": "proximity",
            "risk_score": 5
          },
          {
            "name": "threat_profile_phishing",
            "risk_score": 46
          }
        ]
      },
      "timestamp": "2023-11-21T12:15:50.130728Z"
    }
    
  • סכימת שיווק/מעקב מתקדמת

    {
      "domain": "analytics-tracker-sample.com",
      "google_analytics": {
        "value": "UA-000000-0"
      },
      "ga4": [
        {
          "value": "G-YYYYYYYYYX"
        }
      ],
      "gtm_codes": [
        {
          "value": "GTM-YYYX"
        }
      ],
      "fb_codes": [
        {
          "value": "1234567890"
        }
      ],
      "baidu_codes": [
        {
          "value": "hash_masked_value"
        }
      ],
      "yandex_codes": [
        {
          "value": "98765432"
        }
      ],
      "matomo_codes": [
        {
          "value": "https://analytics.internal-sanitized.net/"
        }
      ]
    }
    
  • סכימה מתויגת ומנוטרת

    {
      "domain": "monitored-threat.net",
      "monitor_domain": true,
      "monitoring_domain_list_name": "Watchlist_Alpha",
      "tags": [
        {
          "label": "Sanitized_Tag",
          "scope": "group",
          "tagged_at": "2020-12-02T13:33:40Z"
        }
      ],
      "registrar": {
        "value": "Safe-Registrar LLC"
      }
    }
    
  • סכֵימת תגובה באינטרנט ו-SSL בסיכון גבוה

    {
      "domain": "high-risk-malware.org",
      "domain_risk": {
        "risk_score": 100,
        "components": [
          {
            "name": "threat_profile_malware",
            "risk_score": 95
          }
        ]
      },
      "ssl_info": [
        {
          "hash": {
            "value": "sha1_masked_hash_sequence"
          },
          "common_name": {
            "value": "www.sanitized-cert.com"
          },
          "issuer_common_name": {
            "value": "Sanitized CA"
          },
          "not_after": {
            "value": 20251231
          }
        }
      ],
      "website_response": 200,
      "server_type": "Sanitized-Server-v1.0",
      "website_title": "Sanitized Landing Page"
    }
    

טבלת מיפוי UDM

שדה ביומן מיפוי UDM Logic (פונקציה לוגית)
פעיל principal.domain.status ממופה ישירות מהשדה הפעיל ביומן הגולמי.
additional_whois_email.[].value about.labels.additional_whois_email המידע נשלף מהמערך additional_whois_email ונוסף כתווית באובייקט about.
adsense.value about.labels.adsense חולץ מ-adsense.value ונוסף כתווית באובייקט about.
admin_contact.city.value principal.domain.admin.office_address.city ממופה ישירות מהשדה admin_contact.city.value ביומן הגולמי.
admin_contact.country.value principal.domain.admin.office_address.country_or_region ממופה ישירות מהשדה admin_contact.country.value ביומן הגולמי.
admin_contact.email.[].value principal.domain.admin.email_addresses הנתונים חולצו מהמערך admin_contact.email ונוספו לשדה email_addresses.
admin_contact.fax.value principal.domain.admin.attribute.labels.fax הערך חולץ מ-admin_contact.fax.value ונוסף כתווית עם המפתח "fax" במאפיין admin.
admin_contact.name.value principal.domain.admin.user_display_name ממופה ישירות מהשדה admin_contact.name.value ביומן הגולמי.
admin_contact.org.value principal.domain.admin.company_name ממופה ישירות מהשדה admin_contact.org.value ביומן הגולמי.
admin_contact.phone.value principal.domain.admin.phone_numbers ממופה ישירות מהשדה admin_contact.phone.value ביומן הגולמי.
admin_contact.postal.value principal.domain.admin.attribute.labels.postal חולץ מ-admin_contact.postal.value ונוסף כתווית עם המפתח "postal" במאפיין admin.
admin_contact.state.value principal.domain.admin.office_address.state ממופה ישירות מהשדה admin_contact.state.value ביומן הגולמי.
admin_contact.street.value principal.domain.admin.office_address.name ממופה ישירות מהשדה admin_contact.street.value ביומן הגולמי.
אלקסה, אלכסה, alexa about.labels.alexa ממופה ישירות מהשדה alexa ביומן הגולמי ונוסף כתווית באובייקט about.
baidu_codes.[].value about.labels.baidu_codes המידע חולץ מהמערך baidu_codes ונוסף כתווית באובייקט about.
billing_contact.city.value principal.domain.billing.office_address.city ממופה ישירות מהשדה billing_contact.city.value ביומן הגולמי.
billing_contact.country.value principal.domain.billing.office_address.country_or_region ממופה ישירות מהשדה billing_contact.country.value ביומן הגולמי.
billing_contact.email.[].value principal.domain.billing.email_addresses הנתונים נשלפים מהמערך billing_contact.email ומתווספים לשדה email_addresses.
billing_contact.fax.value principal.domain.billing.attribute.labels.fax חולץ מ-billing_contact.fax.value ונוסף כתווית עם המפתח "fax" במאפיין החיוב.
billing_contact.name.value principal.domain.billing.user_display_name ממופה ישירות מהשדה billing_contact.name.value ביומן הגולמי.
billing_contact.org.value principal.domain.billing.company_name ממופה ישירות מהשדה billing_contact.org.value ביומן הגולמי.
billing_contact.phone.value principal.domain.billing.phone_numbers ממופה ישירות מהשדה billing_contact.phone.value ביומן הגולמי.
billing_contact.postal.value principal.domain.billing.attribute.labels.postal המידע נשלף מהשדה billing_contact.postal.value ונוסף כתווית עם המפתח postal במאפיין החיוב.
billing_contact.state.value principal.domain.billing.office_address.state ממופה ישירות מהשדה billing_contact.state.value ביומן הגולמי.
billing_contact.street.value principal.domain.billing.office_address.name ממופה ישירות מהשדה billing_contact.street.value ביומן הגולמי.
create_date.value principal.domain.creation_time ההמרה לפורמט של חותמת זמן מתבצעת מהשדה create_date.value ביומן הגולמי.
data_updated_timestamp principal.domain.audit_update_time ההמרה לפורמט של חותמת זמן מהשדה data_updated_timestamp ביומן הגולמי.
דומיין principal.hostname ממופה ישירות משדה הדומיין ביומן הגולמי.
domain_risk.components.[].evidence security_result.detection_fields.evidence המידע נשלף מהמערך domain_risk.components.[].evidence ונוסף כשדה זיהוי עם המפתח evidence באובייקט security_result.
domain_risk.components.[].name security_result.category_details ממופה ישירות מהשדה domain_risk.components.[].name ביומן הגולמי.
domain_risk.components.[].risk_score security_result.risk_score ממופה ישירות מהשדה domain_risk.components.[].risk_score ביומן הגולמי.
domain_risk.components.[].threats security_result.threat_name הרכיב הראשון במערך domain_risk.components.[].threats ממופה ל-security_result.threat_name.
domain_risk.components.[].threats security_result.detection_fields.threats שאר הרכיבים של המערך domain_risk.components.[].threats מתווספים כשדות זיהוי עם המפתח "threats" באובייקט security_result.
domain_risk.risk_score security_result.risk_score ממופה ישירות מהשדה domain_risk.risk_score ביומן הגולמי.
email_domain.[].value about.labels.email_domain המידע נשלף מהמערך email_domain ונוסף כתווית באובייקט about.
expiration_date.value principal.domain.expiration_time השדה הומר לפורמט של חותמת זמן מהשדה expiration_date.value ביומן הגולמי.
fb_codes.[].value about.labels.fb_codes המידע נשלף מהמערך fb_codes ונוסף כתווית באובייקט about.
first_seen.value principal.domain.first_seen_time ההמרה לפורמט של חותמת זמן מתבצעת מהשדה first_seen.value ביומן הגולמי.
ga4.[].value about.labels.ga4 הנתונים חולצו ממערך ga4 ונוספו כתווית באובייקט about.
google_analytics.value about.labels.google_analytics הערך חולץ מ-google_analytics.value ונוסף כתווית באובייקט about.
gtm_codes.[].value about.labels.gtm_codes הנתונים נשלפים מהמערך gtm_codes ומתווספים כתווית באובייקט about.
hotjar_codes.[].value about.labels.hotjar_codes המידע חולץ מהמערך hotjar_codes ונוסף כתווית באובייקט about.
ip.[].address.value principal.ip הרכיב הראשון במערך ה-IP ממופה ל-principal.ip.
ip.[].address.value about.labels.ip_address שאר הרכיבים של מערך ה-IP מתווספים כתוויות עם המפתח "ip_address" באובייקט about.
ip.[].asn.[].value network.asn הרכיב הראשון במערך ip.asn הראשון ממופה ל-network.asn.
ip.[].asn.[].value about.labels.asn שאר הרכיבים של המערכים ip.asn מתווספים כתוויות עם המפתח "asn" באובייקט about.
ip.[].country_code.value principal.location.country_or_region הערך country_code.value של הרכיב הראשון במערך ה-IP ממופה ל-principal.location.country_or_region.
ip.[].country_code.value about.location.country_or_region הערך country_code.value של שאר הרכיבים במערך ה-IP ממופה ל-about.location.country_or_region.
ip.[].isp.value principal.labels.isp הערך isp.value של הרכיב הראשון במערך ה-IP ממופה ל-principal.labels.isp.
ip.[].isp.value about.labels.isp הערך של isp של שאר הרכיבים במערך ip ממופה ל-about.labels.isp.
matomo_codes.[].value about.labels.matomo_codes חולץ מהמערך matomo_codes ונוסף כתווית באובייקט about.
monitor_domain about.labels.monitor_domain ממופה ישירות מהשדה monitor_domain ביומן הגולמי ומתווסף כתווית באובייקט about.
monitoring_domain_list_name about.labels.monitoring_domain_list_name ממופה ישירות מהשדה monitoring_domain_list_name ביומן הגולמי ומתווסף כתווית באובייקט about.
mx.[].domain.value about.domain.name ממופה ישירות מהשדה mx.[].domain.value ביומן הגולמי.
mx.[].host.value about.hostname ממופה ישירות מהשדה mx.[].host.value ביומן הגולמי.
mx.[].ip.[].value about.ip חולץ מהמערך mx.[].ip ונוסף לשדה ip.
mx.[].priority about.security_result.priority_details ממופה ישירות מהשדה mx.[].priority ביומן הגולמי.
name_server.[].domain.value about.labels.name_server_domain הערך נשלף מ-name_server.[].domain.value ונוסף כתווית עם המפתח name_server_domain באובייקט about.
name_server.[].host.value principal.domain.name_server הערך נשלף מ-name_server.[].host.value ונוסף לשדה name_server.
name_server.[].host.value about.domain.name_server הערך נשלף מ-name_server.[].host.value ונוסף לשדה name_server.
name_server.[].ip.[].value about.labels.ip חולץ מהמערך name_server.[].ip ונוסף כתווית עם המפתח "ip" באובייקט about.
popularity_rank about.labels.popularity_rank ממופה ישירות מהשדה popularity_rank ביומן הגולמי ומתווסף כתווית באובייקט about.
redirect.value about.labels.redirect הערך חולץ מ-redirect.value ונוסף כתווית באובייקט about.
redirect_domain.value about.labels.redirect_domain הערך נשלף מ-redirect_domain.value ונוסף כתווית באובייקט about.
registrant_contact.city.value principal.domain.registrant.office_address.city ממופה ישירות מהשדה registrant_contact.city.value ביומן הגולמי.
registrant_contact.country.value principal.domain.registrant.office_address.country_or_region ממופה ישירות מהשדה registrant_contact.country.value ביומן הגולמי.
registrant_contact.email.[].value principal.domain.registrant.email_addresses הנתונים חולצו מהמערך registrant_contact.email ונוספו לשדה email_addresses.
registrant_contact.fax.value principal.domain.registrant.attribute.labels.fax חולץ מ-registrant_contact.fax.value ונוסף כתווית עם המפתח "fax" במאפיין registrant.
registrant_contact.name.value principal.domain.registrant.user_display_name ממופה ישירות מהשדה registrant_contact.name.value ביומן הגולמי.
registrant_contact.org.value principal.domain.registrant.company_name ממופה ישירות מהשדה registrant_contact.org.value ביומן הגולמי.
registrant_contact.phone.value principal.domain.registrant.phone_numbers ממופה ישירות מהשדה registrant_contact.phone.value ביומן הגולמי.
registrant_contact.postal.value principal.domain.registrant.attribute.labels.postal המידע חולץ מ-registrant_contact.postal.value ונוסף כתווית עם המפתח "postal" במאפיין registrant.
registrant_contact.state.value principal.domain.registrant.office_address.state ממופה ישירות מהשדה registrant_contact.state.value ביומן הגולמי.
registrant_contact.street.value principal.domain.registrant.office_address.name ממופה ישירות מהשדה registrant_contact.street.value ביומן הגולמי.
registrant_name.value about.labels.registrant_name הערך נשלף מ-registrant_name.value ונוסף כתווית באובייקט about.
registrant_org.value about.labels.registrant_org הערך נשלף מ-registrant_org.value ונוסף כתווית באובייקט about.
registrar.value principal.domain.registrar ממופה ישירות מהשדה registrar.value ביומן הגולמי.
registrar_status about.labels.registrar_status המידע נשלף מהמערך registrar_status ונוסף כתווית באובייקט about.
server_type network.tls.client.server_name ממופה ישירות מהשדה server_type ביומן הגולמי.
soa_email.[].value principal.user.email_addresses הנתונים נשלפים מהמערך soa_email ומתווספים לשדה email_addresses.
spf_info about.labels.spf_info ממופה ישירות מהשדה spf_info ביומן הגולמי ונוסף כתווית באובייקט about.
ssl_email.[].value about.labels.ssl_email המידע חולץ מהמערך ssl_email ונוסף כתווית באובייקט about.
ssl_info.[].alt_names.[].value about.labels.alt_names חולץ מהמערך ssl_info.[].alt_names ונוסף כתווית באובייקט about.
ssl_info.[].common_name.value about.labels.common_name הערך נשלף מ-ssl_info.[].common_name.value ונוסף כתווית באובייקט about.
ssl_info.[].duration.value about.labels.duration הערך נשלף מ-ssl_info.[].duration.value ונוסף כתווית באובייקט about.
ssl_info.[].email.[].value about.labels.ssl_info_email חולץ מהמערך ssl_info.[].email ונוסף כתווית עם המפתח "ssl_info_email" באובייקט about.
ssl_info.[].hash.value network.tls.server.certificate.sha1 הערך hash.value של הרכיב הראשון במערך ssl_info ממופה ל-network.tls.server.certificate.sha1.
ssl_info.[].hash.value about.labels.hash הערך hash.value של שאר הרכיבים במערך ssl_info ממופה ל-about.labels.hash.
ssl_info.[].issuer_common_name.value network.tls.server.certificate.issuer הערך issuer_common_name.value של הרכיב הראשון במערך ssl_info ממופה ל-network.tls.server.certificate.issuer.
ssl_info.[].issuer_common_name.value about.labels.issuer_common_name הערך issuer_common_name.value של שאר הרכיבים במערך ssl_info ממופה ל-about.labels.issuer_common_name.
ssl_info.[].not_after.value network.tls.server.certificate.not_after הערך not_after.value של הרכיב הראשון במערך ssl_info מומר לפורמט של חותמת זמן וממופה ל-network.tls.server.certificate.not_after.
ssl_info.[].not_after.value about.labels.not_after הערך not_after.value של שאר הרכיבים במערך ssl_info ממופה ל-about.labels.not_after.
ssl_info.[].not_before.value network.tls.server.certificate.not_before הערך not_before.value של הרכיב הראשון במערך ssl_info מומר לפורמט של חותמת זמן וממופה ל-network.tls.server.certificate.not_before.
ssl_info.[].not_before.value about.labels.not_before הערך not_before.value של שאר הרכיבים במערך ssl_info ממופה ל-about.labels.not_before.
ssl_info.[].organization.value network.organization_name הערך organization.value של הרכיב הראשון במערך ssl_info ממופה ל-network.organization_name.
ssl_info.[].organization.value about.labels.organization הערך organization.value של שאר הרכיבים במערך ssl_info ממופה ל-about.labels.organization.
ssl_info.[].subject.value about.labels.subject הערך נשלף מ-ssl_info.[].subject.value ונוסף כתווית באובייקט about.
statcounter_project_codes.[].value about.labels.statcounter_project_codes הנתונים חולצו מהמערך statcounter_project_codes ונוספו כתווית באובייקט about.
statcounter_security_codes.[].value about.labels.statcounter_security_codes הנתונים חולצו מהמערך statcounter_security_codes ונוספו כתווית באובייקט about.
tags.[].label about.file.tags הערך נשלף מהשדה tags.[].label ונוסף לשדה tags.
tags.[].scope security_result.detection_fields.scope חולץ מ-tags.[].scope ונוסף כשדה זיהוי עם המפתח "scope" באובייקט security_result.
tags.[].tagged_at security_result.detection_fields.tagged_at השדה חולץ מ-tags.[].tagged_at ונוסף כשדה זיהוי עם המפתח tagged_at באובייקט security_result.
technical_contact.city.value principal.domain.tech.office_address.city ממופה ישירות מהשדה technical_contact.city.value ביומן הגולמי.
technical_contact.country.value principal.domain.tech.office_address.country_or_region ממופה ישירות מהשדה technical_contact.country.value ביומן הגולמי.
technical_contact.email.[].value principal.domain.tech.email_addresses הנתונים נשלפים מהמערך technical_contact.email ומתווספים לשדה email_addresses.
technical_contact.fax.value principal.domain.tech.attribute.labels.fax חולץ מ-technical_contact.fax.value ונוסף כתווית עם המפתח "fax" במאפיין tech.
technical_contact.name.value principal.domain.tech.user_display_name ממופה ישירות מהשדה technical_contact.name.value ביומן הגולמי.
technical_contact.org.value principal.domain.tech.company_name ממופה ישירות מהשדה technical_contact.org.value ביומן הגולמי.
technical_contact.phone.value principal.domain.tech.phone_numbers ממופה ישירות מהשדה technical_contact.phone.value ביומן הגולמי.
technical_contact.postal.value principal.domain.tech.attribute.labels.postal חולץ מ-technical_contact.postal.value ונוסף כתווית עם המפתח "postal" במאפיין tech.
technical_contact.state.value principal.domain.tech.office_address.state ממופה ישירות מהשדה technical_contact.state.value ביומן הגולמי.
technical_contact.street.value principal.domain.tech.office_address.name ממופה ישירות מהשדה technical_contact.street.value ביומן הגולמי.
tld about.labels.tld ממופה ישירות מהשדה tld ביומן הגולמי ונוסף כתווית באובייקט about.
חותמת זמן about.labels.timestamp ממופה ישירות משדה חותמת הזמן ביומן הגולמי ומתווסף כתווית באובייקט about.
website_response principal.network.http.response_code ממופה ישירות מהשדה website_response ביומן הגולמי.
website_title about.labels.website_title ממופה ישירות מהשדה website_title ביומן הגולמי ונוסף כתווית באובייקט about.
whois_url principal.domain.whois_server ממופה ישירות מהשדה whois_url ביומן הגולמי.
yandex_codes.[].value about.labels.yandex_codes המידע נשלף מהמערך yandex_codes ונוסף כתווית באובייקט about.
edr.client.hostname מוגדר לערך של שדה הדומיין.
edr.client.ip_addresses מוגדר לערך של הרכיב הראשון במערך ה-IP, ובאופן ספציפי ip.[0].address.value.
edr.raw_event_name מוגדר כ-"STATUS_UPDATE" אם principal.hostname קיים, אחרת מוגדר כ-"GENERIC_EVENT".
metadata.event_timestamp הועתק מהשדה create_time ברמה העליונה ביומן הגולמי.
metadata.event_type מוגדר כ-"STATUS_UPDATE" אם principal.hostname קיים, אחרת מוגדר כ-"GENERIC_EVENT".
metadata.log_type מגדירים את הערך "DOMAINTOOLS_THREATINTEL".
metadata.product_name מגדירים את הערך "DOMAINTOOLS".
metadata.vendor_name מגדירים את הערך "DOMAINTOOLS".

יומן שינויים

הצגת יומן השינויים של המנתח הזה

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