איסוף יומנים של Atlassian Bitbucket
גרסת מנתח הנתונים: 2.0
במאמר הזה מוסבר איך להגדיר את Atlassian Bitbucket כך שיומנים יישלחו ל-Google Security Operations באמצעות ווּבְּהוּקים.
Atlassian Bitbucket הוא שירות אירוח של מאגר המקורות של הקוד מבוסס-Git. הוא מספק לצוותי פיתוח שיתוף פעולה בכתיבת קוד, תהליכי עבודה של בקשות משיכה וצינורות CI/CD. Bitbucket תומך בפריסות בענן ובפריסות באירוח עצמי (מרכז נתונים).
לפני שמתחילים
חשוב לוודא שמתקיימות הדרישות המוקדמות הבאות:
- מופע של Google SecOps
- מופע של Atlassian Bitbucket Cloud או Data Center עם גישת אדמין
- גישה למסוף Google Cloud (ליצירת מפתח API)
יצירת פיד של webhook ב-Google SecOps
יצירת הפיד
- עוברים אל SIEM Settings > Feeds (הגדרות SIEM > פידים).
- לוחצים על הוספת פיד חדש.
- בדף הבא, לוחצים על הגדרת פיד יחיד.
- בשדה שם הפיד, מזינים שם לפיד (לדוגמה,
Bitbucket Webhook Logs). - בוחרים באפשרות Webhook בתור סוג המקור.
- בוחרים באפשרות Atlassian Bitbucket בתור סוג היומן.
- לוחצים על הבא.
- מציינים ערכים לפרמטרים הבאים של הקלט:
- תו מפריד לפיצול (אופציונלי): מזינים תו מפריד כדי לפצל אירועים מרובי שורות. ערכים נפוצים:
-
\n– תו שורה חדשה כמפריד (הנפוץ ביותר ב-NDJSON) - אם כל בקשה מכילה אירוע יחיד, אפשר להשאיר את השדה ריק
-
- מרחב שמות של נכס: מרחב השמות של הנכס
- תוויות להוספה: התווית שתתווסף לאירועים מהפיד הזה
- תו מפריד לפיצול (אופציונלי): מזינים תו מפריד כדי לפצל אירועים מרובי שורות. ערכים נפוצים:
- לוחצים על הבא.
- בודקים את ההגדרות של הפיד החדש במסך סיום ולוחצים על שליחה.
יצירה ושמירה של מפתח סודי
אחרי שיוצרים את הפיד, צריך ליצור מפתח סודי לאימות:
- בדף הפרטים של הפיד, לוחצים על יצירת מפתח סודי.
- בתיבת דו-שיח מוצג המפתח הסודי.
- מעתיקים ושומרים את המפתח הסודי באופן מאובטח.
קבלת כתובת ה-URL של נקודת הקצה של הפיד
- עוברים לכרטיסייה פרטים של הפיד.
- בקטע Endpoint Information, מעתיקים את Feed endpoint URL.
הפורמט של כתובת ה-URL הוא:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreateאו
https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreateשומרים את כתובת ה-URL הזו כדי לבצע את השלבים הבאים.
לוחצים על סיום.
יצירת מפתח Google Cloud API
מערכת Google SecOps דורשת מפתח API לצורך אימות. יוצרים מפתח API מוגבל במסוף Google Cloud.
יצירת מפתח API
- נכנסים אל הדף Credentials במסוף Google Cloud.
- בוחרים את הפרויקט (הפרויקט שמשויך למופע Google SecOps).
- לוחצים על Create credentials > API key.
- מפתח API נוצר ומוצג בתיבת דו-שיח.
- לוחצים על Edit API key כדי להגביל את המפתח.
הגבלת מפתח ה-API
- בדף ההגדרות API key:
- שם: מזינים שם תיאורי (לדוגמה,
Webhook API Key)
- שם: מזינים שם תיאורי (לדוגמה,
- בקטע API restrictions (הגבלות על API):
- בוחרים באפשרות הגבלת המקש.
- בתפריט הנפתח Select APIs (בחירת ממשקי API), מחפשים את Google SecOps API ובוחרים אותו.
- לוחצים על Save.
- מעתיקים את הערך של מפתח ה-API מהשדה מפתח ה-API בחלק העליון של הדף.
שומרים את מפתח ה-API בצורה מאובטחת.
הגדרת webhook של Atlassian Bitbucket
הרכבת ה-webhook URL
משלבים את כתובת ה-URL של נקודת הקצה של Google SecOps ואת מפתח ה-API:
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>דוגמה:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...
יצירת webhook ב-Bitbucket Cloud
- נכנסים ל-Bitbucket Cloud כאדמינים של סביבת עבודה או מאגר.
- עוברים אל המאגר שבו רוצים להגדיר את ה-webhook.
- עוברים אל הגדרות המאגר > Webhooks.
- לוחצים על Add webhook (הוספת webhook).
- מזינים את פרטי ההגדרה הבאים:
- שם: מזינים שם תיאורי (לדוגמה,
SIEM Webhook). - כתובת URL: מדביקים את כתובת נקודת הקצה המלאה עם מפתח ה-API והסוד שמופיעים למעלה.
- סטטוס: בוחרים באפשרות פעיל.
- טריגרים: בוחרים באפשרות בחירה מתוך רשימה מלאה של טריגרים ובוחרים את האירועים לשליחה:
- מאגר: Push, Fork, Commit Comment Created
- בקשת מיזוג: נוצרה, עודכנה, אושרה, לא אושרה, מוזגה, נדחתה, נוצרה תגובה
- בעיה: נוצרה, עודכנה, נוצרה תגובה
- שם: מזינים שם תיאורי (לדוגמה,
- לוחצים על Save.
יצירת webhook ב-Bitbucket Data Center
- נכנסים אל Bitbucket Data Center כאדמין של פרויקט או מאגר.
- מנווטים לפרויקט או למאגר שבו רוצים להגדיר את ה-webhook.
- עוברים אל הגדרות הפרויקט > Webhooks (לרמת הפרויקט) או אל הגדרות המאגר > Webhooks (לרמת המאגר).
- לוחצים על Create webhook (יצירת webhook).
- מזינים את פרטי ההגדרה הבאים:
- שם: מזינים שם תיאורי (לדוגמה,
SIEM Webhook). - כתובת URL: מדביקים את כתובת נקודת הקצה המלאה עם מפתח ה-API והסוד שמופיעים למעלה.
- סטטוס: בוחרים באפשרות פעיל.
- אירועים: בוחרים את האירועים להעברה:
- מאגר: שינוי הפניות, יצירת עותק (Fork), הוספת תגובה
- בקשת משיכה: נפתחה, ענף המקור עודכן, שונה, בודק עודכן, אושרה, לא אושרה, נדרשת עבודה, מוזגה, נדחתה, נמחקה, נוספה תגובה
- שם: מזינים שם תיאורי (לדוגמה,
- לוחצים על Save.
אימות המסירה של ה-webhook
- אחרי שיוצרים את ה-webhook, מבצעים פעולה במאגר (לדוגמה, שולחים commit).
- עוברים אל הגדרות המאגר > Webhooks.
- לצד ה-webhook, לוחצים על הצגת הבקשות.
- מוודאים שבבקשה מופיע קוד הסטטוס 200, שמציין שהמסירה בוצעה בהצלחה.
מידע נוסף זמין במאמרי העזרה בנושא Bitbucket Cloud webhook או במאמרי העזרה בנושא Bitbucket Data Center webhook.
הפניה לשיטות אימות
פידים של וווב-הוק ב-Google SecOps תומכים בכמה שיטות אימות. בוחרים את השיטה שהספק תומך בה.
שיטה 1: כותרות מותאמות אישית (מומלץ)
אם הספק שלכם תומך בכותרות HTTP בהתאמה אישית, כדאי להשתמש בשיטה הזו כדי לשפר את האבטחה.
פורמט הבקשה:
POST <ENDPOINT_URL> HTTP/1.1 Content-Type: application/json x-goog-chronicle-auth: <API_KEY> x-chronicle-auth: <SECRET_KEY> { "event": "data", "timestamp": "2025-01-15T10:30:00Z" }היתרונות:
- מפתח ה-API והסוד לא מוצגים בכתובת ה-URL
- מאובטח יותר (הכותרות לא נרשמות ביומני הגישה של שרת האינטרנט)
- השיטה המועדפת אם הספק תומך בה
שיטה 2: פרמטרים של שאילתה
אם הספק שלכם לא תומך בכותרות מותאמות אישית, צריך לצרף את פרטי הכניסה לכתובת ה-URL.
פורמט כתובת ה-URL:
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>לדוגמה:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...פורמט הבקשה:
POST <ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY> HTTP/1.1 Content-Type: application/json { "event": "data", "timestamp": "2025-01-15T10:30:00Z" }
חסרונות:
- פרטי הכניסה גלויים בכתובת ה-URL
- יכול להיות שיירשם ביומני הגישה של שרת האינטרנט
- פחות מאובטח מכותרות
שיטה 3: היברידית (כתובת URL + כותרת)
חלק מההגדרות משתמשות במפתח API בכתובת ה-URL ובמפתח סודי בכותרת.
פורמט הבקשה:
POST <ENDPOINT_URL>?key=<API_KEY> HTTP/1.1 Content-Type: application/json x-chronicle-auth: <SECRET_KEY> { "event": "data", "timestamp": "2025-01-15T10:30:00Z" }
שמות של כותרות אימות
מערכת Google SecOps מקבלת את שמות הכותרות הבאים לצורך אימות:
למפתח API:
x-goog-chronicle-auth(מומלץ)-
X-Goog-Chronicle-Auth(case-insensitive)
למפתח סודי:
x-chronicle-auth(מומלץ)-
X-Chronicle-Auth(case-insensitive)
מגבלות ושיטות מומלצות לשימוש ב-Webhook
מגבלות על בקשות
| הגבלה | ערך |
|---|---|
| גודל בקשה מקסימלי | 4MB |
| מספר QPS מקסימלי (שאילתות לשנייה) | 15,000 |
| זמן קצוב לתפוגה של בקשה | 30 שניות |
| התנהגות של ניסיון חוזר | אוטומטי עם השהיה מעריכית לפני ניסיון חוזר (exponential backoff) |
טבלת מיפוי UDM
| שדה היומן | מיפוי UDM | לוגיקה |
|---|---|---|
actor.display_name |
principal.user.user_display_name |
הערך נלקח מהשדה actor.display_name. |
actor.nickname |
principal.user.userid |
הערך נלקח מהשדה actor.nickname. |
actor.account_id |
principal.user.product_object_id |
הערך נלקח מהשדה actor.account_id. |
actor.uuid |
principal.user.product_object_id |
הערך נלקח מהשדה actor.uuid אם השדה actor.account_id לא קיים. |
actor.links.html.href |
principal.url |
הערך נלקח מהשדה actor.links.html.href. |
repository.full_name |
target.resource.name |
הערך נלקח מהשדה repository.full_name. |
repository.uuid |
target.resource.product_object_id |
הערך נלקח מהשדה repository.uuid. |
repository.links.html.href |
target.url |
הערך נלקח מהשדה repository.links.html.href. |
repository.project.key |
target.resource.attribute.labels |
התווסף כצמד מפתח/ערך עם המפתח project_key. |
repository.project.name |
target.resource.attribute.labels |
הפרמטר מתווסף כצמד מפתח/ערך עם המפתח project_name. |
repository.workspace.slug |
target.resource.attribute.labels |
נוסף כצמד מפתח/ערך עם המפתח workspace. |
push.changes[].new.name |
target.resource.attribute.labels |
התווסף כצמד מפתח/ערך עם המפתח branch_name. |
push.changes[].new.target.hash |
target.resource.attribute.labels |
התווסף כצמד מפתח/ערך עם המפתח commit_hash. |
push.changes[].new.target.message |
target.resource.attribute.labels |
התווסף כצמד מפתח/ערך עם המפתח commit_message. |
push.changes[].new.target.date |
target.resource.attribute.labels |
הערך מתווסף כצמד מפתח/ערך עם המפתח commit_date. |
push.changes[].new.target.author.raw |
target.user.email_addresses |
כתובת האימייל שחולצה משדה המחבר הגולמי. |
pullrequest.id |
target.resource.attribute.labels |
הערך מתווסף כצמד מפתח/ערך עם המפתח pullrequest_id. |
pullrequest.title |
target.resource.attribute.labels |
התווסף כצמד מפתח/ערך עם המפתח pullrequest_title. |
pullrequest.state |
target.resource.attribute.labels |
התווסף כצמד מפתח/ערך עם המפתח pullrequest_state. |
pullrequest.author.display_name |
target.user.user_display_name |
הערך נלקח מהשדה pullrequest.author.display_name. |
pullrequest.source.branch.name |
target.resource.attribute.labels |
התווסף כצמד מפתח/ערך עם המפתח source_branch. |
pullrequest.destination.branch.name |
target.resource.attribute.labels |
התווסף כצמד מפתח/ערך עם המפתח destination_branch. |
date |
metadata.event_timestamp |
הניתוח מתבצע כחותמת זמן בפורמט ISO8601. משמש כחותמת זמן של האירוע אם הוא מופיע במטען הייעודי (payload) של ה-webhook. |
metadata.event_type |
הערך הראשוני הוא GENERIC_EVENT. הערך שונה ל-USER_RESOURCE_ACCESS, USER_RESOURCE_UPDATE_CONTENT או USER_UNCATEGORIZED בהתאם למפתח האירוע ולנוכחות של השדות principal ו-target. | |
metadata.product_event_type |
ההגדרה מתבצעת על סמך ערך הכותרת של ה-webhook X-Event-Key (לדוגמה, repo:push, pullrequest:created, pullrequest:updated). |
|
metadata.product_name |
מגדירים את האפשרות Atlassian Bitbucket. | |
metadata.vendor_name |
מגדירים את הערך Atlassian. |
שנה רישום
צפייה ביומן השינויים של כלי הניתוח הזה
הבעיה עדיין לא נפתרה? קבלת תשובות מחברי הקהילה וממומחי Google SecOps.