Collecter les journaux MuleSoft Anypoint

Compatible avec :

Ce document explique comment ingérer des événements de piste d'audit à partir des journaux de la plate-forme MuleSoft Anypoint vers Google Security Operations à l'aide d'AWS S3.

Avant de commencer

Assurez-vous de remplir les conditions suivantes :

  • Instance Google SecOps
  • Accès privilégié à MuleSoft
  • Accès privilégié à AWS

Obtenir l'ID d'organisation MuleSoft

  1. Connectez-vous à la plate-forme Anypoint.
  2. Accédez à Menu > Gestion des accès.
  3. Dans le tableau Groupes d'entreprises, cliquez sur le nom de votre organisation.
  4. Copiez l'ID de l'organisation (par exemple, 0a12b3c4-d5e6-789f-1021-1a2b34cd5e6f).

Configurer un bucket AWS S3 et IAM pour Google SecOps

  1. Créez un bucket Amazon S3 en suivant ce guide de l'utilisateur : Créer un bucket.
  2. Enregistrez le Nom et la Région du bucket pour référence ultérieure (par exemple, mulesoft-audit-logs).
  3. Créez un utilisateur en suivant ce guide de l'utilisateur : Créer un utilisateur IAM.
  4. Sélectionnez l'utilisateur créé.
  5. Sélectionnez l'onglet Informations d'identification de sécurité.
  6. Cliquez sur Créer une clé d'accès dans la section Clés d'accès.
  7. Sélectionnez Service tiers comme Cas d'utilisation.
  8. Cliquez sur Suivant.
  9. Facultatif : Ajoutez une balise de description.
  10. Cliquez sur Créer une clé d'accès.
  11. 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.
  12. Cliquez sur OK.
  13. Sélectionnez l'onglet Autorisations.
  14. Cliquez sur Ajouter des autorisations dans la section Règles relatives aux autorisations.
  15. Sélectionnez Ajouter des autorisations.
  16. Sélectionnez Joindre directement des règles.
  17. Recherchez et sélectionnez la règle AmazonS3FullAccess.
  18. Cliquez sur Suivant.
  19. Cliquez sur Ajouter des autorisations.

Créer l'application connectée MuleSoft

  1. Connectez-vous à la plate-forme Anypoint.
  2. Accédez à Gestion des accès > Applications connectées > Créer une application.
  3. Fournissez les informations de configuration suivantes :
    • Nom de l'application : saisissez un nom unique (par exemple, Google SecOps export).
    • Sélectionnez L'application agit en son propre nom (identifiants client).
    • Cliquez sur Ajouter des champs d'application → Visionneuse du journal d'audit → Suivant.
    • Sélectionnez tous les groupes d'établissements dont vous avez besoin des journaux.
    • Cliquez sur Suivant > Ajouter des autorisations.
  4. Cliquez sur Save (Enregistrer), puis copiez l'ID client et le code secret du client.

Configurer une stratégie et un rôle IAM pour les importations S3

  1. JSON de la règle (remplacez mulesoft-audit-logs par le nom de votre bucket) :

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "AllowPutAuditObjects",
          "Effect": "Allow",
          "Action": ["s3:PutObject"],
          "Resource": "arn:aws:s3:::mulesoft-audit-logs/*"
        }
      ]
    }
    
  2. Accédez à la console AWS> IAM> Policies> Create policy> onglet JSON.

  3. Copiez et collez le règlement.

  4. Cliquez sur Suivant > Créer une règle.

  5. Accédez à IAM > Rôles > Créer un rôle > Service AWS > Lambda.

  6. Associez la règle que vous venez de créer.

  7. Nommez le rôle WriteMulesoftToS3Role, puis cliquez sur Créer un rôle.

Créer la fonction Lambda

Paramètre Valeur
Nom mulesoft_audit_to_s3
Durée d'exécution Python 3.13
Architecture x86_64
Rôle d'exécution Utiliser un routeur existant > WriteMulesoftToS3Role
  1. Une fois la fonction créée, ouvrez l'onglet Code, supprimez le stub et saisissez le code suivant (mulesoft_audit_to_s3.py).

    #!/usr/bin/env python3
    
    import os, json, gzip, io, uuid, datetime as dt, urllib.request, urllib.error, urllib.parse
    import boto3
    
    ORG_ID        = os.environ["MULE_ORG_ID"]
    CLIENT_ID     = os.environ["CLIENT_ID"]
    CLIENT_SECRET = os.environ["CLIENT_SECRET"]
    S3_BUCKET     = os.environ["S3_BUCKET_NAME"]
    
    TOKEN_URL = "https://anypoint.mulesoft.com/accounts/api/v2/oauth2/token"
    QUERY_URL = f"https://anypoint.mulesoft.com/audit/v2/organizations/{ORG_ID}/query"
    
    def http_post(url, data, headers=None):
        raw = json.dumps(data).encode() if headers else urllib.parse.urlencode(data).encode()
        req = urllib.request.Request(url, raw, headers or {})
        try:
            with urllib.request.urlopen(req, timeout=30) as r:
                return json.loads(r.read())
        except urllib.error.HTTPError as e:
            print("MuleSoft error body →", e.read().decode())
            raise
    
    def get_token():
        return http_post(TOKEN_URL, {
            "grant_type": "client_credentials",
            "client_id":  CLIENT_ID,
            "client_secret": CLIENT_SECRET
        })["access_token"]
    
    def fetch_audit(token, start, end):
        headers = {
            "Authorization": f"Bearer {token}",
            "Content-Type":  "application/json"
        }
        body = {
            "startDate": f"{start.isoformat(timespec='milliseconds')}Z",
            "endDate":   f"{end.isoformat(timespec='milliseconds')}Z",
            "limit": 200,
            "offset": 0,
            "ascending": False
        }
        while True:
            data = http_post(QUERY_URL, body, headers)
            if not data.get("data"):
                break
            yield from data["data"]
            body["offset"] += body["limit"]
    
    def upload(events, ts):
        key = f"{ts:%Y/%m/%d}/mulesoft-audit-{uuid.uuid4()}.json.gz"
        buf = io.BytesIO()
        with gzip.GzipFile(fileobj=buf, mode="w") as gz:
            for ev in events:
                gz.write((json.dumps(ev) + "\n").encode())
        buf.seek(0)
        boto3.client("s3").upload_fileobj(buf, S3_BUCKET, key)
    
    def lambda_handler(event=None, context=None):
        now   = dt.datetime.utcnow().replace(microsecond=0)
        start = now - dt.timedelta(days=1)
    
        token  = get_token()
        events = list(fetch_audit(token, start, now))
    
        if events:
            upload(events, start)
            print(f"Uploaded {len(events)} events")
        else:
            print("No events in the last 24 h")
    
    # For local testing
    if __name__ == "__main__":
        lambda_handler()
    
  2. Accédez à Configuration> Variables d'environnement> Modifier> Ajouter une variable d'environnement.

  3. Saisissez les variables d'environnement fournies, en remplaçant par votre valeur.

    Clé Exemple de valeur
    MULE_ORG_ID your_org_id
    CLIENT_ID your_client_id
    CLIENT_SECRET your_client_secret
    S3_BUCKET_NAME mulesoft-audit-logs

Planifier la fonction Lambda (EventBridge Scheduler)

  1. Accédez à Configuration> Déclencheurs> Ajouter un déclencheur> EventBridge Scheduler> Créer une règle.
  2. Fournissez les informations de configuration suivantes :
    • Nom : daily-mulesoft-audit export.
    • Modèle de programmation : expression Cron.
    • Expression : 0 2 * * * (s'exécute tous les jours à 02h00 UTC).
  3. Conservez les autres valeurs par défaut, puis cliquez sur Créer.

Configurer un flux dans Google SecOps pour ingérer les journaux MuleSoft

  1. Accédez à Paramètres SIEM> Flux.
  2. Cliquez sur Ajouter.
  3. Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple, MuleSoft Logs).
  4. Sélectionnez Amazon S3 V2 comme type de source.
  5. Sélectionnez Mulesoft comme Type de journal.
  6. Cliquez sur Suivant.
  7. Spécifiez les valeurs des paramètres d'entrée suivants :

    • URI S3 : URI du bucket
      • s3://mulesoft-audit-logs/
        • Remplacez mulesoft-audit-logs par le nom réel du bucket.
    • Options de suppression de la source : sélectionnez l'option de suppression de votre choix.

    • Â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.

  8. Cliquez sur Suivant.

  9. Vérifiez la configuration de votre nouveau flux sur l'écran Finaliser, puis cliquez sur Envoyer.

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