AWS WAF-Logs erfassen
In diesem Dokument wird beschrieben, wie Sie die AWS-WAF-Logs (Web Application Firewall) erfassen, indem Sie einen Google Security Operations-Feed einrichten. Der Parser wandelt Roh-JSON-Logs in ein strukturiertes Format um, das dem Google SecOps-UDM entspricht. Es werden Felder wie IP-Adressen, URLs, User-Agents und Details zu Sicherheitsregeln extrahiert und entsprechenden UDM-Feldern zugeordnet, um eine einheitliche Darstellung und Analyse zu ermöglichen.
Hinweise
- Sie benötigen eine Google SecOps-Instanz.
- Sie benötigen erhöhte Zugriffsrechte für AWS.
Amazon S3-Bucket konfigurieren
- Erstellen Sie einen Amazon S3-Bucket. Folgen Sie dazu dieser Anleitung: Bucket erstellen
- Speichern Sie den Namen und die Region des Buckets für später.
- Erstellen Sie einen Nutzer gemäß der Anleitung IAM-Nutzer erstellen.
- Wählen Sie den erstellten Nutzer aus.
- Wählen Sie den Tab Sicherheitsanmeldedaten aus.
- Klicken Sie im Bereich Zugriffsschlüssel auf Zugriffsschlüssel erstellen.
- Wählen Sie als Anwendungsfall Drittanbieterdienst aus.
- Klicken Sie auf Weiter.
- Optional: Fügen Sie ein „description“-Tag hinzu.
- Klicken Sie auf Zugriffsschlüssel erstellen.
- Klicken Sie auf CSV-Datei herunterladen, um den Zugriffsschlüssel und den Secret Access Key zur späteren 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 und wählen Sie sie aus.
- Klicken Sie auf Weiter.
- Klicken Sie auf Berechtigungen hinzufügen.
WAF-Web-ACL (Access Control List) erstellen
Wenn Sie AWS WAF noch nicht eingerichtet haben, müssen Sie eine WAF-Web-ACL (Access Control List) erstellen. Bei bestehenden Konfigurationen können Sie mit dem nächsten Schritt fortfahren.
- Suchen Sie in der AWS-Konsole nach AWS WAF & Shield und wählen Sie diese Option aus.
- Klicken Sie auf Web-ACL erstellen.
- Geben Sie die folgenden Einstellungen an:
- Name: Geben Sie der ACL einen Namen, z. B.
my-waf-web-acl
. - Region: Wählen Sie die Region aus, in der die WAF angewendet werden soll.
- CloudWatch-Messwerte: Aktivieren Sie die Messwerterfassung, um die Aktivität und die ausgelösten Regeln zu erfassen.
- Name: Geben Sie der ACL einen Namen, z. B.
- Wählen Sie nach dem Erstellen die Web-ACL aus, für die Sie die Protokollierung aktivieren möchten.
AWS WAF-Logging konfigurieren
- Rufen Sie in der AWS WAF Console den Tab Logging Ihrer Web-ACL auf.
- Klicken Sie auf Logging aktivieren.
- Wählen Sie Amazon S3 als Ziel für Ihre Protokolle aus.
- Wählen Sie den zuvor erstellten S3-Bucket aus, um die Protokolle darin zu speichern.
- Optional: Konfigurieren Sie ein Log-Präfix zum Organisieren der Protokolle (z. B.
waf-logs/
). - Klicken Sie auf Speichern.
Berechtigungen für den S3-Bucket prüfen
Der S3-Bucket muss die richtigen Berechtigungen für AWS WAF zum Schreiben von Protokollen haben.
- Rufen Sie die S3 Console auf.
- Wählen Sie den Bucket aus, in dem die Protokolle gespeichert werden sollen.
Fügen Sie auf dem Tab Berechtigungen die folgende Bucket-Richtlinie hinzu, damit AWS WAF Protokolle schreiben kann:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "wafv2.amazonaws.com" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::your-log-bucket-name/*" } ] }
- Klicken Sie auf Speichern.
Feed in Google SecOps für die Aufnahme der AWS WAF-Logs konfigurieren
- Gehen Sie zu SIEM-Einstellungen > Feeds.
- Klicken Sie auf Neu hinzufügen.
- Geben Sie im Feld Feedname einen Namen für den Feed ein, z. B. AWS WAF-Protokolle.
- Wählen Sie als Quelltyp Amazon S3 aus.
- Wählen Sie AWS WAF als Logtyp aus.
- Klicken Sie auf Weiter.
Geben Sie Werte für die folgenden Eingabeparameter an:
- Region: die Region, in der sich der Amazon S3-Bucket befindet.
- S3-URI: der Bucket-URI.
s3://your-log-bucket-name/waf-logs/
- Dabei gilt:
your-log-bucket-name
: der tatsächliche Name des Buckets.
- Dabei gilt:
- URI ist ein: Wählen Sie Verzeichnis oder Verzeichnis mit Unterverzeichnissen aus.
- Optionen zum Löschen der Quelle: Wählen Sie die gewünschte Löschoption aus.
- Zugriffsschlüssel-ID: Der 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 werden soll.
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 |
---|---|---|
Aktion | security_result.action | Wenn die Aktion „ALLOW“ (Zulassen) ist, setzen Sie „security_result.action“ auf „ALLOW“ und „security_result.severity“ auf „INFORMATIONAL“. Wenn „action“ auf „BLOCK“ gesetzt ist, setzen Sie „security_result.action“ auf „BLOCK“. Wenn „action“ „CAPTCHA“ ist und „captchaResponse.responseCode“ den Wert „405“ hat, setze „security_result.action“ auf „BLOCK“ und „security_result.action_details“ auf „CAPTCHA {captchaResponse.failureReason}“. |
captchaResponse.failureReason | security_result.action_details | Wird in Verbindung mit „action“ und „captchaResponse.responseCode“ verwendet, um „security_result.action_details“ zu bestimmen. |
captchaResponse.responseCode | security_result.action_details | Wird in Verbindung mit „action“ und „captchaResponse.failureReason“ verwendet, um „security_result.action_details“ zu bestimmen. |
httpRequest.clientIp | principal.ip, principal.asset.ip | Direkt principal.ip und principal.asset.ip zugeordnet. |
httpRequest.headers | target.hostname, target.asset.hostname, network.http.user_agent, network.http.parsed_user_agent, network.http.referral_url, target.location.country_or_region, target.resource.attribute.labels, target.user.userid | Durchläuft jeden Header in httpRequest.headers. Wenn der Headername „host“ oder „Host“ lautet, wird der Wert den Ziel-Hostnamen und dem Ziel-Asset-Hostnamen zugeordnet. Wenn der Headername „User-Agent“ oder „user-agent“ lautet, wird der Wert dem Attribut „network.http.user_agent“ zugeordnet und in „network.http.parsed_user_agent“ analysiert. Wenn der Headername „Referer“ oder „referer“ lautet, wird der Wert network.http.referral_url zugeordnet. Wenn der Headername „(?i)time-zone“ lautet, wird der Wert „target.location.country_or_region“ zugeordnet. Wenn der Headername „authorization“ lautet, wird der Wert decodiert, der Nutzername extrahiert und target.user.userid zugeordnet. Alle anderen Header werden als Schlüssel/Wert-Paare zu „target.resource.attribute.labels“ hinzugefügt. |
httpRequest.httpMethod | network.http.method | Wird direkt auf network.http.method zugeordnet. |
httpRequest.requestId | network.session_id | Wird direkt mit „network.session_id“ abgeglichen. |
httpRequest.uri | target.url | Direkt auf „target.url“ zugeordnet. |
httpSourceId | target.resource.name | Wird direkt auf „target.resource.name“ zugeordnet. |
httpSourceName | metadata.product_event_type | Wird direkt mit „metadata.product_event_type“ abgeglichen. |
Labels | security_result.rule_labels | Durchläuft jedes Label in „labels“. Wenn der Labelname nicht leer ist, wird er als Schlüssel/Wert-Paar zu „security_result.rule_labels“ hinzugefügt. |
nonTerminatingMatchingRules | security_result.action_details, security_result.rule_labels | Durchläuft jede Regel in „nonTerminatingMatchingRules“. Wenn die Aktion „ALLOW“ (Zulassen) und die Regelaktion „CAPTCHA“ ist, legen Sie „security_result.action_details“ auf „CAPTCHA SUCCESSFUL“ (CAPTCHA SUCCESSFUL) fest und fügen Sie security_result.rule_labels die Regel-ID mit dem Schlüssel „nonTerminatingCaptchaRuleName“ hinzu. Wenn die Aktion „BLOCK“ oder „ALLOW“ ist und die Regelaktion „COUNT“ lautet, legen Sie „COUNT RULE“ als Wert für „security_result.action_details“ fest und fügen Sie der Regel-ID „security_result.rule_labels“ den Schlüssel „nonTerminatingCountRuleName“ hinzu. Wenn die Aktion „BLOCK“ oder „ALLOW“ ist und die Regelaktion „CHALLENGE“ lautet, legen Sie für „security_result.action_details“ den Wert „COUNT RULE“ fest und fügen Sie der Regel-ID in „security_result.rule_labels“ den Schlüssel „nonTerminatingChallengeRuleName“ hinzu. |
rateBasedRuleList | security_result.rule_id, security_result.rule_name, security_result.description | Wenn „terminatingRuleType“ auf „RATE_BASED“ gesetzt ist, wird jede Regel in „rateBasedRuleList“ durchgegangen. Wenn „terminatingRuleId“ mit dem Regelnamen übereinstimmt, werden die Regel-ID, der Regelname und die Beschreibung den Variablen „security_result.rule_id“, „security_result.rule_name“ und „security_result.description“ zugeordnet. |
responseCodeSent | network.http.response_code | Wird direkt auf „network.http.response_code“ zugeordnet und in eine Ganzzahl umgewandelt. |
ruleGroupList | intermediary.labels, security_result.rule_id, security_result.rule_name, security_result.description, security_result.detection_fields | Durchläuft jede Regelgruppe in „ruleGroupList“. Die Regelgruppen-ID wird als Schlüssel/Wert-Paar zu „intermediary.labels“ hinzugefügt. Wenn „terminatingRuleType“ „MANAGED_RULE_GROUP“ ist und „terminatingRuleId“ mit der Regelgruppen-ID übereinstimmt, werden die Regel-ID, der Regelname und die Regelbeschreibung den Variablen „security_result.rule_id“, „security_result.rule_name“ und „security_result.description“ zugeordnet. Wenn „terminatingRuleType“ „GROUP“ ist, wird die ID der Endregel extrahiert und security_result.rule_name und security_result.description zugeordnet. Die ID der Endregelgruppe wird security_result.rule_labels mit dem Schlüssel „terminatingRuleGroupName“ hinzugefügt. Wenn „terminatingRuleType“ den Wert „REGULAR“ hat, wird die Aktion der Endregel extrahiert und den Feldern von „security_result.detection“ mit dem Schlüssel „terminatingRuleAction{index}" hinzugefügt. |
terminatingRuleId | security_result.rule_id, security_result.rule_name, security_result.description | Wenn „terminatingRuleType“ den Werten „RATE_BASED“, „MANAGED_RULE_GROUP“ oder „REGULAR“ entspricht, wird „terminatingRuleId“ den Werten „security_result.rule_id“ und „security_result.rule_name“ zugeordnet und verwendet, um „security_result.description“ zu erstellen. |
terminatingRuleMatchDetails | security_result.description, security_result.category_details, security_result.detection_fields | Durchläuft alle Übereinstimmungen in „terminatingRuleMatchDetails“. Legt „security_result.description“ auf „Terminating Rule“ fest. Wenn der Bedingungstyp nicht leer ist, wird er zu „security_result.category_details“ hinzugefügt. Wenn der Standort nicht leer ist, wird er security_result.detection_fields mit dem Schlüssel „location“ hinzugefügt. Für jedes übereinstimmende Datenelement wird es mit dem Schlüssel „matchedData“ zu „security_result.detection_fields“ hinzugefügt. |
terminatingRuleType | security_result.rule_type | Wird direkt security_result.rule_type zugeordnet. |
timestamp | metadata.event_timestamp | In einen Zeitstempel umgewandelt und mit „metadata.event_timestamp“ verknüpft. |
webaclId | intermediary.resource.name | Wird direkt mit „intermediary.resource.name“ abgeglichen. |
metadata.vendor_name | Legen Sie diesen Wert auf „AMAZON“ fest. | |
metadata.product_name | Legen Sie „AWS Web Application Firewall“ fest. | |
metadata.log_type | Legen Sie diesen Wert auf „AWS_WAF“ fest. | |
network.application_protocol | Legen Sie diesen Wert auf „HTTP“ fest. | |
metadata.event_type | Legen Sie „NETWORK_HTTP“ fest, wenn httpRequest.headers den Header „host“ oder „Host“ enthält. Andernfalls setzen Sie „STATUS_UPDATE“. |
Änderungen
2024-03-14
- Die Verarbeitung ungültiger Escape-Zeichen in Protokollmeldungen wurde verbessert, um eine korrekte JSON-Formatierung zu gewährleisten.
2023-12-29
- Die Zuordnung von „user-agent“-Informationen zum entsprechenden UDM-Feld wurde standardisiert.
- Nutzer-IDs aus dem „Authorization“-Header in HTTP-Anfragen extrahiert.
2023-12-08
- Mehrere Fehler im Zusammenhang mit der Hostnamenzuordnung, der Extraktion der Ziel-URL und der Regelverarbeitung wurden behoben.
- Die Fehlerbehandlung in bestimmten Bereichen des Parsers wurde verbessert.
2023-12-11
- Durch ein neues Grok-Muster wurde die Unterstützung für ein neues Protokollformat hinzugefügt.
2023-08-16
- Die Zuordnung von Sicherheitsregelaktionen zum UDM-Feld für Erkennungsfelder wurde verbessert.
2022-12-16
- Die Logik für die Datumsfilterung wurde optimiert und die Verarbeitung ungültiger JSON-Daten verbessert.
- User-Agent-Informationen aus HTTP-Headern, die einem speziellen UDM-Feld zugeordnet sind.
2022-12-11
- Unnötige Logik für die Verarbeitung von CSV- und SYSLOG-Nachrichtenprotokollen entfernt
2022-07-22
- Dies war die erste Erstellung des Parsers.
Benötigen Sie weitere Hilfe? Antworten von Community-Mitgliedern und Google SecOps-Experten erhalten