Collecter les journaux HackerOne

Compatible avec :

Ce document explique comment configurer HackerOne pour envoyer des journaux à Google Security Operations à l'aide de webhooks.

HackerOne est une plate-forme de coordination des failles et de primes aux bogues qui met en relation des organisations et des chercheurs en sécurité afin d'identifier et de 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 développement logiciel.

Avant de commencer

  • Assurez-vous de remplir les conditions suivantes :

  • Une instance Google SecOps

  • Un programme HackerOne de niveau Professionnel ou Enterprise (les webhooks ne sont disponibles que pour ces niveaux)

  • Un accès administrateur aux paramètres de votre programme HackerOne

  • Un accès à la Google Cloud Console (pour la création de clés API)

Créer un flux de webhook dans Google SecOps

Créer le flux

  1. Accédez à Paramètres SIEM > Flux.
  2. Cliquez sur Add New Feed (Ajouter un flux d'actualités).
  3. Sur la page suivante, cliquez sur Configure a single feed (Configurer un seul flux).
  4. Dans le champ Feed name (Nom du flux), saisissez un nom pour le flux (par exemple, HackerOne Webhook).
  5. Sélectionnez Webhook comme Source type (Type de source).
  6. Sélectionnez HackerOne comme Log type (Type de journal).
  7. Cliquez sur Suivant.
  8. Spécifiez des valeurs pour les paramètres d'entrée suivants :
    • Split delimiter (Délimiteur de division) : laissez ce champ vide. Chaque requête de webhook contient un seul événement JSON.
    • Asset namespace (Espace de noms de l'élément) : espace de noms de l'élément
    • Ingestion labels (Libellés d'ingestion) : libellé à appliquer aux événements de ce flux
  9. Cliquez sur Suivant.
  10. Vérifiez la configuration de votre nouveau flux d'actualités dans l'écran Finalize (Finaliser), puis cliquez sur Submit (Envoyer).

Générer et enregistrer la clé secrète

Après avoir créé le flux, vous devez générer une clé secrète pour l'authentification :

  1. Sur la page d'informations du flux, cliquez sur Generate Secret Key (Générer une clé secrète).
  2. Une boîte de dialogue affiche la clé secrète.
  3. Copiez et enregistrez la clé secrète en toute sécurité.

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

  1. Accédez à l'onglet Details (Détails) du flux.
  2. Dans la section Endpoint Information (Informations sur le point de terminaison), copiez l'URL du point de terminaison du flux.
  3. Le format de l'URL est le suivant :

    https://{region}-chronicle.googleapis.com/v1/{parent}/logs:import
    

    Où {region} correspond à la région de votre instance Google SecOps (par exemple, us, europe ou asia-southeast1), et {parent} correspond au chemin d'accès de la ressource au format projects/<PROJECT_ID>/locations/<LOCATION>/instances/<INSTANCE_ID>/logTypes/<LOG_TYPE>.

  4. Enregistrez cette URL pour les étapes suivantes.

  5. Cliquez sur OK.

Créer une clé API Google Cloud

Chronicle nécessite une clé API pour l'authentification. Créez une clé API limitée dans la Google Cloud Console.

Créer la clé API

  1. Accédez à la page Identifiants de la console Google Cloud.
  2. Sélectionnez votre projet (celui associé à votre instance Google SecOps).
  3. Cliquez sur Créer des identifiants > Clé API.
  4. Une clé API est créée et affichée dans une boîte de dialogue.
  5. Cliquez sur Modifier la clé API pour limiter la clé.

Limiter la clé API

  1. Sur la page des paramètres Clé API :
    • Nom : saisissez un nom descriptif (par exemple, Chronicle HackerOne Webhook API Key).
  2. Sous Restrictions relatives aux API:
    1. Sélectionnez Restreindre la clé.
    2. Dans le menu déroulant Sélectionner des API, recherchez et sélectionnez API Google SecOps (ou API Chronicle).
  3. Cliquez sur Enregistrer.
  4. Copiez la valeur de la clé API dans le champ Clé API en haut de la page.
  5. Enregistrez la clé API en toute sécurité.

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://{region}-chronicle.googleapis.com/v1/{parent}/logs:import?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 la clé secrète.

Important : Ne placez pas la clé secrète Google SecOps dans le champ Secret (Secret) de HackerOne. Le champ Secret (Secret) de HackerOne est utilisé pour la validation de la signature de la 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 (Secret) de HackerOne, une erreur 403 Forbidden s'affiche, car HackerOne ne transmet pas cette valeur en tant qu'identifiant d'authentification Google SecOps. Ajoutez plutôt key et secret en tant que paramètres de requête dans l'URL de la charge utile.

Créer un webhook dans HackerOne

  1. Connectez-vous à HackerOne et accédez à votre programme.
  2. Accédez à Engagements, cliquez sur le menu à trois points du programme que vous souhaitez configurer, puis cliquez sur Settings.
  3. Accédez à Automation > Webhooks (Automatisation > Webhooks).
  4. Cliquez sur New webhook (Nouveau webhook).
  5. Fournissez les informations de configuration suivantes :
    • Payload URL (URL de la charge utile) : collez l'URL complète avec la clé API et le secret ci-dessus. Par exemple, https://{region}-chronicle.googleapis.com/v1/{parent}/logs:import?key=AIzaSyD...&secret=abcd1234....
    • Secret (Secret) : laissez ce champ vide.
  6. Sélectionnez les événements pour lesquels vous souhaitez déclencher le webhook. Choisissez l'une des options suivantes :
    • Send me everything (Tout m'envoyer) : tous les événements déclenchent le webhook.
    • Let me specify individual events (Me laisser spécifier des événements individuels) : sélectionnez les événements spécifiques que vous souhaitez envoyer à Google SecOps.
  7. Cliquez sur Add webhook (Ajouter un webhook).

Tester le webhook

  1. Sur la page de configuration du webhook, cliquez sur Test request (Tester la requête) pour envoyer un exemple de requête à l'URL de la charge utile configurée.
  2. Vérifiez que la réponse est HTTP 200.
  3. Cliquez sur votre webhook pour afficher les détails.
  4. Dans la section Recent deliveries (Livraisons récentes), vérifiez que les livraisons récentes affichent l'état "Réussi" (HTTP 200).
  5. Cliquez sur n'importe quelle livraison 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 la charge utile. Vérifiez que le champ Secret (Secret) de 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 inclut le chemin d'accès complet (/v1/{parent}/logs:import).

Vérifier l'ingestion dans Google SecOps

  1. Accédez à SIEM Settings > Feeds (Paramètres SIEM > Flux) dans Google SecOps.
  2. Recherchez votre flux de webhook HackerOne.
  3. Vérifiez la colonne Status (État) (elle doit être Active).
  4. Vérifiez le nombre d'Events received (Événements reçus) (il doit augmenter).
  5. Vérifiez l'horodatage Last succeeded on (Dernière réussite) (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 |

Tableau 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é en tant que libellés clé/valeur
code temporel metadata.event_timestamp Analysé à l'aide du filtre de date au format aaaa-MM-jj'T'HH:mm:ss.SSSZ
metadata.event_type Défini 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 valeur issue de 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

Consulter le journal des modifications de ce parser

Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.