איסוף יומנים של SpyCloud

נתמך ב:

במאמר הזה מוסבר איך להטמיע יומנים של SpyCloud ב-Google Security Operations באמצעות Google Cloud Storage V2.

‫SpyCloud היא פלטפורמה למניעת השתלטות על חשבונות, שמספקת מידע על פרצות אבטחה ועל פרטי כניסה גנובים. הוא מספק רשומות של פריצות, התראות על רשימת מעקב ודוחות על פרטי כניסה שנפרצו באמצעות API בארכיטקטורת REST.

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

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

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

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

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

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

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

קבלת מפתח API

  1. נכנסים לפורטל SpyCloud כאדמינים.
  2. עוברים אל הגדרות > API.
  3. מעתיקים ושומרים את מפתח ה-API במקום מאובטח.

אימות ההרשאות

כדי לוודא שלמפתח ה-API יש את הגישה הנדרשת:

  1. נכנסים לפורטל SpyCloud.
  2. עוברים אל הגדרות > API.
  3. מוודאים שמפתח ה-API פעיל ושיש לו גישה לנקודות הקצה הנדרשות (נתוני פריצה, רשימת מעקב, מצפן).
  4. אם הגישה מוגבלת, צריך לפנות לאדמין של SpyCloud.

בדיקת הגישה ל-API

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

    # Replace with your actual API key
    API_KEY="your-api-key"
    
    # Test API access - fetch watchlist data
    curl -v -H "X-API-Key: ${API_KEY}" \
      "https://api.spycloud.io/enterprise-v2/breach/data/watchlist?since=2024-01-01&until=2024-01-02"
    

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    • חשבון שירות: בוחרים את חשבון השירות spycloud-collector-sa.
  9. עוברים לכרטיסייה מאגרי תגים:

    1. לוחצים על Variables & Secrets (משתנים וסודות).
    2. לוחצים על + הוספת משתנה לכל משתנה סביבתי:
    שם המשתנה ערך לדוגמה תיאור
    GCS_BUCKET spycloud-logs שם קטגוריית GCS
    GCS_PREFIX spycloud קידומת לקובצי יומן
    STATE_KEY spycloud/state.json נתיב קובץ תמונת מצב
    API_KEY your-api-key מפתח ה-API של SpyCloud
    API_BASE https://api.spycloud.io כתובת URL בסיסית של ה-API
    MAX_RECORDS 10000 מספר הרשומות המקסימלי בכל הפעלה
    LOOKBACK_DAYS 7 תקופת המבט לאחור הראשונית (בימים)
    STREAMS watchlist,catalog מקורות נתונים מופרדים בפסיקים
  10. בכרטיסייה Variables & Secrets, גוללים למטה אל Requests:

    • זמן קצוב לתפוגת בקשה: מזינים 600 שניות (10 דקות).
  11. עוברים לכרטיסייה הגדרות במאגרי תגים:

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

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

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

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

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

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

    • הקובץ הראשון: main.py:

      import functions_framework
      from google.cloud import storage
      import json
      import os
      import urllib3
      from datetime import datetime, timezone, timedelta
      import time
      
      # Initialize HTTP client with timeouts
      http = urllib3.PoolManager(
        timeout=urllib3.Timeout(connect=5.0, read=30.0),
        retries=False,
      )
      
      # Initialize Storage client
      storage_client = storage.Client()
      
      # Environment variables
      GCS_BUCKET = os.environ.get('GCS_BUCKET')
      GCS_PREFIX = os.environ.get('GCS_PREFIX', 'spycloud')
      STATE_KEY = os.environ.get('STATE_KEY', 'spycloud/state.json')
      API_KEY = os.environ.get('API_KEY', '')
      API_BASE = os.environ.get('API_BASE', 'https://api.spycloud.io').rstrip('/')
      MAX_RECORDS = int(os.environ.get('MAX_RECORDS', '10000'))
      LOOKBACK_DAYS = int(os.environ.get('LOOKBACK_DAYS', '7'))
      STREAMS = [s.strip() for s in os.environ.get('STREAMS', 'watchlist').split(',') if s.strip()]
      
      def parse_datetime(value: str) -> datetime:
        """Parse ISO datetime string to datetime object."""
        if value.endswith("Z"):
          value = value[:-1] + "+00:00"
        return datetime.fromisoformat(value)
      
      @functions_framework.cloud_event
      def main(cloud_event):
        """
        Cloud Run function triggered by Pub/Sub to fetch SpyCloud logs and write to GCS.
      
        Args:
          cloud_event: CloudEvent object containing Pub/Sub message
        """
      
        if not all([GCS_BUCKET, API_KEY]):
          print('Error: Missing required environment variables')
          return
      
        try:
          bucket = storage_client.bucket(GCS_BUCKET)
      
          # Load state
          state = load_state(bucket, STATE_KEY)
      
          now = datetime.now(timezone.utc)
      
          # Determine date range
          if isinstance(state, dict) and state.get("last_date"):
            since_date = state["last_date"]
          else:
            since_date = (now - timedelta(days=LOOKBACK_DAYS)).strftime('%Y-%m-%d')
      
          until_date = now.strftime('%Y-%m-%d')
      
          print(f"Fetching data from {since_date} to {until_date}")
      
          report = {}
      
          if 'watchlist' in STREAMS:
            print("Fetching watchlist breach data...")
            count = pull_watchlist(bucket, since_date, until_date)
            report['watchlist_records'] = count
      
          if 'catalog' in STREAMS:
            print("Fetching breach catalog...")
            count = pull_catalog(bucket, since_date, until_date)
            report['catalog_records'] = count
      
          if 'compass' in STREAMS:
            print("Fetching compass data...")
            count = pull_compass(bucket, since_date, until_date)
            report['compass_records'] = count
      
          # Update state
          save_state(bucket, STATE_KEY, until_date)
          print(f"Successfully processed: {json.dumps(report)}")
      
        except Exception as e:
          print(f'Error processing logs: {str(e)}')
          raise
      
      def load_state(bucket, key):
        """Load state from GCS."""
        try:
          blob = bucket.blob(key)
          if blob.exists():
            state_data = blob.download_as_text()
            return json.loads(state_data)
        except Exception as e:
          print(f"Warning: Could not load state: {e}")
      
        return {}
      
      def save_state(bucket, key, last_date: str):
        """Save the last query date to GCS state file."""
        try:
          state = {'last_date': last_date, 'last_event_time': datetime.now(timezone.utc).isoformat()}
          blob = bucket.blob(key)
          blob.upload_from_string(
            json.dumps(state, indent=2),
            content_type='application/json'
          )
          print(f"Saved state: last_date={last_date}")
        except Exception as e:
          print(f"Warning: Could not save state: {e}")
      
      def api_get(endpoint: str, params: dict = None):
        """Make authenticated GET request to SpyCloud API with rate limiting."""
        url = f"{API_BASE}{endpoint}"
        if params:
          query = '&'.join([f"{k}={v}" for k, v in params.items()])
          url = f"{url}?{query}"
      
        headers = {
          'X-API-Key': API_KEY,
          'Accept': 'application/json',
          'User-Agent': 'GoogleSecOps-SpyCloudCollector/1.0'
        }
      
        backoff = 1.0
        max_retries = 3
      
        for attempt in range(max_retries):
          response = http.request('GET', url, headers=headers)
      
          if response.status == 429:
            retry_after = int(response.headers.get('Retry-After', str(int(backoff))))
            print(f"Rate limited (429). Retrying after {retry_after}s...")
            time.sleep(retry_after)
            backoff = min(backoff * 2, 30.0)
            continue
      
          if response.status != 200:
            print(f"HTTP Error: {response.status} - {response.data.decode('utf-8')}")
            return None
      
          return json.loads(response.data.decode('utf-8'))
      
        print(f"Failed after {max_retries} retries due to rate limiting")
        return None
      
      def write_ndjson(bucket, prefix: str, stream_name: str, records: list):
        """Write records to GCS as NDJSON."""
        if not records:
          return 0
      
        now = datetime.now(timezone.utc)
        timestamp = now.strftime('%Y%m%d_%H%M%S')
        object_key = f"{GCS_PREFIX}/{stream_name}/logs_{timestamp}.ndjson"
        blob = bucket.blob(object_key)
      
        ndjson = '\n'.join([json.dumps(record, ensure_ascii=False) for record in records]) + '\n'
        blob.upload_from_string(ndjson, content_type='application/x-ndjson')
      
        print(f"Wrote {len(records)} records to gs://{GCS_BUCKET}/{object_key}")
        return len(records)
      
      def pull_watchlist(bucket, since_date: str, until_date: str):
        """Fetch watchlist breach data."""
        cursor = None
        all_records = []
      
        while True:
          params = {'since': since_date, 'until': until_date}
          if cursor:
            params['cursor'] = cursor
      
          data = api_get('/enterprise-v2/breach/data/watchlist', params)
          if not data:
            break
      
          results = data.get('results', [])
          if not results:
            break
      
          all_records.extend(results)
      
          if len(all_records) >= MAX_RECORDS:
            print(f"Reached max_records limit ({MAX_RECORDS})")
            break
      
          cursor = data.get('cursor')
          if not cursor:
            break
      
        return write_ndjson(bucket, GCS_PREFIX, 'watchlist', all_records)
      
      def pull_catalog(bucket, since_date: str, until_date: str):
        """Fetch breach catalog."""
        params = {'since': since_date, 'until': until_date}
        data = api_get('/enterprise-v2/breach/catalog', params)
        if not data:
          return 0
      
        results = data.get('results', [])
        return write_ndjson(bucket, GCS_PREFIX, 'catalog', results)
      
      def pull_compass(bucket, since_date: str, until_date: str):
        """Fetch compass findings."""
        cursor = None
        all_records = []
      
        while True:
          params = {'since': since_date, 'until': until_date}
          if cursor:
            params['cursor'] = cursor
      
          data = api_get('/enterprise-v2/compass/data', params)
          if not data:
            break
      
          results = data.get('results', [])
          if not results:
            break
      
          all_records.extend(results)
      
          if len(all_records) >= MAX_RECORDS:
            print(f"Reached max_records limit ({MAX_RECORDS})")
            break
      
          cursor = data.get('cursor')
          if not cursor:
            break
      
        return write_ndjson(bucket, GCS_PREFIX, 'compass', all_records)
      
    • הקובץ השני: requirements.txt:

      functions-framework==3.*
      google-cloud-storage==2.*
      urllib3>=2.0.0
      
  3. לוחצים על Deploy כדי לשמור ולפרוס את הפונקציה.

  4. ממתינים לסיום הפריסה (2-3 דקות).

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

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

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

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

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

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

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

בדיקת השילוב

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

    Fetching data from YYYY-MM-DD to YYYY-MM-DD
    Fetching watchlist breach data...
    Wrote X records to gs://spycloud-logs/spycloud/watchlist/logs_YYYYMMDD_HHMMSS.ndjson
    Successfully processed: {"watchlist_records": X, "catalog_records": Y}
    
  5. בודקים את מאגר ה-GCS (spycloud-logs) כדי לוודא שהיומנים נכתבו.

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

  • HTTP 401: בדיקת מפתח ה-API במשתני הסביבה
  • ‫HTTP 403: מוודאים שלמפתח ה-API יש גישה לנקודות הקצה הנדרשות
  • ‫HTTP 429: הגבלת קצב – הפונקציה תנסה שוב באופן אוטומטי עם השהיה לפני ניסיון חוזר (backoff)
  • חסרים משתני סביבה: צריך לוודא שכל המשתנים הנדרשים מוגדרים

הגדרת פיד ב-Google SecOps להטמעה של יומני SpyCloud

  1. עוברים אל SIEM Settings > Feeds (הגדרות SIEM > פידים).
  2. לוחצים על הוספת פיד חדש.
  3. לוחצים על Configure a single feed (הגדרת פיד יחיד).
  4. בשדה שם הפיד, מזינים שם לפיד (לדוגמה, SpyCloud Logs).
  5. בוחרים באפשרות Google Cloud Storage V2 בתור סוג המקור.
  6. בוחרים באפשרות SpyCloud בתור סוג היומן.
  7. לוחצים על קבלת חשבון שירות. תוצג כתובת האימייל בחשבון שירות ייחודי, לדוגמה:

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

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

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

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

      gs://spycloud-logs/spycloud/
      
      • מחליפים את:
        • ‫spycloud-logs: השם של קטגוריית GCS.
        • ‫spycloud: קידומת אופציונלית או נתיב לתיקייה שבה מאוחסנים היומנים (אם לא מציינים כלום, היומנים מאוחסנים בתיקיית הבסיס).
    • אפשרות למחיקת המקור: בוחרים את אפשרות המחיקה לפי ההעדפה שלכם:

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

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

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

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

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

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

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

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

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

טבלת מיפוי UDM

שדה ביומן מיפוי UDM היגיון
av_softwares, assets.av_softwares, assets.country, assets.country_code, assets.display_resolution, assets.email, assets.full_name, assets.infected_machine_id, assets.infected_path, assets.infected_time, assets.ip_addresses, assets.keyboard_languages, assets.password, assets.target_url, assets.username, assets.user_browser, assets.user_hostname, assets.user_os, assets.user_sys_registered_owner additional.fields המיזוג בוצע מתוויות שנוצרו מהשדות האלה ומהתווית av_software_list
סיסמה extensions.auth.auth_details הערך הועתק ישירות
מתי metadata.event_timestamp הערך מנותח כחותמת זמן בפורמט ISO8601
metadata.event_type הערך נקבע על סמך התנאים הבאים: NETWORK_CONNECTION אם יש has_principal,‏ has_target,‏ has_network;‏ USER_UNCATEGORIZED אם יש has_principal ו-has_principal_userid;‏ STATUS_UPDATE אם יש has_principal ואין has_principal_ip; אחרת GENERIC_EVENT; או USER_UNCATEGORIZED אם יש user_hostname,‏ ip או infected_machine_id
infected_time metadata.ingested_timestamp הניתוח מתבצע כחותמת זמן בפורמטים yyyy-MM-ddTHH:mm:ssZ,‏ RFC 3339 ו-ISO8601
log_id, assets.log_id, uuid metadata.product_log_id ערך מ-log_id אם הוא לא ריק, אחרת assets.log_id, אחרת uuid
user_os network.http.parsed_user_agent הומר לסוכן משתמש מנותח
user_os network.http.user_agent הערך הועתק ישירות
cookie_domain principal.administrative_domain הערך הועתק ישירות
מדינה principal.asset.location.country_or_region הערך הועתק ישירות
infected_machine_id principal.asset_id הערך משורשר כ-'id: ' + infected_machine_id
infected_path principal.file.full_path הערך הועתק ישירות
user_hostname, domain principal.hostname מוגדר ל-user_hostname אם הוא לא ריק, ואז ל-domain אם הוא לא ריק
ip, ip_addresses principal.ip מוזג ממערך ip וממערך ip_addresses
country_code principal.resource.attribute.labels המיזוג בוצע מהתווית של קוד המדינה [country_code_label] שנוצרה מקוד המדינה [country_code]
id principal.resource.id הערך הועתק ישירות (הומר למחרוזת)
דף הבית principal.url הערך הועתק ישירות
אימייל principal.user.email_addresses הערך הועתק ישירות
full_name principal.user.user_display_name הערך הועתק ישירות
user_sys_registered_owner, email_username principal.user.userid מוגדר ל-user_sys_registered_owner, ואז ל-email_username אם הוא לא ריק
מובהקות security_result.confidence_details הומר למחרוזת
description security_result.description הערך הועתק ישירות
cookie_expiration, ‏ cookie_name, ‏ cookie_subdomain, ‏ cookie_value, ‏ day, ‏ document_id, ‏ locality_zone, ‏ source_id, ‏ spycloud_publishdate, ‏ spycloud_publish_date, ‏ user_browser, ‏ infected_time, ‏ timezone, ‏ password_type, ‏ password_plaintext, ‏ email_domain, ‏ api_token, ‏ account_status, ‏ breach_category, ‏ breach_main_category, ‏ consumer_category, ‏ malware_family, ‏ num_records, ‏ premium_flag, ‏ sensitive_source, ‏ short_title, ‏ site_description, ‏ title, ‏ tlp, ‏ type, ‏ display_resolution, ‏ keyboard_languages security_result.detection_fields מוזגו מתוויות שנוצרו מהשדות האלה
severity security_result.severity מגדירים את הערך LOW אם הוא 2, INFORMATIONAL אם הוא 5, HIGH אם הוא 20, CRITICAL אם הוא 25 או 26
severity security_result.severity_details הערך הועתק ישירות
target_subdomain target.administrative_domain הערך הועתק ישירות
target_domain target.asset.hostname הערך הועתק ישירות
target_domain target.hostname הערך הועתק ישירות
target_url target.url הערך הועתק ישירות
שם משתמש target.user.userid הערך הועתק ישירות
metadata.product_name הוגדר כ-'SPYCLOUD'
metadata.vendor_name הגדרה ל-SpyCloud
spycloud_publish_date", "infected_time", and "timezone security_result.detection_fields מופה מיומן השינויים

יומן שינויים

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

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