Collecter les journaux de la zone 1

Compatible avec :

Ce document explique comment ingérer les journaux Area-1 Email Security (de 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 le programme 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 le bucket S3

  1. Créez un bucket Amazon S3 en suivant ce guide de l'utilisateur : Créer un bucket.
  2. Connectez-vous à la console AWS.
  3. Accédez à S3 > Créer un bucket.
  4. Saisissez un nom pour le bucket (par exemple, area1-security-logs).
  5. Conservez les autres valeurs par défaut (ou configurez le chiffrement et le contrôle des versions si nécessaire).
  6. Cliquez sur Créer.
  7. Enregistrez le nom et la région du bucket pour référence ultérieure.
  8. Créez un utilisateur en suivant ce guide de l'utilisateur : Créer un utilisateur IAM.
  9. Sélectionnez l'utilisateur créé.
  10. Sélectionnez l'onglet Informations d'identification de sécurité.
  11. Cliquez sur Créer une clé d'accès dans la section Clés d'accès.
  12. Sélectionnez Service tiers comme Cas d'utilisation.
  13. Cliquez sur Suivant.
  14. Facultatif : Ajoutez un tag de description.
  15. Cliquez sur Créer une clé d'accès.
  16. Cliquez sur Télécharger le fichier CSV, puis enregistrez la clé d'accès et la clé d'accès secrète pour les consulter ultérieurement.
  17. Cliquez sur OK.
  18. Sélectionnez l'onglet Autorisations.
  19. Dans Règles d'autorisation, cliquez sur Ajouter des autorisations.
  20. Sélectionnez Joindre directement des règles.
  21. Recherchez la règle AmazonS3FullAccess.
  22. Sélectionnez la règle.
  23. Cliquez sur Suivant.
  24. Cliquez sur Ajouter des autorisations.

Obtenir les identifiants de l'API Area 1

  1. Connectez-vous au tableau de bord Area-1 Security (Cloudflare).
  2. Accédez à Paramètres > Accès à l'API.
  3. Générez la clé API (jeton).
  4. Copiez et enregistrez le jeton dans un endroit sûr.

Configurer les packages Python requis

  1. 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 de récupération des journaux de la zone 1

  1. 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)
    
  2. Enregistrer et quitter vi : cliquez sur esc, puis saisissez :wq.

Stocker les variables d'environnement

  1. 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>"
    
  2. Assurez-vous que le fichier est sécurisé :

    chmod 600 /etc/area1.env
    

Exécuter et tester le script

  1. Exécutez le script suivant :

    python3 area1_to_s3.py
    
  2. Vous devriez obtenir le résultat suivant :

    Uploaded area1_events_20250701.json to s3://area1-security-logs/logs/
    

Automatiser avec Cron

  1. 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.py
    
  2. Rendez le fichier exécutable :

    chmod +x /usr/local/bin/run_area1.sh
    
  3. Exé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 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

Pour configurer un flux, procédez comme suit :

  1. Accédez à Paramètres SIEM> Flux.
  2. Cliquez sur Add New Feed (Ajouter un flux).
  3. Sur la page suivante, cliquez sur Configurer un seul flux.
  4. Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple, Area1 Logs).
  5. Sélectionnez Amazon S3 comme Type de source.
  6. Sélectionnez Area1 Security comme Type de journal.
  7. Cliquez sur Suivant.
  8. 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 (au format s3://<your-log-bucket-name>). Remplacez les éléments suivants :
      • your-log-bucket-name : nom du bucket.
    • L'URI est : 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 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.
  9. Cliquez sur Suivant.

  10. 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 :

  • Région : région dans laquelle se trouve le bucket Amazon S3.

    • URI S3 : URI du bucket (au format s3://<your-log-bucket-name>). Remplacez les éléments suivants :
      • your-log-bucket-name : nom du bucket.
    • L'URI est : 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 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.§

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 de 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 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 est 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.
temps 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.

Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.