איסוף יומנים של HackerOne
במאמר הזה מוסבר איך להגדיר את HackerOne כך שישלח יומנים ל-Google Security Operations באמצעות תגובות לפעולה מאתר אחר (webhooks).
HackerOne היא פלטפורמה לתיאום חשיפת נקודות חולשה ולתגמול על דיווח על באגים, שמקשרת בין ארגונים לבין חוקרי אבטחה כדי לזהות ולתקן נקודות חולשה באבטחה. הפלטפורמה מספקת תוכניות לתגמול על דיווח על באגים, תוכניות לחשיפת נקודות חולשה, בדיקות חדירה ובדיקות אבטחה שוטפות לאורך מחזור החיים של פיתוח התוכנה.
לפני שמתחילים
חשוב לוודא שמתקיימות דרישות הסף הבאות:
מכונה של Google SecOps
תוכנית HackerOne עם רמת Professional או Enterprise (תגובות לפעולות אינטרנט זמינות רק ברמות האלה)
הרשאת אדמין בהגדרות התוכנית שלכם ב-HackerOne
גישה למסוף Google Cloud (ליצירת מפתח API)
יצירת פיד של webhook ב-Google SecOps
יצירת הפיד
- עוברים אל SIEM Settings > Feeds (הגדרות SIEM > פידים).
- לוחצים על הוספת פיד חדש.
- בדף הבא, לוחצים על הגדרת פיד יחיד.
- בשדה שם הפיד, מזינים שם לפיד (לדוגמה,
HackerOne Webhook). - בוחרים באפשרות Webhook בתור סוג המקור.
- בוחרים באפשרות HackerOne בתור סוג היומן.
- לוחצים על הבא.
- מציינים ערכים לפרמטרים הבאים של הקלט:
- תו מפריד לפיצול: משאירים את השדה ריק. כל בקשת webhook מכילה אירוע JSON יחיד.
- מרחב השמות של הנכס: מרחב השמות של הנכס
- תוויות להוספה: התווית שתתווסף לאירועים מהפיד הזה
- לוחצים על הבא.
- בודקים את הגדרות הפיד החדש במסך סיום ולוחצים על שליחה.
יצירה ושמירה של מפתח סודי
אחרי שיוצרים את הפיד, צריך ליצור מפתח סודי לאימות:
- בדף הפרטים של הפיד, לוחצים על יצירת מפתח סודי.
- תיפתח תיבת דו-שיח עם המפתח הסודי.
- מעתיקים ושומרים את המפתח הסודי באופן מאובטח.
חשוב: המפתח הסודי מוצג רק פעם אחת ואי אפשר לאחזר אותו מאוחר יותר. אם מאבדים אותו, צריך ליצור מפתח סודי חדש.
איך מקבלים את כתובת ה-URL של נקודת הקצה של הפיד
- עוברים לכרטיסייה פרטים של הפיד.
- בקטע Endpoint Information, מעתיקים את Feed endpoint URL.
הפורמט של כתובת ה-URL הוא:
https://{region}-chronicle.googleapis.com/v1/{parent}/logs:importכאשר
{region}הוא האזור של מופע Google SecOps (לדוגמה,us,europeאוasia-southeast1), ו-{parent}הוא נתיב המשאב בפורמטprojects/<PROJECT_ID>/locations/<LOCATION>/instances/<INSTANCE_ID>/logTypes/<LOG_TYPE>.שומרים את כתובת ה-URL הזו לשלבים הבאים.
לוחצים על סיום.
יצירת מפתח API של Google Cloud
כדי לבצע אימות ב-Chronicle, צריך מפתח API. יוצרים מפתח API מוגבל במסוף Google Cloud.
יצירת מפתח ה-API
- נכנסים לדף Credentials במסוף Google Cloud.
- בוחרים את הפרויקט (הפרויקט שמשויך למכונה של Google SecOps).
- לוחצים על Create credentials > מפתח API.
- מפתח API נוצר ומוצג בתיבת דו-שיח.
- לוחצים על מפתח API כדי להגביל את המפתח.
הגבלת מפתח ה-API
- בדף ההגדרות מפתח API:
- שם: מזינים שם תיאורי (לדוגמה,
Chronicle HackerOne Webhook API Key).
- שם: מזינים שם תיאורי (לדוגמה,
- בקטע API restrictions (הגבלות על API):
- בוחרים באפשרות Restrict key.
- בתפריט הנפתח Select APIs, מחפשים ובוחרים את Google SecOps API (או Chronicle API).
- לוחצים על Save.
- מעתיקים את הערך של מפתח ה-API מהשדה API key שבחלק העליון של הדף.
שומרים את מפתח ה-API בצורה מאובטחת.
הגדרת תגובה לפעולה מאתר אחר (webhook) ב-HackerOne
יצירת כתובת ה-URL של ה-webhook
משלבים את כתובת ה-URL של נקודת הקצה (endpoint) של Google SecOps, את מפתח ה-API ואת המפתח הסודי לכתובת URL אחת. צריך לצרף גם את מפתח ה-API וגם את המפתח הסודי כפרמטרים של שאילתה.
פורמט כתובת ה-URL:
```none
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>
```
לדוגמה:
```none
https://{region}-chronicle.googleapis.com/v1/{parent}/logs:import?key=AIzaSyD...&secret=abcd1234...
```
מחליפים את הערכים הבאים:
- <ENDPOINT_URL>: כתובת נקודת הקצה של הפיד מהקטע קבלת כתובת נקודת הקצה של הפיד.
- <API_KEY>: מפתח ה-API של Google Cloud מהקטע יצירת מפתח API של Google Cloud.
– <SECRET_KEY>: המפתח הסודי מהקטע Generate and save secret key (יצירה ושמירה של מפתח סודי).
חשוב: אל תזינו את המפתח הסודי של Google SecOps בשדה Secret של HackerOne. השדה Secret של HackerOne משמש לאימות חתימת המטען הייעודי (payload) של HMAC (כותרת X-H1-Signature), שהוא מנגנון נפרד מאימות ה-webhook של Google SecOps. אם תמקמו את הסוד של Google SecOps בשדה Secret של HackerOne, תופיע השגיאה 403 Forbidden כי HackerOne לא מעביר את הערך הזה כפרטי כניסה לאימות של Google SecOps. במקום זאת, צריך להוסיף את key וגם את secret כפרמטרים של שאילתה בכתובת ה-URL של המטען הייעודי (payload).
יצירת תגובה לפעולה מאתר אחר (webhook) ב-HackerOne
- נכנסים ל-HackerOne ועוברים לתוכנית שלכם.
- עוברים אל אינטראקציות, לוחצים על סמל האפשרויות הנוספות של התוכנית שרוצים להגדיר ואז לוחצים על הגדרות.
- עוברים אל Automation > Webhooks.
- לוחצים על Webhook חדש.
- מספקים את פרטי ההגדרה הבאים:
- כתובת ה-URL של מטען הייעודי (payload): מדביקים את כתובת ה-URL המלאה עם מפתח ה-API והסוד שצוינו למעלה. לדוגמה,
https://{region}-chronicle.googleapis.com/v1/{parent}/logs:import?key=AIzaSyD...&secret=abcd1234.... - סוד: משאירים את השדה הזה ריק.
- כתובת ה-URL של מטען הייעודי (payload): מדביקים את כתובת ה-URL המלאה עם מפתח ה-API והסוד שצוינו למעלה. לדוגמה,
- בוחרים אילו אירועים יפעילו את ה-webhook. בוחרים באחת מהאפשרויות הבאות:
- Send me everything (שליחת כל הנתונים): כל האירועים יפעילו את ה-webhook.
- אני רוצה לציין אירועים ספציפיים: בוחרים את האירועים הספציפיים שרוצים לשלוח ל-Google SecOps.
לוחצים על Add webhook (הוספת תגובה לפעולה מאתר אחר).
בדיקת ה-webhook
- בדף ההגדרות של ה-webhook, לוחצים על Test request (בדיקת בקשה) כדי לשלוח בקשה לדוגמה לכתובת ה-URL של מטען הייעודי (payload) שהוגדרה.
- מוודאים שהתשובה היא HTTP 200.
- לוחצים על ה-webhook כדי לראות את הפרטים.
- בקטע Recent deliveries, מוודאים שהמסירות האחרונות מציגות סטטוס הצלחה (HTTP 200).
- לוחצים על אחת מהמסירות כדי לראות את בקשת המטען הייעודי (payload) של POST.
אם מופיעה שגיאה:
- HTTP 403: צריך לוודא שמפתח ה-API והמפתח הסודי נוספו בצורה נכונה כפרמטרים של שאילתה בכתובת ה-URL של המטען הייעודי (payload). מוודאים שהשדה Secret (סוד) ב-HackerOne ריק.
- HTTP 401: מוודאים שמפתח ה-API תקין ומוגבל ל-Google SecOps API.
– HTTP 404: מוודאים שכתובת ה-URL של נקודת הקצה נכונה וכוללת את הנתיב המלא (/v1/{parent}/logs:import).
אימות ההטמעה ב-Google SecOps
- עוברים אל SIEM Settings (הגדרות SIEM) > Feeds (פידים) ב-Google SecOps.
- מאתרים את פיד ה-webhook של HackerOne.
- בודקים את העמודה סטטוס (הסטטוס צריך להיות פעיל).
- בודקים את הספירה של אירועים שהתקבלו (הספירה צריכה לעלות).
- בודקים את חותמת הזמן של ההצלחה האחרונה (היא אמורה להיות עדכנית).
מגבלות ושיטות מומלצות לשימוש ב-Webhook
מגבלות על בקשות
| Limit | Value |
|-------|-------|
| **Max request size** | 4 MB |
| **Max QPS (queries per second)** | 15,000 |
| **Request timeout** | 30 seconds |
| **Retry behavior** | Automatic with exponential backoff |
טבלת מיפוי UDM
| שדה ביומן | מיפוי UDM | היגיון |
|---|---|---|
| attributes.cleared, attributes.rules_of_engagement_signed, attributes.identity_verified, attributes.background_checked, attributes.citizenship_verified, attributes.residency_verified, type, attributes.title, attributes.main_state, attributes.state, relationships.reporter.data.type, relationships.reporter.data.attributes.reputation, relationships.reporter.data.attributes.signal, relationships.reporter.data.attributes.impact, relationships.reporter.data.attributes.disabled, relationships.reporter.data.attributes.profile_picture.62x62, relationships.reporter.data.attributes.profile_picture.82x82, relationships.reporter.data.attributes.profile_picture.110x110, relationships.reporter.data.attributes.profile_picture.260x260, relationships.reporter.data.attributes.hackerone_triager, relationships.program.data.id, relationships.program.data.type, relationships.program.data.attributes.handle, relationships.severity.data.type, relationships.severity.data.attributes.rating, relationships.severity.data.attributes.author_type, relationships.severity.data.attributes.calculation_method, relationships.weakness.data.id, relationships.weakness.data.type, relationships.weakness.data.attributes.name, relationships.weakness.data.attributes.description, relationships.weakness.data.attributes.external_id, relationships.structured_scope.data.id, relationships.structured_scope.data.type, relationships.structured_scope.data.attributes.asset_type, relationships.structured_scope.data.attributes.eligible_for_bounty, relationships.structured_scope.data.attributes.eligible_for_submission, relationships.structured_scope.data.attributes.instruction, relationships.structured_scope.data.attributes.max_severity, relationships.structured_scope.data.attributes.confidentiality_requirement, relationships.structured_scope.data.attributes.integrity_requirement, relationships.structured_scope.data.attributes.availability_requirement, relationships.inboxes.data.id, relationships.inboxes.data.type, relationships.inboxes.data.attributes.name, relationships.inboxes.data.attributes.type | additional.fields | מוזגו כתוויות של ערכי מפתח |
| חותמת זמן | metadata.event_timestamp | הניתוח מתבצע באמצעות מסנן תאריכים בפורמט yyyy-MM-dd'T'HH:mm:ss.SSSZ |
| metadata.event_type | צריך להגדיר את הערך "STATUS_UPDATE" אם הערך של has_principal הוא true, את הערך "USER_UNCATEGORIZED" אם הערך של has_principal_user_user הוא true, ואחרת את הערך "GENERIC_EVENT" | |
| id | metadata.product_log_id | הערך הועתק ישירות |
| relationships.structured_scope.data.attributes.asset_identifier | principal.asset.asset_id | מתחיל ב-ASSET: |
| attributes.email_alias | principal.user.email_addresses | ממוזג |
| relationships.reporter.data.id | principal.user.employee_id | הערך הועתק ישירות |
| relationships.reporter.data.attributes.name | principal.user.first_name | הערך הועתק ישירות |
| attributes.username, relationships.reporter.data.attributes.username | principal.user.user_display_name | הערך מ-relationships.reporter.data.attributes.username אם הוא לא ריק, אחרת הערך מ-attributes.username |
| relationships.severity.data.attributes.user_id | principal.user.userid | הערך הועתק ישירות |
| relationships.severity.data.id | security_result.rule_id | הערך הועתק ישירות |
| relationships.severity.data.attributes.max_severity | security_result.severity | הומר לאותיות רישיות |
| attributes.vulnerability_information | security_result.summary | הערך הועתק ישירות |
יומן שינויים
צפייה ביומן השינויים של המנתח הזה
הבעיה עדיין לא נפתרה? קבלת תשובות מחברי הקהילה וממומחי Google SecOps.