איסוף יומנים של HackerOne

נתמך ב:

במאמר הזה מוסבר איך להגדיר את HackerOne כך שישלח יומנים ל-Google Security Operations באמצעות תגובות לפעולה מאתר אחר (webhooks).

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

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

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

  • מכונה של Google SecOps

  • תוכנית HackerOne עם רמת Professional או Enterprise (תגובות לפעולות אינטרנט זמינות רק ברמות האלה)

  • הרשאת אדמין בהגדרות התוכנית שלכם ב-HackerOne

  • גישה למסוף Google Cloud (ליצירת מפתח API)

יצירת פיד של webhook ב-Google SecOps

יצירת הפיד

  1. עוברים אל SIEM Settings > Feeds (הגדרות SIEM > פידים).
  2. לוחצים על הוספת פיד חדש.
  3. בדף הבא, לוחצים על הגדרת פיד יחיד.
  4. בשדה שם הפיד, מזינים שם לפיד (לדוגמה, HackerOne Webhook).
  5. בוחרים באפשרות Webhook בתור סוג המקור.
  6. בוחרים באפשרות HackerOne בתור סוג היומן.
  7. לוחצים על הבא.
  8. מציינים ערכים לפרמטרים הבאים של הקלט:
    • תו מפריד לפיצול: משאירים את השדה ריק. כל בקשת webhook מכילה אירוע JSON יחיד.
    • מרחב השמות של הנכס: מרחב השמות של הנכס
    • תוויות להוספה: התווית שתתווסף לאירועים מהפיד הזה
  9. לוחצים על הבא.
  10. בודקים את הגדרות הפיד החדש במסך סיום ולוחצים על שליחה.

יצירה ושמירה של מפתח סודי

אחרי שיוצרים את הפיד, צריך ליצור מפתח סודי לאימות:

  1. בדף הפרטים של הפיד, לוחצים על יצירת מפתח סודי.
  2. תיפתח תיבת דו-שיח עם המפתח הסודי.
  3. מעתיקים ושומרים את המפתח הסודי באופן מאובטח.

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

איך מקבלים את כתובת ה-URL של נקודת הקצה של הפיד

  1. עוברים לכרטיסייה פרטים של הפיד.
  2. בקטע Endpoint Information, מעתיקים את Feed endpoint URL.
  3. הפורמט של כתובת ה-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>.

  4. שומרים את כתובת ה-URL הזו לשלבים הבאים.

  5. לוחצים על סיום.

יצירת מפתח API של Google Cloud

כדי לבצע אימות ב-Chronicle, צריך מפתח API. יוצרים מפתח API מוגבל במסוף Google Cloud.

יצירת מפתח ה-API

  1. נכנסים לדף Credentials במסוף Google Cloud.
  2. בוחרים את הפרויקט (הפרויקט שמשויך למכונה של Google SecOps).
  3. לוחצים על Create credentials > מפתח API.
  4. מפתח API נוצר ומוצג בתיבת דו-שיח.
  5. לוחצים על מפתח API כדי להגביל את המפתח.

הגבלת מפתח ה-API

  1. בדף ההגדרות מפתח API:
    • שם: מזינים שם תיאורי (לדוגמה, Chronicle HackerOne Webhook API Key).
  2. בקטע API restrictions (הגבלות על API):
    1. בוחרים באפשרות Restrict key.
    2. בתפריט הנפתח Select APIs, מחפשים ובוחרים את Google SecOps API (או Chronicle API).
  3. לוחצים על Save.
  4. מעתיקים את הערך של מפתח ה-API מהשדה API key שבחלק העליון של הדף.
  5. שומרים את מפתח ה-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

  1. נכנסים ל-HackerOne ועוברים לתוכנית שלכם.
  2. עוברים אל אינטראקציות, לוחצים על סמל האפשרויות הנוספות של התוכנית שרוצים להגדיר ואז לוחצים על הגדרות.
  3. עוברים אל Automation > Webhooks.
  4. לוחצים על Webhook חדש.
  5. מספקים את פרטי ההגדרה הבאים:
    • כתובת ה-URL של מטען הייעודי (payload): מדביקים את כתובת ה-URL המלאה עם מפתח ה-API והסוד שצוינו למעלה. לדוגמה, https://{region}-chronicle.googleapis.com/v1/{parent}/logs:import?key=AIzaSyD...&secret=abcd1234....
    • סוד: משאירים את השדה הזה ריק.
  6. בוחרים אילו אירועים יפעילו את ה-webhook. בוחרים באחת מהאפשרויות הבאות:
    • Send me everything (שליחת כל הנתונים): כל האירועים יפעילו את ה-webhook.
    • אני רוצה לציין אירועים ספציפיים: בוחרים את האירועים הספציפיים שרוצים לשלוח ל-Google SecOps.
  7. לוחצים על Add webhook (הוספת תגובה לפעולה מאתר אחר).

בדיקת ה-webhook

  1. בדף ההגדרות של ה-webhook, לוחצים על Test request (בדיקת בקשה) כדי לשלוח בקשה לדוגמה לכתובת ה-URL של מטען הייעודי (payload) שהוגדרה.
  2. מוודאים שהתשובה היא HTTP 200.
  3. לוחצים על ה-webhook כדי לראות את הפרטים.
  4. בקטע Recent deliveries, מוודאים שהמסירות האחרונות מציגות סטטוס הצלחה (HTTP 200).
  5. לוחצים על אחת מהמסירות כדי לראות את בקשת המטען הייעודי (payload) של POST.

אם מופיעה שגיאה: - HTTP 403: צריך לוודא שמפתח ה-API והמפתח הסודי נוספו בצורה נכונה כפרמטרים של שאילתה בכתובת ה-URL של המטען הייעודי (payload). מוודאים שהשדה Secret (סוד) ב-HackerOne ריק. ‫- HTTP 401: מוודאים שמפתח ה-API תקין ומוגבל ל-Google SecOps API. ‫– HTTP 404: מוודאים שכתובת ה-URL של נקודת הקצה נכונה וכוללת את הנתיב המלא (/v1/{parent}/logs:import).

אימות ההטמעה ב-Google SecOps

  1. עוברים אל SIEM Settings (הגדרות SIEM) > Feeds (פידים) ב-Google SecOps.
  2. מאתרים את פיד ה-webhook של HackerOne.
  3. בודקים את העמודה סטטוס (הסטטוס צריך להיות פעיל).
  4. בודקים את הספירה של אירועים שהתקבלו (הספירה צריכה לעלות).
  5. בודקים את חותמת הזמן של ההצלחה האחרונה (היא אמורה להיות עדכנית).

מגבלות ושיטות מומלצות לשימוש ב-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.