Collecter les journaux F5 Distributed Cloud Services

Compatible avec :

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 ;

  1. Accédez à Google Cloud Console.
  2. Sélectionnez votre projet ou créez-en un.
  3. Dans le menu de navigation, accédez à Cloud Storage> Buckets.
  4. Cliquez sur Créer un bucket.
  5. 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
  6. Cliquez sur Créer.

Configurer F5 Distributed Cloud pour exporter vers GCS

Ajouter un bucket GCS à la liste d'autorisation du pare-feu

  1. 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/29
    • 185.160.8.152/29
  2. 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

  1. Dans la console Google Cloud, accédez à IAM et administration > Comptes de service.
  2. Cliquez sur Créer un compte de service.
  3. 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.
  4. Cliquez sur Créer et continuer.

  5. Dans la section Autoriser ce compte de service à accéder au projet :

    1. Cliquez sur Sélectionner un rôle.
    2. Recherchez et sélectionnez Administrateur des objets de l'espace de stockage.
  6. Cliquez sur Continuer.

  7. Cliquez sur OK.

Créer une clé de compte de service

  1. Dans la liste Comptes de service, cliquez sur le compte de service que vous avez créé (par exemple, f5-dcs-log-writer).
  2. Accédez à l'onglet Clés.
  3. Cliquez sur Ajouter une clé > Créer une clé.
  4. Sélectionnez JSON comme type de clé.
  5. Cliquez sur Créer.
  6. Le fichier de clé JSON est téléchargé sur votre ordinateur.
  7. 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

  1. Accédez à Cloud Storage > Buckets.
  2. Cliquez sur le nom de votre bucket (par exemple, f5-dcs-logs).
  3. Accédez à l'onglet Autorisations.
  4. Cliquez sur Accorder l'accès.
  5. 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.
  6. Cliquez sur Enregistrer.

Créer des identifiants Google Cloud dans la console F5 Distributed Cloud

  1. Connectez-vous à la console F5 Distributed Cloud sur https://<tenant>.console.ves.volterra.io.
  2. Sélectionnez le service Multi-Cloud Network Connect sur la page d'accueil.
  3. Accédez à Gérer > Gestion des sites > Identifiants Cloud.
  4. Cliquez sur Add Cloud Credentials (Ajouter des identifiants cloud).
  5. 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.
  6. Dans la section Type d'identifiants Cloud, sélectionnez Identifiants GCP.
  7. Cliquez sur Configurer dans le champ Identifiants GCP.
  8. Dans le menu déroulant Type d'identifiant, sélectionnez Fichier d'identifiants de compte de service.
  9. 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.
  10. Cliquez sur Appliquer.
  11. Cliquez sur Enregistrer et quitter.

Créer un récepteur de journaux global

  1. Dans la console F5 Distributed Cloud, assurez-vous d'être dans le service Multi-Cloud Network Connect.
  2. Accédez à Gérer > Gestion des journaux > Récepteur de journaux global.
  3. Cliquez sur Ajouter un récepteur de journaux global.
  4. 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.
  5. 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
  6. 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).
  7. Dans le menu déroulant Receiver Configuration (Configuration du récepteur), sélectionnez GCP Bucket Receiver (Récepteur de bucket GCP).

  8. Dans le champ Nom du bucket GCP, saisissez le nom de votre bucket GCS (par exemple, f5-dcs-logs).

  9. 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).

  10. 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 : 300 secondes).
    • 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 : 10485760 octets / 10 Mo).
  11. Cliquez sur Enregistrer et quitter.

Tester la connexion

  1. Dans la liste Récepteur de journaux global, recherchez le récepteur que vous avez créé (par exemple, chronicle-gcs-receiver).
  2. Cliquez sur les trois points (...) dans la colonne Actions.
  3. Sélectionnez Tester la connexion.
  4. Attendez la fin du test.
  5. Un message indiquant que la connexion a été établie doit s'afficher.

Vérifier les journaux dans le bucket GCS

  1. Accédez à Cloud Storage > Buckets dans la console GCP.
  2. Cliquez sur le nom de votre bucket (par exemple, f5-dcs-logs).
  3. Vérifiez que des fichiers journaux sont créés dans le bucket.
  4. 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).
  5. 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

  1. Accédez à Paramètres SIEM> Flux.
  2. Cliquez sur Add New Feed (Ajouter un flux).
  3. Cliquez sur Configurer un flux unique.
  4. Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple, F5 DCS Logs).
  5. Sélectionnez Google Cloud Storage V2 comme Type de source.
  6. Sélectionnez Services F5 Distributed Cloud comme Type de journal.
  7. 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.com
    
  8. Copiez cette adresse e-mail pour l'utiliser à l'étape suivante.

  9. Cliquez sur Suivant.

  10. 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-logs par 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

  11. Cliquez sur Suivant.

  12. 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.

  1. Accédez à Cloud Storage > Buckets.
  2. Cliquez sur le nom de votre bucket (par exemple, f5-dcs-logs).
  3. Accédez à l'onglet Autorisations.
  4. Cliquez sur Accorder l'accès.
  5. 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.
  6. 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.