Collecter les journaux Elastic Auditbeat

Compatible avec :

Ce document explique comment ingérer des journaux Elastic Auditbeat dans Google Security Operations à l'aide d'Amazon S3. L'analyseur extrait les champs des journaux JSON, les normalise dans le modèle de données unifié (UDM) et enrichit les données avec un contexte supplémentaire, comme les informations sur l'hôte, les détails du réseau et les classifications des résultats de sécurité. Il gère différents types d'événements en mappant event1.action et d'autres champs à des types d'événements de métadonnées UDM spécifiques, en utilisant par défaut GENERIC_EVENT ou des catégories plus spécifiques lorsque cela est possible.

Avant de commencer

Assurez-vous de remplir les conditions suivantes :

  • Une instance Google SecOps.
  • Accès privilégié au serveur Elastic Auditbeat.
  • Accès privilégié au serveur Logstash.
  • Accès privilégié à AWS (S3, Identity and Access Management (IAM)).

Obtenir les conditions préalables d'Elastic Auditbeat

  1. Assurez-vous qu'Elastic Auditbeat est installé et configuré sur vos serveurs.
  2. Installez Logstash sur un serveur dédié ou à côté d'Auditbeat.
  3. Notez l'emplacement du fichier de configuration Auditbeat (généralement /etc/auditbeat/auditbeat.yml).

Configurer un bucket AWS S3 et IAM pour Google SecOps

  1. Créez un bucket Amazon S3 en suivant ce guide de l'utilisateur : Créer un bucket.
  2. Enregistrez le Nom et la Région du bucket pour référence ultérieure (par exemple, elastic-auditbeat-logs).
  3. Créez un utilisateur en suivant ce guide de l'utilisateur : Créer un utilisateur IAM.
  4. Sélectionnez l'utilisateur créé.
  5. Sélectionnez l'onglet Informations d'identification de sécurité.
  6. Cliquez sur Créer une clé d'accès dans la section Clés d'accès.
  7. Sélectionnez Service tiers comme Cas d'utilisation.
  8. Cliquez sur Suivant.
  9. Facultatif : Ajoutez une balise de description.
  10. Cliquez sur Créer une clé d'accès.
  11. Cliquez sur Télécharger le fichier CSV pour enregistrer la clé d'accès et la clé d'accès secrète pour référence ultérieure.
  12. Cliquez sur OK.
  13. Sélectionnez l'onglet Autorisations.
  14. Cliquez sur Ajouter des autorisations dans la section Règles relatives aux autorisations.
  15. Sélectionnez Ajouter des autorisations.
  16. Sélectionnez Joindre directement des règles.
  17. Recherchez la règle AmazonS3FullAccess.
  18. Sélectionnez la règle.
  19. Cliquez sur Suivant.
  20. Cliquez sur Ajouter des autorisations.

Configurer Auditbeat pour l'envoi à Logstash

  1. Modifiez le fichier de configuration Auditbeat /etc/auditbeat/auditbeat.yml.
  2. Mettez en commentaire toute configuration de sortie existante (Elasticsearch, etc.).
  3. Ajoutez la configuration de sortie Logstash :

    # ==================== Outputs ====================
    output.logstash:
      hosts: ["localhost:5044"]
      # If Logstash is on a different server, use its IP/hostname
      # hosts: ["logstash-server:5044"]
    
      # Optional: Enable load balancing if using multiple Logstash instances
      loadbalance: true
    
      # Optional: Configure bulk settings (default is 2048)
      bulk_max_size: 2048
    
      # Optional: Configure SSL if needed
      # ssl.enabled: true
      # ssl.certificate_authorities: ["/path/to/ca.crt"]
    
  4. Redémarrez Auditbeat pour appliquer les modifications :

    sudo systemctl restart auditbeat
    

Configurer le pipeline Logstash

  1. Créez un fichier de configuration de pipeline Logstash /etc/logstash/conf.d/auditbeat-to-s3.conf :

    input {
      beats {
        port => 5044
        # Optional: Configure SSL
        # ssl => true
        # ssl_certificate => "/path/to/server.crt"
        # ssl_key => "/path/to/server.key"
      }
    }
    
    filter {
      # Add any necessary transformations here
      # The data should remain in raw JSON format for Chronicle parsing
    
      # Optional: Add metadata for debugging
      mutate {
        add_field => { "[@metadata][pipeline]" => "auditbeat-to-s3" }
      }
    }
    
    output {
      s3 {
        # AWS credentials
        access_key_id => "YOUR_AWS_ACCESS_KEY_ID"
        secret_access_key => "YOUR_AWS_SECRET_ACCESS_KEY"
    
        # S3 bucket configuration
        region => "us-east-1"  # Replace with your bucket region
        bucket => "elastic-auditbeat-logs"  # Replace with your bucket name
    
        # Organize logs by date using Logstash timestamp interpolation
        prefix => "auditbeat/%{+YYYY}/%{+MM}/%{+dd}/"
    
        # File rotation settings
        size_file => 10485760  # 10MB files
        time_file => 5  # Rotate every 5 minutes
    
        # Compression for cost optimization
        encoding => "gzip"
    
        # Output format - keep as JSON for Chronicle
        codec => "json_lines"
    
        # Optional: Server-side encryption
        # server_side_encryption => true
        # server_side_encryption_algorithm => "AES256"
      }
    
      # Optional: Keep a local copy for debugging
      # stdout { 
      #   codec => rubydebug 
      # }
    }
    
    • Remplacez YOUR_AWS_ACCESS_KEY_ID et YOUR_AWS_SECRET_ACCESS_KEY par vos identifiants AWS réels.
    • Mettez à jour les valeurs region et bucket pour qu'elles correspondent à votre configuration S3.
    • Démarrez ou redémarrez Logstash :
    sudo systemctl restart logstash
    

(Facultatif) Créez un utilisateur et des clés IAM en lecture seule pour Google SecOps

  1. Accédez à Console AWS > IAM > Utilisateurs.
  2. Cliquez sur Add users (Ajouter des utilisateurs).
  3. Fournissez les informations de configuration suivantes :
    • Utilisateur : saisissez secops-reader.
    • Type d'accès : sélectionnez Clé d'accès – Accès programmatique.
  4. Cliquez sur Créer un utilisateur.
  5. Associez une stratégie de lecture minimale (personnalisée) : Utilisateurs > secops-reader > Autorisations > Ajouter des autorisations > Associer des stratégies directement > Créer une stratégie.
  6. JSON :

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": ["s3:GetObject"],
          "Resource": "arn:aws:s3:::elastic-auditbeat-logs/*"
        },
        {
          "Effect": "Allow",
          "Action": ["s3:ListBucket"],
          "Resource": "arn:aws:s3:::elastic-auditbeat-logs"
        }
      ]
    }
    
  7. Nom = secops-reader-policy.

  8. Cliquez sur Créer une règle> recherchez/sélectionnez > Suivant> Ajouter des autorisations.

  9. Créez une clé d'accès pour secops-reader : Identifiants de sécurité > Clés d'accès.

  10. Cliquez sur Créer une clé d'accès.

  11. Téléchargez le fichier .CSV. (Vous collerez ces valeurs dans le flux.)

Configurer un flux dans Google SecOps pour ingérer les journaux Elastic Auditbeat

  1. Accédez à Paramètres SIEM> Flux.
  2. Cliquez sur + Ajouter un flux.
  3. Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple, Elastic Auditbeat Logs).
  4. Sélectionnez Amazon S3 V2 comme type de source.
  5. Sélectionnez Beats d'audit Elastic comme type de journal.
  6. Cliquez sur Suivant.
  7. Spécifiez les valeurs des paramètres d'entrée suivants :
    • URI S3 : s3://elastic-auditbeat-logs/auditbeat/
    • Options de suppression de la source : sélectionnez l'option de suppression de votre choix.
    • Âge maximal des fichiers : incluez les fichiers modifiés au cours des derniers jours. La valeur par défaut est de 180 jours.
    • ID de clé d'accès : clé d'accès utilisateur ayant accès au bucket S3.
    • Clé d'accès secrète : clé secrète de l'utilisateur ayant accès au bucket S3.
    • Espace de noms de l'élément : espace de noms de l'élément.
    • Libellés d'ingestion : libellé appliqué aux événements de ce flux.
  8. Cliquez sur Suivant.
  9. Vérifiez la configuration de votre nouveau flux sur l'écran Finaliser, puis cliquez sur Envoyer.

Table de mappage UDM

Champ du journal Mappage UDM Logique
@timestamp metadata.event_timestamp Le code temporel de l'événement est analysé à partir du champ @timestamp.
agent.id observer.asset_id Préfixé par "agent_id: ".
agent.type observer.application L'application observateur est définie sur le type d'agent.
agent.version observer.platform_version La version de la plate-forme de l'observateur est définie sur la version de l'agent.
client.bytes principal.labels Ajouté en tant que libellé avec la clé "Bytes". Converti en chaîne.
client.ip principal.ip L'adresse IP principale est définie sur l'adresse IP du client.
client.packets principal.labels Ajouté en tant que libellé avec la clé "Packets". Converti en chaîne.
client.port principal.port Le port principal est défini sur le port client. Converti en nombre entier.
cloud.availability_zone principal.cloud.availability_zone La zone de disponibilité du cloud principal est définie sur la zone de disponibilité du cloud.
cloud.instance.id principal.resource.id L'ID de ressource principal est défini sur l'ID de l'instance cloud.
cloud.machine.type principal.resource.resource_subtype Le sous-type de ressource principal est défini sur le type de machine cloud.
cloud.region principal.cloud.availability_zone Si la région cloud est présente, elle remplace la zone de disponibilité.
destination.bytes target.labels Ajouté en tant que libellé avec la clé "Bytes". Converti en chaîne.
destination.ip target.ip L'adresse IP cible est définie sur l'adresse IP de destination.
destination.packets target.labels Ajouté en tant que libellé avec la clé "Packets". Converti en chaîne.
destination.port target.port Le port cible est défini sur le port de destination. Converti en nombre entier.
ecs.version metadata.product_version Si ce champ est présent, la valeur issue de jsonPayload.@metadata.version est ignorée.
event1.category security_result.category_details Toutes les valeurs sont ajoutées à category_details.
event1.duration network.session_duration.seconds Converti en nombre entier.
event1.id metadata.product_log_id L'ID du journal de produit des métadonnées est défini sur l'ID de l'événement.
event1.outcome extensions.auth.auth_details Les détails d'authentification sont définis sur le résultat de l'événement.
file.extension target.file.mime_type Le type MIME du fichier cible est défini sur l'extension du fichier.
file.hash.sha1 target.file.sha1 Le SHA-1 du fichier cible est défini sur le hachage SHA-1 du fichier.
file.path target.file.full_path Le chemin d'accès complet au fichier cible est défini sur le chemin d'accès.
file.size target.file.size Convertie en uinteger.
group.id principal.group.product_object_id L'ID de l'objet produit du groupe principal est défini sur l'ID du groupe.
group.name principal.group.group_display_name Le nom à afficher du groupe principal est défini sur le nom du groupe.
host.architecture principal.asset.hardware.cpu_platform Stocké dans la variable temporaire hardware.cpu_platform, puis fusionné dans principal.asset.hardware.
host.hostname principal.hostname Le nom d'hôte principal est défini sur le nom d'hôte de l'hôte.
host.id principal.asset.asset_id Préfixé par "ID de l'hôte : ".
host.ip principal.asset.ip Toutes les valeurs sont ajoutées aux adresses IP des assets principaux.
host.mac principal.mac Les tirets sont remplacés par des deux-points.
host.name principal.hostname, observer.hostname Si ce champ est présent, la valeur issue de host.hostname est ignorée.
host.os.kernel principal.platform_patch_level Le niveau de correctif de la plate-forme principale est défini sur le kernel de l'OS hôte.
host.os.version principal.platform_version La version de plate-forme principale est définie sur la version de l'OS hôte. Stocké dans la variable temporaire host_os_version.
httpRequest.remoteIp target.ip Si elle est présente et qu'aucune autre adresse IP cible n'est définie, cette valeur est utilisée.
httpRequest.requestMethod network.http.method La méthode HTTP du réseau est définie sur la méthode de requête HTTP.
httpRequest.requestSize network.sent_bytes Convertie en uinteger.
httpRequest.requestUrl network.http.referral_url L'URL de provenance HTTP du réseau est définie sur l'URL de la requête HTTP.
httpRequest.responseSize network.received_bytes Convertie en uinteger.
httpRequest.serverIp principal.ip Si elle est présente et qu'aucune autre adresse IP principale n'est définie, cette valeur est utilisée.
httpRequest.status network.http.response_code Converti en nombre entier.
httpRequest.userAgent network.http.user_agent Le user-agent HTTP du réseau est défini sur le user-agent HTTP de la requête.
insertId network.session_id L'ID de session du réseau est défini sur l'ID d'insertion.
jsonPayload.@metadata.beat metadata.product_event_type Le type d'événement produit de métadonnées est défini sur le rythme des métadonnées.
jsonPayload.@metadata.version metadata.product_version La version du produit des métadonnées est définie sur la version des métadonnées.
jsonPayload.destination.ip target.ip Si elle est présente et qu'aucune autre adresse IP cible n'est définie, cette valeur est utilisée.
jsonPayload.destination.port target.port Si elle est présente et qu'aucun autre port cible n'est défini, cette valeur est utilisée. Converti en nombre entier.
jsonPayload.event1.category security_result.category_details Toutes les valeurs sont ajoutées à category_details.
jsonPayload.file.path target.file.full_path Si cette valeur est présente et qu'aucun autre chemin cible n'est défini, elle est utilisée.
jsonPayload.process.executable principal.process.file.full_path, target.process.file.full_path Permet de définir le chemin d'accès complet du processus principal et cible si aucune autre valeur n'est présente.
jsonPayload.process.name principal.application Si elle est présente et qu'aucune autre application principale n'est définie, cette valeur est utilisée.
jsonPayload.process.parent.pid principal.process.pid Si elle est présente et qu'aucun autre PID de processus principal n'est défini, cette valeur est utilisée. Converti en chaîne.
jsonPayload.process.parent.ppid principal.process.parent_process.pid Si elle est présente et qu'aucun autre PID de processus parent principal n'est défini, cette valeur est utilisée. Converti en chaîne.
jsonPayload.process.parent.process.executable principal.process.file.full_path Si cette valeur est présente et qu'aucun autre chemin d'accès complet au processus principal n'est défini, elle est utilisée.
jsonPayload.process.parent.process.exe principal.process.file.full_path Si cette valeur est présente et qu'aucun autre chemin d'accès complet au processus principal n'est défini, elle est utilisée.
jsonPayload.process.parent.process.title principal.process.command_line Si elle est présente et qu'aucune autre ligne de commande de processus principal n'est définie, cette valeur est utilisée.
jsonPayload.process.pid target.process.pid Le PID du processus cible est défini sur le PID du processus de la charge utile JSON.
jsonPayload.process.title target.process.command_line La ligne de commande du processus cible est définie sur le titre du processus de la charge utile JSON.
jsonPayload.user.id target.user.userid Si cette valeur est présente et qu'aucun autre ID utilisateur cible n'est défini, elle est utilisée. Converti en chaîne.
jsonPayload.user.name target.user.user_display_name Si cette valeur est présente et qu'aucun autre nom à afficher de l'utilisateur cible n'est défini, elle est utilisée.
msg metadata.description La description des métadonnées est définie sur le message.
network.bytes network.sent_bytes Convertie en uinteger.
network.community_id network.community_id L'ID de la communauté du réseau est défini sur l'ID de la communauté du réseau.
network.transport network.ip_protocol Converti en majuscules.
package.description security_result.description La description du résultat de sécurité est définie sur la description du package.
package.name security_result.rule_name Le nom de la règle de résultat de sécurité est défini sur le nom du package.
package.reference security_result.about.url L'URL du résultat de sécurité est définie sur la référence du package.
package.size security_result.about.file.size Convertie en uinteger.
package.type security_result.about.file.mime_type, security_result.rule_type Le type MIME et le type de règle du résultat de sécurité sont définis sur le type de package.
process.created principal.asset.creation_time Si elle est présente, cette valeur est utilisée. Analysé au format ISO8601.
process.entity_id principal.process.product_specific_process_id Préfixé par "Processus :".
process.executable principal.process.file.full_path, target.process.file.full_path Permet de définir le chemin d'accès complet du processus principal et cible si aucune autre valeur n'est présente.
process.hash.sha1 principal.process.file.sha1 Le processus principal SHA-1 est défini sur le hachage SHA-1 du processus.
process.name principal.application Si elle est présente et qu'aucune autre application principale n'est définie, cette valeur est utilisée.
process.pid principal.process.pid Si elle est présente et qu'aucun autre PID de processus principal n'est défini, cette valeur est utilisée. Converti en chaîne.
process.ppid principal.process.parent_process.pid Si elle est présente et qu'aucun autre PID de processus parent principal n'est défini, cette valeur est utilisée. Converti en chaîne.
process.start principal.asset.creation_time Si process.created n'est pas présent et que ce champ l'est, cette valeur est utilisée. Analysé au format ISO8601.
resource.labels.backend_service_name target.resource.name Le nom de la ressource cible est défini sur le nom du service de backend de la ressource.
resource.labels.forwarding_rule_name target.resource.attribute.labels Ajouté en tant que libellé avec la clé "Nom de la règle de transfert".
resource.labels.project_id target.resource.product_object_id L'ID de l'objet produit de la ressource cible est défini sur l'ID de projet de la ressource.
resource.labels.target_proxy_name target.resource.attribute.labels Ajouté en tant que libellé avec la clé "Nom du proxy cible".
resource.labels.url_map_name target.resource.attribute.labels Ajouté en tant que libellé avec la clé "Nom du mappage d'URL".
server.bytes intermediary.labels Ajouté en tant que libellé avec la clé "Bytes". Converti en chaîne.
server.ip intermediary.ip L'adresse IP intermédiaire est définie sur l'adresse IP du serveur.
server.packets intermediary.labels Ajouté en tant que libellé avec la clé "Packets". Converti en chaîne.
server.port intermediary.port Le port intermédiaire est défini sur le port du serveur. Converti en nombre entier.
service.type target.application L'application cible est définie sur le type de service.
source.bytes src.labels Ajouté en tant que libellé avec la clé "Bytes". Converti en chaîne.
source.ip src.ip L'adresse IP source est définie sur l'adresse IP source.
source.packets src.labels Ajouté en tant que libellé avec la clé "Packets". Converti en chaîne.
source.port src.port Le port source est défini sur le port source. Converti en nombre entier.
system.audit.host.boottime about.asset.last_boot_time Analysé au format ISO8601.
system.audit.host.hostname about.hostname Le nom d'hôte "about" est défini sur le nom d'hôte d'audit du système.
system.audit.host.id principal.user.userid L'ID utilisateur principal est défini sur l'ID d'hôte d'audit du système.
system.audit.host.mac.0 about.mac L'adresse MAC "À propos" est définie sur la première adresse MAC de l'hôte d'audit système.
trace target.process.file.full_path Si elle est présente et qu'aucun autre chemin d'accès complet au processus cible n'est défini, cette valeur est utilisée.
user.effective.id target.user.userid Si cette valeur est présente et qu'aucun autre ID utilisateur cible n'est défini, elle est utilisée.
user.effective.name target.user.user_display_name Si cette valeur est présente et qu'aucun autre nom à afficher de l'utilisateur cible n'est défini, elle est utilisée.
user.id target.user.userid Si cette valeur est présente et qu'aucun autre ID utilisateur cible n'est défini, elle est utilisée. Converti en chaîne.
user.name target.user.user_display_name Si cette valeur est présente et qu'aucun autre nom à afficher de l'utilisateur cible n'est défini, elle est utilisée.
N/A metadata.event_type Définissez-le sur "GENERIC_EVENT" au départ. Modifié en fonction de la logique décrite dans les commentaires du code du parseur.
N/A metadata.log_type À définir sur "ELASTIC_AUDITBEAT".
N/A metadata.product_name Définissez-le sur "Auditbeat".
N/A metadata.vendor_name Définissez-le sur "Élastique".
N/A extensions.auth.type Définissez la valeur sur "AUTHTYPE_UNSPECIFIED" pour les événements USER_LOGIN et USER_LOGOUT.
auditd.data.syscall metadata.product_event_type Le type d'événement de produit de métadonnées est défini sur le syscall auditd.

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