Coletar registros do MuleSoft Anypoint

Compatível com:

Este documento explica como ingerir eventos de rastreamento de auditoria dos registros da plataforma MuleSoft Anypoint no Google Security Operations usando o AWS S3.

Antes de começar

Verifique se você tem os pré-requisitos a seguir:

  • Instância do Google SecOps
  • Acesso privilegiado ao MuleSoft
  • Acesso privilegiado à AWS

Encontrar o ID da organização do MuleSoft

  1. Faça login na plataforma Anypoint.
  2. Acesse Menu > Gerenciamento de acesso.
  3. Na tabela Grupos empresariais, clique no nome da sua organização.
  4. Copie o ID da organização (por exemplo, 0a12b3c4-d5e6-789f-1021-1a2b34cd5e6f).

Configurar o bucket do AWS S3 e o IAM para o Google SecOps

  1. Crie um bucket do Amazon S3 seguindo este guia do usuário: Como criar um bucket.
  2. Salve o Nome e a Região do bucket para referência futura (por exemplo, mulesoft-audit-logs).
  3. Crie um usuário seguindo este guia: Como criar um usuário do IAM.
  4. Selecione o usuário criado.
  5. Selecione a guia Credenciais de segurança.
  6. Clique em Criar chave de acesso na seção Chaves de acesso.
  7. Selecione Serviço de terceiros como Caso de uso.
  8. Clique em Próxima.
  9. Opcional: adicione uma tag de descrição.
  10. Clique em Criar chave de acesso.
  11. Clique em Fazer o download do arquivo CSV para salvar a chave de acesso e a chave de acesso secreta para referência futura.
  12. Clique em Concluído.
  13. Selecione a guia Permissões.
  14. Clique em Adicionar permissões na seção Políticas de permissões.
  15. Selecione Adicionar permissões.
  16. Selecione Anexar políticas diretamente.
  17. Pesquise e selecione a política AmazonS3FullAccess.
  18. Clique em Próxima.
  19. Clique em Adicionar permissões

Criar o app conectado do MuleSoft

  1. Faça login na plataforma Anypoint.
  2. Acesse Gerenciamento de acesso > Apps conectados > Criar app.
  3. Informe os seguintes detalhes de configuração:
    • Nome do app: insira um nome exclusivo (por exemplo, Google SecOps export).
    • Selecione O app age em seu próprio nome (credenciais do cliente).
    • Clique em Adicionar escopos → Leitor de registros de auditoria → Próxima.
    • Selecione todos os grupos de empresas cujos registros você precisa.
    • Clique em Próxima > Adicionar escopos.
  4. Clique em Salvar e copie o ID do cliente e a chave secreta do cliente.

Configurar a política e o papel do IAM para uploads do S3

  1. JSON da política (substitua mulesoft-audit-logs pelo nome do seu bucket):

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "AllowPutAuditObjects",
          "Effect": "Allow",
          "Action": ["s3:PutObject"],
          "Resource": "arn:aws:s3:::mulesoft-audit-logs/*"
        }
      ]
    }
    
  2. Acesse Console da AWS > IAM > Políticas > Criar política > guia JSON.

  3. Copie e cole a política.

  4. Clique em Próxima > Criar política.

  5. Acesse IAM > Funções > Criar função > Serviço da AWS > Lambda.

  6. Anexe a política recém-criada.

  7. Nomeie a função como WriteMulesoftToS3Role e clique em Criar função.

Criar a função Lambda

Configuração Valor
Nome mulesoft_audit_to_s3
Ambiente de execução Python 3.13
Arquitetura x86_64
Função de execução Usar > WriteMulesoftToS3Role
  1. Depois que a função for criada, abra a guia Código, exclua o stub e insira o seguinte 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. Acesse Configuração > Variáveis de ambiente > Editar > Adicionar nova variável de ambiente.

  3. Insira as variáveis de ambiente a seguir, substituindo pelo seu valor.

    Chave Valor de exemplo
    MULE_ORG_ID your_org_id
    CLIENT_ID your_client_id
    CLIENT_SECRET your_client_secret
    S3_BUCKET_NAME mulesoft-audit-logs

Programar a função do Lambda (EventBridge Scheduler)

  1. Acesse Configuração > Gatilhos > Adicionar gatilho > EventBridge Scheduler > Criar regra.
  2. Informe os seguintes detalhes de configuração:
    • Nome: daily-mulesoft-audit export.
    • Padrão de programação: expressão cron.
    • Expressão: 0 2 * * * (executado diariamente às 02:00 UTC).
  3. Deixe o restante como padrão e clique em Criar.

Configurar um feed no Google SecOps para ingerir os registros do MuleSoft

  1. Acesse Configurações do SIEM > Feeds.
  2. Clique em Adicionar novo.
  3. No campo Nome do feed, insira um nome para o feed (por exemplo, MuleSoft Logs).
  4. Selecione Amazon S3 V2 como o Tipo de origem.
  5. Selecione Mulesoft como o Tipo de registro.
  6. Clique em Próxima.
  7. Especifique valores para os seguintes parâmetros de entrada:

    • URI do S3: o URI do bucket
      • s3://mulesoft-audit-logs/
        • Substitua mulesoft-audit-logs pelo nome real do bucket.
    • Opções de exclusão de fontes: selecione a opção de exclusão de acordo com sua preferência.

    • Idade máxima do arquivo: inclui arquivos modificados no último número de dias. O padrão é de 180 dias.

    • ID da chave de acesso: chave de acesso do usuário com acesso ao bucket do S3.

    • Chave de acesso secreta: chave secreta do usuário com acesso ao bucket do S3.

    • Namespace do recurso: o namespace do recurso.

    • Rótulos de ingestão: o rótulo a ser aplicado aos eventos deste feed.

  8. Clique em Próxima.

  9. Revise a nova configuração do feed na tela Finalizar e clique em Enviar.

Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.