Collecter les journaux F5 Distributed Cloud Services
Version de l'analyseur : 6.0
Ce document explique comment ingérer des journaux F5 Distributed Cloud Services dans Google Security Operations à l'aide de Google Cloud Storage V2.
F5 Distributed Cloud Services est une plate-forme SaaS de sécurité, de mise en réseau et de gestion des applications qui fournit une infrastructure cloud distribuée, un déploiement d'applications, une sécurité des API et des fonctionnalités de pare-feu d'application Web dans des emplacements multicloud et de périphérie.
Avant de commencer
Assurez-vous de remplir les conditions suivantes :
- Une instance Google SecOps
- Un projet Google Cloud avec l'API Cloud Storage activée
- Autorisations de créer et de gérer des buckets GCS
- Autorisations permettant de gérer les stratégies IAM sur les buckets GCS
- Accès privilégié à la console F5 Distributed Cloud
- Autorisations de créer des objets Global Log Receiver dans F5 Distributed Cloud
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, f5-dcs-logs).Type d'emplacement Choisissez celle qui correspond le mieux à vos besoins (régionale, birégionale ou multirégionale). Emplacement Sélectionnez l'emplacement (par exemple, us-central1).Classe de stockage Standard (recommandé pour les journaux fréquemment consultés) Access control (Contrôle des accès) Uniforme (recommandé) Outils de protection Facultatif : Activez la gestion des versions d'objets ou la règle de conservation. Cliquez sur Créer.
Configurer F5 Distributed Cloud pour exporter vers GCS
Ajouter un bucket GCS à la liste d'autorisation du pare-feu
F5 Distributed Cloud Global Log Receiver nécessite l'ajout des plages d'adresses IP suivantes à la liste d'autorisation de votre pare-feu :
193.16.236.64/29185.160.8.152/29
Si votre bucket GCS utilise VPC Service Controls ou des règles de pare-feu, ajoutez ces plages d'adresses IP à votre liste d'autorisation.
Créer un compte de service Google Cloud pour F5 Distributed Cloud
- Dans la console Google Cloud, 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
f5-dcs-log-writer(ou un nom descriptif). - Description du compte de service : saisissez
Service account for F5 Distributed Cloud to write logs to GCS.
- Nom du compte de service : saisissez
Cliquez sur Créer et continuer.
Dans la section Autoriser ce compte de service à accéder au projet :
- Cliquez sur Sélectionner un rôle.
- Recherchez et sélectionnez Administrateur des objets Storage.
Cliquez sur Continuer.
Cliquez sur OK.
Créer une clé de compte de service
- Dans la liste Comptes de service, cliquez sur le compte de service que vous avez créé (par exemple,
f5-dcs-log-writer). - Accédez à l'onglet Clés.
- Cliquez sur Ajouter une clé> Créer une clé.
- Sélectionnez JSON comme type de clé.
- Cliquez sur Créer.
- Le fichier de clé JSON est téléchargé sur votre ordinateur.
- Enregistrez ce fichier de manière sécurisée. Vous en aurez besoin lors des prochaines étapes.
Accorder des autorisations IAM sur le bucket GCS
- Accédez à Cloud Storage > Buckets.
- Cliquez sur le nom de votre bucket (par exemple,
f5-dcs-logs). - 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 (par exemple,
f5-dcs-log-writer@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 (par exemple,
- Cliquez sur Enregistrer.
Créer des identifiants Google Cloud dans la console F5 Distributed Cloud
- Connectez-vous à la console F5 Distributed Cloud à l'adresse
https://<tenant>.console.ves.volterra.io. - Sur la page d'accueil, sélectionnez le service Multi-Cloud Network Connect.
- Accédez à Gérer > Gestion des sites > Identifiants cloud.
- Cliquez sur Add Cloud Credentials (Ajouter des identifiants cloud).
- Dans la section Métadonnées :
- Nom : saisissez un nom descriptif (par exemple,
gcp-chronicle-logs). - Description (facultatif) : saisissez
Cloud Storage credentials for Google SecOps log export.
- Nom : saisissez un nom descriptif (par exemple,
- Dans la section Type d'identifiants cloud, sélectionnez Identifiants GCP.
- Cliquez sur Configurer dans le champ Identifiants GCP.
- Dans le menu déroulant Type d'identifiant, sélectionnez Fichier d'identifiants du compte de service.
- Cliquez sur Importer un fichier, puis sélectionnez le fichier de clé JSON que vous avez téléchargé lors des étapes précédentes.
- Cliquez sur Appliquer.
- Cliquez sur Enregistrer et quitter.
Créer un récepteur de journaux global
- Dans la console F5 Distributed Cloud, assurez-vous d'être dans le service Multi-Cloud Network Connect.
- Accédez à Gérer > Gestion des journaux > Récepteur de journaux global.
- Cliquez sur Ajouter un récepteur de journaux global.
Dans la section Métadonnées :
- Nom : saisissez un nom descriptif (par exemple,
chronicle-gcs-receiver). - Description (facultatif) : saisissez
Global log receiver for Google SecOps SIEM.
- Nom : saisissez un nom descriptif (par exemple,
Dans le menu déroulant Type de journal, sélectionnez les types de journaux que vous souhaitez exporter :
- Journaux de requêtes : journaux de requêtes/réponses HTTP avec l'utilisateur, le chemin d'accès, la méthode et les codes de réponse
- Événements de sécurité : événements WAF, DDoS, protection des API, événements de défense contre les bots
- Journaux d'audit : modifications de configuration via des API publiques
- Journaux des requêtes DNS : journaux des requêtes DNS
Dans le menu déroulant Sélection des messages de journal, sélectionnez l'une des options suivantes :
- Sélectionner les journaux de l'espace de noms actuel : envoie uniquement les journaux de l'espace de noms actuel.
- Sélectionner les journaux de tous les espaces de noms : envoie les journaux de tous les espaces de noms (recommandé pour une visibilité complète).
- Sélectionner les journaux dans des espaces de noms spécifiques : envoie les journaux des espaces de noms spécifiés (cliquez sur Ajouter un élément pour ajouter des noms d'espaces de noms).
Dans le menu déroulant Receiver Configuration (Configuration du récepteur), sélectionnez GCP Bucket Receiver (Récepteur de bucket GCP).
Dans le champ GCP Bucket Name (Nom du bucket GCP), saisissez le nom de votre bucket GCS (par exemple,
f5-dcs-logs).Dans le menu déroulant GCP Cloud Credentials (Identifiants cloud GCP), sélectionnez les identifiants cloud que vous avez créés précédemment (par exemple,
gcp-chronicle-logs).(Facultatif) Développez Afficher les champs avancés pour configurer les options de traitement par lot :
- Options de délai avant expiration du lot : sélectionnez Délai avant expiration (en secondes), puis saisissez une valeur (par défaut :
300secondes). - Nombre maximal d'événements par lot : sélectionnez Nombre maximal d'événements et saisissez une valeur comprise entre 32 et 2 000 (ne définissez aucune valeur pour ne pas appliquer de limite).
- Octets par lot : sélectionnez Nombre maximal d'octets et saisissez une valeur comprise entre 4 096 et 1 048 576 (par défaut :
10485760octets/10 Mo).
- Options de délai avant expiration du lot : sélectionnez Délai avant expiration (en secondes), puis saisissez une valeur (par défaut :
Cliquez sur Enregistrer et quitter.
Tester la connexion
- Dans la liste Récepteur de journaux global, recherchez le récepteur que vous avez créé (par exemple,
chronicle-gcs-receiver). - Cliquez sur les trois points (...) dans la colonne Actions.
- Sélectionnez Tester la connexion.
- Attendez la fin du test.
Un message indiquant que la connexion a bien été établie devrait s'afficher.
Vérifier les journaux dans le bucket GCS
- Accédez à Cloud Storage > Buckets dans la console GCP.
- Cliquez sur le nom de votre bucket (par exemple,
f5-dcs-logs). - Vérifiez que les fichiers journaux sont bien créés dans le bucket.
F5 Distributed Cloud organise les journaux dans la structure de dossiers suivante :
YYYY/MM/DD/HH/- Un dossier est créé pour chaque jour (AAAA/MM/JJ).
- Dans chaque dossier de jour, un sous-dossier est créé pour chaque heure (HH).
- Toutes les cinq minutes, de nouveaux fichiers gzip compressés sont écrits dans le sous-dossier horaire.
- Les fichiers sont au format NDJSON (JSON délimité par un retour à la ligne).
Cliquez sur un fichier gzip pour télécharger et inspecter le format du journal.
Récupérer le compte de service Google SecOps
Google SecOps utilise un compte de service unique pour lire les données de votre bucket GCS. Vous devez accorder à ce compte de service l'accès à votre bucket.
Obtenir l'adresse e-mail du compte de service
- Accédez à Paramètres > Gestion des données > Flux. Si vous utilisez une plate-forme SIEM uniquement, accédez à Paramètres > Flux.
- Cliquez sur Ajouter un flux d'actualités.
- Cliquez sur Configurer un flux unique.
- Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple,
F5 DCS Logs). - Sélectionnez Google Cloud Storage V2 comme Type de source.
- Sélectionnez F5 Distributed Cloud Services comme type de journal.
Cliquez sur Get Service Account (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 :
gs://f5-dcs-logs/Remplacez
f5-dcs-logspar le nom de votre bucket GCS.Option de suppression de la source : sélectionnez l'option de suppression de votre choix :
- Jamais : ne supprime jamais les fichiers après les transferts (recommandé pour les tests).
- Supprimer les fichiers transférés : supprime les fichiers après un 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 d'un certain nombre de jours (180 jours par défaut).
Espace de noms de l'élément : espace de noms de l'élément
Étiquettes d'ingestion : étiquette à appliquer aux événements de ce flux.
Cliquez sur Suivant.
Vérifiez la configuration de votre nouveau flux d'actualités sur l'écran Finaliser, puis cliquez sur Envoyer.
Accorder des autorisations IAM au compte de service Google SecOps
Le compte de service Google SecOps doit disposer du rôle Lecteur des objets Storage sur votre bucket GCS.
- Accédez à Cloud Storage > Buckets.
- Cliquez sur le nom de votre bucket (par exemple,
f5-dcs-logs). - 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 du journal | Mappage UDM | Logique |
|---|---|---|
| _id | metadata.product_log_id | Valeur copiée directement |
| src | principal.namespace | Valeur copiée directement |
| kubernetes_labels_app | target.resource.attribute.labels | Fusionné à partir de app_label (dérivé de kubernetes_labels_app) |
| kubernetes_host | target.hostname | Valeur copiée directement |
| kubernetes_container_name | target.resource.product_object_id | Valeur copiée directement |
| bot_info.classification | security_result.detection_fields | Fusionné à partir de bot_info_classification_label (dérivé de bot_info.classification) |
| bot_info.name | security_result.detection_fields | Merged from bot_info_name_label (derived from bot_info.name) |
| bot_info.type | security_result.detection_fields | Merged from bot_info_type_label (derived from bot_info.type) |
| code temporel | @timestamp | Analyse à l'aide d'un filtre de date avec RFC 3339, UNIX, ISO8601 |
| visitor_id | security_result.detection_fields | Fusionné à partir de visitor_id_label (dérivé de visitor_id) |
| tag | security_result.detection_fields | Fusionné à partir de tag_label (dérivé de tag) |
| action | security_result.action | Définissez sur "ALLOW" si les correspondances sont autorisées, ou sur "BLOCK" si elles sont refusées. |
| de gravité, | security_result.severity | Définissez sur HIGH (ÉLEVÉ) si l'état est "error" (erreur) ou "warning" (avertissement), CRITICAL (CRITIQUE) si l'état est "critical" (critique), MEDIUM (MOYEN) si l'état est "notice" (remarque) et LOW (FAIBLE) si l'état est "information" ou "info". |
| de gravité, | security_result.severity_details | Valeur copiée directement |
| api_endpoint | target.labels | Fusionné à partir de api_endpoint_label (dérivé de api_endpoint) |
| app_firewall_name | principal.process.command_line | Valeur copiée directement |
| app_type | security_result.detection_fields | Merged from about_app_type (derived from app_type) |
| as_org | security_result.detection_fields | Fusionné à partir de about_as_org (dérivé de as_org) |
| asn | security_result.detection_fields | Fusionné à partir de about_asn (dérivé de asn) |
| kubernetes.pod_id | security_result.detection_fields | Fusionné à partir de about_pod_id (dérivé de kubernetes.pod_id) |
| kubernetes.pod_name | security_result.detection_fields | Fusionné à partir de about_pod_name (dérivé de kubernetes.pod_name) |
| latitude | principal.location.region_latitude | Converti en float |
| longitude | principal.location.region_longitude | Converti en float |
| req_params | additional.fields | Merged from about_req_params (derived from req_params) |
| as_number | additional.fields | Merged from about_as_number (converted to string from as_number) |
| x_forwarded_for | intermediary.ip | Fusionné si l'adresse IP est valide |
| x_forwarded_for | security_result.about.resource.attribute.labels | Fusionné à partir de x_forwarded_for_label s'il ne s'agit pas d'une adresse IP |
| policy_hit.malicious_user_mitigate_action | security_result.detection_fields | Fusionné à partir de malicious_user_label (dérivé de policy_hit.malicious_user_mitigate_action) |
| policy_hit.policy | security_result.about.resource.attribute.labels | Fusionné à partir de policy_label (dérivé de policy_hit.policy) |
| policy_hit.policy_namespace | additional.fields | Fusionné à partir de policy_namespace_label (dérivé de policy_hit.policy_namespace) |
| policy_hit.policy_rule | security_result.rule_name | Valeur copiée directement |
| policy_hit.policy_rule_description | security_result.description | Valeur copiée directement |
| policy_hit.policy_set | target.resource.name | Valeur copiée directement |
| policy_hit.result | additional.fields | Fusionné à partir de result_label (dérivé de policy_hit.result) |
| vhost_id | security_result.detection_fields | Fusionné à partir de vhostlabel (dérivé de vhost_id) |
| messageid | security_result.detection_fields | Fusionné à partir de messageid_label (dérivé de messageid) |
| sec_event_name | security_result.detection_fields | Merged from sec_event_name_label (derived from sec_event_name) |
| sec_event_type | security_result.detection_fields | Merged from sec_event_type_label (derived from sec_event_type) |
| vh_name | security_result.detection_fields | Fusionné à partir de vhost_name_label (dérivé de vh_name) |
| tls_fingerprint | security_result.detection_fields | Fusionné à partir de tls_fingerprint_label (dérivé de tls_fingerprint) |
| heure | additional.fields | Fusionné à partir de time_label (dérivé de time) |
| kubernetes.namespace_name | additional.fields | Fusionné à partir de namespace_name_label (dérivé de kubernetes.namespace_name) |
| src_instance | additional.fields | Fusionné à partir de src_instance_label (dérivé de src_instance) |
| violation_rating | additional.fields | Merged from violation_rating_label (derived from violation_rating) |
| req_size | additional.fields | Fusionné à partir de req_size_label (converti en chaîne à partir de req_size) |
| rsp_code | additional.fields | Fusionné à partir de rsp_code_label (converti en chaîne à partir de rsp_code) |
| rsp_code_class | additional.fields | Fusionné à partir de rsp_code_class_label (converti en chaîne à partir de rsp_code_class) |
| rsp_size | additional.fields | Fusionné à partir de rsp_size_label (converti en chaîne à partir de rsp_size) |
| original_path | additional.fields | Fusionné à partir de original_path_label (dérivé de original_path) |
| req_path | target.url | Valeur copiée directement |
| req_headers_size | additional.fields | Fusionné à partir de req_headers_size_label (dérivé de req_headers_size) |
| recommended_action | additional.fields | Merged from recommended_action_label (derived from recommended_action) |
| enforcement_mode | additional.fields | Merged from enforcement_mode_label (derived from enforcement_mode) |
| src_ip | principal.ip, principal.asset.ip | Fusionné si correspond à l'expression régulière IPv4 |
| hôte | principal.ip, principal.asset.ip | Fusionné si correspond à l'expression régulière IPv4 |
| nom d'hôte | principal.hostname, principal.asset.hostname | Valeur copiée directement si elle n'est pas vide ou - |
| http_version | network.application_protocol_version | Valeur copiée directement |
| http_version | network.application_protocol | Définissez sur HTTP si l'URL contient HTTP, ou sur HTTPS si elle contient HTTPS. |
| réseau | principal.nat_ip | Fusionné si correspond à l'expression régulière IPv4 |
| dst_ip | target.ip, target.asset.ip | Fusionné si correspond à l'expression régulière IPv4 |
| dst_port | target.port | Converti en entier |
| src_port | principal.port | Converti en entier |
| src_site | additional.fields | Fusionné à partir de src_site_field (dérivé de src_site) |
| site | additional.fields | Fusionné à partir de site_field (dérivé de site) |
| cluster_name | additional.fields | Fusionné à partir de cluster_name_field (dérivé de cluster_name) |
| domaine | principal.administrative_domain | Valeur copiée directement |
| method | network.http.method | Valeur copiée directement si elle n'est pas vide ou N/A |
| espace de noms | target.namespace | Valeur copiée directement |
| city | principal.location.city | Valeur copiée directement |
| flux | security_result.detection_fields | Fusionné à partir de stream_label (dérivé de stream) |
| région | principal.location.country_or_region | Valeur copiée directement |
| utilisateur | principal.user.userid | Extrait de l'utilisateur à l'aide du modèle grok pour user_id |
| user_ip | target.ip, target.asset.ip | Fusionné à partir de l'adresse user_ip extraite |
| Cookie | additional.fields | Fusionné à partir du cookie (dérivé du cookie dans req_headers) |
| X-F5-Request-Id | security_result.detection_fields | Fusionné à partir de x_f5_request_id (dérivé de X-F5-Request-Id dans req_headers) |
| X-Request-Id | security_result.detection_fields | Fusionné à partir de request_id (dérivé de X-Request-Id dans req_headers) |
| security_result | security_result | Fusionné directement |
| has_network, has_principal, has_target | metadata.event_type | Définissez sur NETWORK_CONNECTION si toutes les valeurs sont "true", sur STATUS_UPDATE si "has_principal" est "true", sinon sur GENERIC_EVENT. |
| metadata.vendor_name | Définissez cette option sur "F5_DCS". | |
| metadata.product_name | Définissez-le sur "F5 DCS". | |
| intermédiaire | intermédiaire | Fusionné directement |
rsp_size |
event.idm.read_only_udm.network.received_bytes |
Mappé à partir du journal des modifications |
dst |
event.idm.read_only_udm.target.ip et event.idm.read_only_udm.target.asset.ip |
Mappé à partir du journal des modifications |
has_sec_event |
event.idm.read_only_udm.additional.fields |
Mappé à partir du journal des modifications |
app |
event.idm.read_only_udm.target.application |
Mappé à partir du journal des modifications |
node_id |
event.idm.read_only_udm.additional.fields |
Mappé à partir du journal des modifications |
sample_rate |
event.idm.read_only_udm.additional.fields |
Mappé à partir du journal des modifications |
time_to_first_downstream_tx_byte |
event.idm.read_only_udm.additional.fields |
Mappé à partir du journal des modifications |
time_to_first_upstream_rx_byte |
event.idm.read_only_udm.additional.fields |
Mappé à partir du journal des modifications |
time_to_first_upstream_tx_byte |
event.idm.read_only_udm.additional.fields |
Mappé à partir du journal des modifications |
time_to_last_downstream_tx_byte |
event.idm.read_only_udm.additional.fields |
Mappé à partir du journal des modifications |
time_to_last_rx_byte |
event.idm.read_only_udm.additional.fields |
Mappé à partir du journal des modifications |
time_to_last_upstream_rx_byte |
event.idm.read_only_udm.additional.fields |
Mappé à partir du journal des modifications |
time_to_last_upstream_tx_byte |
event.idm.read_only_udm.additional.fields |
Mappé à partir du journal des modifications |
timeseries_enabled |
event.idm.read_only_udm.additional.fields |
Mappé à partir du journal des modifications |
sni |
event.idm.read_only_udm.additional.fields |
Mappé à partir du journal des modifications |
terminated_time |
event.idm.read_only_udm.additional.fields |
Mappé à partir du journal des modifications |
rtt_downstream_seconds |
event.idm.read_only_udm.additional.fields |
Mappé à partir du journal des modifications |
rtt_upstream_seconds |
event.idm.read_only_udm.additional.fields |
Mappé à partir du journal des modifications |
rsp_code_details |
event.idm.read_only_udm.additional.fields |
Mappé à partir du journal des modifications |
authority |
event.idm.read_only_udm.additional.fields |
Mappé à partir du journal des modifications |
connected_time |
event.idm.read_only_udm.additional.fields |
Mappé à partir du journal des modifications |
req_id |
event.idm.read_only_udm.additional.fields |
Mappé à partir du journal des modifications |
proxy_type |
event.idm.read_only_udm.additional.fields |
Mappé à partir du journal des modifications |
vh_type |
event.idm.read_only_udm.additional.fields |
Mappé à partir du journal des modifications |
dst_instance |
event.idm.read_only_udm.additional.fields |
Mappé à partir du journal des modifications |
lb_port |
event.idm.read_only_udm.additional.fields |
Mappé à partir du journal des modifications |
mtls |
event.idm.read_only_udm.additional.fields |
Mappé à partir du journal des modifications |
ja4_tls_fingerprint |
event.idm.read_only_udm.additional.fields |
Mappé à partir du journal des modifications |
duration_with_data_tx_delay |
event.idm.read_only_udm.additional.fields |
Mappé à partir du journal des modifications |
dst_site |
event.idm.read_only_udm.additional.fields |
Mappé à partir du journal des modifications |
protocol and scheme |
event.idm.read_only_udm.network.application_protocol |
Mappé à partir du journal des modifications |
referer |
event.idm.read_only_udm.network.http.referral_url |
Mappé à partir du journal des modifications |
tls_cipher_suite |
event.idm.read_only_udm.network.tls.cipher |
Mappé à partir du journal des modifications |
tls_version |
event.idm.read_only_udm.network.tls.version |
Mappé à partir du journal des modifications |
user_agent |
event.idm.read_only_udm.network.http.user_agent |
Mappé à partir du journal des modifications |
user_agent |
event.idm.read_only_udm.network.http.parsed_user_agent |
Mappé à partir du journal des modifications |
browser_type |
event.idm.read_only_udm.principal.browser.browser_type |
Mappé à partir du journal des modifications |
content-type |
event.idm.read_only_udm.principal.process.file.mime_type |
Mappé à partir du journal des modifications |
response_flags |
security_result.detection_fields |
Mappé à partir du journal des modifications |
original_authority |
event.idm.read_only_udm.target.administrative_domain |
Mappé à partir du journal des modifications |
country |
event.idm.read_only_udm.principal.location.country_or_region |
Mappé à partir du journal des modifications |
Journal des modifications
Afficher le journal des modifications de cet analyseur
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.