Collecter les journaux d'audit Lucid
Ce document explique comment ingérer les journaux d'audit Lucid dans Google Security Operations à l'aide de Google Cloud Storage V2.
Lucid Software propose une suite de collaboration visuelle incluant Lucidchart, Lucidspark et Lucidscale. L'API Audit Logs, disponible exclusivement pour les clients Enterprise Shield, capture les événements liés à la sécurité et à la conformité dans l'ensemble de l'organisation, y compris l'accès aux comptes, l'activité des documents, la gestion des utilisateurs, les actions d'administration et les opérations d'équipe.
Avant de commencer
Assurez-vous de remplir les conditions suivantes :
- Une instance Google SecOps
- Un projet GCP avec l'API Cloud Storage activée
- Autorisations permettant de créer et de gérer des buckets GCS
- Autorisations permettant de gérer les stratégies IAM sur les buckets GCS
- Autorisations permettant de créer des services Cloud Run, des sujets Pub/Sub et des jobs Cloud Scheduler
- Un compte Lucid Enterprise Shield avec des droits d'administrateur ou de propriétaire de compte
- Accès au portail des développeurs Lucid avec les outils pour les développeurs activés
Activer les outils pour les développeurs dans Lucid
Avant de créer des identifiants d'API, vous devez avoir accès au portail des développeurs Lucid. Il existe deux façons d'activer les outils pour les développeurs :
Option 1 : Activer la fonctionnalité dans les paramètres utilisateur
- Connectez-vous à lucid.app.
- Cliquez sur l'icône de votre profil en haut à droite.
- Sélectionnez Paramètres du compte.
Cochez la case Activer les outils pour les développeurs.
Option 2 : Activer la fonctionnalité en attribuant un rôle d'administrateur
- Connectez-vous à lucid.app en tant que propriétaire du compte ou administrateur de l'équipe.
- Accédez au panneau d'administration.
- Accédez à la section Utilisateurs.
- Sélectionnez l'utilisateur cible.
Modifiez les rôles de l'utilisateur et attribuez-lui le rôle Développeur.
Configurer l'accès à l'API Lucid
Pour permettre à Google SecOps de récupérer les journaux d'audit, vous devez créer un client OAuth 2.0 et générer un jeton d'accès au niveau du compte avec le champ d'application account.audit.logs.
Créer une application et un client OAuth 2.0
- Accédez au portail des développeurs Lucid.
- Cliquez sur Créer une application.
- Saisissez un nom pour votre application (par exemple,
Chronicle SIEM Integration). - Cliquez sur l'application que vous venez de créer pour accéder à ses paramètres.
- Accédez à l'onglet OAuth 2.0.
Saisissez un nom pour votre client OAuth 2.0 (par exemple,
Chronicle Audit Log Collector).Cliquez sur Créer un client OAuth 2.0.
Enregistrer les identifiants client
Une fois le client OAuth 2.0 créé, le portail affiche vos identifiants :
- ID client : votre identifiant client unique.
- Code secret du client : code secret de votre API.
Important : Copiez et enregistrez immédiatement le code secret du client. Si le code secret du client est compromis, cliquez sur le bouton Réinitialiser le code secret du client sur la page des paramètres OAuth 2.0. La réinitialisation du secret révoque immédiatement l'accès jusqu'à ce que le nouveau secret soit mis à jour dans votre intégration.
Enregistrer un URI de redirection
- Sur la page des paramètres OAuth 2.0, cliquez sur Ajouter un URI de redirection.
Saisissez l'URI de redirection pour votre intégration. Si vous utilisez la redirection de test fournie par Lucid, saisissez :
https://lucid.app/oauth2/clients/<CLIENT_ID>/redirectRemplacez
<CLIENT_ID>par votre ID client.
Obtenir un jeton d'accès au niveau du compte
L'API Audit Logs nécessite un jeton de compte (et non un jeton utilisateur). Un administrateur de compte doit autoriser le client OAuth 2.0 à créer un jeton au nom du compte.
Demandez à un administrateur de compte d'accéder à l'URL d'autorisation suivante dans un navigateur :
https://lucid.app/oauth2/authorizeAccount?client_id=<CLIENT_ID>&redirect_uri=<REDIRECT_URI>&scope=account.audit.logsRemplacez
<CLIENT_ID>et<REDIRECT_URI>par vos valeurs réelles.L'administrateur examine les autorisations demandées sur l'écran de consentement, puis clique sur Autoriser.
Lucid redirige vers l'URI de redirection avec un paramètre de requête
coded'autorisation.Échangez le code d'autorisation contre un jeton d'accès en envoyant une requête POST au point de terminaison du jeton :
curl --request POST \ --url https://api.lucid.co/oauth2/token \ --header 'Content-Type: application/json' \ --data '{ "grant_type": "authorization_code", "client_id": "<CLIENT_ID>", "client_secret": "<CLIENT_SECRET>", "code": "<AUTHORIZATION_CODE>", "redirect_uri": "<REDIRECT_URI>" }'La réponse inclut un
access_tokenet unrefresh_token. Consignez les deux valeurs de manière sécurisée.
Vérifier l'accès à l'API
Vérifiez que le jeton d'accès fonctionne en effectuant une requête de test :
curl --request GET \ --url 'https://api.lucid.co/auditLogs?pageSize=1' \ --header 'Authorization: Bearer <ACCESS_TOKEN>' \ --header 'Lucid-Api-Version: 1' \ --header 'Accept: application/json'
Une réponse réussie renvoie un tableau JSON d'événements du journal d'audit.
Autorisations d'API requises
Le client OAuth 2.0 nécessite le champ d'application suivant :
Champ d'application Type de jeton Objectif account.audit.logs Compte Récupérer les événements du journal d'audit pour le compte
Créer un bucket Google Cloud Storage
- Accédez à la console Google Cloud.
- Sélectionnez votre projet ou créez-en un.
- Dans le menu de navigation, accédez à Cloud Storage > Buckets.
- Cliquez sur Créer un bucket.
Fournissez les informations de configuration suivantes :
Paramètre Valeur Attribuez un nom au bucket Saisissez un nom unique (par exemple, lucid-audit-logs-gcs).Type d'emplacement Choisissez en fonction de vos besoins (région, birégion, multirégion). Emplacement Sélectionnez l'emplacement (par exemple, us-central1).Classe de stockage Standard (recommandé pour les journaux auxquels vous accédez fréquemment) Access control (Contrôle des accès) Uniforme (recommandé) Outils de protection Facultatif : Activez la gestion des versions des objets ou la règle de conservation. Cliquez sur Créer.
Créer un compte de service pour la fonction Cloud Run
- Dans la console GCP, accédez à IAM et administration > Comptes de service.
- Cliquez sur Créer un compte de service.
- Fournissez les informations de configuration suivantes :
- Nom du compte de service : saisissez
lucid-audit-collector-sa. - Description du compte de service : saisissez
Service account for Cloud Run function to collect Lucid audit logs.
- Nom du compte de service : saisissez
- Cliquez sur Créer et continuer.
- Dans la section Autoriser ce compte de service à accéder au projet, ajoutez les rôles suivants :
- Cliquez sur Sélectionner un rôle.
- Recherchez et sélectionnez Administrateur des objets Storage.
- Cliquez sur + Ajouter un autre rôle.
- Recherchez et sélectionnez Demandeur Cloud Run.
- Cliquez sur + Ajouter un autre rôle.
- Recherchez et sélectionnez Demandeur Cloud Functions.
- Cliquez sur Continuer.
- Cliquez sur OK.
Accorder des autorisations IAM sur le bucket GCS
- Accédez à Cloud Storage > Buckets.
- Cliquez sur le nom de votre bucket (
lucid-audit-logs-gcs). - Accédez à l'onglet Autorisations.
- Cliquez sur Accorder l'accès.
- Fournissez les informations de configuration suivantes :
- Ajouter des comptes principaux : saisissez l'adresse e-mail du compte de service (
lucid-audit-collector-sa@PROJECT_ID.iam.gserviceaccount.com). - Attribuer des rôles : sélectionnez Administrateur des objets Storage.
- Ajouter des comptes principaux : saisissez l'adresse e-mail du compte de service (
- Cliquez sur Enregistrer.
Créer un sujet Pub/Sub
- Dans la console GCP, accédez à Pub/Sub > Sujets.
- Cliquez sur Créer un sujet.
- Fournissez les informations de configuration suivantes :
- ID du thème : saisissez
lucid-audit-trigger. - Conservez les valeurs par défaut des autres paramètres.
- ID du thème : saisissez
- Cliquez sur Créer.
Créer une fonction Cloud Run pour collecter les journaux
La fonction Cloud Run sera déclenchée par des messages Pub/Sub provenant de Cloud Scheduler pour extraire les journaux de l'API Lucid Audit Logs et les écrire dans GCS.
- Dans la console GCP, accédez à Cloud Run.
- Cliquez sur Créer un service.
- Sélectionnez Fonction (utilisez un éditeur intégré pour créer une fonction).
Dans la section Configurer, fournissez les informations de configuration suivantes :
Paramètre Valeur Nom du service lucid-audit-collectorRégion Sélectionnez la région correspondant à votre bucket GCS (par exemple, us-central1).Durée d'exécution Sélectionnez Python 3.12 ou version ultérieure. Dans la section Déclencheur (facultatif) :
- Cliquez sur + Ajouter un déclencheur.
- Sélectionnez Cloud Pub/Sub.
- Dans Sélectionner un sujet Cloud Pub/Sub, sélectionnez
lucid-audit-trigger. - Cliquez sur Enregistrer.
Dans la section Authentification :
- Sélectionnez Exiger l'authentification.
- Consultez Identity and Access Management (IAM).
Faites défiler la page vers le bas, puis développez Conteneurs, mise en réseau, sécurité.
Accédez à l'onglet Sécurité :
- Compte de service : sélectionnez
lucid-audit-collector-sa.
- Compte de service : sélectionnez
Accédez à l'onglet Conteneurs :
- Cliquez sur Variables et secrets.
- Cliquez sur + Ajouter une variable pour chaque variable d'environnement :
Nom de la variable Exemple de valeur Description GCS_BUCKETlucid-audit-logs-gcsNom du bucket GCS GCS_PREFIXlucid-auditPréfixe des fichiers journaux STATE_KEYlucid-audit/state.jsonChemin d'accès au fichier d'état LUCID_CLIENT_IDyour-oauth-client-idID client Lucid OAuth 2.0 LUCID_CLIENT_SECRETyour-oauth-client-secretCode secret du client Lucid OAuth 2.0 LUCID_REFRESH_TOKENyour-refresh-tokenJeton d'actualisation Lucid OAuth 2.0 LOOKBACK_HOURS24Période d'analyse initiale PAGE_SIZE200Enregistrements par page d'API (200 max.) MAX_PAGES50Nombre maximal de pages par exécution Dans la section Variables et secrets, faites défiler la page jusqu'à Requêtes :
- Délai avant expiration de la requête : saisissez
600secondes (10 minutes).
- Délai avant expiration de la requête : saisissez
Accédez à l'onglet Paramètres :
- Dans la section Ressources :
- Mémoire : sélectionnez 512 Mio ou plus.
- CPU : sélectionnez 1.
- Dans la section Ressources :
Dans la section Scaling de révision :
- Nombre minimal d'instances : saisissez
0. - Nombre maximal d'instances : saisissez
100.
- Nombre minimal d'instances : saisissez
Cliquez sur Créer.
Attendez que le service soit créé (une à deux minutes).
Une fois le service créé, l'éditeur de code intégré s'ouvre automatiquement.
Ajouter un code de fonction
- Saisissez main dans le champ Point d'entrée.
- Dans l'éditeur de code intégré, créez deux fichiers :
main.py:
import functions_framework from google.cloud import storage import json import os import urllib3 from datetime import datetime, timezone, timedelta import re http = urllib3.PoolManager( timeout=urllib3.Timeout(connect=10.0, read=60.0), retries=False, ) storage_client = storage.Client() GCS_BUCKET = os.environ.get('GCS_BUCKET') GCS_PREFIX = os.environ.get('GCS_PREFIX', 'lucid-audit') STATE_KEY = os.environ.get('STATE_KEY', 'lucid-audit/state.json') LUCID_CLIENT_ID = os.environ.get('LUCID_CLIENT_ID') LUCID_CLIENT_SECRET = os.environ.get('LUCID_CLIENT_SECRET') LUCID_REFRESH_TOKEN = os.environ.get('LUCID_REFRESH_TOKEN') LOOKBACK_HOURS = int(os.environ.get('LOOKBACK_HOURS', '24')) PAGE_SIZE = int(os.environ.get('PAGE_SIZE', '200')) MAX_PAGES = int(os.environ.get('MAX_PAGES', '50')) API_BASE = 'https://api.lucid.co' @functions_framework.cloud_event def main(cloud_event): if not all([GCS_BUCKET, LUCID_CLIENT_ID, LUCID_CLIENT_SECRET, LUCID_REFRESH_TOKEN]): print('Error: Missing required environment variables') return try: bucket = storage_client.bucket(GCS_BUCKET) state = load_state(bucket) now = datetime.now(timezone.utc) if isinstance(state, dict) and state.get('last_event_time'): try: last_val = state['last_event_time'] if last_val.endswith('Z'): last_val = last_val[:-1] + '+00:00' last_time = datetime.fromisoformat(last_val) last_time = last_time - timedelta(minutes=2) except Exception as e: print(f"Warning: Could not parse last_event_time: {e}") last_time = now - timedelta(hours=LOOKBACK_HOURS) else: last_time = now - timedelta(hours=LOOKBACK_HOURS) print(f"Fetching audit logs from {last_time.isoformat()} to {now.isoformat()}") access_token, new_refresh_token = refresh_access_token() if new_refresh_token: save_refresh_token(bucket, new_refresh_token) records, newest_event_time = fetch_audit_logs(access_token, last_time, now) if not records: print("No new audit log records found.") save_state(bucket, now.isoformat()) return timestamp = now.strftime('%Y%m%d_%H%M%S') object_key = f"{GCS_PREFIX}/lucid_audit_{timestamp}.ndjson" blob = bucket.blob(object_key) ndjson = '\n'.join( [json.dumps(record, ensure_ascii=False) for record in records] ) + '\n' blob.upload_from_string(ndjson, content_type='application/x-ndjson') print(f"Wrote {len(records)} records to gs://{GCS_BUCKET}/{object_key}") if newest_event_time: save_state(bucket, newest_event_time) else: save_state(bucket, now.isoformat()) print(f"Successfully processed {len(records)} audit log records") except Exception as e: print(f'Error processing logs: {str(e)}') raise def refresh_access_token(): url = f"{API_BASE}/oauth2/token" body = json.dumps({ 'grant_type': 'refresh_token', 'refresh_token': LUCID_REFRESH_TOKEN, 'client_id': LUCID_CLIENT_ID, 'client_secret': LUCID_CLIENT_SECRET }).encode('utf-8') response = http.request( 'POST', url, body=body, headers={'Content-Type': 'application/json'} ) if response.status != 200: raise Exception( f"Token refresh failed: {response.status} - " f"{response.data.decode('utf-8')}" ) data = json.loads(response.data.decode('utf-8')) access_token = data.get('access_token') new_refresh_token = data.get('refresh_token') if not access_token: raise Exception("No access_token in token refresh response") print("Successfully refreshed Lucid API access token") return access_token, new_refresh_token def fetch_audit_logs(access_token, start_time, end_time): records = [] newest_time = None page_num = 0 next_page_url = None since_str = start_time.strftime('%Y-%m-%dT%H:%M:%S.000Z') until_str = end_time.strftime('%Y-%m-%dT%H:%M:%S.000Z') while page_num < MAX_PAGES: page_num += 1 if next_page_url: url = next_page_url else: url = ( f"{API_BASE}/auditLogs" f"?pageSize={PAGE_SIZE}" f"&since={since_str}" f"&until={until_str}" ) headers = { 'Authorization': f'Bearer {access_token}', 'Lucid-Api-Version': '1', 'Accept': 'application/json' } response = http.request('GET', url, headers=headers) if response.status == 429: print(f"Rate limited on page {page_num}. Stopping pagination.") break if response.status != 200: print( f"API error on page {page_num}: {response.status} - " f"{response.data.decode('utf-8')}" ) break page_results = json.loads(response.data.decode('utf-8')) if not page_results: print(f"No more results at page {page_num}") break records.extend(page_results) print(f"Page {page_num}: Retrieved {len(page_results)} events " f"(total: {len(records)})") for event in page_results: try: event_time = event.get('eventTimestamp') if event_time: if newest_time is None or event_time > newest_time: newest_time = event_time except Exception as e: print(f"Warning: Could not parse event time: {e}") link_header = response.headers.get('Link', '') next_page_url = parse_link_header(link_header) if not next_page_url: print(f"No next page link found. Pagination complete.") break if len(page_results) < PAGE_SIZE: break print(f"Total audit log records fetched: {len(records)} from {page_num} pages") return records, newest_time def parse_link_header(link_header): if not link_header: return None match = re.search(r'<([^>]+)>;\s*rel="next"', link_header) if match: return match.group(1) return None def load_state(bucket): try: blob = bucket.blob(STATE_KEY) if blob.exists(): return json.loads(blob.download_as_text()) except Exception as e: print(f"Warning: Could not load state: {e}") return {} def save_state(bucket, last_event_time_iso): try: state = { 'last_event_time': last_event_time_iso, 'last_run': datetime.now(timezone.utc).isoformat() } blob = bucket.blob(STATE_KEY) blob.upload_from_string( json.dumps(state, indent=2), content_type='application/json' ) print(f"Saved state: last_event_time={last_event_time_iso}") except Exception as e: print(f"Warning: Could not save state: {e}") def save_refresh_token(bucket, new_refresh_token): try: token_key = f"{GCS_PREFIX}/refresh_token.json" blob = bucket.blob(token_key) blob.upload_from_string( json.dumps({'refresh_token': new_refresh_token}, indent=2), content_type='application/json' ) print("Saved new refresh token to GCS") except Exception as e: print(f"Warning: Could not save refresh token: {e}")requirements.txt:
functions-framework==3.* google-cloud-storage==2.* urllib3>=2.0.0 ```
- Cliquez sur Déployer pour enregistrer et déployer la fonction.
Attendez la fin du déploiement (deux à trois minutes).
Créer une tâche Cloud Scheduler
- Dans la console GCP, accédez à Cloud Scheduler.
- Cliquez sur Créer une tâche.
Fournissez les informations de configuration suivantes :
Paramètre Valeur Nom lucid-audit-collector-hourlyRégion Sélectionnez la même région que la fonction Cloud Run. Fréquence 0 * * * *(toutes les heures, à l'heure pile)Fuseau horaire Sélectionnez un fuseau horaire (UTC recommandé). Type de cible Pub/Sub Sujet Sélectionner lucid-audit-triggerCorps du message {}(objet JSON vide)Cliquez sur Créer.
Tester l'intégration
- Dans la console Cloud Scheduler, recherchez votre job (
lucid-audit-collector-hourly). - Cliquez sur Exécuter de force pour déclencher le job manuellement.
- Patientez quelques secondes.
- Accédez à Cloud Run > Services.
- Cliquez sur
lucid-audit-collector. - Cliquez sur l'onglet Journaux.
Vérifiez que la fonction s'est exécutée correctement. Par exemple :
Fetching audit logs from YYYY-MM-DDTHH:MM:SS+00:00 to YYYY-MM-DDTHH:MM:SS+00:00 Successfully refreshed Lucid API access token Page 1: Retrieved X events (total: X) Wrote X records to gs://lucid-audit-logs-gcs/lucid-audit/lucid_audit_YYYYMMDD_HHMMSS.ndjson Successfully processed X audit log recordsAccédez à Cloud Storage > Buckets.
Cliquez sur
lucid-audit-logs-gcs.Accédez au dossier
lucid-audit/.Vérifiez qu'un nouveau fichier
.ndjsona été créé avec l'horodatage actuel.
Si des erreurs s'affichent dans les journaux :
- HTTP 401 : vérifiez que les variables d'environnement
LUCID_CLIENT_ID,LUCID_CLIENT_SECRETetLUCID_REFRESH_TOKENsont correctes. - HTTP 403 : vérifiez que le client OAuth 2.0 dispose du champ d'application
account.audit.logset que le jeton est un jeton de compte. - HTTP 429 : limitation du débit. La fonction arrête la pagination et la reprend lors de la prochaine exécution planifiée.
- Variables d'environnement manquantes : vérifiez que toutes les variables requises sont définies dans la configuration de la fonction Cloud Run.
Catégories d'événements du journal d'audit
Les journaux d'audit Lucid sont organisés dans les catégories d'événements suivantes :
| Catégorie | Description |
|---|---|
| Connexions | Événements associés aux connexions des utilisateurs |
| Contenu | Événements associés à l'accès aux documents et aux dossiers, et à leur modification |
| Administration | Événements associés à l'activité d'administration et aux modifications apportées au compte |
| Utilisateur | Événements associés aux actions de l'utilisateur sur les paramètres personnels |
| Équipe | Événements associés aux opérations d'équipe |
Pour obtenir la liste complète des types d'événements et de leurs schémas, consultez la documentation Événements du journal d'audit Lucid.
Environnement FedRAMP
Les utilisateurs de l'environnement Lucid FedRAMP utilisent des points de terminaison d'autorisation et d'API différents. Consultez la documentation sur l'environnement Lucid FedRAMP pour connaître les URL des points de terminaison appropriés.
Récupérer le compte de service Google SecOps
- Accédez à Paramètres SIEM> Flux.
- Cliquez sur Ajouter un flux.
- Cliquez sur Configurer un flux unique.
- Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple,
Lucid Audit Logs). - Sélectionnez Google Cloud Storage V2 comme Type de source.
- Sélectionnez Lucid comme Type de journal.
Cliquez sur Obtenir un compte de service. Une adresse e-mail de compte de service unique s'affiche, par exemple :
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.comCopiez cette adresse e-mail pour l'utiliser à l'étape suivante.
Cliquez sur Suivant.
Spécifiez les valeurs des paramètres d'entrée suivants :
URL du bucket de stockage : saisissez l'URI du bucket GCS avec le chemin d'accès au préfixe :
gs://lucid-audit-logs-gcs/lucid-audit/
Option de suppression de la source : sélectionnez l'option de suppression de votre choix :
- Jamais : ne supprime jamais aucun fichier après les transferts (recommandé pour les tests).
- Supprimer les fichiers transférés : supprime les fichiers une fois le transfert réussi.
Supprimer les fichiers transférés et les répertoires vides : supprime les fichiers et les répertoires vides une fois le transfert réussi.
Âge maximal du fichier : incluez les fichiers modifiés au cours des derniers jours (180 jours par défaut).
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
Cliquez sur Suivant.
Vérifiez la configuration de votre nouveau flux sur l'écran Finaliser, puis cliquez sur Envoyer.
Accorder des autorisations IAM au compte de service Google SecOps
Le compte de service Google SecOps a besoin du rôle Lecteur des objets Storage sur votre bucket GCS.
- Accédez à Cloud Storage > Buckets.
- Cliquez sur
lucid-audit-logs-gcs. - Accédez à l'onglet Autorisations.
- Cliquez sur Accorder l'accès.
- Fournissez les informations de configuration suivantes :
- Ajouter des comptes principaux : collez l'adresse e-mail du compte de service Google SecOps.
- Attribuer des rôles : sélectionnez Lecteur d'objets Storage.
Cliquez sur Enregistrer.
Table de mappage UDM
| Champ de journal | Mappage UDM | Logique |
|---|---|---|
| document_opened | additional.fields | Fusionné avec les libellés créés à partir de chaque champ source s'il n'est pas vide |
| share_link_enable | additional.fields | |
| restricted_account_enable | additional.fields | |
| event1.documentIds | additional.fields | |
| team_folder | additional.fields | |
| method_type | additional.fields | |
| extensions.auth.type | extensions.auth.type | Définissez la valeur sur "AUTHTYPE_UNSPECIFIED" pour les événements de connexion/déconnexion. |
| eventTimestamp | metadata.event_timestamp | Converti à l'aide de la date correspondant à la norme ISO8601 ou au format AAAA-MM-JJTHH:mm:ss.SSSSSSZ |
| has_user_login | metadata.event_type | Défini en fonction des indicateurs has_*: USER_LOGIN si has_user_login et has_target_user, USER_LOGOUT si has_user_logout et has_target_user, USER_RESOURCE_UPDATE_CONTENT si has_user_resource_updated et has_target_resource et has_principal_user, USER_CREATION si has_principal_user et has_target_application et has_target_user, USER_RESOURCE_CREATION si has_target_resource et has_principal_user, FILE_CREATION si has_target_file et has_principal et has_target, USER_RESOURCE_ACCESS si has_target_resource, USER_COMMUNICATION si has_principal_user, STATUS_UPDATE si has_principal et has_target sont définis sur "false", sinon GENERIC_EVENT |
| has_user_logout | metadata.event_type | |
| has_user_resource_updated | metadata.event_type | |
| has_principal_user | metadata.event_type | |
| has_target_resource | metadata.event_type | |
| has_target_file | metadata.event_type | |
| has_principal | metadata.event_type | |
| has_target_user | metadata.event_type | |
| has_target_application | metadata.event_type | |
| has_target | metadata.event_type | |
| event1.event1Type | metadata.product_event_type | Valeur copiée directement |
| actor.actorIp | principal.asset.ip | Valeur copiée directement si elle n'est pas vide |
| actor.actorIp | principal.ip | Valeur copiée directement si elle n'est pas vide |
| actor.actorAccountId | principal.resource.id | Valeur copiée directement si elle n'est pas vide |
| actor.actorClient | principal.resource.name | Valeur copiée directement si elle n'est pas vide |
| flowId | principal.resource.product_object_id | Valeur copiée directement si elle n'est pas vide |
| actor.actorType | principal.user.attribute.roles | Fusionné à partir de actor_type si eventType n'est pas login/logout et que actor_type n'est pas vide |
| actor.actorEmail | principal.user.email_addresses | Fusionné si actor_email n'est pas vide et que l'adresse e-mail est valide, et si eventType n'est pas login/logout |
| actor.actorUserId | principal.user.userid | Valeur copiée directement si elle n'est pas vide et que eventType n'est pas login/logout |
| event1.registrationMethod | security_result.description | Valeur copiée directement si elle n'est pas vide |
| event1.source | target.application | Valeur copiée directement si elle n'est pas vide |
| event1.publishedLink.link | target.file.full_path | Valeur copiée directement si elle n'est pas vide |
| event1.filename | target.file.names | Fusionné s'il n'est pas vide |
| targetData._targetType | target.resource.attribute.labels | Fusionné avec les libellés créés à partir de chaque champ source s'il n'est pas vide |
| targetData._targetId | target.resource.attribute.labels | |
| event1.format | target.resource.attribute.labels | |
| event1.method | target.resource.attribute.labels | |
| event1.publishedLink.format | target.resource.attribute.labels | |
| accountId | target.resource.id | Valeur copiée directement si elle n'est pas vide |
| event1.destinationFolderName | target.resource.name | Définissez sur destinationFolderName si la valeur n'est pas vide, sinon sur folderName si la valeur n'est pas vide, sinon sur publishedLink.name si la valeur n'est pas vide. |
| event1.folderName | target.resource.name | |
| event1.publishedLink.name | target.resource.name | |
| event1.documentId | target.resource.product_object_id | Valeur copiée directement si elle n'est pas vide |
| actor.actorType | target.user.attribute.roles | Fusionné à partir de actor_type si eventType est login/logout, et à partir de event_role si non vide |
| event1.role | target.user.attribute.roles | |
| actor.actorEmail | target.user.email_addresses | Fusionné à partir de actor_email si la connexion/déconnexion est valide, et à partir de userEmail dans _target |
| targetData.userEmail | target.user.email_addresses | |
| event1.destinationFolderId | target.user.product_object_id | Définissez sur destinationFolderId si la valeur n'est pas vide, sinon sur folderId si la valeur n'est pas vide. |
| event1.folderId | target.user.product_object_id | |
| targetData.displayName | target.user.user_display_name | Valeur copiée directement si elle n'est pas vide |
| actor.actorUserId | target.user.userid | Valeur copiée directement si elle n'est pas vide et que eventType est "login" ou "logout" |
| event1.product | metadata.product_name | Valeur du produit si elle n'est pas vide, sinon "LUCID" |
| metadata.vendor_name | metadata.vendor_name | Définie sur "LUCID" |
Journal des modifications
Afficher le journal des modifications pour ce parseur
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.