איסוף יומנים של התראות Intel 471 Watcher

נתמך ב:

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

‫Intel 471 היא חברה למודיעין איומי סייבר שמספקת מודיעין על יריבים ותוכנות זדוניות שמקורו בכלכלה המחתרתית. התראות Watcher הן התראות שנוצרות על ידי פלטפורמת Titan של Intel 471 כשמזוהה תוכן חדש שתואם לקריטריונים של Watcher שהוגדרו על ידי הלקוח. כך אפשר לקבל בזמן אמת מידע על איומים רלוונטיים כמו פעילות של שחקנים, פוסטים בפורומים ומידע על תוכנות זדוניות.

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

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

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

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

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

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

איסוף פרטי הכניסה ל-Intel 471 Titan API

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

  1. נכנסים לפורטל Intel 471 Titan.
  2. לוחצים על סמל פרופיל המשתמש בפינה השמאלית העליונה.
  3. עוברים לקטע API.
  4. מעתיקים ושומרים את מפתח ה-API שמוצג בדף.
  5. רושמים את כתובת האימייל שמשויכת לחשבון Intel 471 (האימייל שבו השתמשתם כדי להיכנס).

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

כדי לוודא שיש לחשבון את ההרשאות הנדרשות:

  1. נכנסים לפורטל Intel 471 Titan.
  2. בתפריט הניווט, עוברים אל צופים.
  3. אם אתם יכולים לראות את ההגדרות וההתראות הקיימות של Watcher, יש לכם את ההרשאות הנדרשות.
  4. אם אתם לא רואים את הקטע הזה, פנו לאדמין של Intel 471 כדי לקבל גישה ל-API והרשאות צפייה.

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

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

    # Replace with your actual credentials
    INTEL471_EMAIL="your-email@example.com"
    INTEL471_API_KEY="your-api-key"
    
    # Test API access
    curl -v -u "${INTEL471_EMAIL}:${INTEL471_API_KEY}" \
        "https://api.intel471.com/v1/alerts?count=1"
    

אם הבדיקה תצליח, אמורה להתקבל תגובת JSON עם מערך alerts. אם מופיעה הודעת שגיאה:

  • ‫HTTP 401: צריך לוודא שכתובת האימייל ומפתח ה-API נכונים
  • ‫HTTP 403: צריך לוודא שלחשבון יש הרשאות לצפייה בהתראות
  • HTTP 429: חריגה ממגבלת הקצב, צריך לחכות ולנסות שוב

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

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

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

  1. במסוף GCP, נכנסים לדף IAM & Admin > Service Accounts.
  2. לוחצים על יצירת חשבון שירות.
  3. מספקים את פרטי ההגדרה הבאים:
    • Service account name: מזינים intel471-alerts-collector-sa
    • Service account description: מזינים Service account for Cloud Run function to collect Intel 471 Watcher Alerts 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 (הפעלת פונקציות של Cloud Functions) ולוחצים עליה.
  6. לוחצים על Continue.
  7. לוחצים על סיום.

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

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

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

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

  1. עוברים אל Cloud Storage > Buckets (קטגוריות).
  2. לוחצים על שם הקטגוריה (לדוגמה, intel471-watcher-alerts-logs).
  3. עוברים לכרטיסייה Permissions.
  4. לוחצים על הענקת גישה.
  5. מספקים את פרטי ההגדרה הבאים:
    • Add principals (הוספת ישויות מורשות): מזינים את כתובת האימייל בחשבון של חשבון השירות (לדוגמה, intel471-alerts-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. מספקים את פרטי ההגדרה הבאים:
    • מזהה הנושא: מזינים intel471-alerts-trigger
    • משאירים את שאר ההגדרות כברירת מחדל.
  4. לוחצים על יצירה.

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

פונקציית Cloud Run תופעל על ידי הודעות Pub/Sub מ-Cloud Scheduler כדי לאחזר התראות Watcher מ-Intel 471 Titan API ולכתוב אותן ב-GCS.

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

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

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

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

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

    • חשבון שירות: בוחרים את חשבון השירות (לדוגמה, intel471-alerts-collector-sa)
  9. עוברים לכרטיסייה מאגרי תגים:

    1. לוחצים על Variables & Secrets (משתנים וסודות).
    2. לוחצים על + הוספת משתנה לכל משתנה סביבתי:

      שם המשתנה ערך לדוגמה תיאור
      GCS_BUCKET intel471-watcher-alerts-logs שם הקטגוריה ב-GCS
      GCS_PREFIX intel471-alerts קידומת לקובצי יומן
      STATE_KEY intel471-alerts/state.json נתיב קובץ תמונת מצב
      INTEL471_EMAIL your-email@example.com כתובת האימייל בחשבון Intel 471
      INTEL471_API_KEY your-api-key מפתח API של Intel 471
      MAX_RECORDS 1000 מספר הרשומות המקסימלי בכל הפעלה
      PAGE_SIZE 100 רשומות בכל דף (עד 100)
      LOOKBACK_HOURS 24 תקופת המבט לאחור הראשונית
  10. בקטע Variables & Secrets, גוללים למטה אל Requests:

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

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

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

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

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

  1. מזינים main בשדה 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
      import base64
      
      # 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', 'intel471-alerts')
      STATE_KEY = os.environ.get('STATE_KEY', 'intel471-alerts/state.json')
      INTEL471_EMAIL = os.environ.get('INTEL471_EMAIL')
      INTEL471_API_KEY = os.environ.get('INTEL471_API_KEY')
      MAX_RECORDS = int(os.environ.get('MAX_RECORDS', '1000'))
      PAGE_SIZE = int(os.environ.get('PAGE_SIZE', '100'))
      LOOKBACK_HOURS = int(os.environ.get('LOOKBACK_HOURS', '24'))
      
      API_BASE = 'https://api.intel471.com/v1'
      
      def to_unix_millis(dt: datetime) -> int:
          """Convert datetime to Unix epoch milliseconds."""
          if dt.tzinfo is None:
              dt = dt.replace(tzinfo=timezone.utc)
          dt = dt.astimezone(timezone.utc)
          return int(dt.timestamp() * 1000)
      
      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 Intel 471 Watcher Alerts and write to GCS.
      
          Args:
              cloud_event: CloudEvent object containing Pub/Sub message
          """
      
          if not all([GCS_BUCKET, INTEL471_EMAIL, INTEL471_API_KEY]):
              print('Error: Missing required environment variables')
              return
      
          try:
              # Get GCS bucket
              bucket = storage_client.bucket(GCS_BUCKET)
      
              # Load state
              state = load_state(bucket, STATE_KEY)
      
              # Determine time window
              now = datetime.now(timezone.utc)
              last_time = None
      
              if isinstance(state, dict) and state.get("last_event_time"):
                  try:
                      last_time = parse_datetime(state["last_event_time"])
                      # Overlap by 2 minutes to catch any delayed events
                      last_time = last_time - timedelta(minutes=2)
                  except Exception as e:
                      print(f"Warning: Could not parse last_event_time: {e}")
      
              if last_time is None:
                  last_time = now - timedelta(hours=LOOKBACK_HOURS)
      
              print(f"Fetching alerts from {last_time.isoformat()} to {now.isoformat()}")
      
              # Convert to Unix milliseconds for Titan API
              start_millis = to_unix_millis(last_time)
              end_millis = to_unix_millis(now)
      
              # Fetch alerts
              records, newest_event_time = fetch_alerts(
                  email=INTEL471_EMAIL,
                  api_key=INTEL471_API_KEY,
                  start_millis=start_millis,
                  end_millis=end_millis,
                  page_size=PAGE_SIZE,
                  max_records=MAX_RECORDS,
              )
      
              if not records:
                  print("No new alert records found.")
                  save_state(bucket, STATE_KEY, now.isoformat())
                  return
      
              # Write to GCS as NDJSON
              timestamp = now.strftime('%Y%m%d_%H%M%S')
              object_key = f"{GCS_PREFIX}/alerts_{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}")
      
              # Update state with newest event time
              if newest_event_time:
                  save_state(bucket, STATE_KEY, newest_event_time)
              else:
                  save_state(bucket, STATE_KEY, now.isoformat())
      
              print(f"Successfully processed {len(records)} records")
      
          except Exception as e:
              print(f'Error processing alerts: {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_event_time_iso: str):
          """Save the last event timestamp to GCS state file."""
          try:
              state = {'last_event_time': last_event_time_iso}
              blob = bucket.blob(key)
              blob.upload_from_string(
                  json.dumps(state, indent=2),
                  content_type='application/json'
              )
              print(f"Saved state: last_event_time={last_event_time_iso}")
          except Exception as e:
              print(f"Warning: Could not save state: {e}")
      
      def fetch_alerts(email: str, api_key: str, start_millis: int, end_millis: int, page_size: int, max_records: int):
          """
          Fetch Watcher Alerts from Intel 471 Titan API with pagination and rate limiting.
      
          Args:
              email: Intel 471 account email
              api_key: Intel 471 API key
              start_millis: Start time in Unix epoch milliseconds
              end_millis: End time in Unix epoch milliseconds
              page_size: Number of records per page (max 100)
              max_records: Maximum total records to fetch
      
          Returns:
              Tuple of (records list, newest_event_time ISO string)
          """
          endpoint = f"{API_BASE}/alerts"
      
          # Build Basic Auth header
          auth_string = f"{email}:{api_key}"
          auth_bytes = auth_string.encode('utf-8')
          auth_b64 = base64.b64encode(auth_bytes).decode('utf-8')
      
          headers = {
              'Authorization': f'Basic {auth_b64}',
              'Accept': 'application/json',
              'User-Agent': 'GoogleSecOps-Intel471Collector/1.0'
          }
      
          records = []
          newest_time = None
          page_num = 0
          backoff = 1.0
          offset = 0
      
          while True:
              page_num += 1
      
              if len(records) >= max_records:
                  print(f"Reached max_records limit ({max_records})")
                  break
      
              # Build request URL with pagination and time filtering
              current_page_size = min(page_size, max_records - len(records))
              params = []
              params.append(f"count={current_page_size}")
              params.append(f"offset={offset}")
              params.append(f"from={start_millis}")
              params.append(f"until={end_millis}")
              url = f"{endpoint}?{'&'.join(params)}"
      
              try:
                  response = http.request('GET', url, headers=headers)
      
                  # Handle rate limiting with exponential backoff
                  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, 60.0)
                      continue
      
                  backoff = 1.0
      
                  if response.status != 200:
                      print(f"HTTP Error: {response.status}")
                      response_text = response.data.decode('utf-8')
                      print(f"Response body: {response_text}")
                      return [], None
      
                  data = json.loads(response.data.decode('utf-8'))
      
                  # Extract results from alerts
                  page_results = data.get('alerts', [])
      
                  if not page_results:
                      print(f"No more results (empty page)")
                      break
      
                  print(f"Page {page_num}: Retrieved {len(page_results)} alerts")
                  records.extend(page_results)
      
                  # Track newest event time using foundTime (Unix milliseconds)
                  for alert in page_results:
                      try:
                          found_time_ms = alert.get('foundTime')
                          if found_time_ms:
                              event_dt = datetime.fromtimestamp(found_time_ms / 1000, tz=timezone.utc)
                              event_time = event_dt.isoformat()
                              if newest_time is None or parse_datetime(event_time) > parse_datetime(newest_time):
                                  newest_time = event_time
                      except Exception as e:
                          print(f"Warning: Could not parse event time: {e}")
      
                  # Check for more results
                  alert_total = data.get('alertTotalCount', 0)
                  if len(records) >= alert_total:
                      print(f"Retrieved all available alerts ({alert_total} total)")
                      break
      
                  if len(page_results) < current_page_size:
                      print(f"Reached last page (size={len(page_results)} < limit={current_page_size})")
                      break
      
                  offset += len(page_results)
      
              except Exception as e:
                  print(f"Error fetching alerts: {e}")
                  return [], None
      
          print(f"Retrieved {len(records)} total records from {page_num} pages")
          return records, newest_time
      
    • 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. מספקים את פרטי ההגדרה הבאים:

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

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

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

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

בדיקת השילוב

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

    Fetching alerts from YYYY-MM-DDTHH:MM:SS+00:00 to YYYY-MM-DDTHH:MM:SS+00:00
    Page 1: Retrieved X alerts
    Wrote X records to gs://bucket-name/intel471-alerts/alerts_YYYYMMDD_HHMMSS.ndjson
    Successfully processed X records
    
  8. עוברים אל Cloud Storage > Buckets (קטגוריות).

  9. לוחצים על שם הקטגוריה (לדוגמה, intel471-watcher-alerts-logs).

  10. עוברים לתיקיית הקידומת (לדוגמה, intel471-alerts/).

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

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

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

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

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

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

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

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

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

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

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

      gs://intel471-watcher-alerts-logs/intel471-alerts/
      

      מחליפים את:

      • ‫intel471-watcher-alerts-logs: השם של קטגוריית GCS.
      • ‫intel471-alerts: קידומת או נתיב תיקייה שבהם מאוחסנים יומני התראות.
    • אפשרות למחיקת המקור: בוחרים את אפשרות המחיקה המועדפת:

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

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

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

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

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

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

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

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

טבלת מיפוי UDM

שדה ביומן מיפוי UDM היגיון
post.links.forum.uid additional.fields שדות מטא-נתונים נוספים שלא נכללים בשדות UDM רגילים
post.links.forum.name additional.fields
post.links.thread.uid additional.fields
post.links.thread.topic additional.fields
post.links.thread.count additional.fields
post.uid additional.fields
post.message additional.fields
highlight.field additional.fields
chunk.text additional.fields
chunk.hl additional.fields
actor.links.forumTotalCount additional.fields
actor.links.forumPrivateMessageTotalCount additional.fields
actor.links.instantMessageChannelTotalCount additional.fields
actor.links.reportTotalCount additional.fields
actor.links.instantMessageTotalCount additional.fields
actor.links.instantMessageServerTotalCount additional.fields
actor.links.forumPostTotalCount additional.fields
actor.lastUpdated additional.fields
actor.activeFrom additional.fields
actor.activeUntil additional.fields
data_leak_post.chunk_number additional.fields
data_leak_post.links.blog.uid additional.fields
data_leak_post.links.blog.name additional.fields
data_leak_post.links.thread.uid additional.fields
data_leak_post.links.thread.topic additional.fields
data_leak_post.links.thread.count additional.fields
data_leak_post.message additional.fields
actor.links.reports[].uid additional.fields
actor.links.reports[].admiraltyCode additional.fields
actor.links.reports[].dateOfInformation additional.fields
סטטוס additional.fields
watcherUid additional.fields
watcherGroupUid additional.fields
report.uid additional.fields
report.admiraltyCode additional.fields
foundTime additional.fields
instantMessage.data.message.text additional.fields
instantMessage.data.message.uid additional.fields
instantMessage.data.channel.name additional.fields
instantMessage.data.channel.uid additional.fields
instantMessage.data.channel.url additional.fields
instantMessage.data.channel.registration_date additional.fields
instantMessage.data.channel.topic additional.fields
instantMessage.data.server.uid additional.fields
instantMessage.data.server.service_type additional.fields
post.links.forum.description metadata.description תיאור האירוע או הישות
actor.links.reports[].subject metadata.description
report.subject metadata.description
report.released metadata.event_timestamp חותמת הזמן של האירוע
metadata.event_type metadata.event_type סוג האירוע (למשל, USER_LOGIN, ‏ NETWORK_CONNECTION)
uid metadata.product_log_id מזהה היומן מהמוצר
data_leak_post.file_listing.download_url principal.url כתובת ה-URL שמשויכת למנהל
actor.links.reports[].portalReportUrl principal.url
report.portalReportUrl principal.url
post.links.authorActor.handle principal.user.attribute.labels מאפייני המשתמשים
actor.links.reports[].actorHandle principal.user.attribute.labels
instantMessage.data.actor.handle principal.user.attribute.labels
post.links.authorActor.uid principal.user.userid מזהה משתמש
actor.uid principal.user.userid
data_leak_post.uid principal.user.userid
instantMessage.data.actor.uid principal.user.userid
report.uid event.idm.read_only_udm.metadata.additional.fields מופה מיומן השינויים
report.admiraltyCode event.idm.read_only_udm.metadata.additional.fields מופה מיומן השינויים
report.subject event.idm.read_only_udm.metadata.description מופה מיומן השינויים
report.portalReportUrl event.idm.read_only_udm.principal.url מופה מיומן השינויים
report.released event.idm.read_only_udm.metadata.event_timestamp מופה מיומן השינויים
post.links.forum.description" and "actor.links.reports.subject metadata.description מופה מיומן השינויים
post.links.authorActor.uid", "data_leak_post.uid" and "actor.uid principal.user.userid מופה מיומן השינויים
post.links.authorActor.handle" and "actor.links.reports.actorHandle principal.user.attribute.labels מופה מיומן השינויים
data_leak_post.file_listing.download_url" and "actor.links.reports.portalReportUrl principal.url מופה מיומן השינויים
post.links.forum.uid", "post.links.forum.name", "post.links.thread.uid", "post.links.thread.topic", "post.links.thread.count", "post.uid", "post.message", "highlights.field", "highlights.chunks.text", "highlights.chunks.hl", "actor.links.forumTotalCount", "actor.links.forumPrivateMessageTotalCount", "actor.links.instantMessageChannelTotalCount", "actor.links.reportTotalCount", "actor.links.instantMessageTotalCount", "actor.links.instantMessageServerTotalCount", "actor.links.forumPostTotalCount", "actor.lastUpdated", "actor.activeFrom", "actor.activeUntil", "data_leak_post.chunk_number", "data_leak_post.links.blog.uid", "data_leak_post.links.blog.name", "data_leak_post.links.thread.uid", "data_leak_post.links.thread.topic", "data_leak_post.links.thread.count", "data_leak_post.message", "actor.links.reports.uid", "actor.links.reports.admiraltyCode", "actor.links.reports.dateOfInformation additional.fields מופה מיומן השינויים

יומן שינויים

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

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