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 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 bugs, 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 préalables suivantes :

  • Une instance Google SecOps
  • Programme HackerOne avec un forfait Professional ou Enterprise (les Webhooks ne sont disponibles que pour ces forfaits)
  • Vous bénéficiez d'un accès administrateur aux paramètres de votre programme HackerOne.

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).
  3. Sur la page suivante, cliquez sur Configurer un seul flux.
  4. Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple, HackerOne Vulnerability Reports).
  5. Sélectionnez Webhook comme type de source.
  6. Sélectionnez HackerOne comme Type de journal.
  7. Cliquez sur Suivant.
  8. Spécifiez les valeurs des paramètres d'entrée suivants :
    • Délimiteur de fractionnement (facultatif) : 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.
  9. Cliquez sur Suivant.
  10. Vérifiez la configuration de votre nouveau flux 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 :

  1. Sur la page d'informations sur le flux, cliquez sur 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 de manière sécurisée.

Obtenir l'URL du point de terminaison du flux

  1. Accédez à l'onglet 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 d'URL est le suivant :

    https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate
    

    ou

    https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate
    
  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 restreinte 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 Chronicle).
  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 la restreindre.

Restreindre la clé API

  1. Sur la page des paramètres de la 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 la liste 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 de manière sécurisée.

Configurer le webhook HackerOne

Créer l'URL du webhook

  • Combinez l'URL du point de terminaison Chronicle et la clé API :

    <ENDPOINT_URL>?key=<API_KEY>
    
    • Exemple :

      https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...
      

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 sur Paramètres.
  3. Accédez à Automatisation > Webhooks.
  4. Cliquez sur Nouveau webhook.
  5. Fournissez les informations de configuration suivantes :
    • URL de la charge utile : collez l'URL complète du point de terminaison avec la clé API ci-dessus.
    • Secret : collez la clé secrète issue de la création du flux Chronicle.
    • Sélectionnez les événements qui doivent déclencher le webhook : choisissez l'une des options suivantes :
      • Tout m'envoyer : le webhook est déclenché par tous les événements.
      • Me permettre de spécifier des événements individuels : sélectionnez les événements spécifiques que vous souhaitez envoyer à Chronicle. Événements recommandés pour la surveillance de la sécurité :
        • report_created : lorsqu'un pirate informatique envoie un nouveau rapport sur une faille de sécurité
        • report_triaged : lorsqu'un rapport est trié
        • report_resolved : lorsqu'un signalement est résolu
        • report_bounty_awarded : lorsqu'une récompense est attribuée
        • report_swag_awarded : date à laquelle des produits dérivés ont été attribués
        • program_hacker_joined : lorsqu'un pirate informatique rejoint le programme
        • program_hacker_left : lorsqu'un pirate informatique quitte le programme
  6. Cliquez sur Add webhook (Ajouter un Webhook).

Tester le webhook

  1. Sur la page de configuration du webhook, sélectionnez Demande de test pour envoyer un exemple de requête à l'URL de charge utile configurée.
  2. Vérifiez que la réponse est HTTP 200.
  3. Vérifiez le flux Chronicle pour l'événement de test dans un délai d'une à deux minutes.

Vérifier que le webhook fonctionne

Vérifier l'état du webhook HackerOne

  1. Connectez-vous à la console HackerOne.
  2. Accédez à Engagements, cliquez sur le menu à trois points de votre programme, puis sur Paramètres.
  3. Accédez à Automatisation > Webhooks.
  4. Cliquez sur votre webhook pour afficher les détails.
  5. Dans la section Diffusions récentes, vérifiez que les diffusions récentes ont bien été effectuées (code HTTP 200).
  6. Cliquez sur n'importe quelle distribution pour afficher la requête POST de charge utile.

Vérifier l'état du flux Chronicle

  1. Accédez à Paramètres du SIEM > Flux dans Chronicle.
  2. Localisez votre flux de webhook HackerOne.
  3. Vérifiez la colonne État (elle doit indiquer Actif).
  4. Vérifiez le nombre d'événements reçus (il doit augmenter).
  5. Vérifiez l'horodatage Dernière réussite le (il doit être récent).

Vérifier les journaux dans Chronicle

  1. Accédez à Rechercher > Recherche UDM.
  2. Utilisez la requête suivante :

    metadata.vendor_name = "HACKERONE" AND metadata.product_name = "HACKERONE"
    
  3. Ajustez la période sur "Dernière heure".

  4. Vérifiez que les événements apparaissent dans les résultats.

Référence des méthodes d'authentification

Les flux de webhook Chronicle sont compatibles avec plusieurs méthodes d'authentification. Les Webhooks HackerOne utilisent une combinaison de paramètres de requête et de validation de signature.

HackerOne envoie des webhooks à l'URL de charge utile configurée. L'authentification est gérée par :

  • Clé API dans l'URL : la clé API Chronicle est ajoutée en tant que paramètre de requête à l'URL du payload.
  • Validation de la signature secrète : HackerOne génère un en-tête X-H1-Signature contenant un hexdigest HMAC SHA256 du corps de la requête signé avec le secret configuré.

    • Format de l'URL :

      <ENDPOINT_URL>?key=<API_KEY>
      
    • Format de la demande :

      POST <ENDPOINT_URL>?key=<API_KEY> HTTP/1.1
      Content-Type: application/json
      X-H1-Signature: sha256=<HMAC_HEXDIGEST>
      X-H1-Event: <EVENT_TYPE>
      X-H1-Delivery: <DELIVERY_ID>
      
      {
        "data": {
          "activity": {...},
          "report": {...}
        }
      }
      
  • Avantages :

    • Double authentification : clé API pour l'accès à Chronicle et signature pour la validation de la charge utile
    • HackerOne fournit une fonctionnalité de génération de signatures intégrée.
    • Validation sécurisée de l'intégrité de la charge utile

Validation de la signature

  • HackerOne inclut les en-têtes suivants dans chaque requête webhook :

    • X-H1-Signature : HMAC SHA256 hexdigest du corps de la requête (format : sha256=<hexdigest>)
    • X-H1-Event : type d'événement ayant déclenché le webhook
    • X-H1-Delivery : identifiant unique de la livraison
  • Pour valider la signature sur votre point de terminaison de réception :

    import hmac
    import hashlib
    
    def validate_request(request_body, secret, signature):
        _, digest = signature.split('=')
        generated_digest = hmac.new(
            secret.encode(),
            request_body.encode(),
            hashlib.sha256
        ).hexdigest()
        return hmac.compare_digest(digest, generated_digest)
    

Types d'événements de webhook

HackerOne est compatible avec les types d'événements de webhook suivants :

Type d'événement Description
report_created Déclenchement lorsqu'un pirate informatique envoie un nouveau rapport de faille
report_triaged Déclenché lorsqu'un rapport est trié
report_resolved Déclenchement lorsqu'un signalement est résolu
report_bounty_awarded Déclenchement lorsqu'une récompense est attribuée pour un signalement
report_swag_awarded Déclenchement lorsqu'un cadeau est attribué pour un signalement
report_became_public Déclenchée lorsqu'un rapport devient public
program_hacker_joined Déclenchement lorsqu'un pirate informatique rejoint le programme
program_hacker_left Déclenchement lorsqu'un pirate informatique quitte le programme

Table de mappage UDM

Champ de 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
timestamp 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", ou sur "GENERIC_EVENT" dans le cas contraire.
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 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

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