Collecter les journaux Elastic Auditbeat
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
- Assurez-vous qu'Elastic Auditbeat est installé et configuré sur vos serveurs.
- Installez Logstash sur un serveur dédié ou à côté d'Auditbeat.
- 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
- Créez un bucket Amazon S3 en suivant ce guide de l'utilisateur : Créer un bucket.
- Enregistrez le Nom et la Région du bucket pour référence ultérieure (par exemple,
elastic-auditbeat-logs
). - Créez un utilisateur en suivant ce guide de l'utilisateur : Créer un utilisateur IAM.
- Sélectionnez l'utilisateur créé.
- Sélectionnez l'onglet Informations d'identification de sécurité.
- Cliquez sur Créer une clé d'accès dans la section Clés d'accès.
- Sélectionnez Service tiers comme Cas d'utilisation.
- Cliquez sur Suivant.
- Facultatif : Ajoutez une balise de description.
- Cliquez sur Créer une clé d'accès.
- 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.
- Cliquez sur OK.
- Sélectionnez l'onglet Autorisations.
- Cliquez sur Ajouter des autorisations dans la section Règles relatives aux autorisations.
- Sélectionnez Ajouter des autorisations.
- Sélectionnez Joindre directement des règles.
- Recherchez la règle AmazonS3FullAccess.
- Sélectionnez la règle.
- Cliquez sur Suivant.
- Cliquez sur Ajouter des autorisations.
Configurer Auditbeat pour l'envoi à Logstash
- Modifiez le fichier de configuration Auditbeat
/etc/auditbeat/auditbeat.yml
. - Mettez en commentaire toute configuration de sortie existante (Elasticsearch, etc.).
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"]
Redémarrez Auditbeat pour appliquer les modifications :
sudo systemctl restart auditbeat
Configurer le pipeline Logstash
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
etYOUR_AWS_SECRET_ACCESS_KEY
par vos identifiants AWS réels. - Mettez à jour les valeurs
region
etbucket
pour qu'elles correspondent à votre configuration S3. - Démarrez ou redémarrez Logstash :
sudo systemctl restart logstash
- Remplacez
(Facultatif) Créez un utilisateur et des clés IAM en lecture seule pour Google SecOps
- Accédez à Console AWS > IAM > Utilisateurs.
- Cliquez sur Add users (Ajouter des utilisateurs).
- Fournissez les informations de configuration suivantes :
- Utilisateur : saisissez
secops-reader
. - Type d'accès : sélectionnez Clé d'accès – Accès programmatique.
- Utilisateur : saisissez
- Cliquez sur Créer un utilisateur.
- 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.
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" } ] }
Nom =
secops-reader-policy
.Cliquez sur Créer une règle> recherchez/sélectionnez > Suivant> Ajouter des autorisations.
Créez une clé d'accès pour
secops-reader
: Identifiants de sécurité > Clés d'accès.Cliquez sur Créer une clé d'accès.
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
- Accédez à Paramètres SIEM> Flux.
- Cliquez sur + Ajouter un flux.
- Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple,
Elastic Auditbeat Logs
). - Sélectionnez Amazon S3 V2 comme type de source.
- Sélectionnez Beats d'audit Elastic comme type de journal.
- Cliquez sur Suivant.
- 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.
- URI S3 :
- Cliquez sur Suivant.
- 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.