Collecter les journaux Area 1
Version de l'analyseur : 3.0
Ce document explique comment ingérer les journaux Area 1 Email Security (par Cloudflare) dans Google Security Operations à l'aide d'AWS S3. L'analyseur traite les journaux au format JSON. Il extrait les champs pertinents de la structure JSON imbriquée, les mappe au modèle de données unifié (UDM) et enrichit les données avec des informations géographiques et des détails de sécurité tels que les hachages et la disposition des pièces jointes.
Avant de commencer
Assurez-vous de remplir les conditions suivantes :
- Instance Google SecOps
- Un hôte Windows 2016 ou version ultérieure, ou un hôte Linux avec
systemd - Si vous exécutez l'outil derrière un proxy, les ports du pare-feu sont ouverts.
- Accès privilégié à Area 1 Email Security (par Cloudflare)
Configurer AWS IAM et un bucket S3
- Créez un bucket Amazon S3 en suivant ce guide de l'utilisateur : Créer un bucket.
- Connectez-vous à la console AWS.
- Accédez à S3 > Create bucket (S3 > Créer un bucket).
- Saisissez un nom pour le bucket (par exemple,
area1-security-logs). - Conservez les autres valeurs par défaut (ou configurez le chiffrement et la gestion des versions si nécessaire).
- Cliquez sur Créer.
- 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 Security credentials (Identifiants 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 un tag de description.
- Cliquez sur Créer une clé d'accès.
- Cliquez sur Download CSV file (Télécharger le fichier CSV) et stockez la clé d'accès et la clé d'accès secrète pour pouvoir vous y référer ultérieurement.
- Cliquez sur OK.
- Sélectionnez l'onglet Autorisations.
- Dans Stratégies d'autorisation, cliquez sur Ajouter des autorisations.
- Sélectionnez Associer directement des stratégies.
- Recherchez la stratégie AmazonS3FullAccess.
- Sélectionnez la règle.
- Cliquez sur Suivant.
- Cliquez sur Ajouter des autorisations.
Obtenir les identifiants de l'API Area 1
- Connectez-vous au tableau de bord Area 1 Security (Cloudflare).
- Accédez à Settings > API Access (Paramètres > Accès à l'API).
- Générez la clé API (jeton).
- Copiez et enregistrez le jeton dans un emplacement sécurisé.
Configurer les packages Python requis
Connectez-vous à votre hôte de collecte de journaux (par exemple, une VM AWS) et exécutez la commande suivante pour configurer les identifiants AWS :
pip install boto3 requests aws configure
Créer le script Area 1 Log Puller
Créez le fichier suivant en saisissant
sudo vi area1_to_s3.py, puis copiez le code suivant :- Ajustez les éléments suivants :
#!/usr/bin/env python3 import os import requests import boto3 import datetime import json # Configuration AREA1_API_TOKEN = os.environ.get("AREA1_API_TOKEN") # Load securely from env AWS_PROFILE = os.environ.get("AWS_PROFILE", None) # Optional, for named profiles S3_BUCKET_NAME = "area1-security-logs" LOG_TYPE = "events" # Time range end_time = datetime.datetime.utcnow() start_time = end_time - datetime.timedelta(days=1) def fetch_area1_logs(): url = f"https://api.area1security.com/v1/{LOG_TYPE}" headers = { "Authorization": f"Bearer {AREA1_API_TOKEN}", "Accept": "application/json" } params = { "startDate": start_time.strftime("%Y-%m-%dT%H:%M:%SZ"), "endDate": end_time.strftime("%Y-%m-%dT%H:%M:%SZ") } response = requests.get(url, headers=headers, params=params) response.raise_for_status() return response.json() def upload_to_s3(data): filename = f"area1_{LOG_TYPE}_{start_time.strftime('%Y%m%d')}.json" session = boto3.Session(profile_name=AWS_PROFILE) if AWS_PROFILE else boto3.Session() s3 = session.client("s3") s3.put_object( Bucket=S3_BUCKET_NAME, Key=f"logs/{filename}", Body=json.dumps(data).encode("utf-8"), ContentType="application/json" ) print(f"[✓] Uploaded {filename} to s3://{S3_BUCKET_NAME}/logs/") if __name__ == "__main__": logs = fetch_area1_logs() upload_to_s3(logs)Enregistrez et quittez
vi: cliquez suresc, puis saisissez:wq.
Stocker les variables d'environnement
Créez un fichier sécurisé pour stocker les variables d'environnement dans
/etc/area1.env(ou/home/user/.area1.env).export AREA1_API_TOKEN="your_actual_area1_api_token" export AWS_PROFILE="<your_aws_programmatic_username>"Assurez-vous que le fichier est sécurisé :
chmod 600 /etc/area1.env
Exécuter et tester le script
Exécutez le script suivant :
python3 area1_to_s3.pyVous devriez obtenir le résultat suivant :
Uploaded area1_events_20250701.json to s3://area1-security-logs/logs/
Automatiser avec Cron
Créez un script wrapper pour Cron en exécutant
sudo vi /usr/local/bin/run_area1.sh, puis copiez le code suivant :#!/usr/bin/env bash set -euo pipefail source /etc/area1.env /usr/bin/python3 /opt/scripts/area1_to_s3.pyRendez le fichier exécutable :
chmod +x /usr/local/bin/run_area1.shExécution programmée tous les jours à 1h00 UTC :
crontab -e 0 1 * * * /usr/local/bin/run_area1.sh >> /var/log/area1_to_s3.log 2>&1
Configurer des flux
Il existe deux points d'entrée différents pour configurer des flux dans la plate-forme Google SecOps :
- Paramètres > Gestion des données > Flux > Ajouter un flux (sur la plate-forme SIEM uniquement, Paramètres > Flux > Ajouter un flux)
- Content Hub > Packs de contenu > Premiers pas
Configurez les flux depuis Paramètres > Gestion des données > Flux.
Pour configurer un flux, procédez comme suit :
- Accédez à Paramètres > Gestion des données > Flux. Si vous utilisez une plate-forme SIEM uniquement, accédez à Paramètres > Flux.
- Cliquez sur Ajouter un flux d'actualités.
- Sur la page suivante, cliquez sur Configurer un seul flux.
- Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple,
Area1 Logs). - Sélectionnez Amazon S3 comme Type de source.
- Sélectionnez Area1 Security comme type de journal.
- Cliquez sur Suivant.
Spécifiez les valeurs des paramètres d'entrée suivants :
- Région : région où se trouve le bucket Amazon S3.
- URI S3 : URI du bucket (le format doit être
s3://<your-log-bucket-name>). Remplacez les éléments suivants :your-log-bucket-name: nom du bucket.
- L'URI est un : sélectionnez 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 de l'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 d'actualités sur l'écran Finaliser, puis cliquez sur Envoyer.
Configurer des flux à partir du hub de contenus
Spécifiez les valeurs des champs suivants :
Région : région où se trouve le bucket Amazon S3.
- URI S3 : URI du bucket (le format doit être
s3://<your-log-bucket-name>). Remplacez les éléments suivants :your-log-bucket-name: nom du bucket.
- L'URI est un : sélectionnez 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 de l'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.§
- URI S3 : URI du bucket (le format doit être
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.
Table de mappage UDM
| Champ du journal | Mappage UDM | Logique |
|---|---|---|
| alert_id | security_result.rule_id | La valeur est extraite du champ alert_id. |
| alert_reasons | security_result.description | La valeur est extraite du champ alert_reasons. |
| attachments.att_size | security_result.about.file.size | La valeur est extraite du champ attachments.att_size et convertie en entier non signé. |
| attachments.disposition | security_result.about.user.attribute.labels.value | La valeur est extraite du champ attachments.disposition. |
| attachments.extension | security_result.about.file.mime_type | La valeur est extraite du champ attachments.extension. |
| attachments.md5 | security_result.about.file.md5 | La valeur est extraite du champ attachments.md5. |
| attachments.name | security_result.about.file.full_path | La valeur est extraite du champ attachments.name. |
| attachments.sha1 | security_result.about.file.sha1 | La valeur est extraite du champ attachments.sha1. |
| attachments.sha256 | security_result.about.file.sha256 | La valeur est extraite du champ attachments.sha256. |
| attachments.ssdeep | security_result.about.file.ssdeep | La valeur est extraite du champ attachments.ssdeep. |
| delivery_mode | security_result.detection_fields.value | La valeur est extraite du champ delivery_mode. |
| envelope_from | principal.user.email_addresses, network.email.from | La valeur est extraite du champ envelope_from. |
| envelope_to | network.email.to, target.user.email_addresses | La valeur est extraite du champ envelope_to. |
| final_disposition | security_result.category_details | La valeur est extraite du champ final_disposition. |
| message_id | metadata.product_log_id | La valeur est extraite du champ message_id après la suppression des caractères "<" et ">". |
| replyto | network.email.bounce_address | La valeur est extraite du champ replyto. |
| smtp_helo_server_ip | principal.ip | La valeur est extraite du champ smtp_helo_server_ip. |
| smtp_helo_server_ip_as_name | principal.location.name | La valeur est extraite du champ smtp_helo_server_ip_as_name. |
| smtp_helo_server_ip_as_number | principal.asset_id | La valeur est extraite du champ smtp_helo_server_ip_as_number et précédée de asset_id:. |
| smtp_helo_server_ip_geo | principal.location.country_or_region, principal.location.state, principal.location.city | La valeur est extraite du champ smtp_helo_server_ip_geo à l'aide d'un modèle Grok. |
| smtp_helo_server_name | principal.administrative_domain | La valeur est extraite du champ smtp_helo_server_name. |
| source | metadata.vendor_name | La valeur est extraite du champ source. Si le champ est vide, la valeur est définie sur area1security. |
| subject | network.email.subject | La valeur est extraite du champ subject. |
| heure | metadata.event_timestamp | La valeur est extraite du champ time et convertie en code temporel. |
| metadata.event_type | La valeur est définie sur EMAIL_TRANSACTION. |
|
| metadata.product_name | La valeur est définie sur AREA1. |
|
| metadata.log_type | La valeur est définie sur AREA1. |
|
| security_result.about.user.attribute.labels.key | La valeur est définie sur disposition. |
|
| security_result.category | La valeur est définie sur SOFTWARE_MALICIOUS. |
|
| security_result.detection_fields.key | La valeur est définie sur delivery_mode. |
|
envelope_to.0" instead of "replyto |
network.email.to |
Mappé à partir du journal des modifications |
Journal des modifications
Afficher le journal des modifications de cet analyseur
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.