שילוב של Pub/Sub עם Google SecOps

במאמר הזה מוסבר איך לשלב את Pub/Sub עם Google Security Operations.

תרחישים לדוגמה

השילוב של Pub/Sub תומך בתרחישי השימוש הבאים:

  • קליטה אוטומטית של התראות: אחזור רציף של יומני אבטחה, התראות וטלמטריה שפורסמו בנושאי Pub/Sub כדי לקלוט אותם ב-Google SecOps כמקרים.

  • ארגון מרכזי של אבטחה: איחוד של ניתוב אירועי אבטחה דרך Pub/Sub ממערכות בענן וממערכות של צד שלישי כדי להפעיל תגובות אוטומטיות.

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

לפני שמגדירים את השילוב של Pub/Sub ב-Google SecOps, צריך לבצע את השלבים המקדימים הבאים:

  1. יוצרים חשבון שירות.

  2. מקצים את התפקידים הנדרשים של ניהול זהויות והרשאות גישה לחשבון השירות.

  3. בוחרים ומגדירים אחת משיטות האימות הבאות:

    • אפשרות 1: Workload Identity (מומלץ): בשיטה הזו נעשה שימוש באסימונים לטווח קצר באמצעות התחזות לחשבון שירות.

    • אפשרות 2: מפתח JSON של חשבון שירות: השיטה הזו מסתמכת על קובץ מפתח סודי סטטי לטווח ארוך.

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

  1. במסוף Google Cloud , נכנסים אל IAM & Admin > Service Accounts.

    לדף Service accounts

  2. לוחצים על addCreate service account (הוספהיצירת חשבון שירות).

  3. מזינים שם ותיאור ולוחצים על סיום. רושמים את כתובת האימייל של חשבון השירות.

מתן תפקידים ב-IAM

כשנותנים הרשאות, השילוב יכול להציג ולשלוף הודעות מהמינויים שלכם. כדי להקצות את התפקיד הרגיל, מבצעים את השלבים הבאים:

  1. במסוף Google Cloud , נכנסים אל IAM.

    כניסה לדף IAM

  2. מאתרים את חשבון השירות ולוחצים על עריכת הגורם המורשה (עריכה).

  3. לוחצים על Add another role ובוחרים באפשרות Pub/Sub Viewer (roles/pubsub.viewer).

  4. לוחצים על Save.

הגדרת פרטי כניסה של Workload Identity

הגישה המומלצת היא Workload Identity, כי היא משתמשת באסימוני גישה לטווח קצר באמצעות התחזות לחשבון שירות.

זיהוי הזהות הייחודית של המופע

כדי ליצור חיבור, צריך לתת למופע של Google SecOps הרשאה להתחזות לחשבון השירות שלכם.

  1. ב-Google SecOps, עוברים אל Content Hub > Response Integrations.

  2. בוחרים את השילוב Pub/Sub ומזינים את כתובת האימייל בחשבון השירות בWorkload Identity Email.

  3. לוחצים על שמירה > בדיקה. הבדיקה צפויה להיכשל.

  4. לוחצים על close_small לצד הכפתור Test ומאתרים את כתובת האימייל של הזהות שמתחילה ב-gke-init-python@... או ב-soar-python@....

  5. מעתיקים את כתובת האימייל הייחודית הזו.

נותנים הרשאה לזהות המופע ב- Google Cloud

  1. במסוף Google Cloud , נכנסים אל IAM & Admin > Service Accounts.

    לדף Service accounts

  2. בוחרים את חשבון השירות של היעד ועוברים אל הרשאות > הענקת גישה.

  3. מדביקים את כתובת האימייל הייחודית בשדה New principals ומקצים את התפקיד Service Account Token Creator (roles/iam.serviceAccountTokenCreator).

הענקת גישה לפרויקט מכסה

כדי לבצע אימות באמצעות Workload Identity, צריך Quota Project ID כדי לעקוב אחרי השימוש ב-API והחיוב.

  1. במסוף Google Cloud , נכנסים לדף IAM של הפרויקט שמשמש כפרויקט המכסות.

    כניסה לדף IAM

  2. מאתרים את חשבון השירות ולוחצים על עריכת הגורם המורשה (עריכה).

  3. לוחצים על Add another role (הוספת תפקיד נוסף) ובוחרים באפשרות Service Usage Consumer (צרכן שימוש בשירות) (roles/serviceusage.serviceUsageConsumer).

  4. לוחצים על Save.

הגדרת מפתח JSON

קבצים סטטיים של מפתחות סודיים לטווח ארוך מחייבים רוטציה ידנית. משתמשים בשיטה הזו רק אם Workload Identity לא זמין.

  1. במסוף Google Cloud , נכנסים אל IAM & Admin > Service Accounts ובוחרים את חשבון השירות.

    לדף Service accounts

  2. עוברים לכרטיסייה מפתחות ולוחצים על הוספת מפתח > יצירת מפתח חדש.

  3. בוחרים באפשרות JSON ולוחצים על Create (יצירה). קובץ ה-JSON יורד למחשב.

פרמטרים של שילוב

השילוב של Pub/Sub דורש את הפרמטרים הבאים:

פרמטר תיאור
Workload Identity Email

זה שינוי אופציונלי.

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

מגדירים את הפרמטר הזה רק אם מבצעים אימות באמצעות זהות של עומס עבודה. אם הגדרתם את האפשרות הזו, אתם צריכים לציין גם את Quota Project ID. המערכת מתעלמת מ-Service Account JSON File Content.

Service Account JSON File Content

זה שינוי אופציונלי.

התוכן המלא של קובץ ה-JSON של מפתח חשבון השירות.

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

Quota Project ID

זה שינוי אופציונלי.

מזהה הפרויקט שמשמש לחיוב ולשימוש ב-API.

הפרמטר הזה נדרש כשמשתמשים באימות של Workload Identity.

אם לא מציינים ערך, השילוב מאחזר את המזהה מפרטי הכניסה של חשבון השירות.

Project ID

זה שינוי אופציונלי.

מזהה הפרויקט לטירגוט ב-Pub/Sub.

אם לא מציינים ערך, השילוב מאחזר את המזהה מפרטי הכניסה של חשבון השירות.

Verify SSL

חובה.

מאמת את אישור ה-SSL לחיבור לשרת. ההגדרה הזו מופעלת כברירת מחדל.

הוראות להגדרת שילוב ב-Google SecOps מופיעות במאמר הגדרת שילובים.

במקרה הצורך, אפשר לבצע שינויים בשלב מאוחר יותר. אחרי שמגדירים מופע של שילוב, אפשר להשתמש בו ב-playbooks. מידע נוסף על הגדרה ותמיכה במספר מופעים זמין במאמר תמיכה במספר מופעים.

פעולות

מידע נוסף על פעולות זמין במאמרים איך מגיבים לפעולות שממתינות לאישור ב-Your Workdesk ואיך מבצעים פעולה ידנית.

פינג

משתמשים בפעולת הפינג כדי לבדוק את הקישוריות ל-Pub/Sub.

הפעולה הזו לא מופעלת בישויות של Google SecOps.

הוספת נתונים לפעולה

אין.

פלט של פעולות

הפעולה Ping מספקת את הפלטים הבאים:

סוג הפלט של הפעולה זמינות
קיר המארז לא זמין
קישור לקיר של הפנייה לא זמין
טבלת קיר עם תושבת לא זמין
טבלת העשרה לא זמין
תוצאה בפורמט JSON לא זמין
הודעות פלט יש גישה
תוצאת הסקריפט יש גישה
הודעות פלט

הפעולה Ping יכולה להחזיר את הודעות הפלט הבאות:

הודעת פלט תיאור ההודעה
Successfully connected to the Pub/Sub server with the provided connection parameters! הפעולה הסתיימה בהצלחה.
Failed to connect to the Pub/Sub server! Error is ERROR_REASON

הפעולה נכשלה.

צריך לבדוק את החיבור לשרת, את פרמטרי הקלט או את פרטי הכניסה.

תוצאת הסקריפט

בטבלה הבאה מפורט הערך של פלט תוצאת הסקריפט כשמשתמשים בפעולה Ping:

שם התוצאה של הסקריפט ערך
is_success True או False

מחברים

הוראות מפורטות להגדרת מחבר ב-Google SecOps מופיעות במאמר הוספת נתונים (מחברים).

Pub/Sub – Messages Connector

בפלטפורמת Google SecOps, Pub/Sub – Messages Connector נקרא PubSub – Messages Connector.

משתמשים במחבר ההודעות של Pub/Sub כדי לאחזר הודעות מ-Pub/Sub.

מיפוי חומרת הבעיה ב-JSON

כדי למפות את רמת החומרה של ההתראה, צריך לציין באיזה שדה המחבר Pub/Sub – Messages משתמש כדי לקבל את הערך של רמת החומרה בפרמטר Severity Mapping JSON. תגובת המחבר יכולה להכיל סוגי ערכים, כמו integer, float ו-string.

‫Pub/Sub – Messages Connector קורא את הערכים integer ו-float וממפה אותם בהתאם להגדרות של Google SecOps. בטבלה הבאה מוצג המיפוי של הערכים של integer לרמת החומרה ב-Google SecOps:

ערך מספרי שלם מידת החומרה הממופה
100 Critical
גווני אפור מ-80 עד 100 High
גווני אפור מ-60 עד 80 Medium
גווני אפור מ-40 עד 60 Low
פחות מ-40 Informational

אם התשובה מכילה את הערך string, Pub/Sub – Messages Connector דורש הגדרה נוספת.

בהתחלה, ערך ברירת המחדל יופיע כך:

{
    "Default": 60
}

אם הערכים שנדרשים למיפוי נמצאים במפתח ה-JSON‏ event_severity, הערכים יכולים להיות:

  • "Malicious"
  • "Benign"
  • "Unknown"

כדי לנתח את ערכי המפתח של JSON‏ event_severity ולוודא שאובייקט ה-JSON הוא בפורמט הנכון, מגדירים את הפרמטר Severity Mapping JSON באופן הבא:

{
    "event_severity": {
        "Malicious": 100,
        "Unknown": 60,
        "Benign": -1
    },
    "Default": 50
}

חובה לציין את הערך "Default".

במקרה שבו יש כמה התאמות לאותו אובייקט JSON, Pub/Sub – Messages Connector נותן עדיפות למפתח הראשון של אובייקט JSON.

כדי לעבוד עם שדות שמכילים ערכים של integer או float, צריך להגדיר את המפתח ואת המחרוזת הריקה בפרמטר Severity Mapping JSON:

{
  "Default":"60",
  "integer_field": "",
  "float_field": ""
}

כניסות קלט של מחברים

מחבר ההודעות של Pub/Sub דורש את הפרמטרים הבאים:

פרמטר תיאור
Product Field Name חובה

שם השדה שבו מאוחסן שם המוצר.

ערך ברירת המחדל הוא Product Name.

Event Field Name חובה

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

ערך ברירת המחדל הוא event_type.

Environment Field Name אופציונלי

השם של השדה שבו מאוחסן שם הסביבה.

אם השדה environment לא נמצא, הסביבה מוגדרת לסביבת ברירת המחדל.

ערך ברירת המחדל הוא "".

Environment Regex Pattern אופציונלי

תבנית של ביטוי רגולרי להפעלה על הערך שנמצא בשדה Environment Field Name. הפרמטר הזה מאפשר לכם לשנות את השדה environment באמצעות הלוגיקה של הביטוי הרגולרי.

משתמשים בערך ברירת המחדל .* כדי לאחזר את הערך הנדרש Environment Field Name.

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

PythonProcessTimeout חובה

מגבלת הזמן הקצוב בשניות לתהליך Python שמריץ את הסקריפט הנוכחי.

ערך ברירת המחדל הוא 60.

Service Account JSON File Content אופציונלי

התוכן של קובץ ה-JSON של מפתח חשבון השירות.

אפשר להגדיר את הפרמטר הזה או את הפרמטר Workload Identity Email.

כדי להגדיר את הפרמטר הזה, צריך לספק את התוכן המלא של קובץ ה-JSON של מפתח חשבון השירות שהורדתם כשייצרתם חשבון שירות.

במחבר Pub/Sub – Messages, אימות באמצעות קובץ JSON של מפתח חשבון השירות מקבל עדיפות על פני איחוד שירותי אימות הזהות של עומסי עבודה.

Workload Identity Email אופציונלי

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

אפשר להגדיר את הפרמטר הזה או את הפרמטר Service Account JSON File Content.

כדי להתחזות לחשבונות שירות באמצעות איחוד שירותי אימות הזהות של עומסי עבודה, צריך להקצות לחשבון השירות את התפקיד Service Account Token Creator.

Project ID אופציונלי

מזהה הפרויקט שבו יש להשתמש במחבר.

Quota Project ID אופציונלי

Google Cloud מזהה הפרויקט שבו אתם משתמשים עבור Google Cloud ממשקי API וחיוב. כדי להשתמש בפרמטר הזה, צריך להקצות לחשבון השירות את התפקיד Service Usage Consumer. מידע נוסף על תפקידי IAM זמין במאמר בקרת גישה באמצעות IAM.

השילוב מצרף את ערך הפרמטר הזה לכל בקשות ה-API.

Subscription ID חובה

מזהה המינוי ל-Pub/Sub.

Case Name Template אופציונלי

שם מותאם אישית של בקשת התמיכה.

כשמגדירים את הפרמטר הזה, המחבר מוסיף מפתח חדש בשם custom_case_name לאירוע Google SecOps.

אפשר לספק את משתני המיקום בפורמט הבא: [name of the field].

לדוגמה: Phishing - [event_mailbox]

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

Alert Name Template חובה

שם של התראה מותאמת אישית.

אפשר לספק את משתני המיקום בפורמט הבא: [name of the field].

דוגמה: Phishing - [event_mailbox]

במקרה של placeholders, המחבר משתמש באירוע הראשון של Google SecOps. המחבר מטפל רק במפתחות שמכילים את ערך המחרוזת. אם לא מספקים ערך או משתמשים בתבנית לא תקינה, המחבר משתמש בערך גיבוי בפורמט הבא: CONNECTOR_NAME - Alert. כדי להגדיר את הפרמטר הזה, מציינים שדות של אירועים ללא קידומות.

Rule Generator Template חובה

כלי ליצירת כללים בהתאמה אישית.

אפשר לספק את משתני המיקום בפורמט הבא: [name of the field].

דוגמה: Phishing - [event_mailbox]

במקרה של placeholders, המחבר משתמש באירוע הראשון של Google SecOps. המחבר מטפל רק במפתחות שמכילים את ערך המחרוזת. אם לא מספקים ערך או משתמשים בתבנית לא תקינה, המחבר משתמש בערך גיבוי בפורמט הבא: CONNECTOR_NAME - Rule Generator. כדי להגדיר את הפרמטר הזה, מציינים שדות של אירועים בלי קידומות.

Timestamp Field חובה

שם השדה להגדרת חותמת הזמן של ההתראה ב-Google SecOps.

אם חותמת הזמן לא בפורמט של תקופת הזמן של מערכת Unix, צריך להגדיר את פורמט חותמת הזמן בפרמטר Timestamp Format.

ערך ברירת המחדל הוא message_publishTime.

Timestamp Format אופציונלי

הפורמט של חותמת הזמן של ההודעה.

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

ערך ברירת המחדל הוא %Y-%m-%dT%H:%M:%S.%fZ.

Severity Mapping JSON חובה

אובייקט ה-JSON שמגדיר איך המחבר מחילוץ את רמת החומרה מההודעה.

ערך ברירת המחדל הוא:

    {
      "Default": "60"
    }
    

מידע נוסף על מיפוי חומרת הבעיה זמין במאמר בנושא מיפוי חומרת הבעיה ב-JSON.

Unique ID Field אופציונלי

שם השדה שמאשר שההודעה ייחודית. אפשר להשתמש במילת המפתח השמורה pubsub_message_id כדי לחלץ את מזהה ההודעה המקורי של Pub/Sub. אם לא מגדירים ערך או שהשדה לא נמצא, המחבר יוצר גיבוב SHA-256 ומשתמש בו כמזהה להודעה.

Max Messages To Fetch חובה

המספר המקסימלי של הודעות לעיבוד בכל איטרציה של המחבר.

ערך ברירת המחדל הוא 100.

Disable Overflow אופציונלי

אם האפשרות הזו נבחרה, המחבר מתעלם ממנגנון הגלישה של Google SecOps במהלך יצירת ההתראה.

האפשרות הזו מסומנת כברירת מחדל.

Verify SSL חובה

אם בוחרים באפשרות הזו, האינטגרציה בודקת שאישור ה-SSL לחיבור ל-Pub/Sub תקף.

האפשרות הזו מסומנת כברירת מחדל.

Proxy Server Address אופציונלי

הכתובת של שרת ה-Proxy שבו רוצים להשתמש.

Proxy Username אופציונלי

שם המשתמש של ה-proxy לאימות.

Proxy Password אופציונלי

סיסמת ה-proxy לאימות.

כללים של Connectors

מחבר ההודעות של Pub/Sub תומך בשרתי proxy.

אירועים של מחברים

בדוגמה הבאה מוצג פלט ה-JSON של אירוע ב-Google SecOps שנוצר על ידי Pub/Sub – Messages Connector:

{
   "notificationConfigName": "organizations/ORGANIZATION_ID/notificationConfigs/soar_connector_toxic_notifications_config",
   "finding": {
       "name": "organizations/ORGANIZATION_ID/sources/SOURCE_ID/findings/FINDING_ID",
       "parent": "organizations/ORGANIZATION_ID/sources/SOURCE_ID",
       "resourceName": "//compute.googleapis.com/projects/PROJECT_ID/global/firewalls/FIREWALL_ID",
       "state": "ACTIVE",
       "category": "OPEN_NETBIOS_PORT",
       "externalUri": "https://console.cloud.google.com/networking/firewalls/details/default-allow-rdp?project\u003dPROJECT_ID",
       "sourceProperties": {
           "Recommendation": "Restrict the firewall rules at: https://console.cloud.google.com/networking/firewalls/details/default-allow-rdp?project\u003dPROJECT_ID",
           "ExceptionInstructions": "Add the security mark \"allow_open_netbios_port\" to the asset with a value of \"true\" to prevent this finding from being activated again.",
           "Explanation": "Firewall rules that allow connections from all IP addresses on TCP ports 137-139 or UDP ports 137-139 may expose NetBIOS services to attackers.",
           "ScannerName": "FIREWALL_SCANNER",
           "ResourcePath": [
               "projects/PROJECT_ID/",
               "folders/FOLDER_ID/",
               "folders/FOLDER_ID/",
               "organizations/ORGANIZATION_ID/"
           ],
           "ExposedService": "NetBIOS",
           "OpenPorts": {
               "TCP": [
                   137.0,
                   138.0,
                   139.0
               ],
               "UDP": [
                   137.0,
                   138.0,
                   139.0
               ]
           },
           "compliance_standards": {
               "iso": [
                   {
                       "ids": [
                           "A.13.1.1"
                       ]
                   }
               ],
               "pci": [
                   {
                       "ids": [
                           "1.2.1"
                       ]
                   }
               ],
               "nist": [
                   {
                       "ids": [
                           "SC-7"
                       ]
                   }
               ]
           },
           "ReactivationCount": 4.0
       },
       "securityMarks": {
           "name": "organizations/ORGANIZATION_ID/sources/SOURCE_ID/findings/FINDING_ID/securityMarks",
           "marks": {
               "peter": "e2e1"
           }
       },
       "eventTime": "2024-08-30T14:44:37.973090Z",
       "createTime": "2024-06-24T07:08:54.777Z",
       "propertyDataTypes": {
           "ResourcePath": {
               "listValues": {
                   "propertyDataTypes": [
                       {
                           "primitiveDataType": "STRING"
                       }
                   ]
               }
           },
           "ReactivationCount": {
               "primitiveDataType": "NUMBER"
           },
           "Explanation": {
               "primitiveDataType": "STRING"
           },
           "ExposedService": {
               "primitiveDataType": "STRING"
           },
           "ScannerName": {
               "primitiveDataType": "STRING"
           }
       }
   }
}

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