Collecter les journaux HackerOne
Ce document explique comment configurer HackerOne pour qu'il transmette les journaux à Google Security Operations à l'aide de webhooks.
HackerOne est une plate-forme de coordination des failles et de primes aux bugs qui met en relation les organisations et les chercheurs en sécurité pour identifier et corriger les failles de sécurité. La plate-forme propose des programmes de primes aux bogues, des programmes de divulgation des failles, des tests d'intrusion et des tests de sécurité continus tout au long du cycle de vie du développement logiciel.
Avant de commencer
Assurez-vous de remplir les conditions préalables suivantes :
Une instance Google SecOps
Programme HackerOne avec un forfait Professional ou Enterprise (les Webhooks ne sont disponibles que pour ces forfaits)
Accès administrateur aux paramètres de votre programme HackerOne
Accès à la Google Cloud Console (pour créer une clé API)
Créer un flux de webhook dans Google SecOps
Créer le flux
- Accédez à Paramètres SIEM> Flux.
- Cliquez sur Ajouter un flux d'actualités.
- Sur la page suivante, cliquez sur Configurer un seul flux.
- Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple,
HackerOne Webhook). - Sélectionnez Webhook comme type de source.
- Sélectionnez HackerOne comme type de journal.
- Cliquez sur Suivant.
- Spécifiez les valeurs des paramètres d'entrée suivants :
- Délimiteur de fractionnement : laissez ce champ vide. Chaque requête de webhook contient un seul événement JSON.
- Espace de noms de l'élément : espace de noms de l'élément
- Libellés d'ingestion : libellé à appliquer aux événements de ce flux
- Cliquez sur Suivant.
- Vérifiez la configuration de votre nouveau flux d'actualités sur l'écran Finaliser, puis cliquez sur Envoyer.
Générer et enregistrer une clé secrète
Après avoir créé le flux, vous devez générer une clé secrète pour l'authentification :
- Sur la page d'informations sur le flux, cliquez sur Générer une clé secrète.
- Une boîte de dialogue affiche la clé secrète.
- Copiez et enregistrez la clé secrète de manière sécurisée.
Important : La clé secrète ne s'affiche qu'une seule fois et ne peut pas être récupérée ultérieurement. Si vous la perdez, vous devrez en générer une nouvelle.
Obtenir l'URL du point de terminaison du flux
- Accédez à l'onglet Détails du flux.
- Dans la section Informations sur le point de terminaison, copiez l'URL du point de terminaison du flux.
Le format d'URL est le suivant :
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreateou pour les points de terminaison régionaux :
https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreateEnregistrez cette URL pour les étapes suivantes.
Cliquez sur OK.
Créer une clé API Google Cloud
Chronicle nécessite une clé API pour l'authentification. Créez une clé API restreinte dans la Google Cloud Console.
Créer la clé API
- Accédez à la page "Identifiants" de la console Google Cloud.
- Sélectionnez votre projet (celui associé à votre instance Google SecOps).
- Cliquez sur Créer des identifiants> Clé API.
- Une clé API est créée et s'affiche dans une boîte de dialogue.
- Cliquez sur Modifier la clé API pour restreindre la clé.
Restreindre la clé API
- Sur la page des paramètres de la clé API :
- Nom : saisissez un nom descriptif (par exemple,
Chronicle HackerOne Webhook API Key).
- Nom : saisissez un nom descriptif (par exemple,
- Sous Restrictions relatives aux API :
- Sélectionnez Restreindre la clé.
- Dans le menu déroulant Sélectionner des API, recherchez et sélectionnez API Google SecOps (ou API Chronicle).
- Cliquez sur Enregistrer.
- Copiez la valeur de la clé API dans le champ Clé API en haut de la page.
Enregistrez la clé API de manière sécurisée.
Configurer le webhook HackerOne
Créer l'URL de webhook
Combinez l'URL du point de terminaison Google SecOps, la clé API et la clé secrète en une seule URL. La clé API et la clé secrète doivent être ajoutées en tant que paramètres de requête.
Format de l'URL :
```none
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>
```
Exemple :
```none
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...
```
Remplacez les éléments suivants :
- <ENDPOINT_URL> : URL du point de terminaison du flux de la section Obtenir l'URL du point de terminaison du flux.
- <API_KEY> : clé API Google Cloud de la section Créer une clé API Google Cloud.
- <SECRET_KEY> : clé secrète de la section Générer et enregistrer une clé secrète.
Important : Ne placez pas la clé secrète Google SecOps dans le champ Secret de HackerOne. Le champ Secret de HackerOne est utilisé pour la validation de la signature de charge utile HMAC (en-tête X-H1-Signature), qui est un mécanisme distinct de l'authentification du webhook Google SecOps. Si vous placez le secret Google SecOps dans le champ Secret de HackerOne, une erreur 403 Forbidden s'affichera, car HackerOne ne transmet pas cette valeur en tant qu'identifiant d'authentification Google SecOps. À la place, ajoutez key et secret en tant que paramètres de requête dans l'URL de la charge utile.
Créer un webhook dans HackerOne
- Connectez-vous à HackerOne et accédez à votre programme.
- Accédez à Engagements, cliquez sur le menu à trois points du programme que vous souhaitez configurer, puis sur Paramètres.
- Accédez à Automatisation > Webhooks.
- Cliquez sur Nouveau webhook.
- Fournissez les informations de configuration suivantes :
- URL de la charge utile : collez l'URL complète avec la clé API et le secret ci-dessus (par exemple,
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...). - Secret : laissez ce champ vide.
- URL de la charge utile : collez l'URL complète avec la clé API et le secret ci-dessus (par exemple,
- Sélectionnez les événements qui déclencheront le webhook. Choisissez l'une des options suivantes :
- Tout m'envoyer : le webhook sera déclenché par tous les événements.
- Me laisser spécifier des événements individuels : sélectionnez les événements spécifiques que vous souhaitez envoyer à Google SecOps.
Cliquez sur Add webhook (Ajouter un Webhook).
Tester le webhook
- Sur la page de configuration du webhook, cliquez sur Demande de test pour envoyer un exemple de requête à l'URL de charge utile configurée.
- Vérifiez que la réponse est HTTP 200.
- Cliquez sur votre webhook pour afficher les détails.
- Dans la section Livraisons récentes, vérifiez que les livraisons récentes ont bien été effectuées (HTTP 200).
- Cliquez sur n'importe quelle diffusion pour afficher la requête de charge utile POST.
Si vous recevez une erreur :
- HTTP 403 : vérifiez que la clé API et la clé secrète sont correctement ajoutées en tant que paramètres de requête dans l'URL de charge utile. Vérifiez que le champ Secret HackerOne est vide.
- HTTP 401 : vérifiez que la clé API est valide et limitée à l'API Google SecOps.
- HTTP 404 : vérifiez que l'URL du point de terminaison est correcte et qu'elle inclut le chemin d'accès complet (/v2/unstructuredlogentries:batchCreate).
Vérifier l'ingestion dans Google SecOps
- Accédez à Paramètres SIEM> Flux dans Google SecOps.
- Recherchez votre flux de webhook HackerOne.
- Vérifiez la colonne État (elle doit indiquer Active).
- Vérifiez le nombre d'événements reçus (il doit augmenter).
- Vérifiez le code temporel Dernière réussite le (il doit être récent).
Limites et bonnes pratiques concernant les webhooks
Limites de requêtes
| Limit | Value |
|-------|-------|
| **Max request size** | 4 MB |
| **Max QPS (queries per second)** | 15,000 |
| **Request timeout** | 30 seconds |
| **Retry behavior** | Automatic with exponential backoff |
Table de mappage UDM
| Champ du journal | Mappage UDM | Logique |
|---|---|---|
| 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 | Fusionnées en tant qu'étiquettes clé/valeur |
| code temporel | metadata.event_timestamp | Analysé à l'aide du filtre de date au format yyyy-MM-dd'T'HH:mm:ss.SSSZ |
| metadata.event_type | Définissez sur "STATUS_UPDATE" si has_principal est défini sur "true", sur "USER_UNCATEGORIZED" si has_principal_user_user est défini sur "true", sinon sur "GENERIC_EVENT". | |
| id | metadata.product_log_id | Valeur copiée directement |
| relationships.structured_scope.data.attributes.asset_identifier | principal.asset.asset_id | Préfixé par "ASSET:" |
| attributes.email_alias | principal.user.email_addresses | Fusionné |
| relationships.reporter.data.id | principal.user.employee_id | Valeur copiée directement |
| relationships.reporter.data.attributes.name | principal.user.first_name | Valeur copiée directement |
| attributes.username, relationships.reporter.data.attributes.username | principal.user.user_display_name | Valeur issue de relationships.reporter.data.attributes.username si elle n'est pas vide, sinon attributes.username |
| relationships.severity.data.attributes.user_id | principal.user.userid | Valeur copiée directement |
| relationships.severity.data.id | security_result.rule_id | Valeur copiée directement |
| relationships.severity.data.attributes.max_severity | security_result.severity | Converti en majuscules |
| attributes.vulnerability_information | security_result.summary | Valeur copiée directement |
Journal des modifications
Afficher le journal des modifications de ce parseur
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.