Coletar registros de auditoria do Workday

Compatível com:

Este documento explica como ingerir registros de auditoria do Workday no Google Security Operations usando o Google Cloud Storage. Primeiro, o analisador identifica o tipo de evento específico nos registros com base na análise de padrões dos dados JSON. Em seguida, ele extrai e estrutura os campos relevantes de acordo com o tipo identificado, mapeando-os para um modelo de dados unificado (UDM) para uma análise de segurança consistente.

Antes de começar

Verifique se você atende os seguintes pré-requisitos:

  • Uma instância do Google SecOps
  • Um projeto do GCP com a API Cloud Storage ativada
  • Permissões para criar e gerenciar buckets do GCS
  • Permissões para gerenciar políticas do IAM em buckets do GCS
  • Permissões para criar funções do Cloud Run, tópicos do Pub/Sub e jobs do Cloud Scheduler
  • Acesso privilegiado ao Workday

Criar um bucket do Google Cloud Storage

  1. Acesse o Console do Google Cloud.
  2. Selecione seu projeto ou crie um novo.
  3. No menu de navegação, acesse Cloud Storage > Buckets.
  4. Clique em Criar bucket.
  5. Informe os seguintes detalhes de configuração:

    Configuração Valor
    Nomeie seu bucket Insira um nome exclusivo globalmente, por exemplo, workday-audit-logs.
    Tipo de local Escolha com base nas suas necessidades (região, birregional, multirregional)
    Local Selecione o local (por exemplo, us-central1).
    Classe de armazenamento Padrão (recomendado para registros acessados com frequência)
    Controle de acesso Uniforme (recomendado)
    Ferramentas de proteção Opcional: ativar o controle de versões de objetos ou a política de retenção
  6. Clique em Criar.

Criar um usuário do sistema de integração (ISU) do Workday

  1. No Workday, pesquise Criar usuário do sistema de integração > OK.
  2. Preencha o Nome de usuário (por exemplo, audit_gcs_user).
  3. Clique em OK.
  4. Para redefinir a senha, acesse Ações relacionadas > Segurança > Redefinir senha.
  5. Selecione Manter regras de senha para evitar que a senha expire.
  6. Pesquise Criar grupo de segurança > Grupo de segurança do sistema de integração (sem restrições).
  7. Forneça um nome (por exemplo, ISU_Audit_GCS) e adicione o ISU a Usuários do sistema de integração.
  8. Pesquise Políticas de segurança de domínio para área funcional > Sistema.
  9. Em Registro de auditoria, selecione Ações > Editar permissões.
  10. Em Get Only, adicione o grupo ISU_Audit_GCS.
  11. Clique em OK > Ativar mudanças pendentes na política de segurança.

Configurar um relatório personalizado do Workday

  1. No Workday, pesquise Criar relatório personalizado.
  2. Informe os seguintes detalhes de configuração:
    • Nome: insira um nome exclusivo, por exemplo, Audit_Trail_BP_JSON.
    • Tipo: selecione Avançado.
    • Origem de dados: selecione Rastreamento de auditoria – Processo comercial.
  3. Clique em OK.
  4. Opcional: adicione filtros em Tipo de processo de negócios ou Data de vigência.
  5. Acesse a guia Saída.
  6. Selecione Ativar como serviço da Web, Otimizado para performance e Formato JSON.
  7. Clique em OK > Concluído.
  8. Abra o relatório e clique em Compartilhar > adicionar ISU_Audit_GCS com permissão de visualização > OK.
  9. Acesse Ações relacionadas > Serviço da Web > Ver URLs.
  10. Copie o URL JSON.

Criar uma conta de serviço para a função do Cloud Run

A função do Cloud Run precisa de uma conta de serviço com permissões para gravar no bucket do GCS e ser invocada pelo Pub/Sub.

Criar conta de serviço

  1. No Console do GCP, acesse IAM e administrador > Contas de serviço.
  2. Clique em Criar conta de serviço.
  3. Informe os seguintes detalhes de configuração:
    • Nome da conta de serviço: insira workday-audit-collector-sa.
    • Descrição da conta de serviço: insira Service account for Cloud Run function to collect Workday audit logs.
  4. Clique em Criar e continuar.
  5. Na seção Conceder acesso a essa conta de serviço ao projeto, adicione os seguintes papéis:
    1. Clique em Selecionar papel.
    2. Pesquise e selecione Administrador de objetos do Storage.
    3. Clique em + Adicionar outro papel.
    4. Pesquise e selecione Invocador do Cloud Run.
    5. Clique em + Adicionar outro papel.
    6. Pesquise e selecione Invocador do Cloud Functions.
  6. Clique em Continuar.
  7. Clique em Concluído.

Esses papéis são necessários para:

  • Administrador de objetos do Storage: gravar registros em um bucket do GCS
  • Invocador do Cloud Run: permite que o Pub/Sub invoque a função
  • Invocador do Cloud Functions: permite a invocação de funções

Conceder permissões do IAM no bucket do GCS

Conceda permissões de gravação à conta de serviço no bucket do GCS:

  1. Acesse Cloud Storage > Buckets.
  2. Clique no nome do bucket.
  3. Acesse a guia Permissões.
  4. Clique em Conceder acesso.
  5. Informe os seguintes detalhes de configuração:
    • Adicionar principais: insira o e-mail da conta de serviço (por exemplo, workday-audit-collector-sa@PROJECT_ID.iam.gserviceaccount.com).
    • Atribuir papéis: selecione Administrador de objetos do Storage.
  6. Clique em Salvar.

Criar tópico Pub/Sub

Crie um tópico do Pub/Sub em que o Cloud Scheduler vai publicar e a função do Cloud Run vai se inscrever.

  1. No Console do GCP, acesse Pub/Sub > Tópicos.
  2. Selecione Criar tópico.
  3. Informe os seguintes detalhes de configuração:
    • ID do tópico: insira workday-audit-trigger.
    • Não altere as outras configurações.
  4. Clique em Criar.

Criar uma função do Cloud Run para coletar registros

A função do Cloud Run é acionada por mensagens do Pub/Sub do Cloud Scheduler para buscar registros da API Workday e gravá-los no GCS.

  1. No console do GCP, acesse o Cloud Run.
  2. Clique em Criar serviço.
  3. Selecione Função (use um editor in-line para criar uma função).
  4. Na seção Configurar, forneça os seguintes detalhes de configuração:

    Configuração Valor
    Nome do serviço workday-audit-collector
    Região Selecione a região que corresponde ao seu bucket do GCS (por exemplo, us-central1).
    Ambiente de execução Selecione Python 3.12 ou uma versão mais recente.
  5. Na seção Acionador (opcional):

    1. Clique em + Adicionar gatilho.
    2. Selecione Cloud Pub/Sub.
    3. Em Selecionar um tópico do Cloud Pub/Sub, escolha o tópico workday-audit-trigger.
    4. Clique em Salvar.
  6. Na seção Autenticação:

    1. Selecione Exigir autenticação.
    2. Confira o Identity and Access Management (IAM).
  7. Role a tela para baixo e abra Contêineres, rede, segurança.

  8. Acesse a guia Segurança:

    • Conta de serviço: selecione a conta de serviço workday-audit-collector-sa.
  9. Acesse a guia Contêineres:

    1. Clique em Variáveis e secrets.
    2. Clique em + Adicionar variável para cada variável de ambiente:
    Nome da variável Valor de exemplo
    GCS_BUCKET workday-audit-logs
    WD_USER audit_gcs_user
    WD_PASS your-workday-password
    WD_URL https://wd-servicesN.workday.com/ccx/service/customreport2/<tenant>/<user>/Audit_Trail_BP_JSON?format=json
  10. Role a tela para baixo na guia Variáveis e secrets até Solicitações:

    • Tempo limite da solicitação: insira 600 segundos (10 minutos).
  11. Acesse a guia Configurações em Contêineres:

    • Na seção Recursos:
      • Memória: selecione 512 MiB ou mais.
      • CPU: selecione 1.
    • Clique em Concluído.
  12. Role até Ambiente de execução:

    • Selecione Padrão (recomendado).
  13. Na seção Escalonamento de revisão:

    • Número mínimo de instâncias: insira 0.
    • Número máximo de instâncias: insira 100 ou ajuste com base na carga esperada.
  14. Clique em Criar.

  15. Aguarde a criação do serviço (1 a 2 minutos).

  16. Depois que o serviço é criado, o editor de código inline é aberto automaticamente.

Adicionar código da função

  1. Insira main em Ponto de entrada da função.
  2. No editor de código em linha, crie dois arquivos:

    • Primeiro arquivo: main.py::
    import functions_framework
    from google.cloud import storage
    import json
    import os
    import urllib3
    from datetime import datetime, timezone
    import base64
    import gzip
    import io
    import uuid
    
    # Initialize HTTP client
    http = urllib3.PoolManager(
        timeout=urllib3.Timeout(connect=5.0, read=30.0),
        retries=False,
    )
    
    # Initialize Storage client
    storage_client = storage.Client()
    
    @functions_framework.cloud_event
    def main(cloud_event):
        """
        Cloud Run function triggered by Pub/Sub to fetch logs from Workday API and write to GCS.
    
        Args:
            cloud_event: CloudEvent object containing Pub/Sub message
        """
    
        # Get environment variables
        bucket_name = os.environ.get('GCS_BUCKET')
        wd_user = os.environ.get('WD_USER')
        wd_pass = os.environ.get('WD_PASS')
        wd_url = os.environ.get('WD_URL')
    
        if not all([bucket_name, wd_user, wd_pass, wd_url]):
            print('Error: Missing required environment variables')
            return
    
        try:
            # Get GCS bucket
            bucket = storage_client.bucket(bucket_name)
    
            print(f'Fetching Workday audit report from {wd_url}')
    
            # Fetch report from Workday
            data = fetch_report(wd_url, wd_user, wd_pass)
    
            # Upload to GCS
            timestamp = datetime.now(timezone.utc)
            upload(bucket, data, timestamp)
    
            print(f'Successfully uploaded Workday audit report ({len(data)} bytes raw)')
    
        except Exception as e:
            print(f'Error processing logs: {str(e)}')
            raise
    
    def fetch_report(url, username, password):
        """Fetch report from Workday using Basic Auth."""
        credentials = f"{username}:{password}"
        credentials_bytes = credentials.encode('utf-8')
        auth_header = b"Basic " + base64.b64encode(credentials_bytes)
    
        req_headers = {
            "Authorization": auth_header.decode('utf-8')
        }
    
        response = http.request('GET', url, headers=req_headers)
    
        if response.status != 200:
            raise Exception(f"Failed to fetch report: HTTP {response.status}")
    
        return response.data
    
    def upload(bucket, payload, ts):
        """Upload gzipped JSON to GCS."""
        key = f"{ts:%Y/%m/%d}/workday-audit-{uuid.uuid4()}.json.gz"
    
        buf = io.BytesIO()
        with gzip.GzipFile(fileobj=buf, mode='w') as gz:
            gz.write(payload)
        buf.seek(0)
    
        blob = bucket.blob(key)
        blob.upload_from_file(buf, content_type='application/gzip')
    
        print(f'Uploaded to gs://{bucket.name}/{key}')
    
    • Segundo arquivo: requirements.txt:
    functions-framework==3.*
    google-cloud-storage==2.*
    urllib3>=2.0.0
    
  3. Clique em Implantar para salvar e implantar a função.

  4. Aguarde a conclusão da implantação (2 a 3 minutos).

Criar o job do Cloud Scheduler

O Cloud Scheduler publica mensagens no tópico do Pub/Sub em intervalos regulares, acionando a função do Cloud Run.

  1. No Console do GCP, acesse o Cloud Scheduler.
  2. Clique em Criar job.
  3. Informe os seguintes detalhes de configuração:

    Configuração Valor
    Nome workday-audit-collector-daily
    Região Selecione a mesma região da função do Cloud Run
    Frequência 20 2 * * * (executado diariamente às 02h20 UTC)
    Fuso horário Selecione o fuso horário (UTC recomendado)
    Tipo de destino Pub/Sub
    Tópico Selecione o tópico workday-audit-trigger.
    Corpo da mensagem {} (objeto JSON vazio)
  4. Clique em Criar.

Opções de frequência de programação

  • Escolha a frequência com base no volume de registros e nos requisitos de latência:

    Frequência Expressão Cron Caso de uso
    A cada 5 minutos */5 * * * * Alto volume e baixa latência
    A cada 15 minutos */15 * * * * Volume médio
    A cada hora 0 * * * * Padrão
    A cada 6 horas 0 */6 * * * Baixo volume, processamento em lote
    Diário 20 2 * * * Coleta de dados históricos (recomendada)

Testar o job do programador

  1. No console do Cloud Scheduler, encontre seu job.
  2. Clique em Forçar execução para acionar manualmente.
  3. Aguarde alguns segundos e acesse Cloud Run > Serviços > workday-audit-collector > Registros.
  4. Verifique se a função foi executada com sucesso.
  5. Verifique o bucket do GCS para confirmar se os registros foram gravados.

Recuperar a conta de serviço do Google SecOps

O Google SecOps usa uma conta de serviço exclusiva para ler dados do seu bucket do GCS. Você precisa conceder a essa conta de serviço acesso ao seu bucket.

Receber o e-mail da conta de serviço

  1. Acesse Configurações do SIEM > Feeds.
  2. Clique em Adicionar novo feed.
  3. Clique em Configurar um único feed.
  4. No campo Nome do feed, insira um nome para o feed (por exemplo, Workday Audit Logs).
  5. Selecione Google Cloud Storage V2 como o Tipo de origem.
  6. Selecione Auditoria do Workday como o Tipo de registro.
  7. Clique em Receber conta de serviço. Um e-mail exclusivo da conta de serviço é exibido, por exemplo:

    chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com
    
  8. Copie esse endereço de e-mail para usar na próxima etapa.

Conceder permissões do IAM à conta de serviço do Google SecOps

A conta de serviço do Google SecOps precisa do papel de Leitor de objetos do Storage no seu bucket do GCS.

  1. Acesse Cloud Storage > Buckets.
  2. Clique no nome do bucket.
  3. Acesse a guia Permissões.
  4. Clique em Conceder acesso.
  5. Informe os seguintes detalhes de configuração:
    • Adicionar participantes: cole o e-mail da conta de serviço do Google SecOps.
    • Atribuir papéis: selecione Leitor de objetos do Storage.
  6. Clique em Salvar.

Configurar um feed no Google SecOps para ingerir registros de auditoria do Workday

  1. Acesse Configurações do SIEM > Feeds.
  2. Clique em Adicionar novo feed.
  3. Clique em Configurar um único feed.
  4. No campo Nome do feed, insira um nome para o feed (por exemplo, Workday Audit Logs).
  5. Selecione Google Cloud Storage V2 como o Tipo de origem.
  6. Selecione Auditoria do Workday como o Tipo de registro.
  7. Clique em Próxima.
  8. Especifique valores para os seguintes parâmetros de entrada:

    • URL do bucket de armazenamento: insira o URI do bucket do GCS com o caminho do prefixo:

      gs://workday-audit-logs/
      
      • Substitua workday-audit-logs pelo nome real do bucket do GCS.
    • Opção de exclusão da fonte: selecione a opção de exclusão de acordo com sua preferência:

      • Nunca: nunca exclui arquivos após as transferências (recomendado para testes).
      • Excluir arquivos transferidos: exclui os arquivos após a transferência bem-sucedida.
      • Excluir arquivos transferidos e diretórios vazios: exclui arquivos e diretórios vazios após a transferência bem-sucedida.
    • Idade máxima do arquivo: inclui arquivos modificados no último número de dias. O padrão é de 180 dias.

    • Namespace do recurso: o namespace do recurso.

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

  9. Clique em Próxima.

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

Tabela de mapeamento do UDM

Campo de registro Mapeamento do UDM Lógica
Conta metadata.event_type Se o campo "Account" não estiver vazio, o campo "metadata.event_type" será definido como "USER_RESOURCE_UPDATE_CONTENT".
Conta principal.user.primaryId O userId é extraído do campo "Account" usando um padrão grok e mapeado para principal.user.primaryId.
Conta principal.user.primaryName O nome de exibição do usuário é extraído do campo "Conta" usando um padrão grok e mapeado para "principal.user.primaryName".
ActivityCategory metadata.event_type Se o campo "ActivityCategory" for "READ", o campo "metadata.event_type" será definido como "RESOURCE_READ". Se for "WRITE", será definido como "RESOURCE_WRITTEN".
ActivityCategory metadata.product_event_type Mapeado diretamente do campo "ActivityCategory".
AffectedGroups target.user.group_identifiers Mapeado diretamente do campo "AffectedGroups".
Área target.resource.attribute.labels.area.value Mapeado diretamente do campo "Área".
AuthType extensions.auth.auth_details Mapeado diretamente do campo "AuthType".
AuthType extensions.auth.type Mapeado do campo "AuthType" para diferentes tipos de autenticação definidos na UDM com base em valores específicos.
CFIPdeConexion src.domain.name Se o campo "CFIPdeConexion" não for um endereço IP válido, ele será mapeado para "src.domain.name".
CFIPdeConexion target.ip Se o campo "CFIPdeConexion" for um endereço IP válido, ele será mapeado para "target.ip".
ChangedRelationship metadata.description Mapeado diretamente do campo "ChangedRelationship".
ClassOfInstance target.resource.attribute.labels.class_instance.value Mapeado diretamente do campo "ClassOfInstance".
column18 about.labels.utub.value Mapeado diretamente do campo "column18".
CreatedBy principal.user.userid O userid é extraído do campo "CreatedBy" usando um padrão grok e mapeado para "principal.user.userid".
CreatedBy principal.user.user_display_name O nome de exibição do usuário é extraído do campo "CreatedBy" usando um padrão grok e mapeado para "principal.user.user_display_name".
Domínio about.domain.name Mapeado diretamente do campo "Domínio".
EffectiveDate @timestamp Analisado como "@timestamp" após a conversão para o formato "aaaa-MM-dd HH:mm:ss.SSSZ".
EntryMoment @timestamp Analisado como "@timestamp" após a conversão para o formato "ISO8601".
EventType security_result.description Mapeado diretamente do campo "EventType".
Formulário target.resource.name Mapeado diretamente do campo "Formulário".
InstancesAdded about.resource.attribute.labels.instances_added.value Mapeado diretamente do campo "InstancesAdded".
InstancesAdded target.user.attribute.roles.instances_added.name Mapeado diretamente do campo "InstancesAdded".
InstancesRemoved about.resource.attribute.labels.instances_removed.value Mapeado diretamente do campo "InstancesRemoved".
InstancesRemoved target.user.attribute.roles.instances_removed.name Mapeado diretamente do campo "InstancesRemoved".
IntegrationEvent target.resource.attribute.labels.integration_event.value Mapeado diretamente do campo "IntegrationEvent".
IntegrationStatus security_result.action_details Mapeado diretamente do campo "IntegrationStatus".
IntegrationSystem target.resource.name Mapeado diretamente do campo "IntegrationSystem".
IP src.domain.name Se o campo "IP" não for um endereço IP válido, ele será mapeado para "src.domain.name".
IP src.ip Se o campo "IP" for um endereço IP válido, ele será mapeado para "src.ip".
IsDeviceManaged additional.fields.additional1.value.string_value Se o campo "IsDeviceManaged" for "N", o valor será definido como "Successful". Caso contrário, ela será definida como "Ocorreu uma falha no login".
IsDeviceManaged additional.fields.additional2.value.string_value Se o campo "IsDeviceManaged" for "N", o valor será definido como "Successful". Caso contrário, será definido como "Credenciais inválidas".
IsDeviceManaged additional.fields.additional3.value.string_value Se o campo "IsDeviceManaged" for "N", o valor será definido como "Successful". Caso contrário, será definido como "Conta bloqueada".
IsDeviceManaged security_result.action_details Mapeado diretamente do campo "IsDeviceManaged".
OutputFiles about.file.full_path Mapeado diretamente do campo "OutputFiles".
Pessoa principal.user.primaryId Se o campo "Person" começar com "INT", o userid será extraído usando um padrão grok e mapeado para "principal.user.primaryId".
Pessoa principal.user.primaryName Se o campo "Person" começar com "INT", o nome de exibição do usuário será extraído usando um padrão grok e mapeado para "principal.user.primaryName".
Pessoa principal.user.user_display_name Se o campo "Person" não começar com "INT", ele será mapeado diretamente para "principal.user.user_display_name".
Pessoa metadata.event_type Se o campo "Person" não estiver vazio, o campo "metadata.event_type" será definido como "USER_RESOURCE_UPDATE_CONTENT".
ProcessedTransaction target.resource.attribute.creation_time Analisado como "target.resource.attribute.creation_time" após a conversão para o formato "dd/MM/aaaa HH:mm:ss,SSS (ZZZ)", "dd/MM/aaaa, HH:mm:ss,SSS (ZZZ)" ou "MM/dd/aaaa, HH:mm:ss.SSS A ZZZ".
ProgramBy principal.user.userid Mapeado diretamente do campo "ProgramBy".
RecurrenceEndDate principal.resource.attribute.last_update_time Analisado como "principal.resource.attribute.last_update_time" após a conversão para o formato "aaaa-MM-dd".
RecurrenceStartDate principal.resource.attribute.creation_time Analisado como "principal.resource.attribute.creation_time" após a conversão para o formato "aaaa-MM-dd".
RequestName metadata.description Mapeado diretamente do campo "RequestName".
ResponseMessage security_result.summary Mapeado diretamente do campo "ResponseMessage".
RestrictedToEnvironment security_result.about.hostname Mapeado diretamente do campo "RestrictedToEnvironment".
RevokedSecurity security_result.outcomes.outcomes.value Mapeado diretamente do campo "RevokedSecurity".
RunFrequency principal.resource.attribute.labels.run_frequency.value Mapeado diretamente do campo "RunFrequency".
ScheduledProcess principal.resource.name Mapeado diretamente do campo "ScheduledProcess".
SecuredTaskExecuted target.resource.name Mapeado diretamente do campo "SecuredTaskExecuted".
SecureTaskExecuted metadata.event_type Se o campo "SecureTaskExecuted" contiver "Create", o campo "metadata.event_type" será definido como "USER_RESOURCE_CREATION".
SecureTaskExecuted target.resource.name Mapeado diretamente do campo "SecureTaskExecuted".
SentTime @timestamp Analisado como "@timestamp" após a conversão para o formato "ISO8601".
SessionId network.session_id Mapeado diretamente do campo "SessionId".
ShareBy target.user.userid Mapeado diretamente do campo "ShareBy".
SignOffTime additional.fields.additional4.value.string_value O valor do campo "AuthFailMessage" é colocado na matriz "additional.fields" com a chave "Enterprise Interface Builder".
SignOffTime metadata.description Mapeado diretamente do campo "AuthFailMessage".
SignOffTime metadata.event_type Se o campo "SignOffTime" estiver vazio, o campo "metadata.event_type" será definido como "USER_LOGIN". Caso contrário, ele será definido como "USER_LOGOUT".
SignOffTime principal.user.attribute.last_update_time Analisado como "principal.user.attribute.last_update_time" após a conversão para o formato "ISO8601".
SignOnIp src.domain.name Se o campo "SignOnIp" não for um endereço IP válido, ele será mapeado para "src.domain.name".
SignOnIp src.ip Se o campo "SignOnIp" for um endereço IP válido, ele será mapeado para "src.ip".
Status metadata.product_event_type Mapeado diretamente do campo "Status".
SystemAccount principal.user.email_addresses O endereço de e-mail é extraído do campo "SystemAccount" usando um padrão grok e mapeado para "principal.user.email_addresses".
SystemAccount principal.user.primaryId O userid é extraído do campo "SystemAccount" usando um padrão grok e mapeado para "principal.user.primaryId".
SystemAccount principal.user.primaryName O nome de exibição do usuário é extraído do campo "SystemAccount" usando um padrão grok e mapeado para "principal.user.primaryName".
SystemAccount src.user.userid O userid secundário é extraído do campo "SystemAccount" usando um padrão grok e mapeado para "src.user.userid".
SystemAccount src.user.user_display_name O nome de exibição do usuário secundário é extraído do campo "SystemAccount" usando um padrão grok e mapeado para "src.user.user_display_name".
SystemAccount target.user.userid O userid de destino é extraído do campo "SystemAccount" usando um padrão grok e mapeado para "target.user.userid".
Destino target.user.user_display_name Mapeado diretamente do campo "Destino".
Modelo about.resource.name Mapeado diretamente do campo "Modelo".
Locatário target.asset.hostname Mapeado diretamente do campo "Tenant".
TlsVersion network.tls.version Mapeado diretamente do campo "TlsVersion".
Transaction security_result.action_details Mapeado diretamente do campo "Transaction".
TransactionType security_result.summary Mapeado diretamente do campo "TransactionType".
TypeForm target.resource.resource_subtype Mapeado diretamente do campo "TypeForm".
UserAgent network.http.parsed_user_agent Analisado do campo "UserAgent" usando o filtro "useragent".
UserAgent network.http.user_agent Mapeado diretamente do campo "UserAgent".
WorkdayAccount target.user.user_display_name O nome de exibição do usuário é extraído do campo "WorkdayAccount" usando um padrão grok e mapeado para "target.user.user_display_name".
WorkdayAccount target.user.userid O userid é extraído do campo "WorkdayAccount" usando um padrão grok e mapeado para "target.user.userid".
additional.fields.additional1.key Definido como "FailedSignOn".
additional.fields.additional2.key Definido como "InvalidCredentials".
additional.fields.additional3.key Definido como "AccountLocked".
additional.fields.additional4.key Defina como "Enterprise Interface Builder".
metadata.event_type Definido como "GENERIC_EVENT" inicialmente e atualizado com base na lógica que envolve outros campos.
metadata.event_type Definido como "USER_CHANGE_PERMISSIONS" para tipos de eventos específicos.
metadata.event_type Definido como "RESOURCE_WRITTEN" para tipos de eventos específicos.
metadata.log_type Fixado no código como "WORKDAY_AUDIT".
metadata.product_name Fixado no código como "Enterprise Interface Builder".
metadata.vendor_name Fixado no código como "Workday".
principal.asset.category Definido como "Phone" se o campo "DeviceType" for "Phone".
principal.resource.resource_type Codificado como "TASK" se o campo "ScheduledProcess" não estiver vazio.
security_result.action Definido como "ALLOW" ou "FAIL" com base nos valores dos campos "FailedSignOn", "IsDeviceManaged", "InvalidCredentials" e "AccountLocked".
security_result.summary Definido como "Concluído" ou mensagens de erro específicas com base nos valores dos campos "FailedSignOn", "IsDeviceManaged", "InvalidCredentials" e "AccountLocked".
target.resource.resource_type Codificado como "TASK" para tipos de eventos específicos.
target.resource.resource_type Codificado como "DATASET" se o campo "TypeForm" não estiver vazio.
mensagem principal.user.email_addresses Extrai o endereço de e-mail do campo "message" usando um padrão grok e o mescla em "principal.user.email_addresses" se um padrão específico for correspondente.
mensagem src.user.userid Limpa o campo se "event.idm.read_only_udm.principal.user.userid" corresponder ao "user_target" extraído do campo "message".
mensagem src.user.user_display_name Limpa o campo se "event.idm.read_only_udm.principal.user.userid" corresponder ao "user_target" extraído do campo "message".
mensagem target.user.userid Extrai o userid do campo "message" usando um padrão grok e o mapeia para "target.user.userid" se um padrão específico for correspondente.

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