Collecter les journaux GitLab
Présentation
Cet analyseur extrait les champs des journaux JSON GitLab, les normalise dans le modèle de données unifié (UDM) et enrichit les données avec un contexte supplémentaire. Il gère différents types d'événements GitLab, en se concentrant sur les actions des utilisateurs, l'accès aux ressources et les résultats de sécurité, tout en traitant les informations liées au réseau et aux applications. L'analyseur effectue également une logique basée sur les rôles et les actions dans GitLab, en catégorisant les événements et en attribuant les niveaux de gravité appropriés.
Avant de commencer
Assurez-vous de remplir les conditions préalables suivantes :
- Instance Google SecOps.
- Accès privilégié à GitLab.
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 GitLab).
- Sélectionnez Webhook comme type de source.
- Sélectionnez Gitlab 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 un webhook dans GitLab pour Google SecOps
- Ouvrez votre navigateur Web et accédez au projet GitLab pour lequel vous souhaitez configurer le webhook.
- Dans votre projet, accédez à Paramètres > Webhooks.
- Cliquez sur Add new webhook (Ajouter un webhook).
- Dans le champ URL, collez l'URL du point de terminaison Google SecOps.
- Cliquez sur Ajouter un en-tête personnalisé.
- Saisissez X-Webhook-Access-Key dans le champ Nom de l'en-tête.
- Dans le champ Valeur de l'en-tête, copiez la clé secrète générée lors de la configuration du flux Google SecOps.
- Cliquez sur Ajouter un en-tête personnalisé.
- Saisissez X-goog-api-key dans le champ Nom de l'en-tête.
- Dans le champ Valeur de l'en-tête, copiez la clé API générée lors de la configuration du flux Google SecOps. Remarque : Pour renforcer la sécurité, générez un jeton secret et ajoutez-le à la configuration du webhook GitLab et à la configuration du flux Google SecOps correspondant. Cela permet de vérifier l'authenticité des webhooks entrants.
- Choisissez les événements GitLab qui doivent déclencher le webhook. Par exemple, vous pouvez sélectionner Événements push pour envoyer des données à Google SecOps chaque fois que du code est envoyé au dépôt. Réfléchissez bien aux événements qui sont pertinents pour vos besoins de surveillance de la sécurité. Trop d'événements peuvent entraîner une charge inutile.
- Pour mieux comprendre l'objectif du webhook, donnez-lui un nom explicite, tel que Webhook Google SecOps.
- Assurez-vous que la case Activer la validation SSL est cochée. C'est essentiel pour une communication sécurisée.
- Cliquez sur Ajouter un webhook pour enregistrer votre configuration.
Table de mappage UDM
Champ de journal | Mappage UDM | Logique |
---|---|---|
author_id |
principal.user.userid |
Converti en chaîne. |
author_name |
principal.user.email_addresses |
Si la valeur correspond à une expression régulière d'adresse e-mail. |
author_name |
principal.user.user_display_name |
Si la valeur ne correspond pas à une expression régulière d'adresse e-mail. |
details.as |
principal.resource.attribute.labels |
Ajouté en tant que libellé avec la clé "as". |
details.add |
principal.resource.attribute.labels |
Ajouté en tant que libellé avec la clé "add". |
details.as |
principal.user.role_name |
Valeur brute du champ de journal. |
details.as |
principal.user.attribute.roles.type |
Définissez sur "ADMINISTRATOR" si details.as est "Propriétaire", sur "SERVICE_ACCOUNT" si details.as est "Developer", "Maintainer" ou "Reporter", et sur "TYPE_UNSPECIFIED" si details.as est "Guest". |
details.custom_message |
security_result.description |
Valeur brute du champ de journal. |
details.custom_message.action |
security_result.summary |
Valeur brute du champ de journal. |
details.entity_path |
target.file.full_path |
Valeur brute du champ de journal. |
details.target_id |
target.resource.id |
Converti en chaîne. |
entity_path |
target.file.full_path |
Valeur brute du champ de journal. |
entity_type |
target.resource.attribute.labels |
Ajouté en tant que libellé avec la clé "Entity Type" (Type d'entité). |
event_type |
metadata.product_event_type |
Valeur brute du champ de journal. |
insertId |
metadata.product_log_id |
Valeur brute du champ de journal. |
ip_address |
principal.ip , principal.asset.ip |
Valeur brute du champ de journal. |
jsonPayload.action |
additional.fields |
Ajouté en tant que champ avec la clé "action" et une valeur de chaîne. |
jsonPayload.controller |
additional.fields |
Ajouté en tant que champ avec la clé "controller" et une valeur de chaîne. |
jsonPayload.correlation_id |
principal.asset_id |
Préfixé par "id: ". |
jsonPayload.cpu_s |
additional.fields |
Ajouté en tant que champ avec la clé "cpu_s" et une valeur de chaîne. |
jsonPayload.details.custom_message.protocol |
network.application_protocol |
Définissez la valeur sur "UNKNOWN_APPLICATION_PROTOCOL" si elle est "web", sinon convertissez-la en majuscules. Également ajouté en tant que champ supplémentaire avec la clé "Application Protocol" si la valeur est "web". |
jsonPayload.mem_total_bytes |
additional.fields |
Ajouté en tant que champ avec la clé "mem_total_bytes" et la valeur de chaîne. |
jsonPayload.meta_caller_id |
additional.fields |
Ajouté en tant que champ avec la clé "Caller Id" et une valeur de chaîne. |
jsonPayload.meta_client_id |
target.user.userid |
Valeur brute du champ de journal. |
jsonPayload.meta_feature_category |
additional.fields |
Ajouté en tant que champ avec la clé "Feature Category" (Catégorie de fonctionnalité) et une valeur de chaîne. |
jsonPayload.meta_remote_ip |
principal.ip , principal.asset.ip |
Valeur du champ de journal brut, analysée en tant que tableau JSON et fusionnée dans les champs IP. |
jsonPayload.meta_user |
principal.user.userid |
Utilisé comme solution de repli si jsonPayload.username est vide. |
jsonPayload.method |
network.http.method |
Valeur brute du champ de journal. |
jsonPayload.path |
target.process.file.full_path |
Valeur brute du champ de journal. |
jsonPayload.pid |
target.process.pid |
Converti en chaîne. |
jsonPayload.remote_ip |
principal.ip , principal.asset.ip |
Valeur brute du champ de journal. |
jsonPayload.request_urgency |
additional.fields |
Ajouté en tant que champ avec la clé "Request Urgency" et une valeur de chaîne. |
jsonPayload.severity |
security_result.severity |
Définissez la valeur sur "INFORMATIONAL" si elle est "INFO", sur "ERROR" si elle est "ERROR" et sur "MEDIUM" si elle est "NOTICE". |
jsonPayload.status |
network.http.response_code |
Converti en entier si la valeur n'est pas "ACTIVE". |
jsonPayload.ua |
network.http.user_agent |
Valeur brute du champ de journal. |
jsonPayload.username |
principal.user.userid |
Valeur brute du champ de journal. |
jsonPayload.worker_id |
principal.application |
Valeur brute du champ de journal. |
labels.instance_name |
principal.hostname , principal.asset.hostname |
Valeur du champ de journal brut, utilisée si le message contient "Removing user" (Suppression de l'utilisateur). |
logName |
security_result.category_details |
Valeur brute du champ de journal. |
message |
security_result.summary |
Valeur du champ de journal brut, utilisée si jsonPayload.severity est défini sur "ERROR". |
protoPayload.@type |
additional.fields |
Ajouté en tant que champ avec la clé "type protoPayload" et une valeur de chaîne. |
protoPayload.authenticationInfo.principalEmail |
principal.user.email_addresses , principal.user.userid |
Valeur brute du champ de journal. |
protoPayload.authenticationInfo.principalSubject |
additional.fields |
Ajouté en tant que champ avec la clé "authenticationInfo principalSubject" et une valeur de chaîne. |
protoPayload.authenticationInfo.serviceAccountKeyName |
additional.fields |
Ajouté en tant que champ avec la clé "authenticationInfo serviceAccountKeyName" et une valeur de chaîne. |
protoPayload.authorizationInfo |
target.resource.attribute.labels , security_result.action |
Les valeurs de ce champ sont ajoutées en tant que libellés dont les clés sont précédées de "authenticationInfo". security_result.action est défini sur "ALLOW" si une valeur dans granted est "true", et sur "BLOCK" si elle est "false". Les champs imbriqués tels que resourceAttributes sont également ajoutés en tant que libellés avec des clés dont le préfixe est "authenticationInfo_resourceAttributes". |
protoPayload.methodName |
additional.fields |
Ajouté en tant que champ avec la clé "protoPayload methodName" et la valeur de chaîne. |
protoPayload.request.@type |
additional.fields |
Ajouté en tant que champ avec la clé "Request Type" et une valeur de chaîne. |
protoPayload.request.resource |
target.resource.attribute.labels |
Ajouté en tant que libellé avec la clé "Request resource" (Demander une ressource). |
protoPayload.requestMetadata.callerIp |
additional.fields |
Ajoutée en tant que champ avec la clé "requestMetadata callerIp" et une valeur de chaîne. |
protoPayload.requestMetadata.callerSuppliedUserAgent |
additional.fields |
Ajouté en tant que champ avec la clé "requestMetadata callerSuppliedUserAgent" et une valeur de chaîne. |
protoPayload.serviceName |
additional.fields |
Ajouté en tant que champ avec la clé "serviceName" et une valeur de chaîne. |
protoPayload.status.code |
additional.fields |
Ajouté en tant que champ avec la clé "protoPayload status code" et une valeur de chaîne. |
protoPayload.status.message |
additional.fields , target.user.email_addresses , target.user.userid |
Ajouté en tant que champ avec la clé "message d'état protoPayload" et la valeur de chaîne. Si une adresse e-mail peut être extraite du message, elle est ajoutée à target.user.email_addresses et target.user.userid . |
receiveTimestamp |
metadata.event_timestamp , timestamp |
Analysé comme code temporel de l'événement. |
resource.labels.project_id |
target.resource.attribute.labels |
Ajouté en tant que libellé avec la clé "ID du projet". |
resource.labels.zone |
target.cloud.availability_zone |
Valeur brute du champ de journal. |
resource.type |
target.cloud.environment |
Définissez la valeur sur "GOOGLE_CLOUD_PLATFORM" si elle correspond à "gce". |
security_result.action |
security_result.action |
Dérivé de protoPayload.authorizationInfo.granted . |
security_result.category_details |
security_result.category_details |
Fusionné avec logName . |
security_result.description |
security_result.description |
Dérivé de jsonPayload.details.custom_message . |
security_result.severity |
security_result.severity |
Dérivé de severity ou jsonPayload.severity . |
security_result.summary |
security_result.summary |
Dérivé de jsonPayload.details.custom_message.action ou jsonPayload.message . |
severity |
security_result.severity |
Définissez la valeur sur "INFORMATIONAL" si elle est "INFO", sur "ERROR" si elle est "ERROR" et sur "MEDIUM" si elle est "NOTICE". |
sourceLocation |
principal.resource.attribute.labels |
Les valeurs de ce champ sont ajoutées en tant que libellés. |
target_details |
target.resource.attribute.labels |
Ajouté en tant que libellé avec la clé "Target Details" (Détails de la cible). |
target_type |
target.resource.attribute.labels |
Ajouté en tant que libellé avec la clé "target type". |
timestamp |
timestamp |
Valeur brute du champ de journal. Définie en fonction de la présence des champs "principal" et "cible". La valeur par défaut est "GENERIC_EVENT" si aucune condition spécifique n'est remplie. Les valeurs possibles sont "USER_RESOURCE_UPDATE_CONTENT", "USER_RESOURCE_ACCESS" et "USER_UNCATEGORIZED". Définissez-le sur "GITLAB". Définissez-le sur "GITLAB". |
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.