Collecter les journaux F5 Distributed Cloud Services
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. Elle fournit des fonctionnalités d'infrastructure cloud distribuée, de déploiement d'applications, de sécurité des API et de pare-feu pour applications Web dans des emplacements multicloud et en 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 pour créer et 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 permettant de créer des objets Global Log Receiver dans F5 Distributed Cloud
créer un bucket Google Cloud Storage ;
- Accédez à Google Cloud Console.
- 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 Nommer votre bucket Saisissez un nom unique (par exemple, f5-dcs-logs).Type d'emplacement Choisissez en fonction de vos besoins (région, birégion ou 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 : Activer la gestion des versions des 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
Le récepteur de journaux global F5 Distributed Cloud nécessite que les plages d'adresses IP suivantes soient ajoutées à 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 de l'espace de stockage.
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 sur
https://<tenant>.console.ves.volterra.io. - Sélectionnez le service Multi-Cloud Network Connect sur la page d'accueil.
- 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 de 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 des requêtes : journaux des 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, protection contre les robots
- Journaux d'audit : modifications de la configuration via les API publiques
- Journaux des requêtes DNS : journaux des requêtes DNS
Dans le menu déroulant Sélection du message de journal, sélectionnez l'une des options suivantes :
- Sélectionner les journaux de l'espace de noms actuel : envoie les journaux de l'espace de noms actuel uniquement.
- 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 des 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 Nom du bucket GCP, saisissez le nom de votre bucket GCS (par exemple,
f5-dcs-logs).Dans le menu déroulant 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 pour les lots : sélectionnez Délai avant expiration (en secondes) et saisissez une valeur (par défaut :
300secondes). - Nombre maximal d'événements par lot : sélectionnez Nombre maximal d'événements, puis saisissez une valeur comprise entre 32 et 2 000 (laissez le champ vide pour ne pas définir de limite).
- Octets du lot : sélectionnez Octets max. et saisissez une valeur comprise entre 4 096 et 1 048 576 (par défaut :
10485760octets / 10 Mo).
- Options de délai avant expiration pour les lots : sélectionnez Délai avant expiration (en secondes) et 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 été établie doit 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 des fichiers journaux sont 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 examiner 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 SIEM> Flux.
- Cliquez sur Add New Feed (Ajouter un flux).
- 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 Services F5 Distributed Cloud comme Type de journal.
Cliquez sur Obtenir un compte de service. Une adresse e-mail unique pour le compte de service 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 aucun fichier 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 après un transfert réussi.
Âge maximal des fichiers : 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 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 des objets de l'espace de stockage.
Cliquez sur Enregistrer.
Table de mappage UDM
| Champ de 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 | Fusionné à partir de bot_info_name_label (dérivé de bot_info.name) |
| bot_info.type | security_result.detection_fields | Fusionné à partir de bot_info_type_label (dérivé de bot_info.type) |
| timestamp | @timestamp | Analysé à l'aide d'un filtre de date avec RFC3339, 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, sur "BLOCK" si elles sont refusées. |
| de gravité, | security_result.severity | Définissez le niveau sur "HIGH" (ÉLEVÉ) en cas d'erreur ou d'avertissement, sur "CRITICAL" (CRITIQUE) en cas de problème critique, sur "MEDIUM" (MOYEN) en cas de notification et sur "LOW" (FAIBLE) en cas d'information. |
| 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 | Fusionné à partir de about_app_type (dérivé de 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 | Fusionné à partir de about_req_params (dérivé de req_params) |
| as_number | additional.fields | Fusionné à partir de about_as_number (converti en chaîne à partir de as_number) |
| x_forwarded_for | intermediary.ip | Fusionnée si l'adresse IP est valide |
| x_forwarded_for | security_result.about.resource.attribute.labels | Fusionné à partir de x_forwarded_for_label si ce n'est pas 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 | Fusionné à partir de sec_event_name_label (dérivé de sec_event_name) |
| sec_event_type | security_result.detection_fields | Fusionné à partir de sec_event_type_label (dérivé de 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 | Fusionné à partir de violation_rating_label (dérivé de 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 | Fusionné à partir de recommended_action_label (dérivé de recommended_action) |
| enforcement_mode | additional.fields | Fusionné à partir de enforcement_mode_label (dérivé de enforcement_mode) |
| src_ip | principal.ip, principal.asset.ip | Fusionné si l'expression régulière IPv4 correspond |
| hôte | principal.ip, principal.asset.ip | Fusionné si l'expression régulière IPv4 correspond |
| nom d'hôte | principal.hostname, principal.asset.hostname | Valeur copiée directement si elle n'est pas vide ou si elle est égale à "-" |
| http_version | network.application_protocol_version | Valeur copiée directement |
| http_version | network.application_protocol | Définissez sur HTTP si le contenu contient HTTP, et sur HTTPS si le contenu contient HTTPS. |
| réseau | principal.nat_ip | Fusionné si l'expression régulière IPv4 correspond |
| dst_ip | target.ip, target.asset.ip | Fusionné si l'expression régulière IPv4 correspond |
| 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 IP de l'utilisateur 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éfini sur NETWORK_CONNECTION si la valeur est "true" pour tous les éléments, sur STATUS_UPDATE si has_principal est défini sur "true", ou sur GENERIC_EVENT dans le cas contraire. |
| metadata.vendor_name | Défini sur "F5_DCS" | |
| metadata.product_name | Définissez sur "F5 DCS". | |
| intermédiaire | intermédiaire | Fusionné directement |
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.