Recoger registros de MuleSoft Anypoint

Disponible en:

En este documento se explica cómo ingerir eventos de registro de auditoría de los registros de la plataforma MuleSoft Anypoint en Google Security Operations mediante AWS S3.

Antes de empezar

Asegúrate de que cumples los siguientes requisitos previos:

  • Instancia de Google SecOps
  • Acceso privilegiado a MuleSoft
  • Acceso privilegiado a AWS

Obtener el ID de organización de MuleSoft

  1. Inicia sesión en Anypoint Platform.
  2. Ve a Menú > Gestión de accesos.
  3. En la tabla Grupos de empresas, haga clic en el nombre de su organización.
  4. Copia el ID de organización (por ejemplo, 0a12b3c4-d5e6-789f-1021-1a2b34cd5e6f).

Configurar un segmento de AWS S3 y IAM para Google SecOps

  1. Crea un segmento de Amazon S3 siguiendo esta guía de usuario: Crear un segmento.
  2. Guarda el nombre y la región del segmento para consultarlos más adelante (por ejemplo, mulesoft-audit-logs).
  3. Crea un usuario siguiendo esta guía: Crear un usuario de gestión de identidades y accesos.
  4. Selecciona el Usuario creado.
  5. Selecciona la pestaña Credenciales de seguridad.
  6. En la sección Claves de acceso, haz clic en Crear clave de acceso.
  7. Selecciona Servicio de terceros en Caso práctico.
  8. Haz clic en Siguiente.
  9. Opcional: añade una etiqueta de descripción.
  10. Haz clic en Crear clave de acceso.
  11. Haz clic en Descargar archivo CSV para guardar la clave de acceso y la clave de acceso secreta para futuras consultas.
  12. Haz clic en Listo.
  13. Selecciona la pestaña Permisos.
  14. Haz clic en Añadir permisos en la sección Políticas de permisos.
  15. Selecciona Añadir permisos.
  16. Seleccione Adjuntar políticas directamente.
  17. Busca y selecciona la política AmazonS3FullAccess.
  18. Haz clic en Siguiente.
  19. Haz clic en Añadir permisos.

Crear la aplicación conectada de MuleSoft

  1. Inicia sesión en Anypoint Platform.
  2. Ve a Gestión de acceso > Aplicaciones conectadas > Crear aplicación.
  3. Proporcione los siguientes detalles de configuración:
    • Nombre de la aplicación: introduce un nombre único (por ejemplo, Google SecOps export).
    • Selecciona La aplicación actúa en su propio nombre (credenciales de cliente).
    • Haz clic en Añadir ámbitos → Lector de registros de auditoría → Siguiente.
    • Selecciona todos los grupos de empresas cuyos registros necesites.
    • Haz clic en Siguiente > Añadir ámbitos.
  4. Haz clic en Guardar y copia el ID de cliente y el secreto de cliente.

Configurar la política y el rol de gestión de identidades y accesos para las subidas de S3

  1. JSON de la política (sustituye mulesoft-audit-logs por el nombre de tu segmento):

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "AllowPutAuditObjects",
          "Effect": "Allow",
          "Action": ["s3:PutObject"],
          "Resource": "arn:aws:s3:::mulesoft-audit-logs/*"
        }
      ]
    }
    
  2. Ve a la consola de AWS > IAM > Políticas > Crear política > pestaña JSON.

  3. Copia y pega la política.

  4. Haz clic en Siguiente > Crear política.

  5. Ve a IAM > Roles > Crear rol > Servicio de AWS > Lambda.

  6. Adjunte la política que acaba de crear.

  7. Dale el nombre WriteMulesoftToS3Role al rol y haz clic en Crear rol.

Crear la función Lambda

Ajuste Valor
Nombre mulesoft_audit_to_s3
Tiempo de ejecución Python 3.13
Arquitectura x86_64
Rol de ejecución Usar una > WriteMulesoftToS3Role
  1. Una vez creada la función, abra la pestaña Código, elimine el stub e introduzca el siguiente código (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. Ve a Configuración > Variables de entorno > Editar > Añadir nueva variable de entorno.

  3. Introduce las siguientes variables de entorno, sustituyendo los valores por los tuyos.

    Clave Valor de ejemplo
    MULE_ORG_ID your_org_id
    CLIENT_ID your_client_id
    CLIENT_SECRET your_client_secret
    S3_BUCKET_NAME mulesoft-audit-logs

Programar la función Lambda (EventBridge Scheduler)

  1. Ve a Configuración > Activadores > Añadir activador > EventBridge Scheduler > Crear regla.
  2. Proporcione los siguientes detalles de configuración:
    • Nombre: daily-mulesoft-audit export.
    • Patrón de programación: expresión cron.
    • Expresión: 0 2 * * * (se ejecuta todos los días a las 02:00 UTC).
  3. Deja el resto de los ajustes como están y haz clic en Crear.

Configurar un feed en Google SecOps para ingerir los registros de MuleSoft

  1. Ve a Configuración de SIEM > Feeds.
  2. Haz clic en Añadir nuevo.
  3. En el campo Nombre del feed, introduce un nombre para el feed (por ejemplo, MuleSoft Logs).
  4. Selecciona Amazon S3 V2 como Tipo de fuente.
  5. Seleccione Mulesoft como Tipo de registro.
  6. Haz clic en Siguiente.
  7. Especifique los valores de los siguientes parámetros de entrada:

    • URI de S3: el URI del contenedor
      • s3://mulesoft-audit-logs/
        • Sustituye mulesoft-audit-logs por el nombre real del segmento.
    • Opciones de eliminación de la fuente: selecciona la opción de eliminación que prefieras.

    • Antigüedad máxima del archivo: incluye los archivos modificados en los últimos días. El valor predeterminado es 180 días.

    • ID de clave de acceso: clave de acceso de usuario con acceso al segmento de S3.

    • Clave de acceso secreta: clave secreta del usuario con acceso al segmento de S3.

    • Espacio de nombres de recursos: el espacio de nombres de recursos.

    • Etiquetas de ingestión: etiqueta que se aplicará a los eventos de este feed.

  8. Haz clic en Siguiente.

  9. Revise la configuración de la nueva fuente en la pantalla Finalizar y, a continuación, haga clic en Enviar.

¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.