Collecter les journaux Forseti Open Source

Compatible avec :

Ce document explique comment ingérer les journaux Forseti Open Source dans Google Security Operations à l'aide de Google Cloud Storage V2.

Forseti Security est un ensemble d'outils Open Source conçus par la communauté pour améliorer la sécurité des environnements Google Cloud Platform. Forseti prend des instantanés d'inventaire des ressources GCP à intervalles réguliers, analyse les ressources pour s'assurer que les contrôles d'accès sont définis comme prévu et offre une visibilité sur les stratégies Cloud IAM.

Avant de commencer

Assurez-vous de remplir les conditions préalables suivantes :

  • Instance Google SecOps.
  • 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.
  • Un déploiement Forseti Security existant (par exemple, déployé à l'aide du module Forseti Terraform sur Google Compute Engine).
  • Accès au fichier de configuration du serveur Forseti (forseti_conf_server.yaml).

Créer un bucket Google Cloud Storage

Utiliser la console Google Cloud

  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, forseti-violations-export).
    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.

Utiliser l'outil de ligne de commande gcloud

Vous pouvez également créer un bucket à l'aide de la commande gcloud :

gcloud storage buckets create gs://forseti-violations-export \
    --location=us-central1 \
    --default-storage-class=STANDARD

Remplacez :

  • forseti-violations-export : nom de bucket de votre choix (unique au niveau mondial).
  • us-central1 : région de votre choix (par exemple, us-central1, europe-west1).

Configurer Forseti Security pour exporter les cas de non-respect vers GCS

Forseti Security utilise une configuration de notificateur dans le fichier forseti_conf_server.yaml pour exporter les violations du scanner vers Google Cloud Storage.

  1. Connectez-vous à votre VM serveur Forseti à l'aide de SSH :

    gcloud compute ssh forseti-server-vm --project=YOUR_PROJECT_ID --zone=YOUR_ZONE
    

    Remplacez YOUR_PROJECT_ID et YOUR_ZONE par les valeurs de votre déploiement Forseti.

  2. Ouvrez le fichier de configuration du serveur Forseti pour le modifier :

    sudo nano /home/ubuntu/forseti-security/configs/forseti_conf_server.yaml
    

    Si votre déploiement Forseti utilise une configuration basée sur GCS, téléchargez le fichier depuis le bucket de votre serveur Forseti :

    gsutil cp gs://YOUR_FORSETI_SERVER_BUCKET/configs/forseti_conf_server.yaml ~/forseti_conf_server.yaml
    
  3. Accédez à la section notifier et localisez la sous-section resources.

  4. Pour chaque type de ressource de non-respect des règles que vous souhaitez exporter, configurez le notificateur gcs_violations. Ajoutez ou mettez à jour la configuration comme suit :

    notifier:
      resources:
        - resource: iam_policy_violations
          should_notify: true
          notifiers:
            - name: gcs_violations
              configuration:
                data_format: csv
                gcs_path: gs://forseti-violations-export/violations/
        - resource: firewall_rule_violations
          should_notify: true
          notifiers:
            - name: gcs_violations
              configuration:
                data_format: csv
                gcs_path: gs://forseti-violations-export/violations/
        - resource: cloudsql_acl_violations
          should_notify: true
          notifiers:
            - name: gcs_violations
              configuration:
                data_format: csv
                gcs_path: gs://forseti-violations-export/violations/
        - resource: bucket_acl_violations
          should_notify: true
          notifiers:
            - name: gcs_violations
              configuration:
                data_format: csv
                gcs_path: gs://forseti-violations-export/violations/
        - resource: config_validator_violations
          should_notify: true
          notifiers:
            - name: gcs_violations
              configuration:
                data_format: csv
                gcs_path: gs://forseti-violations-export/violations/
    

    Remplacez :

    • forseti-violations-export : nom du bucket GCS que vous avez créé à l'étape précédente.
    • violations/ : chemin d'accès au préfixe facultatif pour organiser les fichiers d'infraction.

    Paramètres de configuration :

    • resource : type de ressource de la non-conformité. Les types de ressources disponibles dépendent des scanners Forseti activés dans votre déploiement. Les types courants incluent iam_policy_violations, firewall_rule_violations, cloudsql_acl_violations, bucket_acl_violations, config_validator_violations, groups_settings_violations et d'autres.
    • should_notify : définissez sur true pour activer les notifications pour ce type de ressource.
    • data_format : format des données exportées. Les valeurs valides sont csv ou json. La valeur par défaut est csv.
    • gcs_path : chemin d'accès Cloud Storage où les cas de non-respect seront exportés. Le chemin doit commencer par gs:// et se terminer par une barre oblique.
  5. Enregistrez le fichier de configuration.

  6. Si vous avez téléchargé la configuration depuis GCS, importez le fichier mis à jour dans le bucket de votre serveur Forseti :

    gsutil cp ~/forseti_conf_server.yaml gs://YOUR_FORSETI_SERVER_BUCKET/configs/forseti_conf_server.yaml
    
  7. Rechargez la configuration du serveur Forseti :

    forseti server configuration reload
    
  8. Vérifiez que la configuration a bien été chargée :

    forseti server configuration get | grep gcs_violations
    

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.

Configurer un flux dans Google SecOps pour ingérer les journaux Forseti Open Source

  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, Forseti Violations).
  5. Sélectionnez Google Cloud Storage V2 comme Type de source.
  6. Sélectionnez Open Source Forseti comme type de journal.

  7. Cliquez sur Obtenir un compte de service.

  8. Une adresse e-mail unique pour le compte de service s'affiche, par exemple :

    chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com
    
  9. Copiez cette adresse e-mail. Vous en aurez besoin lors de la tâche suivante.

  10. Cliquez sur Suivant.

  11. Spécifiez les valeurs des paramètres d'entrée suivants :

    • URL du bucket Storage : saisissez l'URI du bucket GCS avec le préfixe du chemin d'accès :
    gs://forseti-violations-export/violations/
    
    • Remplacez :
      • forseti-violations-export : nom de votre bucket GCS.
      • violations/ : préfixe/chemin d'accès au dossier facultatif où les journaux sont stockés (laisser vide pour la racine).
    • 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. La valeur par défaut est de 180 jours.
    • 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.
  12. Cliquez sur Suivant.

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

Utiliser la console Google Cloud

  1. Accédez à Cloud Storage > Buckets.
  2. Cliquez sur le nom de votre bucket.
  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.
    • Attribuez des rôles : sélectionnez Lecteur des objets de l'espace de stockage.
  6. Cliquez sur Enregistrer.

Utiliser l'outil de ligne de commande gcloud

Vous pouvez également accorder des autorisations à l'aide de la commande gcloud :

gcloud storage buckets add-iam-policy-binding gs://forseti-violations-export \
    --member="serviceAccount:chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com" \
    --role="roles/storage.objectViewer"

Remplacez :

  • forseti-violations-export : nom de votre bucket.
  • chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com : adresse e-mail du compte de service Google SecOps.

Utiliser l'outil de ligne de commande gsutil (ancienne version)

gsutil iam ch serviceAccount:chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com:objectViewer \
    gs://forseti-violations-export

Vérifier les autorisations

Pour vérifier que les autorisations ont été accordées correctement :

gcloud storage buckets get-iam-policy gs://forseti-violations-export \
    --flatten="bindings[].members" \
    --filter="bindings.role:roles/storage.objectViewer"

L'adresse e-mail du compte de service Google SecOps doit s'afficher dans le résultat.

Table de mappage UDM

Champ du journal Mappage UDM Logique
data.resource_data.instanceGroupUrls à propos de Fusionné à partir d'un tableau d'instanceGroupUrls
data.resource_data.nodePools.*.statusMessage metadata.description Valeur de nodePool.statusMessage
data.resource_type metadata.event_type Définissez RESOURCE_PERMISSIONS_CHANGE pour kms_cryptokey/serviceaccount_key, RESOURCE_DELETION pour firewall, STATUS_HEARTBEAT pour kubernetes_cluster, ou GENERIC_EVENT dans le cas contraire.
data.scanner_index_id metadata.product_log_id Valeur copiée directement, convertie en chaîne
metadata.product_name Définissez la valeur sur "FORSETI SECURITY".
metadata.vendor_name Défini sur "FORSETI"
data.resource_data.direction network.direction Définissez sur INBOUND si la direction est INGRESS.
data.resource_data.endpoint principal.ip Valeur copiée directement
data.resource_data.nodeConfig.oauthScopes.0 principal.url Valeur copiée directement
data.full_name, serviceAccount principal.user.userid Extrait de data.full_name à l'aide de grok, ou défini sur serviceAccount s'il n'est pas vide
data.violation_data.protection_level, data.violation_data.purpose, data.violation_data.project_id, data.violation_data.node_pool_name, data.violation_data.violation_reason security_result.detection_fields Fusionné à partir de plusieurs paires clé-valeur
data.violation_type security_result.category Définissez sur POLICY_VIOLATION si FIREWALL_BLACKLIST_VIOLATION, sur UNKNOWN_CATEGORY si KE_VERSION_VIOLATION, sinon sur ACL_VIOLATION.
data.rule_name security_result.rule_name Valeur copiée directement
data.violation_type security_result.summary Valeur copiée directement
data.resource_data.zone target.asset.attribute.cloud.availability_zone Valeur copiée directement
target.asset.attribute.cloud.environment Définissez-le sur "GOOGLE_CLOUD_PLATFORM".
data.full_name target.asset.attribute.cloud.project.id Extrait de data.full_name à l'aide de grok
data.resource_data.subnetwork target.asset.attribute.cloud.vpc.name Valeur copiée directement
data.resource_data.nodeConfig.machineType target.asset.hardware Fusionné à partir de machineType et de la plate-forme de processeur constante
data.resource_data.privateClusterConfig.privateEndpoint target.ip Valeur copiée directement
data.resource_data.versionTemplate.algorithm, data.resource_data.key_algorithm target.labels Paire clé-valeur fusionnée pour l'algorithme, le cas échéant
data.resource_data.location target.location.name Valeur copiée directement
data.resource_name target.resource.name Valeur copiée directement
data.resource_id target.resource.product_object_id Valeur copiée directement si elle est différente de resource_name
data.resource_type target.resource.resource_subtype Définissez sur "gke" si resource_type est kubernetes_cluster.
data.resource_type target.resource.resource_type Mappé à un type spécifique en fonction de resource_type d'origine

Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.