Collecter les journaux Atlassian Jira
Présentation
Cet analyseur gère les journaux Atlassian Jira aux formats SYSLOG et JSON. Il tente d'abord d'analyser le message au format JSON. Si cela échoue, il utilise des modèles grok pour analyser les messages au format SYSLOG, en extrayant divers champs tels que les adresses IP, les noms d'utilisateur, les méthodes HTTP et les codes de réponse, avant de les mapper sur l'UDM. L'analyseur gère également des événements d'audit Jira spécifiques, y compris les connexions réussies et les échecs, et met en correspondance les champs pertinents avec les attributs de résultat de sécurité dans l'UDM.
Avant de commencer
- Assurez-vous de disposer d'une instance Google SecOps.
- Assurez-vous de disposer d'un accès privilégié à Atlassian Jira.
Configurer un flux dans Google SecOps pour ingérer les journaux Atlassian Jira
- Accédez à Paramètres du SIEM > Flux.
- Cliquez sur Ajouter.
- Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple, Journaux Atlassian Jira).
- Sélectionnez Webhook comme type de source.
- Sélectionnez Atlassian Jira comme Type de journal.
- Cliquez sur Suivant.
- Facultatif: spécifiez des valeurs pour les paramètres d'entrée suivants :
- Délimiteur de fractionnement: délimiteur utilisé pour séparer les lignes de journal, par exemple
\n
. - Espace de noms des éléments: espace de noms des éléments.
- 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 journal, par exemple
- Cliquez sur Suivant.
- Vérifiez la configuration du flux dans 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 cette action rend l'ancienne clé secrète obsolète.
- Dans l'onglet Détails, copiez l'URL du point de terminaison du flux dans le champ Informations sur le point de terminaison. Vous devez spécifier cette URL de point de terminaison dans votre application cliente.
- Cliquez sur OK.
Créer une clé API pour le flux webhook
Accédez à la console Google Cloud > Identifiants.
Cliquez sur Créer des identifiants, puis sélectionnez Clé API.
Limitez l'accès de la clé API à l'API Google Security Operations.
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 plutôt que dans l'URL. Si votre client webhook n'est pas compatible avec 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 permettant de s'authentifier auprès de Google Security Operations.SECRET
: clé secrète que vous avez générée pour authentifier le flux.
Créer un webhook dans Atlassian Jira pour Google SecOps
- Accédez à votre instance Jira en tant qu'administrateur.
- Accédez à Paramètres Paramètres > Système > WebHooks.
- Cliquez sur Créer un webhook.
- Configurez les détails du webhook suivants :
- Nom: indiquez un nom descriptif pour le webhook (par exemple, Intégration Google SecOps).
- URL: saisissez l'URL du point de terminaison de l'API Google SecOps.
- Événements: sélectionnez les événements Jira qui doivent déclencher le webhook. Choisissez les événements pertinents pour vos besoins de surveillance de la sécurité (par exemple, "Problème créé", "Problème mis à jour", "Commentaire ajouté"). Si nécessaire, vous pouvez sélectionner Tous les événements.
- Facultatif: Filtre JQL: utilisez un filtre JQL pour affiner davantage les événements qui déclenchent le webhook. Cela vous permet de vous concentrer sur des projets, des types de problèmes ou d'autres critères spécifiques.
- Exclure le corps: laissez cette option décochée. Le webhook doit envoyer les données d'événement au format JSON à Google SecOps.
- Cliquez sur Créer pour enregistrer la configuration du webhook.
Tableau de mappage UDM
Champ de journal | Mappage UDM | Logique |
---|---|---|
affectedObjects.id |
target.resource.attribute.labels.value |
Le champ id de chaque objet du tableau affectedObjects est mappé sur un libellé avec la clé "ID_[index]", où [index] correspond à la position de l'objet dans le tableau. |
affectedObjects.name |
target.resource.attribute.labels.value |
Le champ name de chaque objet du tableau affectedObjects est mappé sur un libellé avec la clé "Name_[index]", où [index] correspond à la position de l'objet dans le tableau. |
affectedObjects.type |
target.resource.attribute.labels.value |
Le champ type de chaque objet du tableau affectedObjects est mappé sur un libellé avec la clé "Type_[index]", où [index] correspond à la position de l'objet dans le tableau. |
associatedItems.0.id |
target.user.userid |
Si associatedItems.0.typeName est "USER", ce champ est mappé sur target.user.userid . Sinon, il est mappé à un libellé avec la clé "associatedItems Id" dans security_result.detection_fields . |
associatedItems.0.name |
target.user.user_display_name |
Si associatedItems.0.typeName est "USER", ce champ est mappé sur target.user.user_display_name . Dans le cas contraire, il est mappé à une étiquette avec la clé "associatedItems Name" dans security_result.detection_fields . |
associatedItems.0.parentId |
target.process.parent_process.pid |
Si associatedItems.0.typeName est "USER", ce champ est mappé sur target.process.parent_process.pid . |
associatedItems.0.parentName |
target.resource.parent |
Si associatedItems.0.typeName est "USER", ce champ est mappé sur target.resource.parent . |
associatedItems.0.typeName |
security_result.detection_fields.value |
Mappé sur un libellé avec la clé "associatedItems TypeName" dans security_result.detection_fields . |
author.id |
principal.user.userid |
Mappé sur principal.user.userid . |
author.name |
principal.user.user_display_name |
Mappé sur principal.user.user_display_name . |
author.type |
principal.resource.attribute.labels.value |
Mappé sur un libellé avec la clé "Author Type" (Type d'auteur) dans principal.resource.attribute.labels . |
author.uri |
principal.url |
Mappé sur principal.url . |
authorAccountId |
principal.user.userid |
Mappé sur principal.user.userid . |
authorKey |
target.resource.attribute.labels.value |
Mappé sur un libellé avec la clé "Clé de l'auteur" dans target.resource.attribute.labels . |
auditType.action |
security_result.summary |
Mappé sur security_result.summary . Utilisé également pour dériver security_result.action et metadata.event_type (USER_LOGIN si l'action contient "login", ALLOW si "successful", BLOCK si "failed"). |
auditType.area |
metadata.product_event_type |
Mappé sur metadata.product_event_type . |
auditType.category |
security_result.category_details |
Mappé sur security_result.category_details . |
category |
metadata.product_event_type |
Mappé sur metadata.product_event_type . |
changedValues.changedFrom |
security_result.about.resource.attribute.labels.value |
Mappé sur un libellé avec la clé "Changed From" (Modifié à partir de) dans security_result.about.resource.attribute.labels . |
changedValues.changedTo |
security_result.about.resource.attribute.labels.value |
Mappé sur un libellé avec la clé "Changed To" (Modifié en) dans security_result.about.resource.attribute.labels . |
changedValues.fieldName |
security_result.about.resource.attribute.labels.value |
Mappé sur un libellé avec la clé "FieldName" dans security_result.about.resource.attribute.labels . |
changedValues.i18nKey |
security_result.about.resource.attribute.labels.value |
Mappé sur un libellé avec la clé "FieldName" dans security_result.about.resource.attribute.labels . |
changedValues.key |
security_result.about.resource.attribute.labels.value |
Mappé sur un libellé avec la clé "Changed From" (Modifié à partir de) dans security_result.about.resource.attribute.labels . |
changedValues.to |
security_result.about.resource.attribute.labels.value |
Mappé sur un libellé avec la clé "Changed To" (Modifié en) dans security_result.about.resource.attribute.labels . |
created |
metadata.event_timestamp |
Analysé et mappé sur metadata.event_timestamp . |
dst_ip |
target.ip |
Mappé sur target.ip . |
extraAttributes.name |
principal.resource.attribute.labels.value |
Mappé sur un libellé avec la clé "Name" (Nom) dans principal.resource.attribute.labels . |
extraAttributes.value |
principal.resource.attribute.labels.value |
Mappé sur un libellé avec la clé "Valeur" dans principal.resource.attribute.labels . |
http_method |
network.http.method |
Mappé sur network.http.method . |
http_referral_url |
network.http.referral_url |
Mappé sur network.http.referral_url . |
id |
metadata.product_log_id |
Mappé sur metadata.product_log_id . |
objectItem.id |
security_result.detection_fields.value |
Mappé sur un libellé avec la clé "objectItem Id" dans security_result.detection_fields . |
objectItem.name |
security_result.detection_fields.value |
Mappé sur un libellé avec la clé "objectItem Name" dans security_result.detection_fields . |
objectItem.typeName |
security_result.detection_fields.value |
Mappé sur un libellé avec la clé "objectItem TypeName" dans security_result.detection_fields . |
path |
principal.url |
Si la valeur n'est pas "-" ou "/status", elle est mappée sur principal.url . |
protocol |
network.ip_protocol |
Si "HTTP", mappé sur network.ip_protocol . |
remoteAddress |
principal.ip |
Mappé sur principal.ip . |
response_code |
network.http.response_code |
Mappé sur network.http.response_code . |
sent_bytes |
network.sent_bytes |
Mappé sur network.sent_bytes . |
source |
principal.ip |
Analyse pour extraire les adresses IP et fusion dans principal.ip . |
src_ip1 , src_ip2 , src_ip3 |
principal.ip |
Mappé sur principal.ip . |
summary |
metadata.description |
Mappé sur metadata.description . |
user_agent |
network.http.user_agent |
Mappé sur network.http.user_agent . |
user_name |
principal.user.userid |
Mappé sur principal.user.userid . Définissez cette valeur sur "MACHINE" si auditType.action contient "login". Dérivé de date_time si l'analyse est effectuée sur le fichier journal syslog ou de created si l'analyse est effectuée sur un fichier JSON. Si timestamp est disponible au format JSON, il est utilisé à la place de created . Si aucun de ces éléments n'est présent, l'create_time du lot est utilisé. Dérivé en fonction de la présence d'autres champs: NETWORK_HTTP si dst_ip est présent, USER_UNCATEGORIZED si user_name ou (associatedItems.0.typeName est "USER" et associatedItems.0.id est présent) est présent, STATUS_UPDATE si src_ip1 , src_ip2 , src_ip3 ou remoteAddress est présent, ou GENERIC_EVENT dans le cas contraire. Remplacer par USER_LOGIN si auditType.action contient "login". Toujours défini sur "ATLASSIAN_JIRA". Toujours défini sur "ATLASSIAN_JIRA". Définissez la valeur sur "ALLOW" si auditType.action contient "login successful" (Connexion réussie), ou sur "BLOCK" si auditType.action contient "login failed" (Connexion échouée). |
Modifications
2023-12-12
- Ajout de la prise en charge du mappage de plusieurs adresses IP de "source" à "principal.ip".
2023-11-10
- Ajout d'un nouveau format Grok pour analyser les journaux JSON non valides.
- Mappage de "affectedObjects" sur "target.resource.attribute.labels".
- Mappage de "changedValues" sur "security_result.about.resource.attribute.labels".
- "extraAttributes" a été mappé sur "principal.resource.attribute.labels".
- Mappage de "source" sur "principal.ip".
- Les valeurs "author.id", "author.name", "author.uri", "author.type", "auditType.area", "auditType.category" et "auditType.action" ont été mappées sur "principal.user.userid", "principal.user.user_display_name", "principal.url", "principal.resource.attribute.labels", "metadata.product_event_type", "security_result.category_details" et "security_result.summary", respectivement.
2023-02-09
- Ajout d'un bloc "json" pour récupérer les données JSON.
2023-01-10
- Amélioration : prise en charge des journaux au format JSON.
- Mappage de "authorAccountId" sur "principal.user.userid".
- Mappage de "id" sur "metadata.product_log_id".
- Mappage de "remoteAddress" sur "principal.ip".
- Mappage de "summary" sur "metadata.description".
- "category" a été mappé sur "metadata.product_event_type".
- "authorKey" a été mappé sur "target.resource.attribute.labels".
- Mappage de "objectItem.id", "objectItem.name" et "objectItem.typeName" sur "security_result.detection_fields".
- "associatedItems.0.id" a été mappé sur "target.user.userid" lorsque "associatedItems.0.typeName" est "USER".
- "associatedItems.0.name" a été mappé sur "target.user.user_display_name" lorsque "associatedItems.0.typeName" est "USER".
- Mappage de "associatedItems.0.parentId" sur "target.process.parent_process.pid" lorsque "associatedItems.0.typeName" est "USER".
- Mappage de "associatedItems.0.parentName" sur "target.resource.parent" lorsque "associatedItems.0.typeName" est "USER".
- Mappage de "associatedItems.0.id" et "associatedItems.0.name" sur "security_result.detection_fields" lorsque "associatedItems.0.typeName" n'est pas "USER".
- Mappage de "associatedItems.0.typeName" sur "security_result.detection_fields".
- Mappage de "changedValues.fieldName", "changedValues.changedFrom" et "changedValues.changedTo" sur "security_result.about.resource.attribute.labels".
- Mappage de "STATUS_UPDATE" sur "metadata.event_type" si "remoteAddress" est présent.
- Mappage de "USER_UNCATEGORIZED" sur "metadata.event_type" si "authorAccountId" est présent ou si "associatedItems.0.typeName" est "USER" et que "associatedItems.0.id" est présent.
2022-05-31
- Correction de bug : ajout d'une condition pour vérifier le mappage incorrect de principal.url si la valeur de l'URL dans les journaux contient "/status".