איסוף יומני פעילות של SentinelOne

נתמך ב:

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

‫SentinelOne Singularity היא פלטפורמה אוטונומית להגנה על נקודות קצה, שמספקת יכולות מניעה, זיהוי ותגובה בזמן אמת בנקודות קצה, בעומסי עבודה בענן ובמכשירי IoT. ביומן הפעילות מתועדים אירועים ניהוליים ותפעוליים בסביבת SentinelOne, כולל התחברויות של משתמשים, שינויים במדיניות, פעולות לניהול איומים, התקנות של סוכנים ושינויים בהגדרות האישיות של המערכת. אפשר לייצא את יומני הפעילות האלה באמצעות SentinelOne API בארכיטקטורת REST ולכתוב אותם לקטגוריה של GCS כדי ש-Google SecOps יקלוט אותם.

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

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

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

יצירת טוקן API של SentinelOne

  1. נכנסים למסוף הניהול של SentinelOne בכתובת https://<your-management-url>.sentinelone.net.
  2. עוברים אל הגדרות > משתמשים > משתמשי שירות.
  3. לוחצים על Actions >‏ Create New Service User.
  4. מזינים את פרטי ההגדרה הבאים:
    • שם: מזינים שם תיאורי (לדוגמה, SIEM Activity Log Integration)
    • תאריך תפוגה: מגדירים תאריך תפוגה או משאירים את ברירת המחדל.
    • רמת ההיקף: בוחרים את ההיקף המתאים (חשבון או אתר)
    • תפקיד: בוחרים באפשרות צפייה (ההרשאה המינימלית שנדרשת כדי לקרוא יומני פעילות)
  5. לוחצים על יצירת משתמש.
  6. תיבת דו-שיח מציגה את אסימון ה-API.
  7. מעתיקים ושומרים את אסימון ה-API בצורה מאובטחת.

אימות הגישה ל-API

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

    S1_BASE_URL="https://your-management-url.sentinelone.net"
    S1_API_TOKEN="your-api-token"
    
    curl -s -X GET "${S1_BASE_URL}/web/api/v2.1/activities?limit=2" \
        -H "Authorization: ApiToken ${S1_API_TOKEN}" \
        | python3 -m json.tool
    
  • תגובה מוצלחת מחזירה אובייקט JSON עם מערך data שמכיל רשומות של פעילויות ואובייקט pagination:

    {
        "data": [
            {
                "id": "123456789",
                "activityType": 27,
                "activityUuid": "a2c8037c-e6df-436d-b92b-bc09a418717e",
                "createdAt": "2026-03-29T10:30:00.000000Z",
                "primaryDescription": "User logged in",
                "accountId": "123456",
                "accountName": "My Account",
                "siteId": "789012",
                "data": {}
            }
        ],
        "pagination": {
            "nextCursor": "eyJpZCI6...",
            "totalItems": 1500
        }
    }
    

אם השגיאות האלה מופיעות:

  • ‫HTTP 401 (Unauthorized): מוודאים שהטוקן של ה-API תקין ושהתוקף שלו לא פג.
  • ‫HTTP 403 (Forbidden): מוודאים שלמשתמש השירות יש את ההיקף והתפקיד המתאימים.

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

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

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

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

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

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

  1. במסוף GCP, נכנסים לדף IAM & Admin > Service Accounts.
  2. לוחצים על Create Service Account.
  3. מזינים את פרטי ההגדרה הבאים:
    • Service account name: מזינים s1-activity-collector-sa
    • Service account description: מזינים Service account for Cloud Run function to collect SentinelOne Activity 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. מזינים את פרטי ההגדרה הבאים:
    • הוספת חשבונות משתמשים: מזינים את כתובת האימייל של חשבון השירות (לדוגמה, s1-activity-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. מזינים את פרטי ההגדרה הבאים:
    • מזהה הנושא: מזינים s1-activity-trigger
    • משאירים את שאר ההגדרות כברירת מחדל.
  4. לוחצים על יצירה.

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

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

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

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

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

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

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

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

    1. לוחצים על Variables & Secrets.
    2. לוחצים על ‎+ Add variable לכל משתנה סביבה:
    שם משתנה ערך לדוגמה תיאור
    GCS_BUCKET sentinelone-activity-logs שם הקטגוריה ב-GCS
    GCS_PREFIX sentinelone-activities קידומת לקובצי יומן
    STATE_KEY sentinelone-activities/state.json נתיב קובץ תמונת המצב
    S1_BASE_URL https://your-mgmt-url.sentinelone.net כתובת ה-URL של מסוף הניהול של SentinelOne
    S1_API_TOKEN your-api-token טוקן API של SentinelOne
    PAGE_SIZE 1000 רשומות לכל דף API (מקסימום 1,000)
    MAX_RECORDS 50000 מספר הרשומות המקסימלי לכל הרצה
    LOOKBACK_HOURS 2 תקופת המבט לאחור הראשונית
  10. גוללים למטה בקטע Variables & Secrets עד שמגיעים ל-Requests:

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

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

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

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

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

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

  1. בשדה Entry point, מזינים main.
  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=60.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', 'sentinelone-activities').strip('/')
      STATE_KEY = os.environ.get('STATE_KEY') or f"{GCS_PREFIX}/state.json"
      S1_BASE_URL = os.environ.get('S1_BASE_URL', '').rstrip('/')
      S1_API_TOKEN = os.environ.get('S1_API_TOKEN')
      PAGE_SIZE = int(os.environ.get('PAGE_SIZE', '1000'))
      MAX_RECORDS = int(os.environ.get('MAX_RECORDS', '50000'))
      LOOKBACK_HOURS = int(os.environ.get('LOOKBACK_HOURS', '2'))
      
      ACTIVITIES_ENDPOINT = '/web/api/v2.1/activities'
      
      def parse_datetime(value):
        """Parse ISO datetime string to datetime object."""
        if not value:
          return None
        if value.endswith("Z"):
          value = value[:-1] + "+00:00"
        try:
          return datetime.fromisoformat(value)
        except Exception:
          try:
            return datetime.strptime(value, '%Y-%m-%dT%H:%M:%S.%f')
          except Exception:
            return None
      
      @functions_framework.cloud_event
      def main(cloud_event):
        """
        Cloud Run function triggered by Pub/Sub to fetch
        SentinelOne Activity records and write to GCS.
      
        Args:
          cloud_event: CloudEvent object containing Pub/Sub message
        """
      
        if not all([GCS_BUCKET, S1_BASE_URL, S1_API_TOKEN]):
          print('Error: Missing required environment variables')
          return
      
        try:
          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 delayed events
              if last_time:
                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 activity logs from "
            f"{last_time.isoformat()} to {now.isoformat()}"
          )
      
          # Fetch activity logs
          records, newest_event_time = fetch_activity_logs(
            start_time=last_time,
            end_time=now,
          )
      
          if not records:
            print("No new activity 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}/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 "
            f"gs://{GCS_BUCKET}/{object_key}"
          )
      
          # Update state
          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 activity 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_event_time_iso):
        """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_activity_logs(start_time, end_time):
        """
        Fetch activity logs from SentinelOne REST API with
        cursor-based pagination.
      
        Args:
          start_time: Start time for log query
          end_time: End time for log query
      
        Returns:
          Tuple of (records list, newest_event_time ISO string)
        """
        url = f"{S1_BASE_URL}{ACTIVITIES_ENDPOINT}"
        headers = {
          'Authorization': f'ApiToken {S1_API_TOKEN}',
          'Content-Type': 'application/json',
        }
      
        # Format timestamps for SentinelOne API
        start_str = start_time.strftime('%Y-%m-%dT%H:%M:%S.000000Z')
      
        records = []
        newest_time = None
        cursor = None
        backoff = 1.0
      
        while True:
          if len(records) >= MAX_RECORDS:
            print(f"Reached max_records limit ({MAX_RECORDS})")
            break
      
          params = {
            'createdAt__gt': start_str,
            'limit': str(PAGE_SIZE),
            'sortBy': 'createdAt',
            'sortOrder': 'asc',
          }
      
          if cursor:
            params['cursor'] = cursor
      
          try:
            response = http.request(
              'GET', url,
              fields=params,
              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). "
                f"Retrying after {retry_after}s..."
              )
              time.sleep(retry_after)
              backoff = min(backoff * 2, 30.0)
              continue
      
            # Handle token expiry
            if response.status == 401:
              print(
                "API token is invalid or expired. "
                "Generate a new token in SentinelOne console."
              )
              return records, newest_time
      
            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 records, newest_time
      
            data = json.loads(response.data.decode('utf-8'))
            result = data.get('data', [])
            pagination = data.get('pagination', {})
            total_items = pagination.get('totalItems', 0)
            next_cursor = pagination.get('nextCursor')
      
            if not result:
              print("No more results (empty page)")
              break
      
            print(
              f"Retrieved {len(result)} events "
              f"(total: {total_items})"
            )
            records.extend(result)
      
            # Track newest event time
            for event in result:
              try:
                event_time = event.get('createdAt')
                if event_time:
                  if newest_time is None:
                    newest_time = event_time
                  else:
                    current_dt = parse_datetime(event_time)
                    newest_dt = parse_datetime(newest_time)
                    if (
                      current_dt and newest_dt
                      and current_dt > newest_dt
                    ):
                      newest_time = event_time
              except Exception as e:
                print(
                  f"Warning: Could not parse "
                  f"event time: {e}"
                )
      
            # Check pagination
            if not next_cursor:
              print("Reached last page")
              break
      
            cursor = next_cursor
      
          except Exception as e:
            print(f"Error fetching activity logs: {e}")
            return records, newest_time
      
        print(f"Retrieved {len(records)} total activity records")
        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. ממלאים את פרטי ההגדרה הבאים:

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

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

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

תדירות ביטוי Cron תרחיש לדוגמה
כל 10 דקות */10 * * * * נפח גבוה, כמעט בזמן אמת
כל שעה 0 * * * * רגיל (מומלץ)
כל שעתיים 0 */2 * * * החלשה של עוצמת הקול

בדיקת השילוב

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

    Fetching activity logs from YYYY-MM-DDTHH:MM:SS+00:00 to YYYY-MM-DDTHH:MM:SS+00:00
    Retrieved X events (total: Y)
    Wrote X records to gs://sentinelone-activity-logs/sentinelone-activities/logs_YYYYMMDD_HHMMSS.ndjson
    Successfully processed X records
    
  8. נכנסים לדף Cloud Storage > Buckets.

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

  10. עוברים לתיקיית הקידומת sentinelone-activities/.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

טבלת מיפוי UDM

שדה ביומן מיפוי UDM Logic (פונקציה לוגית)
deviceNtDomain about.administrative_domain שינוי שם/מיפוי
deviceExternalId about.asset.asset_id מיפוי ישיר
device_product about.asset.asset_id מיפוי ישיר
device_vendor about.asset.asset_id מיפוי ישיר
fileHash about.file.full_path מיפוי ישיר
filePath about.file.full_path שינוי שם/מיפוי
_hash about.file.sha256 שינוי שם/מיפוי
fileHash about.file.sha256 שינוי שם/מיפוי
fsize about.file.size שינוי שם/מיפוי
dvchost about.hostname שינוי שם/מיפוי
ips about.ip ממוזג
dvc_mac about.mac מופה: slot ← mac_address
dvcmac about.mac ממוזג
mac_address about.mac ממוזג
deviceTranslatedAddress about.nat_ip ממוזג
Emne about.process.command_line מיפוי ישיר
Path about.process.command_line מיפוי ישיר
Subject about.process.command_line מיפוי ישיר
deviceProcessName about.process.command_line שינוי שם/מיפוי
dvcpid about.process.pid שינוי שם/מיפוי
permissions about.resource.attribute.permissions ממוזג
additional_cfp1 additional.fields ממוזג
additional_cfp2 additional.fields ממוזג
additional_cfp3 additional.fields ממוזג
additional_cfp4 additional.fields ממוזג
additional_cn1 additional.fields ממוזג
additional_cn2 additional.fields ממוזג
additional_cn3 additional.fields ממוזג
additional_cs1 additional.fields ממוזג
additional_cs2 additional.fields ממוזג
additional_cs3 additional.fields ממוזג
additional_cs4 additional.fields ממוזג
additional_cs5 additional.fields ממוזג
additional_cs6 additional.fields ממוזג
additional_cs7 additional.fields ממוזג
additional_devicePayloadId additional.fields ממוזג
additional_eventId additional.fields ממוזג
additional_flexString1 additional.fields ממוזג
additional_fname additional.fields ממוזג
cs2 additional.fields מופה: arc_test ← additional_cs2
cs5_label additional.fields ממוזג
source_type_label additional.fields ממוזג
has_user extensions.auth.type מופה: true ← AUTHTYPE_UNSPECIFIED
event_name metadata.description מיפוי ישיר
msg metadata.description שינוי שם/מיפוי
primaryDescription metadata.description מיפוי ישיר
Generated metadata.event_timestamp נותח בתור yyyy-MM-ddTHH:mm:ss
Received metadata.event_timestamp נותח בתור yyyy-MM-ddTHH:mm:ss
createdAt metadata.event_timestamp נותח בתור ISO8601
rt metadata.event_timestamp נותח בתור (EEE,ddMMMyyyy,HH:mm:ss)
updatedAt metadata.event_timestamp נותח בתור ISO8601
event_name metadata.event_type מופה: "LogSpyware","LogPredictiveMachineLearning" ← SCAN_UNCATEGORIZED
has_principal metadata.event_type מופה: true ← NETWORK_CONNECTION, true ← STATUS_UPDATE
has_user metadata.event_type מופה: true ← USER_LOGIN
activityType metadata.product_event_type מיפוי ישיר
device_event_class_id metadata.product_event_type מיפוי ישיר
event_name metadata.product_event_type מיפוי ישיר
activityID metadata.product_log_id מיפוי ישיר
activityUuid metadata.product_log_id מיפוי ישיר
externalId metadata.product_log_id מיפוי ישיר
device_product metadata.product_name מיפוי ישיר
device_version metadata.product_version מיפוי ישיר
device_vendor metadata.vendor_name שינוי שם/מיפוי
app_protocol_output network.application_protocol מיפוי ישיר
deviceDirection network.direction מופה: 0 ← INBOUND, 1 ← OUTBOUND
requestMethod network.http.method שינוי שם/מיפוי
requestClientApplication network.http.user_agent שינוי שם/מיפוי
ip_protocol_out network.ip_protocol מיפוי ישיר
in network.received_bytes שינוי שם/מיפוי
out network.sent_bytes שינוי שם/מיפוי
sntdom principal.administrative_domain שינוי שם/מיפוי
sourceServiceName principal.application שינוי שם/מיפוי
data.ipAddress principal.asset.ip ממוזג
Group_name principal.group.group_display_name מיפוי ישיר
Gruppenavn principal.group.group_display_name מיפוי ישיר
Device_name principal.hostname מיפוי ישיר
Enhetsnavn principal.hostname מיפוי ישיר
shost principal.hostname שינוי שם/מיפוי
data.ipAddress principal.ip ממוזג
principal_ip principal.ip ממוזג
shost principal.ip ממוזג
mac principal.mac ממוזג
sourceTranslatedAddress principal.nat_ip ממוזג
sourceTranslatedPort principal.nat_port שינוי שם/מיפוי
spt principal.port שינוי שם/מיפוי
data.sourceprocesscommandline principal.process.command_line מיפוי ישיר
sproc principal.process.command_line שינוי שם/מיפוי
data.sourceprocessname principal.process.file.names ממוזג
spid principal.process.pid שינוי שם/מיפוי
principal_role principal.user.attribute.roles ממוזג
suser principal.user.user_display_name מיפוי ישיר
suid principal.user.userid שינוי שם/מיפוי
sec_result security_result ממוזג
_action security_result.action ממוזג
act security_result.action מופה: accept ← _action, deny ← _action
Action_Taken security_result.action_details מיפוי ישיר
act security_result.action_details מיפוי ישיר
cat security_result.category_details ממוזג
Scan_Type security_result.description מיפוי ישיר
Type security_result.description מיפוי ישיר
msg_data_2 security_result.description מיפוי ישיר
infection_channel_label security_result.detection_fields ממוזג
operasjon_label security_result.detection_fields ממוזג
operation_label security_result.detection_fields ממוזג
permission_label security_result.detection_fields ממוזג
spyware_Grayware_Type_label security_result.detection_fields ממוזג
threat_probability_label security_result.detection_fields ממוזג
tillatelse_label security_result.detection_fields ממוזג
mwProfile security_result.rule_name מיפוי ישיר
severity security_result.severity מופה: "0", "1", "2", "3", "LOW" ← LOW, ‏"4", "5", "6", "MEDIUM", "SUBSTANTIAL", "INFO"...
Result security_result.summary מיפוי ישיר
appcategory security_result.summary מיפוי ישיר
reason security_result.summary שינוי שם/מיפוי
Spyware security_result.threat_name מיפוי ישיר
Unknown_Threat security_result.threat_name מיפוי ישיר
Virus_Malware_Name security_result.threat_name מיפוי ישיר
oldFilePath src.file.full_path שינוי שם/מיפוי
oldFileSize src.file.size שינוי שם/מיפוי
old_permissions src.resource.attribute.permissions ממוזג
dntdom target.administrative_domain שינוי שם/מיפוי
destinationServiceName target.application שינוי שם/מיפוי
agentId target.asset.asset_id מיפוי ישיר
data.computerName target.asset.hostname מיפוי ישיר
data.newGroupName target.group.group_display_name מיפוי ישיר
data.newGroupId target.group.product_object_id מיפוי ישיר
data.computerName target.hostname מיפוי ישיר
temp_dhost target.hostname מיפוי ישיר
IPv6_Address target.ip ממוזג
dst_ip target.ip ממוזג
ipv6 target.ip מופה: - ← IPv6_Address
data.siteName target.location.name מיפוי ישיר
siteName target.location.name מיפוי ישיר
mac_address target.mac ממוזג
accountName target.namespace מיפוי ישיר
destination_translated_address target.nat_ip ממוזג
destinationTranslatedPort target.nat_port שינוי שם/מיפוי
dpt target.port שינוי שם/מיפוי
dproc target.process.command_line שינוי שם/מיפוי
File_name target.process.file.full_path מיפוי ישיר
Infected_Resource target.process.file.full_path מיפוי ישיר
Object target.process.file.full_path מיפוי ישיר
Objekt target.process.file.full_path מיפוי ישיר
dpid target.process.pid שינוי שם/מיפוי
full_scope_details_label target.resource.attribute.labels ממוזג
notification_scope_label target.resource.attribute.labels ממוזג
resource_Type_label target.resource.attribute.labels ממוזג
scope_level_label target.resource.attribute.labels ממוזג
site_id_label target.resource.attribute.labels ממוזג
vendor_activity_id_label target.resource.attribute.labels ממוזג
request target.url מיפוי ישיר
target_role target.user.attribute.roles ממוזג
CustomerName target.user.user_display_name מיפוי ישיר
data.accountName target.user.user_display_name מיפוי ישיר
temp_duser target.user.user_display_name מיפוי ישיר
Bruker target.user.userid מיפוי ישיר
User_value target.user.userid מיפוי ישיר
accountId target.user.userid מיפוי ישיר
temp_duid target.user.userid מיפוי ישיר
לא רלוונטי extensions.auth.type קבוע: AUTHTYPE_UNSPECIFIED
לא רלוונטי metadata.event_type קבוע: PROCESS_UNCATEGORIZED
לא רלוונטי metadata.vendor_name קבוע: SentinelOne
לא רלוונטי network.direction קבוע: INBOUND
לא רלוונטי security_result.severity קבוע: LOW
createdAt event.idm.read_only_udm.metadata.event_timestamp מופה מיומן השינויים
updatedAt event.idm.read_only_udm.security_result.last_updated_time מופה מיומן השינויים
activityUuid event.idm.read_only_udm.metadata.product_log_id מופה מיומן השינויים
activityID event.idm.read_only_udm.metadata.product_log_id מופה מיומן השינויים
primaryDescription event.idm.read_only_udm.metadata.description מופה מיומן השינויים
rt event.idm.read_only_udm.metadata.event_timestamp מופה מיומן השינויים
activityType event.idm.read_only_udm.metadata.product_event_type מופה מיומן השינויים
device_product event.idm.read_only_udm.metadata.product_name מופה מיומן השינויים
data.ipAddress event.idm.read_only_udm.principal.ip מופה מיומן השינויים
data.ipAddress event.idm.read_only_udm.principal.asset.ip מופה מיומן השינויים
data.sourceprocesscommandline event.idm.read_only_udm.principal.process.command_line מופה מיומן השינויים
data.sourceprocessname event.idm.read_only_udm.principal.process.file.names מופה מיומן השינויים
agentId event.idm.read_only_udm.target.asset.asset_id מופה מיומן השינויים
data.computerName event.idm.read_only_udm.target.hostname מופה מיומן השינויים
data.computerName event.idm.read_only_udm.target.asset.hostname מופה מיומן השינויים
accountName event.idm.read_only_udm.target.namespace מופה מיומן השינויים
siteName, event.idm.read_only_udm.target.location.name מופה מיומן השינויים
accountId event.idm.read_only_udm.target.user.userid מופה מיומן השינויים
data.accountName event.idm.read_only_udm.target.user.user_display_name מופה מיומן השינויים
data.newGroupId event.idm.read_only_udm.target.group.product_object_id מופה מיומן השינויים
data.newGroupName event.idm.read_only_udm.target.group.group_display_name מופה מיומן השינויים
data.sourceType event.idm.read_only_udm.additional.fields מופה מיומן השינויים
data.alertid event.idm.read_only_udm.security_result.rule_id מופה מיומן השינויים
data.ruledescription event.idm.read_only_udm.security_result.detection_fields מופה מיומן השינויים
data.oldGroupName event.idm.read_only_udm.security_result.detection_fields מופה מיומן השינויים
data.oldGroupId event.idm.read_only_udm.security_result.detection_fields מופה מיומן השינויים
data.newGroupId event.idm.read_only_udm.security_result.detection_fields מופה מיומן השינויים
data.newGroupName event.idm.read_only_udm.security_result.detection_fields מופה מיומן השינויים
data.fullScopeDetails event.idm.read_only_udm.security_result.description מופה מיומן השינויים

יומן שינויים

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

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