Collecter les journaux Auth0
Présentation
Cet analyseur extrait les événements de journaux Auth0 à partir de messages au format JSON. Il initialise les champs UDM, analyse la charge utile JSON, mappe les champs pertinents au schéma UDM et catégorise les événements en fonction du champ type, en définissant les actions de sécurité et les types d'événements appropriés.
Avant de commencer
Assurez-vous de remplir les conditions préalables suivantes :
- Instance Google SecOps.
- Un compte Auth0 disposant des autorisations nécessaires.
Configurer des flux
Il existe deux points d'entrée différents pour configurer les flux dans la plate-forme Google SecOps :
- Paramètres SIEM> Flux
- Plate-forme de contenu > Packs de contenu
Configurer des flux à partir de Paramètres SIEM > Flux
Pour configurer un flux, procédez comme suit :
- Accédez à Paramètres SIEM > Flux.
- Cliquez sur Add New Feed (Ajouter un flux).
- Sur la page suivante, cliquez sur Configurer un seul flux.
- Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple, Journaux Auth0).
- Sélectionnez Webhook comme type de source.
- Sélectionnez AUTH_ZERO comme type de journal.
- Cliquez sur Suivant.
- Facultatif : spécifiez les valeurs des paramètres d'entrée suivants :
- Délimiteur de fractionnement : délimiteur utilisé pour séparer les lignes de journaux, tel que
\n
. - Espace de noms de l'élément : espace de noms de l'élément.
- Libellés d'ingestion : libellé appliqué aux événements de ce flux.
- Délimiteur de fractionnement : délimiteur utilisé pour séparer les lignes de journaux, tel que
- Cliquez sur Suivant.
- Vérifiez la configuration du flux sur l'écran Finaliser, puis cliquez sur Envoyer.
- Cliquez sur Générer une clé secrète pour générer une clé secrète permettant d'authentifier ce flux.
- Copiez et stockez la clé secrète. Vous ne pourrez plus afficher cette clé secrète. Si nécessaire, vous pouvez générer une nouvelle clé secrète, mais l'ancienne deviendra obsolète.
- Dans l'onglet Détails, copiez l'URL du point de terminaison du flux à partir du champ Informations sur le point de terminaison. Vous devez spécifier cette URL de point de terminaison dans votre application cliente.
- Cliquez sur OK.
Configurer des flux depuis le Hub de contenu
Indiquez les valeurs des champs suivants :
- Délimiteur de fractionnement : délimiteur utilisé pour séparer les lignes de journaux, tel que
\n
.
Options avancées
- Nom du flux : valeur préremplie qui identifie le flux.
- Type de source : méthode utilisée pour collecter les journaux dans Google SecOps.
- Espace de noms de l'élément : espace de noms associé au flux.
Libellés d'ingestion : libellés appliqués à tous les événements de ce flux.
Cliquez sur Générer une clé secrète pour générer une clé secrète permettant d'authentifier ce flux.
Copiez et stockez la clé secrète. Vous ne pourrez plus afficher cette clé secrète. Si nécessaire, vous pouvez générer une nouvelle clé secrète, mais l'ancienne deviendra obsolète.
Dans l'onglet Détails, copiez l'URL du point de terminaison du flux à partir du champ Informations sur le point de terminaison. Vous devez spécifier cette URL de point de terminaison dans votre application cliente.
Créer une clé API pour le flux de webhook
Accédez à la consoleGoogle Cloud > Identifiants.
Cliquez sur Créer des identifiants, puis sélectionnez Clé API.
Restreignez l'accès à la clé API à l'API Chronicle.
Spécifier l'URL du point de terminaison
- Dans votre application cliente, spécifiez l'URL du point de terminaison HTTPS fournie dans le flux de webhook.
Activez l'authentification en spécifiant la clé API et la clé secrète dans l'en-tête personnalisé au format suivant :
X-goog-api-key = API_KEY X-Webhook-Access-Key = SECRET
Recommandation : Spécifiez la clé API en tant qu'en-tête au lieu de la spécifier dans l'URL. Si votre client de webhook n'accepte pas les en-têtes personnalisés, vous pouvez spécifier la clé API et la clé secrète à l'aide de paramètres de requête au format suivant :
ENDPOINT_URL?key=API_KEY&secret=SECRET
Remplacez les éléments suivants :
ENDPOINT_URL
: URL du point de terminaison du flux.API_KEY
: clé API pour s'authentifier auprès de Google Security Operations.SECRET
: clé secrète que vous avez générée pour authentifier le flux.
Configurer le webhook Auth0 pour Google SecOps
- Accédez au tableau de bord Auth0.
- Accédez à Surveillance > Flux.
- Cliquez sur Créer un flux de journaux.
- Cliquez sur le bouton Custom Webhook (Webhook personnalisé) et donnez-lui le nom de votre choix. Par exemple : Webhook Google SecOps.
- Configurez les éléments suivants :
- URL du payload : saisissez l'URL du point de terminaison de l'API Google SecOps.
- Content-Type : définissez l'en-tête Content-Type sur application/json. Cela indique à Google SecOps le format des données envoyées.
- Facultatif : Jeton d'autorisation : configurez un secret pour renforcer la sécurité. Elle servira à vérifier l'authenticité des requêtes de webhook.
Personnaliser la charge utile : vous pouvez personnaliser la charge utile envoyée à Google SecOps en modifiant la catégorie d'événement. Cela vous permet de sélectionner des points de données spécifiques à partir de l'événement Auth0 et de les mettre en forme selon les besoins de Google SecOps. Pour en savoir plus sur les variables de contexte et les options de script disponibles, consultez la documentation Auth0. Assurez-vous que la charge utile finale est conforme au format UDM Google SecOps attendu.
- Cliquez sur Enregistrer pour créer le webhook.
- Déclenchez l'événement associé au crochet (par exemple, enregistrez un nouvel utilisateur ou connectez-vous).
- Vérifiez que les journaux sont envoyés à Google SecOps en consultant le flux dans la console Google SecOps.
Table de mappage UDM
Champ de journal | Mappage UDM | Logique |
---|---|---|
client_id |
principal.asset.product_object_id |
Mappé directement à partir du champ client_id . |
client_name |
principal.hostname |
Mappé directement à partir du champ client_name . |
connection |
security_result.description |
Mappé directement à partir du champ connection . |
connection_id |
security_result.rule_id |
Mappé directement à partir du champ connection_id . |
date |
metadata.event_timestamp |
Analysé à partir du champ date au format ISO8601. |
description |
metadata.description |
Mappé directement à partir du champ description . |
details.error |
security_result.detection_fields |
Mappé à partir du champ details.error . La clé est "Error". |
details.error.oauthError |
security_result.detection_fields |
Mappé à partir du champ details.error.oauthError . La clé est "oauthError". |
details.error.type |
security_result.detection_fields |
Mappé à partir du champ details.error.type . La clé est "oauth_error_type". |
details.ipOnAllowlist |
security_result.detection_fields |
Mappé à partir du champ details.ipOnAllowlist . La clé est "ipOnAllowlist". |
details.link |
target.url |
Mappé directement à partir du champ details.link s'il est présent, sinon dérivé d'autres champs (voir ci-dessous). |
details.request.auth.strategy |
security_result.detection_fields |
Mappé à partir du champ details.request.auth.strategy . La clé est "strategy". |
details.request.body.app_metadata.blockedReason |
security_result.detection_fields |
Mappé à partir du champ details.request.body.app_metadata.blockedReason . La clé est "blockedReason". |
details.request.body.app_metadata.customer_id |
target.user.product_object_id |
Mappé directement à partir du champ details.request.body.app_metadata.customer_id . |
details.request.body.app_metadata.migrated |
security_result.detection_fields |
Mappé à partir du champ details.request.body.app_metadata.migrated . La clé est "migrated". |
details.request.channel |
security_result.detection_fields |
Mappé à partir du champ details.request.channel . La clé est "channel". |
details.request.method |
network.http.method |
Directement mappé à partir du champ details.request.method après conversion en majuscules. |
details.request.path |
target.url |
Directement mappé à partir du champ details.request.path si details.link n'est pas présent, sinon dérivé d'autres champs (voir ci-dessous). |
details.response.body.email |
target.user.email_addresses |
Mappé directement à partir du champ details.response.body.email . |
details.response.body.email_verified |
security_result.detection_fields |
Mappé à partir du champ details.response.body.email_verified . La clé est "email_verified". |
details.response.body.nickname |
target.user.user_display_name |
Mappé directement à partir du champ details.response.body.nickname . |
details.response.body.user_id |
target.user.userid |
Mappé directement à partir du champ details.response.body.user_id . |
details.response.statusCode |
network.http.response_code |
Mappé directement à partir du champ details.response.statusCode après conversion en entier. |
details.return_to |
target.url |
Directement mappé à partir du champ details.return_to si details.link et details.request.path ne sont pas présents, sinon dérivé d'autres champs (voir ci-dessous). |
details.session_id |
network.session_id |
Mappé directement à partir du champ details.session_id . |
details.stats.loginsCount |
additional.fields |
Mappé à partir du champ details.stats.loginsCount . La clé est "loginsCount". |
details.requiresVerification |
security_result.detection_fields |
Mappé à partir du champ details.requiresVerification . La clé est "requiresVerification". |
details.to |
target.user.email_addresses |
Mappé directement à partir du champ details.to . |
hostname |
target.hostname |
Mappé directement à partir du champ hostname . |
ip |
principal.ip |
Mappé directement à partir du champ ip . |
js_data.audience |
target.url |
Mappé directement à partir du champ js_data.audience si details.link , details.request.path et details.return_to ne sont pas présents. |
js_data.details.body.email_verified |
security_result.detection_fields |
Mappé à partir du champ js_data.details.body.email_verified . La clé est "email_verified". |
js_data.details.body.is_signup |
security_result.detection_fields |
Mappé à partir du champ js_data.details.body.is_signup . La clé est "is_signup". |
js_data.details.body.transaction.redirect_uri |
target.url |
Directement mappé à partir du champ js_data.details.body.transaction.redirect_uri si details.link , details.request.path , details.return_to et js_data.audience ne sont pas présents. |
js_data.scope |
security_result.detection_fields |
Mappé à partir du champ js_data.scope . La clé est "scope". |
js_data.tracking_id |
security_result.detection_fields |
Mappé à partir du champ js_data.tracking_id . La clé est "tracking_id". |
log_id |
metadata.product_log_id |
Mappé directement à partir du champ log_id . |
metadata.log_type |
metadata.log_type |
Mappé directement à partir du champ log_type . |
metadata.product_name |
metadata.product_name |
Défini sur "AUTH_ZERO". |
metadata.vendor_name |
metadata.vendor_name |
Défini sur "AUTH_ZERO". |
metadata.product_event_type |
metadata.product_event_type |
Mappé directement à partir du champ type . |
network.http.parsed_user_agent |
network.http.parsed_user_agent |
Analysé à partir du champ user_agent . |
network.http.user_agent |
network.http.user_agent |
Mappé directement à partir du champ user_agent . |
security_result.action |
security_result.action |
Déterminé par le champ type (ALLOW ou BLOCK). Consultez le code du parseur pour connaître les mappages spécifiques. |
strategy |
security_result.detection_fields |
Mappé à partir du champ strategy . La clé est "strategy". |
strategy_type |
security_result.detection_fields |
Mappé à partir du champ strategy_type . La clé est "strategy_type". |
target.user.email_addresses |
target.user.email_addresses |
Mappé directement à partir du champ user_name s'il s'agit d'une adresse e-mail, sinon dérivé d'autres champs (voir ci-dessus). |
target.user.userid |
target.user.userid |
Directement mappé à partir du champ user_id , ou details.response.body.user_id ou user_name si user_id n'est pas présent. |
user_agent |
network.http.user_agent |
Mappé directement à partir du champ user_agent . |
user_id |
target.user.userid |
Mappé directement à partir du champ user_id . |
user_name |
target.user.email_addresses |
Mappé directement à partir du champ user_name . Définissez sur "MACHINE" si security_result.action est défini sur "ALLOW" et type est défini sur "slo", "sapi", "s", "ss" ou "ssa". Définissez sur "OTP" si extensions.auth.type est défini sur "MACHINE" et type sur "slo". Déterminé par une combinaison de champs, y compris type , client_name , ip , hostname et has_user . Consultez le code du parseur pour connaître les mappages spécifiques. |
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.