Collecter les journaux Akamai WAF
Ce document explique comment exporter et ingérer des journaux Akamai WAF dans Google Security Operations à l'aide de Google Cloud Storage ou d'AWS S3.
L'analyseur gère les journaux et est compatible avec les formats syslog et CEF. Il extrait des champs tels que les adresses IP, les URL, les méthodes HTTP, les codes de réponse, les user-agents et les informations sur les règles de sécurité, et les mappe au modèle de données unifié (UDM) pour une représentation cohérente. L'analyseur gère également des champs Akamai spécifiques tels que attackData
et clientReputation
, en effectuant les transformations de données nécessaires et en enrichissant la sortie UDM.
Avant de commencer
Assurez-vous de remplir les conditions suivantes :
- Instance Google SecOps
- Accès privilégié à Google Cloud ou AWS
- Accès privilégié à Akamai
Exporter et ingérer des journaux Akamai WAF depuis Cloud Storage
Cette section décrit la première étape du processus : configurer l'espace de stockage nécessaire pour vos journaux Akamai WAF.
Créer un bucket de stockage Google Cloud
- Connectez-vous à la console Google Cloud .
Accédez à la page Buckets Cloud Storage.
Cliquez sur Créer.
Sur la page "Créer un bucket", saisissez les informations concernant votre bucket. Après chacune de ces étapes, cliquez sur Continuer pour passer à l'étape suivante :
Dans la section Premiers pas, procédez comme suit :
- Saisissez un nom unique qui répond aux exigences de dénomination des buckets (par exemple,
akamai-waf-logs
). - Pour activer l'espace de noms hiérarchique, cliquez sur la flèche d'expansion pour développer la section Optimiser pour les charges de travail orientées fichiers et à forte intensité de données, puis sélectionnez Activer l'espace de noms hiérarchique sur ce bucket.
- Pour ajouter une étiquette de bucket, cliquez sur la flèche de développement pour développer la section Étiquettes.
- Cliquez sur Ajouter un libellé, puis spécifiez une clé et une valeur pour votre libellé.
- Saisissez un nom unique qui répond aux exigences de dénomination des buckets (par exemple,
Dans la section Choisir l'emplacement de stockage de vos données, procédez comme suit :
- Sélectionnez un type d'emplacement.
- Utilisez le menu déroulant du type d'emplacement pour sélectionner un emplacement où les données d'objets de votre bucket seront stockées de manière permanente.
- Pour configurer la réplication entre buckets, développez la section Configurer la réplication entre buckets.
Dans la section Choisir une classe de stockage pour vos données, sélectionnez une classe de stockage par défaut pour le bucket, ou bien classe automatique pour une gestion automatique des classes de stockage des données de votre bucket.
Dans la section Choisir comment contrôler l'accès aux objets, sélectionnez non pour appliquer la protection contre l'accès public, puis sélectionnez un modèle de contrôle des accès pour les objets de votre bucket.
Dans la section Choisir comment protéger les données d'objet, procédez comme suit :
- Sélectionnez l'une des options sous Protection des données que vous souhaitez définir pour votre bucket.
- Pour choisir comment vos données d'objet seront chiffrées, cliquez sur la flèche d'expansion intitulée Chiffrement des données, puis sélectionnez une méthode de chiffrement des données.
Cliquez sur Créer.
Configurer les autorisations pour Cloud Storage
Accédez à la page Créer un compte de service.
Sélectionnez un projet Google Cloud.
Saisissez le nom du compte de service à afficher dans la console Google Cloud .
Cliquez sur Créer et continuer.
Attribuez le rôle roles/storage.admin sur le bucket.
Cliquez sur OK pour terminer la création du compte de service.
Créer et télécharger Google Cloud le fichier de clé du compte de service
Accédez à la page Comptes de service.
Sélectionnez un projet Google Cloud.
Cliquez sur l'adresse e-mail du compte de service que vous venez de créer.
Cliquez sur l'onglet Clés.
Cliquez sur le menu Ajouter une clé, puis sélectionnez Créer une clé.
Sélectionnez le type de clé JSON, puis cliquez sur Créer.
- Cliquez sur Créer pour télécharger un fichier de clé de compte de service. Une fois téléchargé, vous ne pourrez plus le télécharger à nouveau.
- La clé téléchargée est au format suivant, où
PRIVATE_KEY
correspond à la partie privée de la paire de clés publique/privée.
Configurer Akamai WAF pour envoyer des journaux à Cloud Storage
- Connectez-vous à Akamai Control Center.
- Accédez à la section Sécurité.
- Sélectionnez Journaux.
- Configurer une nouvelle distribution de journaux :
- Source du journal : sélectionnez votre configuration WAF.
- Destination : sélectionnez Google Cloud Storage.
- Nom à afficher : saisissez une description unique.
- Bucket : spécifiez le nom du bucket Cloud Storage que vous avez créé (par exemple,
gs://akamai-waf-logs
). - ID du projet : saisissez l'ID unique de votre projet Google Cloud .
- Nom du compte de service : saisissez le nom du compte de service que vous avez créé précédemment.
- Clé privée : saisissez la valeur private_key de la clé JSON que vous avez générée et téléchargée précédemment. (Vous devez saisir votre clé privée au format PEM avec des symboles de saut de ligne (\n), par exemple
-----BEGIN PRIVATE KEY-----\nprivate_key\n-----END PRIVATE KEY-----\n
.) - Format du journal : choisissez le format de journal souhaité (par exemple, JSON).
- Fréquence des notifications push : sélectionnez la fréquence à laquelle vous souhaitez recevoir les journaux (par exemple,
every 60 seconds
).
Cliquez sur Valider et enregistrer pour valider la connexion à la destination et enregistrer les informations que vous avez fournies.
Google CloudCliquez sur Suivant pour accéder à l'onglet Récapitulatif.
Configurer des flux
Il existe deux points d'entrée différents pour configurer les flux dans la plate-forme Google SecOps :
- Paramètres SIEM> Flux
- Plate-forme de contenu > Packs de contenu
Configurer des flux à partir de Paramètres SIEM > Flux à l'aide de Google Cloud Stockage
Pour configurer un flux, procédez comme suit :
- Accédez à Paramètres SIEM> Flux.
- Cliquez sur Add New Feed (Ajouter un flux).
- Sur la page suivante, cliquez sur Configurer un seul flux.
- Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple, Journaux Akamai WAF).
- Sélectionnez Google Cloud Storage comme Type de source.
- Sélectionnez Akamai WAF comme type de journal.
- Cliquez sur Obtenir un compte de service en tant que compte de service Chronicle.
- Cliquez sur Suivant.
Spécifiez les valeurs des paramètres d'entrée suivants :
- URI du bucket Storage : URL du bucket Storage (par exemple,
gs://akamai-waf-logs
). Google Cloud - URI Is A (L'URI est un) : sélectionnez Directory which includes subdirectories (Répertoire incluant des sous-répertoires).
- Options de suppression de la source : sélectionnez l'option de suppression de votre choix.
- URI du bucket Storage : URL du bucket Storage (par exemple,
Cliquez sur Suivant.
Vérifiez la configuration de votre nouveau flux sur l'écran "Finaliser", puis cliquez sur Envoyer.
Configurer des flux depuis le Hub de contenu
Indiquez les valeurs des champs suivants :
- URI du bucket Storage : URL du bucket Storage (par exemple,
gs://akamai-waf-logs
). Google Cloud - URI Is A (L'URI est un) : sélectionnez Directory which includes subdirectories (Répertoire incluant des sous-répertoires).
Options de suppression de la source : sélectionnez l'option de suppression de votre choix.
Options avancées
- Nom du flux : valeur préremplie qui identifie le flux.
- Type de source : méthode utilisée pour collecter les journaux dans Google SecOps.
- Espace de noms de l'élément : espace de noms associé au flux.
- Libellés d'ingestion : libellés appliqués à tous les événements de ce flux.
Exporter et ingérer les journaux Akamai WAF depuis AWS S3
Cette section explique les étapes initiales de la configuration de votre bucket Amazon S3 pour recevoir et stocker les journaux Akamai WAF.
Configurer le bucket Amazon S3
- 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.
- 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 Akamai WAF pour envoyer des journaux à Amazon S3
- Connectez-vous à Akamai Control Center.
- Accédez à la section Sécurité.
- Sélectionnez Journaux.
Configurer une nouvelle diffusion des journaux :
- Source du journal : sélectionnez votre configuration WAF.
- Destination : sélectionnez Amazon S3.
- Bucket S3 : spécifiez le nom du bucket S3 que vous avez créé.
- Région : sélectionnez la région AWS dans laquelle se trouve votre bucket S3.
- ID de clé d'accès et clé d'accès secrète : fournissez les identifiants que vous avez générés.
- Format du journal : choisissez le format de journal souhaité (par exemple, JSON).
Fréquence d'envoi : sélectionnez la fréquence à laquelle vous souhaitez recevoir les journaux (par exemple, toutes les 5 minutes).
Vérifiez la diffusion des journaux :
- Après avoir configuré LDS, surveillez le bucket S3 pour les fichiers journaux entrants.
Configurer des flux à partir de Paramètres SIEM > Flux à l'aide d'AWS S3
Pour configurer un flux, procédez comme suit :
- Accédez à Paramètres SIEM> Flux.
- Cliquez sur Add New Feed (Ajouter un flux).
- Sur la page suivante, cliquez sur Configurer un seul flux.
- Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple, Journaux Akamai WAF).
- Sélectionnez Amazon S3 comme Type de source.
- Sélectionnez Akamai WAF comme type de journal.
- Cliquez sur Suivant.
Spécifiez les valeurs des paramètres d'entrée suivants :
- Région : région dans laquelle se trouve le bucket Amazon S3.
- URI S3 : URI du bucket.
s3:/BUCKET_NAME
Remplacez les éléments suivants :BUCKET_NAME
: nom du bucket.
- URI is a (L'URI est un) : sélectionnez le TYPE d'URI en fonction de la configuration du flux de journaux : Single file (Fichier unique), Directory (Répertoire) ou Directory which includes subdirectories (Répertoire incluant des sous-répertoires).
- Options de suppression de la source : sélectionnez l'option de suppression de votre choix.
- 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.
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 (ordre croissant) | Mappage UDM | Logique |
---|---|---|
attackData.clientIP |
principal.ip , principal.asset.ip |
Adresse IP du client à l'origine de la requête. Extrait du champ attackData.clientIP des journaux akamai_siem. |
attackData.configId |
metadata.product_log_id |
ID de configuration de la sécurité. Extrait du champ attackData.configId des journaux akamai_siem. Également ajouté en tant que detection_field dans l'objet security_result. |
attackData.policyId |
N/A | Utilisé dans la logique du parseur pour renseigner security_result.summary avec la valeur PolicyId:[value] . |
attackData.ruleActions |
security_result.action , security_result.action_details |
Actions effectuées en fonction de la règle déclenchée. Extrait du champ attackData.ruleActions des journaux akamai_siem. "deny" est mappé sur BLOCK, tandis que les autres valeurs ("alert", "monitor", "allow", "tarpit") sont mappées sur ALLOW. La valeur d'origine est également stockée dans action_details . |
attackData.ruleData |
security_result.detection_fields |
Données associées à la règle déclenchée. Extrait du champ attackData.ruleData des journaux akamai_siem. Ajouté à security_result.detection_fields avec la clé "RuleData". |
attackData.ruleMessages |
security_result.threat_name |
Messages associés à la règle déclenchée. Extrait du champ attackData.ruleMessages des journaux akamai_siem. |
attackData.ruleSelectors |
security_result.detection_fields |
Sélecteurs associés à la règle déclenchée. Extrait du champ attackData.ruleSelectors des journaux akamai_siem. Ajouté à security_result.detection_fields avec la clé "RuleSelector". |
attackData.ruleTags |
security_result.category_details |
Tags associés à la règle déclenchée. Extrait du champ attackData.ruleTags des journaux akamai_siem. |
attackData.ruleVersions |
security_result.detection_fields |
Versions des règles déclenchées. Extrait du champ attackData.ruleVersions des journaux akamai_siem. Ajouté à security_result.detection_fields avec la clé "Rule Version". |
clientReputation |
principal.labels |
Informations sur la réputation du client. Extrait du champ clientReputation des journaux akamai_siem. Ajouté en tant que libellé au compte principal avec la clé "reputation". |
cliIP , cli_ip , principal_ip |
principal.ip , principal.asset.ip |
Adresse IP du client. Extrait de cliIP , cli_ip ou principal_ip selon le format du journal. |
cp |
additional.fields |
Code CP. Extrait du champ cp . Ajouté à additional.fields avec la clé "cp". |
eventId |
metadata.product_log_id |
ID de l'événement. Extrait du champ eventId . |
eventTime , log_date |
metadata.event_timestamp |
Horodatage de l'événement. Extrait de eventTime ou analysé à partir de log_date , selon le format du journal. |
eventType.eventDefinition.eventDefinitionId |
target.resource.product_object_id |
ID de la définition de l'événement. Extrait de eventType.eventDefinition.eventDefinitionId . |
eventType.eventDefinition.eventDescription |
metadata.description |
Description de l'événement. Extrait de eventType.eventDefinition.eventDescription . |
eventType.eventDefinition.eventName |
metadata.product_event_type |
Nom de l'événement. Extrait de eventType.eventDefinition.eventName . |
eventType.eventTypeId |
additional.fields |
ID du type d'événement. Extrait de eventType.eventTypeId . Ajouté à additional.fields avec la clé "eventTypeId". |
eventType.eventTypeName |
additional.fields |
Nom du type d'événement. Extrait de eventType.eventTypeName . Ajouté à additional.fields avec la clé "eventTypeName". |
format |
N/A | Utilisé par l'analyseur pour déterminer le format du journal. |
geo.asn |
principal.location.name |
Numéro de système autonome (ASN). Extrait de geo.asn ou AkamaiSiemASN selon le format du journal. La valeur est précédée de "ASN ". |
geo.city |
principal.location.city |
Ville. Extrait de geo.city ou AkamaiSiemCity selon le format du journal. |
geo.country |
principal.location.country_or_region |
Pays. Extrait de geo.country ou AkamaiSiemContinent selon le format du journal. |
httpMessage.bytes |
network.sent_bytes |
Octets envoyés dans le message HTTP. Extrait de httpMessage.bytes . |
httpMessage.host |
target.hostname , target.asset.hostname |
Nom d'hôte. Extrait de httpMessage.host ou reqHost selon le format du journal. |
httpMessage.method |
network.http.method |
Méthode HTTP. Extrait de httpMessage.method , network_http_method ou reqMethod selon le format du journal. Converti en majuscules. |
httpMessage.path |
target.url |
Chemin de requête. Extrait de httpMessage.path , target_url ou reqPath selon le format du journal. Si httpMessage.query est présent, il est ajouté au chemin d'accès avec un séparateur "?". |
httpMessage.port |
target.port |
Port. Extrait de httpMessage.port ou reqPort selon le format du journal. |
httpMessage.protocol |
N/A | Utilisé par l'analyseur pour déterminer le protocole. |
httpMessage.query |
N/A | Utilisé dans la logique du parseur pour ajouter à httpMessage.path , le cas échéant. |
httpMessage.requestId |
network.session_id |
ID de la demande. Extrait de httpMessage.requestId ou reqId selon le format du journal. |
httpMessage.requestHeaders , AkamaiSiemRequestHeaders |
additional.fields |
En-têtes de requête. Extrait de httpMessage.requestHeaders ou AkamaiSiemRequestHeaders selon le format du journal. Ajouté à additional.fields avec la clé "AkamaiSiemRequestHeaders". |
httpMessage.responseHeaders , AkamaiSiemResponseHeaders |
additional.fields |
En-têtes de réponse. Extrait de httpMessage.responseHeaders ou AkamaiSiemResponseHeaders selon le format du journal. Ajouté à additional.fields avec la clé "AkamaiSiemResponseHeaders". |
httpMessage.status , AkamaiSiemResponseStatus , network_http_response_code , statusCode |
network.http.response_code |
Code de réponse HTTP. Extrait de httpMessage.status , AkamaiSiemResponseStatus , network_http_response_code ou statusCode selon le format du journal. |
httpMessage.tls , AkamaiSiemTLSVersion , tlsVersion |
network.tls.version |
Version TLS. Extrait de httpMessage.tls , AkamaiSiemTLSVersion ou tlsVersion selon le format du journal. |
httpMessage.useragent , network_http_user_agent , UA , useragent |
network.http.user_agent |
User-agent. Extrait de httpMessage.useragent , network_http_user_agent , UA ou useragent selon le format du journal. |
log_description |
metadata.description |
Description du journal. Extrait de log_description . |
log_rule |
security_result.rule_name |
Règle de journalisation. Extrait de log_rule . |
message |
N/A | Message de journal brut. Utilisé par l'analyseur pour diverses extractions. |
network_http_referral_url |
network.http.referral_url |
URL de provenance HTTP. Extrait de network_http_referral_url . |
proto |
N/A | Utilisé dans la logique du parseur pour remplir security_result.summary si attackData.policyId n'est pas présent. |
reqHost |
target.hostname , target.asset.hostname |
Demandez à devenir l'organisateur. Extrait de reqHost . |
reqId |
metadata.product_log_id , network.session_id |
ID de la demande. Extrait de reqId . |
reqMethod |
network.http.method |
Méthode de requête. Extrait de reqMethod . |
reqPath |
target.url |
Chemin de requête. Extrait de reqPath . |
reqPort |
target.port |
Port de requête. Extrait de reqPort . |
rspContentType |
target.file.mime_type |
Type de contenu de la réponse. Extrait de rspContentType . |
securityRules |
security_result.rule_name , security_result.about.resource.attribute.labels |
Règles de sécurité. Extrait de securityRules . La première partie est mappée sur rule_name , et le reste est ajouté en tant que libellés avec les clés "non_deny_rules" et "deny_rule_format". |
statusCode |
network.http.response_code |
Code d'état. Extrait de statusCode . |
state |
principal.location.state , target.user.personal_address.state |
État. Extrait de state . |
tlsVersion |
network.tls.version |
Version TLS. Extrait de tlsVersion . |
type |
metadata.product_event_type |
Type d'événement. Extrait de type . |
UA |
network.http.user_agent |
User-agent. Extrait de UA . |
version |
metadata.product_version , principal.asset.software.version |
Version. Extrait de version . |
N/A | metadata.event_timestamp |
L'horodatage de l'événement est dérivé du champ _ts dans les journaux akamai_lds, du champ httpMessage.start dans les journaux akamai_siem ou du champ log_date dans d'autres formats. |
N/A | metadata.vendor_name |
Codé en dur sur "Akamai". |
N/A | metadata.product_name |
Codé en dur sur "Kona". |
N/A | metadata.log_type |
Codé en dur sur "AKAMAI_WAF". |
N/A | network.application_protocol |
Définissez la valeur sur "HTTP" pour les journaux akamai_siem et akamai_lds, ou sur "DNS" pour les autres formats. |
N/A | security_result.severity |
Définissez la valeur sur "MEDIUM" pour l'action "alert" (alerte), sur "CRITICAL" pour l'action "deny" (refuser) et sur "HIGH" pour les autres actions. |
N/A | event.idm.read_only_udm.metadata.event_type |
Définissez sa valeur sur "NETWORK_HTTP" pour la plupart des formats de journaux, sur "GENERIC_EVENT" pour les événements avec des champs eventId ou eventData , ou sur "STATUS_UPDATE" pour les événements avec des champs cli_ip ou p_ip , mais sans champ reqHost . |
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.