Elastic Auditbeat-Logs erfassen
In diesem Dokument wird beschrieben, wie Sie Elastic Auditbeat-Logs mit Amazon S3 in Google Security Operations aufnehmen. Der Parser extrahiert Felder aus den JSON-Logs, normalisiert sie im Unified Data Model (UDM) und reichert die Daten mit zusätzlichem Kontext wie Hostinformationen, Netzwerkdetails und Sicherheitsklassifizierungen an. Es werden verschiedene Ereignistypen verarbeitet, indem event1.action
und andere Felder bestimmten UDM-Metadaten-Ereignistypen zugeordnet werden. Standardmäßig wird GENERIC_EVENT
oder, falls möglich, eine spezifischere Kategorie verwendet.
Hinweise
Prüfen Sie, ob folgende Voraussetzungen erfüllt sind:
- Eine Google SecOps-Instanz.
- Privilegierter Zugriff auf den Elastic Auditbeat-Server.
- Privilegierter Zugriff auf den Logstash-Server.
- Privilegierter Zugriff auf AWS (S3, Identity and Access Management (IAM)).
Voraussetzungen für Elastic Auditbeat
- Elastic Auditbeat muss auf Ihren Servern installiert und konfiguriert sein.
- Installieren Sie Logstash auf einem dedizierten Server oder zusammen mit Auditbeat.
- Notieren Sie sich den Speicherort der Auditbeat-Konfigurationsdatei (in der Regel
/etc/auditbeat/auditbeat.yml
).
AWS S3-Bucket und IAM für Google SecOps konfigurieren
- Erstellen Sie einen Amazon S3-Bucket. Folgen Sie dazu der Anleitung unter Bucket erstellen.
- Speichern Sie den Namen und die Region des Buckets zur späteren Verwendung (z. B.
elastic-auditbeat-logs
). - Erstellen Sie einen Nutzer gemäß dieser Anleitung: IAM-Nutzer erstellen.
- Wählen Sie den erstellten Nutzer aus.
- Wählen Sie den Tab Sicherheitsanmeldedaten aus.
- Klicken Sie im Abschnitt Zugriffsschlüssel auf Zugriffsschlüssel erstellen.
- Wählen Sie Drittanbieterdienst als Anwendungsfall aus.
- Klicken Sie auf Weiter.
- Optional: Fügen Sie ein Beschreibungstag hinzu.
- Klicken Sie auf Zugriffsschlüssel erstellen.
- Klicken Sie auf CSV-Datei herunterladen, um den Access Key (Zugriffsschlüssel) und den Secret Access Key (geheimer Zugriffsschlüssel) für die zukünftige Verwendung zu speichern.
- Klicken Sie auf Fertig.
- Wählen Sie den Tab Berechtigungen aus.
- Klicken Sie im Bereich Berechtigungsrichtlinien auf Berechtigungen hinzufügen.
- Wählen Sie Berechtigungen hinzufügen aus.
- Wählen Sie Richtlinien direkt anhängen aus.
- Suchen Sie nach der Richtlinie AmazonS3FullAccess.
- Wählen Sie die Richtlinie aus.
- Klicken Sie auf Weiter.
- Klicken Sie auf Berechtigungen hinzufügen.
Auditbeat so konfigurieren, dass Daten an Logstash gesendet werden
- Bearbeiten Sie die Auditbeat-Konfigurationsdatei
/etc/auditbeat/auditbeat.yml
. - Kommentieren Sie alle vorhandenen Ausgabekonfigurationen (Elasticsearch usw.) aus.
Fügen Sie die Logstash-Ausgabekonfiguration hinzu:
# ==================== 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"]
Starten Sie Auditbeat neu, damit die Änderungen übernommen werden:
sudo systemctl restart auditbeat
Logstash-Pipeline konfigurieren
Erstellen Sie eine neue Logstash-Pipeline-Konfigurationsdatei
/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 # } }
- Ersetzen Sie
YOUR_AWS_ACCESS_KEY_ID
undYOUR_AWS_SECRET_ACCESS_KEY
durch Ihre tatsächlichen AWS-Anmeldedaten. - Aktualisieren Sie die Werte
region
undbucket
entsprechend Ihrer S3-Konfiguration. - Starten Sie Logstash oder starten Sie es neu:
sudo systemctl restart logstash
- Ersetzen Sie
(Optional) IAM-Nutzer mit Lesezugriff und Schlüssel für Google SecOps erstellen
- Rufen Sie die AWS-Konsole > IAM > Nutzer auf.
- Klicken Sie auf Add users (Nutzer hinzufügen).
- Geben Sie die folgenden Konfigurationsdetails an:
- Nutzer: Geben Sie
secops-reader
ein. - Zugriffstyp: Wählen Sie Zugriffsschlüssel – programmatischer Zugriff aus.
- Nutzer: Geben Sie
- Klicken Sie auf Nutzer erstellen.
- Minimale Leseberechtigung (benutzerdefiniert) anhängen: Nutzer > secops-reader > Berechtigungen > Berechtigungen hinzufügen > Richtlinien direkt anhängen > Richtlinie erstellen.
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" } ] }
Name =
secops-reader-policy
.Klicken Sie auf Richtlinie erstellen> suchen/auswählen> Weiter> Berechtigungen hinzufügen.
Erstellen Sie einen Zugriffsschlüssel für
secops-reader
: Sicherheitsanmeldedaten > Zugriffsschlüssel.Klicken Sie auf Zugriffsschlüssel erstellen.
Laden Sie die Datei
.CSV
herunter. Sie fügen diese Werte in den Feed ein.
Feed in Google SecOps konfigurieren, um Elastic Auditbeat-Logs aufzunehmen
- Rufen Sie die SIEM-Einstellungen > Feeds auf.
- Klicken Sie auf + Neuen Feed hinzufügen.
- Geben Sie im Feld Feedname einen Namen für den Feed ein, z. B.
Elastic Auditbeat Logs
. - Wählen Sie Amazon S3 V2 als Quelltyp aus.
- Wählen Sie Elastic Audit Beats als Logtyp aus.
- Klicken Sie auf Weiter.
- Geben Sie Werte für die folgenden Eingabeparameter an:
- S3-URI:
s3://elastic-auditbeat-logs/auditbeat/
- Optionen zum Löschen der Quelle: Wählen Sie die gewünschte Option zum Löschen aus.
- Maximales Dateialter: Dateien einschließen, die in den letzten Tagen geändert wurden. Der Standardwert ist 180 Tage.
- Zugriffsschlüssel-ID: Nutzerzugriffsschlüssel mit Zugriff auf den S3-Bucket.
- Geheimer Zugriffsschlüssel: Der geheime Schlüssel des Nutzers mit Zugriff auf den S3-Bucket.
- Asset-Namespace: Der Asset-Namespace.
- Aufnahmelabels: Das Label, das auf die Ereignisse aus diesem Feed angewendet wird.
- S3-URI:
- Klicken Sie auf Weiter.
- Prüfen Sie die neue Feedkonfiguration auf dem Bildschirm Abschließen und klicken Sie dann auf Senden.
UDM-Zuordnungstabelle
Logfeld | UDM-Zuordnung | Logik |
---|---|---|
@timestamp |
metadata.event_timestamp |
Der Ereigniszeitstempel wird aus dem Feld @timestamp geparst. |
agent.id |
observer.asset_id |
Dem Wert muss „agent_id: “ vorangestellt werden. |
agent.type |
observer.application |
Die Observer-Anwendung ist auf den Agent-Typ festgelegt. |
agent.version |
observer.platform_version |
Die Observer-Plattformversion wird auf die Agent-Version festgelegt. |
client.bytes |
principal.labels |
Als Label mit dem Schlüssel „Bytes“ hinzugefügt. In String umgewandelt. |
client.ip |
principal.ip |
Die IP-Adresse des Hauptkontos wird auf die Client-IP-Adresse festgelegt. |
client.packets |
principal.labels |
Als Label mit dem Schlüssel „Packets“ hinzugefügt. In String umgewandelt. |
client.port |
principal.port |
Der Hauptport wird auf den Clientport festgelegt. In Ganzzahl konvertiert. |
cloud.availability_zone |
principal.cloud.availability_zone |
Die primäre Cloud-Verfügbarkeitszone wird auf die Cloud-Verfügbarkeitszone festgelegt. |
cloud.instance.id |
principal.resource.id |
Die Hauptkonto-Ressourcen-ID wird auf die Cloud-Instanz-ID festgelegt. |
cloud.machine.type |
principal.resource.resource_subtype |
Der primäre Ressourcenuntertyp wird auf den Cloud-Maschinentyp festgelegt. |
cloud.region |
principal.cloud.availability_zone |
Wenn eine Cloud-Region vorhanden ist, wird die Verfügbarkeitszone überschrieben. |
destination.bytes |
target.labels |
Als Label mit dem Schlüssel „Bytes“ hinzugefügt. In String umgewandelt. |
destination.ip |
target.ip |
Die Ziel-IP wird auf die Ziel-IP festgelegt. |
destination.packets |
target.labels |
Als Label mit dem Schlüssel „Packets“ hinzugefügt. In String umgewandelt. |
destination.port |
target.port |
Der Zielport wird auf den Zielport festgelegt. In Ganzzahl konvertiert. |
ecs.version |
metadata.product_version |
Falls vorhanden, wird der Wert aus jsonPayload.@metadata.version überschrieben. |
event1.category |
security_result.category_details |
Alle Werte werden „category_details“ hinzugefügt. |
event1.duration |
network.session_duration.seconds |
In Ganzzahl konvertiert. |
event1.id |
metadata.product_log_id |
Die Metadaten-Produktlog-ID wird auf die Ereignis-ID festgelegt. |
event1.outcome |
extensions.auth.auth_details |
Die Autorisierungsdetails werden auf das Ergebnis des Ereignisses festgelegt. |
file.extension |
target.file.mime_type |
Der MIME-Typ der Zieldatei wird auf die Dateiendung festgelegt. |
file.hash.sha1 |
target.file.sha1 |
Der SHA-1-Wert der Zieldatei wird auf den SHA-1-Hash der Datei festgelegt. |
file.path |
target.file.full_path |
Der vollständige Pfad der Zieldatei wird auf den Pfad festgelegt. |
file.size |
target.file.size |
In „uinteger“ konvertiert. |
group.id |
principal.group.product_object_id |
Die ID des Hauptgruppenprodukts wird auf die Gruppen-ID festgelegt. |
group.name |
principal.group.group_display_name |
Der Anzeigename der Hauptgruppe wird auf den Gruppennamen festgelegt. |
host.architecture |
principal.asset.hardware.cpu_platform |
Wird in der temporären Variablen hardware.cpu_platform gespeichert und dann in principal.asset.hardware zusammengeführt. |
host.hostname |
principal.hostname |
Der Prinzipal-Hostname wird auf den Host-Hostname festgelegt. |
host.id |
principal.asset.asset_id |
Beginnt mit „Host-ID: “. |
host.ip |
principal.asset.ip |
Alle Werte werden den IP-Adressen des Haupt-Assets hinzugefügt. |
host.mac |
principal.mac |
Bindestriche werden durch Doppelpunkte ersetzt. |
host.name |
principal.hostname , observer.hostname |
Falls vorhanden, wird der Wert aus host.hostname überschrieben. |
host.os.kernel |
principal.platform_patch_level |
Das Haupt-Patch-Level der Plattform wird auf den Kernel des Hostbetriebssystems festgelegt. |
host.os.version |
principal.platform_version |
Die Hauptplattformversion wird auf die Version des Hostbetriebssystems festgelegt. In der temporären Variablen host_os_version gespeichert. |
httpRequest.remoteIp |
target.ip |
Wenn dieser Wert vorhanden ist und keine andere Ziel-IP festgelegt ist, wird er verwendet. |
httpRequest.requestMethod |
network.http.method |
Die HTTP-Methode des Netzwerks wird auf die HTTP-Anfragemethode festgelegt. |
httpRequest.requestSize |
network.sent_bytes |
In „uinteger“ konvertiert. |
httpRequest.requestUrl |
network.http.referral_url |
Die HTTP-Referrer-URL des Netzwerks wird auf die HTTP-Anfrage-URL festgelegt. |
httpRequest.responseSize |
network.received_bytes |
In „uinteger“ konvertiert. |
httpRequest.serverIp |
principal.ip |
Wenn dieser Wert vorhanden ist und keine andere Haupt-IP-Adresse festgelegt ist, wird er verwendet. |
httpRequest.status |
network.http.response_code |
In Ganzzahl konvertiert. |
httpRequest.userAgent |
network.http.user_agent |
Der HTTP-User-Agent des Netzwerks wird auf den User-Agent der HTTP-Anfrage festgelegt. |
insertId |
network.session_id |
Die Netzwerk-Sitzungs-ID wird auf die Insert-ID festgelegt. |
jsonPayload.@metadata.beat |
metadata.product_event_type |
Der Ereignistyp für Metadatenprodukte wird auf den Metadaten-Beat festgelegt. |
jsonPayload.@metadata.version |
metadata.product_version |
Die Metadaten-Produktversion wird auf die Metadatenversion festgelegt. |
jsonPayload.destination.ip |
target.ip |
Wenn dieser Wert vorhanden ist und keine andere Ziel-IP festgelegt ist, wird er verwendet. |
jsonPayload.destination.port |
target.port |
Wenn dieser Wert vorhanden ist und kein anderer Zielport festgelegt ist, wird er verwendet. In Ganzzahl konvertiert. |
jsonPayload.event1.category |
security_result.category_details |
Alle Werte werden „category_details“ hinzugefügt. |
jsonPayload.file.path |
target.file.full_path |
Wenn dieser Wert vorhanden ist und kein anderer Zielpfad festgelegt ist, wird er verwendet. |
jsonPayload.process.executable |
principal.process.file.full_path , target.process.file.full_path |
Wird verwendet, um sowohl den vollständigen Pfad des Hauptprozesses als auch des Zielprozesses festzulegen, wenn kein anderer Wert vorhanden ist. |
jsonPayload.process.name |
principal.application |
Wenn dieser Wert vorhanden ist und keine andere primäre Anwendung festgelegt ist, wird er verwendet. |
jsonPayload.process.parent.pid |
principal.process.pid |
Wenn dieser Wert vorhanden ist und keine andere PID für den Hauptprozess festgelegt ist, wird er verwendet. In String umgewandelt. |
jsonPayload.process.parent.ppid |
principal.process.parent_process.pid |
Wenn dieser Wert vorhanden ist und keine andere PID des übergeordneten Hauptprozesses festgelegt ist, wird dieser Wert verwendet. In String umgewandelt. |
jsonPayload.process.parent.process.executable |
principal.process.file.full_path |
Wenn dieser Wert vorhanden ist und kein anderer vollständiger Pfad für den Hauptprozess festgelegt ist, wird dieser Wert verwendet. |
jsonPayload.process.parent.process.exe |
principal.process.file.full_path |
Wenn dieser Wert vorhanden ist und kein anderer vollständiger Pfad für den Hauptprozess festgelegt ist, wird dieser Wert verwendet. |
jsonPayload.process.parent.process.title |
principal.process.command_line |
Wenn dieser Wert vorhanden ist und keine andere Befehlszeile für den Hauptprozess festgelegt ist, wird er verwendet. |
jsonPayload.process.pid |
target.process.pid |
Die PID des Zielprozesses wird auf die PID des Prozesses in der JSON-Nutzlast festgelegt. |
jsonPayload.process.title |
target.process.command_line |
Die Befehlszeile des Zielprozesses wird auf den Prozesstitel der JSON-Nutzlast festgelegt. |
jsonPayload.user.id |
target.user.userid |
Wenn dieser Wert vorhanden ist und keine andere Zielnutzer-ID festgelegt ist, wird er verwendet. In String umgewandelt. |
jsonPayload.user.name |
target.user.user_display_name |
Wenn dieser Wert vorhanden ist und kein anderer Anzeigename für den Zielnutzer festgelegt ist, wird er verwendet. |
msg |
metadata.description |
Die Metadatenbeschreibung wird auf die Nachricht festgelegt. |
network.bytes |
network.sent_bytes |
In „uinteger“ konvertiert. |
network.community_id |
network.community_id |
Die Netzwerk-Community-ID wird auf die Netzwerk-Community-ID festgelegt. |
network.transport |
network.ip_protocol |
In Großbuchstaben umgewandelt. |
package.description |
security_result.description |
Die Beschreibung des Sicherheitsergebnisses wird auf die Paketbeschreibung festgelegt. |
package.name |
security_result.rule_name |
Der Name der Sicherheitsergebnisregel wird auf den Paketnamen festgelegt. |
package.reference |
security_result.about.url |
Die URL des Sicherheitsergebnisses ist auf die Paketreferenz festgelegt. |
package.size |
security_result.about.file.size |
In „uinteger“ konvertiert. |
package.type |
security_result.about.file.mime_type , security_result.rule_type |
Der MIME-Typ und der Regeltyp des Sicherheitsergebnisses werden auf den Pakettyp festgelegt. |
process.created |
principal.asset.creation_time |
Falls vorhanden, wird dieser Wert verwendet. Wird als ISO8601 geparst. |
process.entity_id |
principal.process.product_specific_process_id |
Beginnt mit „Process:“ (Prozess:). |
process.executable |
principal.process.file.full_path , target.process.file.full_path |
Wird verwendet, um sowohl den vollständigen Pfad des Hauptprozesses als auch des Zielprozesses festzulegen, wenn kein anderer Wert vorhanden ist. |
process.hash.sha1 |
principal.process.file.sha1 |
Der SHA-1-Hash des Hauptprozesses wird auf den SHA-1-Hash des Prozesses festgelegt. |
process.name |
principal.application |
Wenn dieser Wert vorhanden ist und keine andere primäre Anwendung festgelegt ist, wird er verwendet. |
process.pid |
principal.process.pid |
Wenn dieser Wert vorhanden ist und keine andere PID für den Hauptprozess festgelegt ist, wird er verwendet. In String umgewandelt. |
process.ppid |
principal.process.parent_process.pid |
Wenn dieser Wert vorhanden ist und keine andere PID des übergeordneten Hauptprozesses festgelegt ist, wird dieser Wert verwendet. In String umgewandelt. |
process.start |
principal.asset.creation_time |
Wenn process.created nicht vorhanden ist und dieses Feld vorhanden ist, wird dieser Wert verwendet. Wird als ISO8601 geparst. |
resource.labels.backend_service_name |
target.resource.name |
Der Name der Zielressource wird auf den Namen des Backend-Dienstes der Ressource festgelegt. |
resource.labels.forwarding_rule_name |
target.resource.attribute.labels |
Als Label mit dem Schlüssel „Name der Weiterleitungsregel“ hinzugefügt. |
resource.labels.project_id |
target.resource.product_object_id |
Die Produktobjekt-ID der Zielressource wird auf die Projekt-ID der Ressource festgelegt. |
resource.labels.target_proxy_name |
target.resource.attribute.labels |
Als Label mit dem Schlüssel „Target proxy name“ hinzugefügt. |
resource.labels.url_map_name |
target.resource.attribute.labels |
Als Label mit dem Schlüssel „URL map name“ (Name der URL-Zuordnung) hinzugefügt. |
server.bytes |
intermediary.labels |
Als Label mit dem Schlüssel „Bytes“ hinzugefügt. In String umgewandelt. |
server.ip |
intermediary.ip |
Die Zwischen-IP wird auf die Server-IP festgelegt. |
server.packets |
intermediary.labels |
Als Label mit dem Schlüssel „Packets“ hinzugefügt. In String umgewandelt. |
server.port |
intermediary.port |
Der Zwischenport wird auf den Serverport festgelegt. In Ganzzahl konvertiert. |
service.type |
target.application |
Die Zielanwendung ist auf den Diensttyp festgelegt. |
source.bytes |
src.labels |
Als Label mit dem Schlüssel „Bytes“ hinzugefügt. In String umgewandelt. |
source.ip |
src.ip |
Die Quell-IP wird auf die Quell-IP festgelegt. |
source.packets |
src.labels |
Als Label mit dem Schlüssel „Packets“ hinzugefügt. In String umgewandelt. |
source.port |
src.port |
Der Quellport wird auf den Quellport festgelegt. In Ganzzahl konvertiert. |
system.audit.host.boottime |
about.asset.last_boot_time |
Wird als ISO8601 geparst. |
system.audit.host.hostname |
about.hostname |
Der Hostname „about“ wird auf den Hostnamen des System-Audit-Hosts festgelegt. |
system.audit.host.id |
principal.user.userid |
Die Hauptnutzer-ID wird auf die System-Audit-Host-ID festgelegt. |
system.audit.host.mac.0 |
about.mac |
Die MAC-Adresse „about“ wird auf die MAC-Adresse des ersten System-Audit-Hosts festgelegt. |
trace |
target.process.file.full_path |
Wenn dieser Wert vorhanden ist und kein anderer vollständiger Pfad für den Zielprozess festgelegt ist, wird er verwendet. |
user.effective.id |
target.user.userid |
Wenn dieser Wert vorhanden ist und keine andere Zielnutzer-ID festgelegt ist, wird er verwendet. |
user.effective.name |
target.user.user_display_name |
Wenn dieser Wert vorhanden ist und kein anderer Anzeigename für den Zielnutzer festgelegt ist, wird er verwendet. |
user.id |
target.user.userid |
Wenn dieser Wert vorhanden ist und keine andere Zielnutzer-ID festgelegt ist, wird er verwendet. In String umgewandelt. |
user.name |
target.user.user_display_name |
Wenn dieser Wert vorhanden ist und kein anderer Anzeigename für den Zielnutzer festgelegt ist, wird er verwendet. |
– | metadata.event_type |
Wird anfangs auf „GENERIC_EVENT“ festgelegt. Geändert basierend auf der Logik, die in den Parser-Codekommentaren beschrieben ist. |
– | metadata.log_type |
Legen Sie diesen Wert auf „ELASTIC_AUDITBEAT“ fest. |
– | metadata.product_name |
Auf „Auditbeat“ festgelegt. |
– | metadata.vendor_name |
Legen Sie diesen Wert auf „Elastisch“ fest. |
– | extensions.auth.type |
Für USER_LOGIN- und USER_LOGOUT-Ereignisse auf „AUTHTYPE_UNSPECIFIED“ festgelegt. |
auditd.data.syscall |
metadata.product_event_type |
Der Metadaten-Produkt-Ereignistyp wird auf den auditd-Systemaufruf festgelegt. |
Benötigen Sie weitere Hilfe? Antworten von Community-Mitgliedern und Google SecOps-Experten erhalten