Collecter les journaux Cloudflare Page Shield
Ce document explique comment ingérer des journaux Cloudflare Page Shield dans Google Security Operations à l'aide d'Amazon S3.
Page Shield vous aide à gérer les ressources chargées par les visiteurs de votre site Web, y compris les scripts, leurs connexions et les cookies. Il déclenche des notifications d'alerte lorsque les ressources changent ou sont considérées comme malveillantes.
Avant de commencer
- Une instance Google SecOps
- Compte Cloudflare avec Page Shield activé
- Accès privilégié au tableau de bord Cloudflare
- Accès privilégié à AWS (S3, IAM)
Cette option utilise Cloudflare Logpush pour exporter les événements Page Shield vers Amazon S3, que Google SecOps ingère ensuite.
Activer Page Shield
- Connectez-vous au tableau de bord Cloudflare.
- Sélectionnez votre compte et votre domaine.
- Accédez à Sécurité> Page Shield.
- Cliquez sur Activer Page Shield.
Créer un bucket Amazon S3
- Ouvrez la console Amazon S3.
- Cliquez sur Créer un bucket.
- Fournissez les informations de configuration suivantes :
- Nom du bucket : saisissez un nom explicite pour le bucket (par exemple,
cloudflare-pageshield-logs). - Région : sélectionnez la région AWS de votre choix (par exemple,
us-east-1).
- Nom du bucket : saisissez un nom explicite pour le bucket (par exemple,
- Cliquez sur Créer.
- Enregistrez le nom et la région du bucket pour référence ultérieure.
Créer un utilisateur IAM avec accès à S3
- Ouvrez la console IAM.
- Cliquez sur Utilisateurs > Ajouter un utilisateur.
- Saisissez un nom d'utilisateur (par exemple,
chronicle-s3-user). - Sélectionnez Accès programmatique.
- Cliquez sur Next: Permissions (Suivant : Autorisations).
- Sélectionnez Joindre directement des règles existantes.
- Recherchez et sélectionnez la règle AmazonS3FullAccess.
- Cliquez sur Next: Tags (Suivant : Tags).
- Cliquez sur Suivant : Relire.
- Cliquez sur Créer un utilisateur.
- Cliquez sur Download .csv file (Télécharger le fichier .csv) pour enregistrer l'ID de clé d'accès et la clé d'accès secrète.
Configurer la stratégie de bucket S3 pour Cloudflare
- Dans la console Amazon S3, sélectionnez votre bucket.
- Cliquez sur Autorisations > Règle du bucket.
- Cliquez sur Modifier.
Collez la règle suivante en remplaçant
<BUCKET_NAME>par le nom de votre bucket :{ "Id": "Policy1506627184792", "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1506627150918", "Action": ["s3:PutObject"], "Effect": "Allow", "Resource": "arn:aws:s3:::<BUCKET_NAME>/*", "Principal": { "AWS": ["arn:aws:iam::391854517948:user/cloudflare-logpush"] } } ] }Cliquez sur Enregistrer les modifications.
Créer un job Cloudflare Logpush
- Connectez-vous au tableau de bord Cloudflare.
- Sélectionnez votre compte et votre domaine.
- Accédez à Analytics et journaux > Journaux.
- Cliquez sur Create a Logpush job (Créer un job Logpush).
- Dans Sélectionner une destination, choisissez Amazon S3.
- Saisissez les informations suivantes sur la destination :
- Nom du bucket : saisissez le nom de votre bucket S3 (par exemple,
cloudflare-pageshield-logs). - Région du bucket : sélectionnez la région correspondant à votre bucket S3.
- Chemin d'accès au bucket (facultatif) : saisissez un préfixe de chemin d'accès (par exemple,
pageshield/).
- Nom du bucket : saisissez le nom de votre bucket S3 (par exemple,
- Cliquez sur Continuer.
- Pour prouver que vous êtes bien le propriétaire, Cloudflare enverra un fichier à la destination que vous aurez indiquée. Pour trouver le jeton, sélectionnez le bouton "Ouvrir" dans l'onglet "Vue d'ensemble" du fichier de validation de la propriété, puis collez-le dans le tableau de bord Cloudflare pour vérifier votre accès au bucket. Saisissez le jeton de propriété, puis sélectionnez "Continuer".
- Dans Sélectionner un ensemble de données, choisissez Événements Page Shield.
- Cliquez sur Suivant.
- Configurez votre tâche logpush :
- Nom du job : saisissez un nom descriptif (par exemple,
pageshield-to-s3). - Si les journaux correspondent : laissez ce champ vide pour inclure tous les événements ou configurez les filtres selon vos besoins.
- Envoyer les champs suivants : sélectionnez Tous les champs ou choisissez des champs spécifiques.
- Nom du job : saisissez un nom descriptif (par exemple,
- Cliquez sur Envoyer.
Configurer un flux dans Google SecOps pour ingérer les journaux Page Shield
- 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,
Cloudflare Page Shield S3). - Sélectionnez Amazon S3 V2 comme type de source.
- Sélectionnez Cloudflare Page Shield comme Type de journal.
- Cliquez sur Suivant.
Spécifiez les valeurs des paramètres d'entrée suivants :
URI S3 : saisissez l'URI du bucket au format
s3://<BUCKET_NAME>/<BUCKET_PATH>/.Option de suppression de la source : sélectionnez l'option de suppression de votre choix :
- Jamais : ne supprime jamais aucun fichier après les transferts.
- Supprimer les fichiers transférés : supprime les fichiers après un transfert réussi.
- Supprimer les fichiers transférés et les répertoires vides : supprime les fichiers et les répertoires vides après un transfert réussi.
Â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é à appliquer aux événements de ce flux.
Cliquez sur Suivant.
Vérifiez la configuration de votre nouveau flux sur l'écran Finaliser, puis cliquez sur Envoyer.
Table de mappage UDM
| Champ de journal | Mappage UDM | Logique |
|---|---|---|
| URLContainsCDNCGIPath | event.idm.read_only_udm.additional.fields.CGI_label | Valeur extraite de URLContainsCDNCGIPath, définie comme string_value dans le libellé avec la clé "CGI" |
| Action | event.idm.read_only_udm.additional.fields.action_label | Valeur extraite de l'action, définie comme string_value dans le libellé avec la clé "action" |
| resource.first_page_url | event.idm.read_only_udm.additional.fields.first_page_label | Valeur extraite de resource.first_page_url, définie comme string_value dans le libellé avec la clé "first_page_url" |
| resource.last_page_url | event.idm.read_only_udm.additional.fields.last_page_label | Valeur extraite de resource.last_page_url, définie comme string_value dans le libellé avec la clé "last_page_url" |
| nom | event.idm.read_only_udm.additional.fields.name_label | Valeur extraite du nom, définie comme string_value dans le libellé avec la clé "name" |
| ts | event.idm.read_only_udm.metadata.event_timestamp | Converti de ts (UNIX) en code temporel |
| event.idm.read_only_udm.metadata.event_type | Dérivé de has_principal, has_target, has_target_user : NETWORK_CONNECTION si principal et cible ; USER_UNCATEGORIZED si target_user ; STATUS_UPDATE si principal ; sinon GENERIC_EVENT | |
| resource.url | event.idm.read_only_udm.network.http.referral_url | Valeur extraite de resource.url |
| Hôte | event.idm.read_only_udm.principal.asset.hostname | Valeur extraite de Host ou host.hostname |
| Hôte | event.idm.read_only_udm.principal.hostname | Valeur extraite de Host ou host.hostname |
| alert_type | event.idm.read_only_udm.principal.resource.attribute.labels.alert_type_label | Valeur extraite de alert_type, définie comme valeur dans le libellé avec la clé "alert_type" |
| resource.cryptomining_score | event.idm.read_only_udm.principal.resource.attribute.labels.crypto_label | Valeur extraite de resource.cryptomining_score, définie comme valeur dans le libellé avec la clé "cryptominingscore%{index2}" |
| resource.dataflow_score | event.idm.read_only_udm.principal.resource.attribute.labels.dataflow_label | Valeur extraite de resource.dataflow_score, définie comme valeur dans le libellé avec la clé "dataflowscore%{index2}" |
| policie.description | event.idm.read_only_udm.principal.resource.attribute.labels.desc_label | Valeur extraite de policie.description, définie comme valeur dans le libellé avec la clé "description_%{index}" |
| version.fetched_at | event.idm.read_only_udm.principal.resource.attribute.labels.fetched_at_label | Valeur extraite de version.fetched_at, définie comme valeur dans le libellé avec la clé "fetchedat%{index2}" |
| version.hash | event.idm.read_only_udm.principal.resource.attribute.labels.hash_label | Valeur extraite de version.hash, définie comme valeur dans le libellé avec la clé "hash_%{index2}" |
| policie.id | event.idm.read_only_udm.principal.resource.attribute.labels.id_label | Valeur extraite de policie.id, définie comme valeur dans le libellé avec la clé "policyid%{index}" |
| data.options.remove_dashboard_links | event.idm.read_only_udm.principal.resource.attribute.labels.remove_dash_label | Valeur extraite de data.options.remove_dashboard_links, définie comme valeur dans le libellé avec la clé "remove_dashboard_links" |
| resource.resource_type | event.idm.read_only_udm.principal.resource.attribute.labels.res_type_label | Valeur extraite de resource.resource_type, définie comme valeur dans le libellé avec la clé "resourcetype%{index2}" |
| data.type | event.idm.read_only_udm.principal.resource.attribute.labels.type_label | Valeur extraite de data.type, définie comme valeur dans le libellé avec la clé "type" |
| data.zones | event.idm.read_only_udm.principal.resource.attribute.labels.zones_label | Valeur extraite de data.zones, définie comme valeur dans le libellé avec la clé "zones" |
| resource.id | event.idm.read_only_udm.principal.resource.id | Valeur extraite de resource.id |
| PageURL | event.idm.read_only_udm.principal.url | Valeur extraite de PageURL |
| account_id | event.idm.read_only_udm.principal.user.product_object_id | Valeur extraite de account_id |
| policy_id | event.idm.read_only_udm.security_result.detection_fields.policy_id_label | Valeur extraite de policy_id, définie comme valeur dans le libellé avec la clé "policy_id" |
| policy_name | event.idm.read_only_udm.security_result.detection_fields.policy_name_label | Valeur extraite de policy_name, définie comme valeur dans le libellé avec la clé "policy_name" |
| texte | event.idm.read_only_udm.security_result.description | Valeur extraite du texte |
| resource.first_seen_at | event.idm.read_only_udm.security_result.first_discovered_time | Conversion de resource.first_seen_at en code temporel ISO8601 |
| PolicyID | event.idm.read_only_udm.security_result.rule_name | Valeur extraite de PolicyID |
| data.severity | event.idm.read_only_udm.security_result.severity | Dérivé de data.severity : si "INFO" → "INFORMATIONAL", si "WARN" → "MEDIUM", sinon "UNKNOWN_SEVERITY" |
| URL | event.idm.read_only_udm.target.url | Valeur extraite de l'URL |
| URLHost | event.idm.read_only_udm.target.user.email_addresses | Valeur extraite de URLHost si elle correspond au format d'adresse e-mail |
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.