איסוף מערכי נתונים מרכזיים של Code42 Incydr

גרסת המנתח: 3.0

נתמך ב:

במסמך הזה מוסבר איך להטמיע מערכי נתונים מרכזיים של Code42 Incydr (משתמשים, ביקורת, תיקים ואופציונלית אירועי קבצים) ב-Google Security Operations באמצעות Google Cloud Storage.

‫Code42 Incydr הוא פתרון לניהול סיכונים פנימיים שמזהה זליגת מידע במכשירים, חוקר אותה ומגיב לה. הפתרון עוקב אחרי פעילות בקבצים בזמן אמת בנקודות קצה, בשירותי ענן ובאימייל.

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

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

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

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

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

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

איסוף פרטי הכניסה ל-API של Code42 Incydr

יצירת לקוח API

  1. נכנסים למסוף האינטרנט של Code42 Incydr.
  2. עוברים אל ניהול > שילובים > לקוחות API.
  3. לוחצים על יצירת לקוח API חדש.
  4. בתיבת הדו-שיח Create new API client (יצירת לקוח API חדש), מזינים שם ללקוח (לדוגמה, Google Security Operations Integration).
  5. מעתיקים את הפרטים הבאים ושומרים אותם במיקום מאובטח:
    • מזהה לקוח: המזהה של לקוח ה-API.
    • ‫Secret: מפתח ה-API Secret של הלקוח.
  6. לוחצים על יצירה.

קביעת כתובת ה-URL הבסיסית של ה-API

כתובת ה-URL הבסיסית של ה-API תלויה בכתובת ה-URL של מסוף Code42 Incydr. מאמתים את כתובת ה-URL של API Gateway בפורטל למפתחים של Incydr או במאמרי העזרה של הסביבה של הדייר (tenant).

  • ברירות מחדל נפוצות:

    כתובת ה-URL של המסוף כתובת URL בסיסית של ה-API
    https://console.us.code42.com https://api.us.code42.com
    https://console.us2.code42.com https://api.us2.code42.com
    https://console.ie.code42.com https://api.ie.code42.com
    https://console.gov.code42.com https://api.gov.code42.com

אימות ההרשאות של לקוח ה-API

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

  1. במסוף Code42 Incydr, עוברים אל Administration > Integrations > API Clients (ניהול > שילובים > לקוחות API).
  2. לוחצים על השם של לקוח ה-API שיצרתם.
  3. מוודאים שללקוח ה-API יש גישה להיקפי ההרשאות הבאים:

    • משתמשים: גישת קריאה לנתוני משתמשים
    • יומן ביקורת: הרשאת קריאה ליומני ביקורת
    • בקשות תמיכה: גישת קריאה לנתוני בקשות תמיכה
    • אירועים שקשורים לקבצים (אופציונלי): גישת קריאה לנתוני אירועים שקשורים לקבצים

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

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

    # Replace with your actual credentials
    CLIENT_ID="your-client-id"
    CLIENT_SECRET="your-client-secret"
    API_BASE="https://api.us.code42.com"
    
    # Get OAuth token
    TOKEN=$(curl -s -X POST "${API_BASE}/v1/oauth/token" \
      -u "${CLIENT_ID}:${CLIENT_SECRET}" \
      -H "Content-Type: application/x-www-form-urlencoded" \
      -d "grant_type=client_credentials" | jq -r '.access_token')
    
    # Test API access
    curl -v -H "Authorization: Bearer ${TOKEN}" "${API_BASE}/v1/users?pageSize=1"
    

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

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

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

  1. במסוף GCP, נכנסים לדף IAM & Admin > Service Accounts.
  2. לוחצים על יצירת חשבון שירות.
  3. מספקים את פרטי ההגדרה הבאים:
    • שם חשבון השירות: מזינים code42-incydr-collector-sa.
    • תיאור חשבון השירות: מזינים Service account for Cloud Run function to collect Code42 Incydr 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. לוחצים על שם הקטגוריה (לדוגמה, code42-incydr-logs).
  3. עוברים לכרטיסייה Permissions.
  4. לוחצים על הענקת גישה.
  5. מספקים את פרטי ההגדרה הבאים:
    • Add principals (הוספת ישויות מורשות): מזינים את כתובת האימייל בחשבון השירות (לדוגמה, code42-incydr-collector-sa@your-project.iam.gserviceaccount.com).
    • הקצאת תפקידים: בוחרים באפשרות אדמין של אובייקטים באחסון.
  6. לוחצים על Save.

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

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

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

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

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

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

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

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

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

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

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

    1. לוחצים על Variables & Secrets (משתנים וסודות).
    2. לוחצים על + הוספת משתנה לכל משתנה סביבתי:
    שם משתנה ערך לדוגמה תיאור
    INCYDR_BASE_URL https://api.us.code42.com כתובת ה-URL הבסיסית של ה-API מהדייר
    INCYDR_CLIENT_ID your-client-id מזהה לקוח API
    INCYDR_CLIENT_SECRET your-client-secret API client secret
    GCS_BUCKET code42-incydr-logs שם הקטגוריה ב-GCS
    GCS_PREFIX code42/ קידומת לקובצי יומן
    PAGE_SIZE 500 רשומות בכל דף
    LOOKBACK_MINUTES 60 תקופת המבט לאחור הראשונית
    STREAMS users,audit,cases מקורות נתונים מופרדים בפסיקים
    FE_QUERY_JSON `` אופציונלי: קובץ JSON של שאילתת אירועים
    FE_PAGE_SIZE 1000 אופציונלי: גודל הדף של אירועי הקבצים
  10. בכרטיסייה Variables & Secrets, גוללים למטה אל Requests:

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

    • בקטע Resources:
      • זיכרון: בוחרים באפשרות 1,024 MiB או יותר.
      • מעבד (CPU): בוחרים באפשרות 1.
    • לוחצים על סיום.
  12. גוללים אל Execution environment:

    • בוחרים באפשרות ברירת מחדל (מומלץ).
  13. בקטע Revision scaling:

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

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

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

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

  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, timedelta, timezone
    import time
    
    # Initialize HTTP client
    http = urllib3.PoolManager(
        timeout=urllib3.Timeout(connect=5.0, read=30.0),
        retries=False,
    )
    
    # Initialize Storage client
    storage_client = storage.Client()
    
    # Environment variables
    BASE = os.environ.get("INCYDR_BASE_URL", "").rstrip("/")
    CID = os.environ.get("INCYDR_CLIENT_ID", "")
    CSECRET = os.environ.get("INCYDR_CLIENT_SECRET", "")
    BUCKET = os.environ.get("GCS_BUCKET", "")
    PREFIX_BASE = os.environ.get("GCS_PREFIX", "code42/")
    PAGE_SIZE = int(os.environ.get("PAGE_SIZE", "500"))
    LOOKBACK_MINUTES = int(os.environ.get("LOOKBACK_MINUTES", "60"))
    STREAMS = [s.strip() for s in os.environ.get("STREAMS", "users").split(",") if s.strip()]
    FE_QUERY_JSON = os.environ.get("FE_QUERY_JSON", "").strip()
    FE_PAGE_SIZE = int(os.environ.get("FE_PAGE_SIZE", "1000"))
    
    def now_utc():
        return datetime.now(timezone.utc)
    
    def iso_minus(minutes: int):
        return (now_utc() - timedelta(minutes=minutes)).strftime("%Y-%m-%dT%H:%M:%SZ")
    
    def put_json(bucket, prefix: str, page_label: str, data):
        ts = now_utc().strftime("%Y/%m/%d/%H%M%S")
        key = f"{PREFIX_BASE}{prefix}{ts}-{page_label}.json"
        blob = bucket.blob(key)
        blob.upload_from_string(json.dumps(data), content_type='application/json')
        return key
    
    def get_token():
        """Get OAuth 2.0 access token using client credentials flow."""
        token_url = f"{BASE}/v1/oauth/token"
    
        # Encode credentials
        import base64
        credentials = f"{CID}:{CSECRET}"
        encoded_credentials = base64.b64encode(credentials.encode('utf-8')).decode('utf-8')
    
        headers = {
            'Authorization': f'Basic {encoded_credentials}',
            'Content-Type': 'application/x-www-form-urlencoded',
            'Accept': 'application/json'
        }
    
        body = 'grant_type=client_credentials'
    
        backoff = 1.0
        max_retries = 3
    
        for attempt in range(max_retries):
            response = http.request('POST', token_url, body=body, headers=headers)
    
            if response.status == 429:
                retry_after = int(response.headers.get('Retry-After', str(int(backoff))))
                print(f"Rate limited (429) on token request. Retrying after {retry_after}s...")
                time.sleep(retry_after)
                backoff = min(backoff * 2, 30.0)
                continue
    
            if response.status != 200:
                raise RuntimeError(f"Failed to get access token: {response.status} - {response.data.decode('utf-8')}")
    
            data = json.loads(response.data.decode('utf-8'))
            return data['access_token']
    
        raise RuntimeError(f"Failed to get token after {max_retries} retries due to rate limiting")
    
    def auth_header():
        token = get_token()
        return {
            "Authorization": f"Bearer {token}",
            "Accept": "application/json"
        }
    
    def http_get(path: str, params: dict = None, headers: dict = None):
        url = f"{BASE}{path}"
        if params:
            from urllib.parse import urlencode
            url += "?" + urlencode(params)
    
        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
    
            return response.data
    
        raise RuntimeError(f"Failed after {max_retries} retries due to rate limiting")
    
    def http_post_json(path: str, body: dict, headers: dict = None):
        url = f"{BASE}{path}"
    
        backoff = 1.0
        max_retries = 3
    
        for attempt in range(max_retries):
            response = http.request(
                'POST',
                url,
                body=json.dumps(body),
                headers={**headers, 'Content-Type': 'application/json'}
            )
    
            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
    
            return response.data
    
        raise RuntimeError(f"Failed after {max_retries} retries due to rate limiting")
    
    # USERS (/v1/users)
    def pull_users(bucket, hdrs):
        next_token = None
        pages = 0
        while True:
            params = {"active": "true", "blocked": "false", "pageSize": PAGE_SIZE}
            if next_token:
                params["pageToken"] = next_token
            raw = http_get("/v1/users", params, hdrs)
            data = json.loads(raw.decode('utf-8'))
            put_json(bucket, "users/", f"users-page-{pages}", data)
            pages += 1
            next_token = data.get("nextPageToken") or data.get("next_page_token")
            if not next_token:
                break
        return pages
    
    # AUDIT LOG (/v1/audit/log)
    def pull_audit(bucket, hdrs):
        start_iso = iso_minus(LOOKBACK_MINUTES)
        next_token = None
        pages = 0
        while True:
            params = {"startTime": start_iso, "pageSize": PAGE_SIZE}
            if next_token:
                params["pageToken"] = next_token
            raw = http_get("/v1/audit/log", params, hdrs)
            try:
                data = json.loads(raw.decode('utf-8'))
                put_json(bucket, "audit/", f"audit-page-{pages}", data)
                next_token = data.get("nextPageToken") or data.get("next_page_token")
                pages += 1
                if not next_token:
                    break
            except Exception as e:
                print(f"Error parsing audit log response: {e}")
                # Save raw response
                ts = now_utc().strftime("%Y/%m/%d/%H%M%S")
                key = f"{PREFIX_BASE}audit/{ts}-audit-export.bin"
                blob = bucket.blob(key)
                blob.upload_from_string(raw, content_type='application/octet-stream')
                pages += 1
                break
        return pages
    
    # CASES (/v1/cases)
    def pull_cases(bucket, hdrs):
        next_token = None
        pages = 0
        while True:
            params = {"pageSize": PAGE_SIZE}
            if next_token:
                params["pageToken"] = next_token
            raw = http_get("/v1/cases", params, hdrs)
            data = json.loads(raw.decode('utf-8'))
            put_json(bucket, "cases/", f"cases-page-{pages}", data)
            pages += 1
            next_token = data.get("nextPageToken") or data.get("next_page_token")
            if not next_token:
                break
        return pages
    
    # FILE EVENTS (/v2/file-events/search)
    def pull_file_events(bucket, hdrs):
        if not FE_QUERY_JSON:
            return 0
        try:
            base_query = json.loads(FE_QUERY_JSON)
        except Exception as e:
            print(f"Error: FE_QUERY_JSON is not valid JSON: {e}")
            return 0
    
        pages = 0
        next_token = None
        while True:
            body = dict(base_query)
            body["pageSize"] = FE_PAGE_SIZE
            if next_token:
                body["pageToken"] = next_token
            raw = http_post_json("/v2/file-events/search", body, hdrs)
            data = json.loads(raw.decode('utf-8'))
            put_json(bucket, "file_events/", f"fileevents-page-{pages}", data)
            pages += 1
            next_token = (
                data.get("nextPageToken") or 
                data.get("next_page_token") or 
                (data.get("file_events") or {}).get("nextPageToken")
            )
            if not next_token:
                break
        return pages
    
    @functions_framework.cloud_event
    def main(cloud_event):
        """
        Cloud Run function triggered by Pub/Sub to fetch logs from Code42 Incydr API and write to GCS.
    
        Args:
            cloud_event: CloudEvent object containing Pub/Sub message
        """
    
        if not all([BASE, CID, CSECRET, BUCKET]):
            print('Error: Missing required environment variables')
            return
    
        try:
            bucket = storage_client.bucket(BUCKET)
            hdrs = auth_header()
            report = {}
    
            if "users" in STREAMS:
                print("Fetching users...")
                report["users_pages"] = pull_users(bucket, hdrs)
            if "audit" in STREAMS:
                print("Fetching audit logs...")
                report["audit_pages"] = pull_audit(bucket, hdrs)
            if "cases" in STREAMS:
                print("Fetching cases...")
                report["cases_pages"] = pull_cases(bucket, hdrs)
            if "file_events" in STREAMS:
                print("Fetching file events...")
                report["file_events_pages"] = pull_file_events(bucket, hdrs)
    
            print(f'Successfully processed logs: {json.dumps(report)}')
    
        except Exception as e:
            print(f'Error processing logs: {str(e)}')
            raise
    
    • הקובץ השני: 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. מספקים את פרטי ההגדרה הבאים:

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

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

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

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

בדיקת המשימה המתוזמנת

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

    Fetching users...
    Fetching audit logs...
    Fetching cases...
    Successfully processed logs: {"users_pages": X, "audit_pages": Y, "cases_pages": Z}
    
  5. בודקים את הקטגוריה ב-GCS‏ (code42-incydr-logs) כדי לוודא שהיומנים נכתבו.

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

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

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

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

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

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

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

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

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

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

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

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

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

      gs://code42-incydr-logs/code42/
      
      • מחליפים את:

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

        • קטגוריית הבסיס: gs://code42-incydr-logs/
        • עם קידומת: gs://code42-incydr-logs/code42/
    • אפשרות למחיקת המקור: בוחרים את אפשרות המחיקה המועדפת:

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

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

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

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

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

יומן שינויים

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

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