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

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

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

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

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

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

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

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

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

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

  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. מאתרים את חשבון השירות ולוחצים על Edit principal (edit).

  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. בוחרים את חשבון השירות הרצוי ועוברים אל Permissions > Grant Access.

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

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

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

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

    כניסה לדף IAM

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

  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. עוברים לכרטיסייה Keys ולוחצים על Add key > Create new key.

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

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

כדי לשלב את Pub/Sub, צריך להגדיר את הפרמטרים הבאים:

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

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

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

צריך להגדיר את הפרמטר הזה רק אם מבצעים אימות באמצעות Workload Identity. אם מגדירים את המאפיין הזה, צריך לציין גם את המאפיין 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

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

פעולות

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

פינג

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

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

קלט של הפעולה

אין.

ערכי פלט של פעולות

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

סוג הפלט של הפעולה זמינות
חיבור לקיר של המארז לא זמין
קישור ללוח הפניות לא זמין
שולחן קונסולה צמוד לקיר לא זמין
טבלת העשרה לא זמין
תוצאת 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

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

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

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

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

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

מחברים

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

‫Pub/Sub – מחבר הודעות

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

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

מיפוי חומרת JSON

כדי למפות את חומרת ההתראה, צריך לציין באיזה שדה Pub/Sub – Messages Connector משתמש כדי לקבל את הערך של החומרה בפרמטר 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"

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

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

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

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

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

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

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

במחבר Pub/Sub – Messages צריך להגדיר את הפרמטרים הבאים:

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

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

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

Event Field Name חובה

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

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

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

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

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

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

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

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

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

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

PythonProcessTimeout חובה

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

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

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

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

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

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

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

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

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

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

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

Project ID אופציונלי

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

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

מזהה הפרויקט ב- Google Cloud שמשמש לממשקי API ולחיוב ב- Google Cloud . כדי להשתמש בפרמטר הזה, צריך להקצות לחשבון השירות את התפקיד 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]

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

Alert Name Template חובה

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

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

דוגמה: Phishing - [event_mailbox]

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

Rule Generator Template חובה

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

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

דוגמה: Phishing - [event_mailbox]

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

Timestamp Field חובה

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

אם חותמת הזמן לא בפורמט ראשית זמן יוניקס (Unix epoch), צריך להגדיר את הפורמט של חותמת הזמן בפרמטר Timestamp Format.

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

Timestamp Format אופציונלי

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

המחבר צריך את חותמת הזמן כדי לעבד את ההודעה בצורה נכונה. אם חותמת הזמן לא בפורמט של ראשית זמן יוניקס (Unix epoch) ולא מגדירים פורמט לחותמת הזמן, המחבר נכשל.

ערך ברירת המחדל הוא %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.

כללי מחברים

המחבר Pub/Sub – Messages תומך בשרתי 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.