Coletar registros do Agiloft
Versão do analisador:1.0
Este documento explica como ingerir registros do Agiloft no Google Security Operations usando o Google Cloud Storage V2.
O Agiloft é uma plataforma de gestão do ciclo de vida de contratos (CLM, na sigla em inglês) sem código que automatiza a criação de contratos, fluxos de trabalho de aprovação e acompanhamento de compliance. A tabela de registros de atividades do Agiloft registra eventos de uso do sistema, como logins e logouts de usuários, modificações de registros, mudanças de regras e ações administrativas. Esses registros de atividade podem ser exportados pela API REST do Agiloft e gravados em um bucket do GCS para ingestão pelo Google SecOps.
Antes de começar
Verifique se você tem os pré-requisitos a seguir:
- Uma instância do Google SecOps
- Um projeto do GCP com a API Storage do Cloud ativada
- Permissões para criar e gerenciar intervalos do GCS
- Permissões para criar serviços do Cloud Run, tópicos do Pub/Sub e jobs do Cloud Scheduler
- Uma instância do Agiloft com a edição Advanced, Premium ou Platform. O acesso à API REST exige uma dessas edições.
- Uma conta de usuário do Agiloft em um grupo compatível com REST com acesso à tabela de registros de atividades
- Registro de atividades ativado na base de conhecimento (KB) do Agiloft
Configurar a geração de registros de atividade do Agiloft
- Faça login na base de conhecimento do Agiloft com uma conta de administrador.
- Clique no ícone de engrenagem Configuração no canto superior direito.
- Acesse Sistema > Configurar registro de atividades.
- Clique em Novo para abrir o assistente Regras de auditoria.
- Informe os seguintes detalhes de configuração:
- Nome: insira um nome para a regra (por exemplo,
All Activity for SIEM). - Idioma: selecione o idioma da base de conhecimento
- Nome: insira um nome para a regra (por exemplo,
- Crie ou selecione uma pesquisa salva que determine quais ações dos usuários serão registradas.
- Selecione os eventos que você quer acompanhar. Para um monitoramento de segurança abrangente, selecione:
- Login
- Sair
- Falha no login
- Criação de registro
- Edição de registro
- Exclusão de registro
- Download de arquivos
- Edição de regra
- Edição de fluxo de trabalho
- Edição em grupo
- Edição de equipe
- Edição de tabela
- Edição de colunas
- Defina o período de armazenamento dos registros de auditoria (por exemplo,
1 year). Clique em Concluir.
Mostrar a tabela do registro de atividades
- Na base de conhecimento do Agiloft, acesse Configuração > Tabelas.
- Selecione Registro de atividades na lista de tabelas.
Clique em Mostrar para tornar a tabela do registro de atividades acessível para consultas de API.
Coletar credenciais da API Agiloft
Receber detalhes da instância do Agiloft
- Faça login na sua instância do Agiloft.
Anote os seguintes valores da barra de endereço do navegador:
- Nome do host: o endereço do servidor (por exemplo,
yourcompany.agiloft.com) - Nome da KB: o nome da base de conhecimento, exibido no canto superior direito da KB ao lado do ícone de ajuda (por exemplo,
Production)
- Nome do host: o endereço do servidor (por exemplo,
Criar um usuário de API dedicado
- Na base de conhecimento do Agiloft, acesse Configuração > Acesso > Pessoas.
- Crie uma conta de usuário dedicada ao acesso à API:
- Login: insira um login descritivo (por exemplo,
siem_api_user). - Senha: defina uma senha forte
- Login: insira um login descritivo (por exemplo,
Adicione o usuário a um grupo com acesso à API REST ativado e acesso de leitura à tabela Registro de atividades.
Verifique as permissões
Para verificar se a conta tem as permissões necessárias:
- Faça login no Agiloft com as credenciais de usuário da API.
- Acesse Configuração > Tabelas.
- Verifique se a tabela Registro de atividades está visível e acessível.
- Se a tabela "Registro de atividades" não aparecer, entre em contato com o administrador do Agiloft para conceder as permissões de grupo necessárias.
Testar o acesso à API
Teste suas credenciais antes de prosseguir com a integração:
AGILOFT_HOST="https://yourcompany.agiloft.com" AGILOFT_KB="YourKBName" AGILOFT_LOGIN="siem_api_user" AGILOFT_PASSWORD="your-password" # Test login and get JWT token TOKEN=$(curl -s "${AGILOFT_HOST}/ewws/EWLogin?$KB=${AGILOFT_KB}&\$login=${AGILOFT_LOGIN}&\$password=${AGILOFT_PASSWORD}&\$lang=en" \ | python3 -c "import sys,json; data=json.load(sys.stdin); print(data.get('token',''))") echo "Token: ${TOKEN}" # Test Activity Log table access with JSON format curl -v "${AGILOFT_HOST}/ewws/EWSearch/.json?\$KB=${AGILOFT_KB}&\$table=activity_log&\$login=${AGILOFT_LOGIN}&\$password=${AGILOFT_PASSWORD}&\$lang=en&limit=1&page=0&field=id&field=action&field=description&field=login&field=date" \ -H "Accept: application/json"
Criar um bucket do Google Cloud Storage
- Acesse o Console do Google Cloud.
- Selecione ou crie um projeto.
- No menu de navegação, acesse Cloud Storage > Buckets.
- Clique em Criar bucket.
Informe os seguintes detalhes de configuração:
Configuração Valor Nomeie seu bucket Insira um nome globalmente exclusivo, por exemplo, agiloft-activity-logs.Tipo de local Escolha de acordo com 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 Clique em Criar.
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 a conta de serviço
- No console do GCP, acesse IAM e administrador > Contas de serviço.
- Clique em Criar conta de serviço.
- Informe os seguintes detalhes de configuração:
- Nome da conta de serviço: insira
agiloft-logs-collector-sa - Descrição da conta de serviço: insira
Service account for Cloud Run function to collect Agiloft activity logs
- Nome da conta de serviço: insira
- Clique em Criar e continuar.
- Na seção Conceder acesso a essa conta de serviço ao projeto, adicione os seguintes papéis:
- Clique em Selecionar papel.
- Pesquise e selecione Administrador de objetos do Storage.
- Clique em + Adicionar outro papel.
- Pesquise e selecione Invocador do Cloud Run.
- Clique em + Adicionar outro papel.
- Pesquise e selecione Invocador de funções do Cloud.
- Clique em Continuar.
- Clique em Concluído.
Essas funções são necessárias para:
- Administrador de objetos do Storage: grava registros no bucket do GCS e gerencia arquivos de estado.
- 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:
- Acesse Cloud Storage > Buckets.
- Clique no nome do bucket.
- Acesse a guia Permissões.
- Clique em Conceder acesso.
- Informe os seguintes detalhes de configuração:
- Adicionar principais: insira o e-mail da conta de serviço (por exemplo,
agiloft-logs-collector-sa@PROJECT_ID.iam.gserviceaccount.com). - Atribuir papéis: selecione Administrador de objetos do Storage.
- Adicionar principais: insira o e-mail da conta de serviço (por exemplo,
- Clique em Salvar.
Criar um tópico do 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.
- No Console do GCP, acesse Pub/Sub > Tópicos.
- Selecione Criar tópico.
- Informe os seguintes detalhes de configuração:
- ID do tópico: insira
agiloft-logs-trigger - Não mude as outras configurações.
- ID do tópico: insira
- Clique em Criar.
Criar uma função do Cloud Run para coletar registros
A função do Cloud Run será acionada por mensagens do Pub/Sub do Cloud Scheduler para buscar registros de atividades da API REST do Agiloft e gravá-los no GCS.
- No console do GCP, acesse o Cloud Run.
- Clique em Criar serviço.
- Selecione Função (use um editor in-line para criar uma função).
Na seção Configurar, forneça os seguintes detalhes de configuração:
Configuração Valor Nome do serviço agiloft-logs-collectorRegião Selecione a região correspondente ao seu bucket do GCS (por exemplo, us-central1).Ambiente de execução Selecione Python 3.12 ou uma versão mais recente. Na seção Gatilho (opcional):
- Clique em + Adicionar gatilho.
- Selecione Cloud Pub/Sub.
- Em Selecionar um tópico do Cloud Pub/Sub, escolha o tópico
agiloft-logs-trigger. - Clique em Salvar.
Na seção Autenticação:
- Selecione Exigir autenticação.
- Confira o Identity and Access Management (IAM).
Role a tela para baixo e abra Contêineres, rede, segurança.
Acesse a guia Segurança:
- Conta de serviço: selecione a conta de serviço
agiloft-logs-collector-sa.
- Conta de serviço: selecione a conta de serviço
Acesse a guia Contêineres:
- Clique em Variáveis e secrets.
- Clique em + Adicionar variável para cada variável de ambiente:
Nome da variável Valor de exemplo Descrição GCS_BUCKETagiloft-activity-logsNome do bucket do GCS GCS_PREFIXagiloftPrefixo para arquivos de registro STATE_KEYagiloft/state.jsonCaminho do arquivo de estado AGILOFT_HOSThttps://yourcompany.agiloft.comURL da instância do Agiloft AGILOFT_KBYourKBNameNome da base de conhecimento do Agiloft (diferencia maiúsculas de minúsculas) AGILOFT_LOGINsiem_api_userLogin do usuário da API AGILOFT_PASSWORDyour-passwordSenha do usuário da API PAGE_SIZE100Página "Registros por API" MAX_RECORDS10000Máximo de registros por execução LOOKBACK_HOURS2Período de lookback inicial Role a tela para baixo na seção Variáveis e secrets até Solicitações:
- Tempo limite da solicitação: insira
600segundos (10 minutos)
- Tempo limite da solicitação: insira
Acesse a guia Configurações:
- Na seção Recursos:
- Memória: selecione 512 MiB ou mais.
- CPU: selecione 1
- Na seção Recursos:
Na seção Escalonamento de revisão:
- Número mínimo de instâncias: insira
0 - Número máximo de instâncias: insira
100ou ajuste com base na carga esperada.
- Número mínimo de instâncias: insira
Clique em Criar.
Aguarde a criação do serviço (1 a 2 minutos).
Depois que o serviço for criado, o editor de código inline será aberto automaticamente.
Adicionar código da função
- Insira main no campo Ponto de entrada.
No editor de código inline, crie dois arquivos:
Primeiro arquivo:main.py:
import functions_framework from google.cloud import storage import json import os import urllib3 import urllib.parse from datetime import datetime, timezone, timedelta import time # Initialize HTTP client with timeouts http = urllib3.PoolManager( timeout=urllib3.Timeout(connect=5.0, read=30.0), retries=False, ) # Initialize Storage client storage_client = storage.Client() # Environment variables GCS_BUCKET = os.environ.get('GCS_BUCKET') GCS_PREFIX = os.environ.get('GCS_PREFIX', 'agiloft').strip('/') STATE_KEY = os.environ.get('STATE_KEY') or f"{GCS_PREFIX}/state.json" AGILOFT_HOST = os.environ.get('AGILOFT_HOST', '').rstrip('/') AGILOFT_KB = os.environ.get('AGILOFT_KB') AGILOFT_LOGIN = os.environ.get('AGILOFT_LOGIN') AGILOFT_PASSWORD = os.environ.get('AGILOFT_PASSWORD') PAGE_SIZE = int(os.environ.get('PAGE_SIZE', '100')) MAX_RECORDS = int(os.environ.get('MAX_RECORDS', '10000')) LOOKBACK_HOURS = int(os.environ.get('LOOKBACK_HOURS', '2')) ACTIVITY_LOG_FIELDS = [ 'id', 'action', 'action_duration', 'login', 'user_name', 'user_primary_team', 'company', 'cookie', 'date', 'description', 'groups', 'interface', 'ip', 'record_id', 'rule_id', 'session_duration', 'session_id', 'table_label' ] def parse_datetime(value): """Parse ISO datetime string to datetime object.""" if not value: return None if value.endswith("Z"): value = value[:-1] + "+00:00" try: return datetime.fromisoformat(value) except Exception: return None @functions_framework.cloud_event def main(cloud_event): """ Cloud Run function triggered by Pub/Sub to fetch Agiloft Activity Log records and write to GCS. Args: cloud_event: CloudEvent object containing Pub/Sub message """ if not all([GCS_BUCKET, AGILOFT_HOST, AGILOFT_KB, AGILOFT_LOGIN, AGILOFT_PASSWORD]): print('Error: Missing required environment variables') return try: bucket = storage_client.bucket(GCS_BUCKET) # Load state state = load_state(bucket, STATE_KEY) # Determine time window now = datetime.now(timezone.utc) last_time = None if isinstance(state, dict) and state.get("last_event_time"): try: last_time = parse_datetime(state["last_event_time"]) # Overlap by 2 minutes to catch delayed events if last_time: last_time = last_time - timedelta(minutes=2) except Exception as e: print(f"Warning: Could not parse last_event_time: {e}") if last_time is None: last_time = now - timedelta(hours=LOOKBACK_HOURS) print(f"Fetching activity logs from {last_time.isoformat()} to {now.isoformat()}") # Fetch activity logs records, newest_event_time = fetch_activity_logs( start_time=last_time, end_time=now, ) if not records: print("No new activity log records found.") save_state(bucket, STATE_KEY, now.isoformat()) return # Write to GCS as NDJSON timestamp = now.strftime('%Y%m%d_%H%M%S') object_key = f"{GCS_PREFIX}/logs_{timestamp}.ndjson" blob = bucket.blob(object_key) ndjson = '\n'.join( [json.dumps(record, ensure_ascii=False) for record in records] ) + '\n' blob.upload_from_string(ndjson, content_type='application/x-ndjson') print(f"Wrote {len(records)} records to gs://{GCS_BUCKET}/{object_key}") # Update state if newest_event_time: save_state(bucket, STATE_KEY, newest_event_time) else: save_state(bucket, STATE_KEY, now.isoformat()) print(f"Successfully processed {len(records)} records") except Exception as e: print(f'Error processing activity logs: {str(e)}') raise def load_state(bucket, key): """Load state from GCS.""" try: blob = bucket.blob(key) if blob.exists(): state_data = blob.download_as_text() return json.loads(state_data) except Exception as e: print(f"Warning: Could not load state: {e}") return {} def save_state(bucket, key, last_event_time_iso): """Save the last event timestamp to GCS state file.""" try: state = {'last_event_time': last_event_time_iso} blob = bucket.blob(key) blob.upload_from_string( json.dumps(state, indent=2), content_type='application/json' ) print(f"Saved state: last_event_time={last_event_time_iso}") except Exception as e: print(f"Warning: Could not save state: {e}") def fetch_activity_logs(start_time, end_time): """ Fetch activity logs from Agiloft REST API with pagination. Args: start_time: Start time for log query end_time: End time for log query Returns: Tuple of (records list, newest_event_time ISO string) """ base_url = f"{AGILOFT_HOST}/ewws/EWSearch/.json" # Build field parameters field_params = '&'.join( [f"field={urllib.parse.quote(f)}" for f in ACTIVITY_LOG_FIELDS] ) # Build date filter query start_str = start_time.strftime('%d %m %y %H:%M:%S') end_str = end_time.strftime('%d %m %y %H:%M:%S') query_filter = urllib.parse.quote( f"date >= '{start_str}' AND date <= '{end_str}'" ) records = [] newest_time = None page_num = 0 backoff = 1.0 while True: if len(records) >= MAX_RECORDS: print(f"Reached max_records limit ({MAX_RECORDS})") break url = ( f"{base_url}" f"?$KB={urllib.parse.quote(AGILOFT_KB)}" f"&$table=activity_log" f"&$login={urllib.parse.quote(AGILOFT_LOGIN)}" f"&$password={urllib.parse.quote(AGILOFT_PASSWORD)}" f"&$lang=en" f"&query={query_filter}" f"&limit={PAGE_SIZE}" f"&page={page_num}" f"&{field_params}" ) try: response = http.request('GET', url) # Handle rate limiting with exponential backoff if response.status == 429: retry_after = int( response.headers.get('Retry-After', str(int(backoff))) ) print(f"Rate limited (429). Retrying after {retry_after}s...") time.sleep(retry_after) backoff = min(backoff * 2, 30.0) continue backoff = 1.0 if response.status != 200: print(f"HTTP Error: {response.status}") response_text = response.data.decode('utf-8') print(f"Response body: {response_text}") return [], None data = json.loads(response.data.decode('utf-8')) if not data.get('success', False): print(f"API error: {data.get('message', 'Unknown error')}") return [], None result = data.get('result', []) # Handle single record vs list if isinstance(result, dict): result = [result] if not result: print(f"No more results (empty page {page_num})") break print(f"Page {page_num}: Retrieved {len(result)} events") records.extend(result) # Track newest event time for event in result: try: event_time = event.get('date') if event_time: if newest_time is None: newest_time = event_time else: current_dt = parse_datetime(event_time) newest_dt = parse_datetime(newest_time) if current_dt and newest_dt and current_dt > newest_dt: newest_time = event_time except Exception as e: print(f"Warning: Could not parse event time: {e}") # Check pagination if len(result) < PAGE_SIZE: print( f"Reached last page (size={len(result)} < limit={PAGE_SIZE})" ) break page_num += 1 except Exception as e: print(f"Error fetching activity logs: {e}") return [], None print(f"Retrieved {len(records)} total records from {page_num + 1} pages") return records, newest_timeSegundo arquivo:requirements.txt:
functions-framework==3.* google-cloud-storage==2.* urllib3>=2.0.0
Clique em Implantar para salvar e implantar a função.
Aguarde a conclusão da implantação (2 a 3 minutos).
Criar um job do Cloud Scheduler
O Cloud Scheduler vai publicar mensagens no tópico do Pub/Sub em intervalos regulares, acionando a função do Cloud Run.
- No console do GCP, acesse o Cloud Scheduler.
- Clique em Criar job.
Informe os seguintes detalhes de configuração:
Configuração Valor Nome agiloft-logs-collector-hourlyRegião Selecione a mesma região da função do Cloud Run Frequência 0 * * * *(de hora em hora)Fuso horário Selecionar fuso horário (UTC recomendado) Tipo de destino Pub/Sub Tópico Selecione o tópico agiloft-logs-trigger.Corpo da mensagem {}(objeto JSON vazio)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 hora | 0 * * * * |
Padrão (recomendado) |
| A cada 2 horas | 0 */2 * * * |
Diminuir o volume |
| A cada 6 horas | 0 */6 * * * |
Baixo volume, processamento em lote |
Testar a integração
- No console do Cloud Scheduler, encontre seu job.
- Clique em Forçar execução para acionar o job manualmente.
- Aguarde alguns segundos.
- Acesse Cloud Run > Serviços.
- Clique no nome da função
agiloft-logs-collector. - Clique na guia Registros.
Verifique se a função foi executada com sucesso. Procure:
Fetching activity logs from YYYY-MM-DDTHH:MM:SS+00:00 to YYYY-MM-DDTHH:MM:SS+00:00 Page 0: Retrieved X events Wrote X records to gs://agiloft-activity-logs/agiloft/logs_YYYYMMDD_HHMMSS.ndjson Successfully processed X recordsAcesse Cloud Storage > Buckets.
Clique no nome do bucket.
Navegue até a pasta de prefixo
agiloft/.Verifique se um novo arquivo
.ndjsonfoi criado com o carimbo de data/hora atual.
Se você encontrar erros nos registros:
- HTTP 401: verifique as credenciais da API nas variáveis de ambiente. Verifique se o login e a senha estão corretos.
- HTTP 403: verifique se o usuário da API tem acesso de leitura à tabela do registro de atividades e pertence a um grupo ativado para REST.
- HTTP 429: limitação de taxa. A função vai tentar de novo automaticamente com espera.
- "success": false: confira a mensagem de erro. As causas comuns incluem nome incorreto da base de conhecimento (diferenciação entre maiúsculas e minúsculas) ou nome da tabela.
- Variáveis de ambiente ausentes: verifique se todas as variáveis necessárias estão definidas.
Configurar um feed no Google SecOps para ingerir registros do Agiloft
- Acesse Configurações do SIEM > Feeds.
- Clique em Adicionar novo feed.
- Clique em Configurar um único feed.
- No campo Nome do feed, insira um nome para o feed (por exemplo,
Agiloft Activity Logs). - Selecione Google Cloud Storage V2 como o Tipo de origem.
- Selecione Agiloft como o Tipo de registro.
Clique em Receber conta de serviço. Um e-mail exclusivo da conta de serviço será exibido, por exemplo:
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.comCopie esse endereço de e-mail para usar na próxima etapa.
Clique em Próxima.
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://agiloft-activity-logs/agiloft/- Substitua:
agiloft-activity-logs: o nome do bucket do GCS.agiloft: prefixo/caminho da pasta opcional onde os registros são armazenados (deixe em branco para a raiz).
- Substitua:
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.
- Excluir arquivos transferidos e diretórios vazios: exclui arquivos e diretórios vazios após a transferência.
Idade máxima do arquivo: inclua arquivos modificados no último número de dias (o padrão é 180 dias).
Namespace do recurso: o namespace do recurso
Rótulos de ingestão: o rótulo a ser aplicado aos eventos deste feed
Clique em Próxima.
Revise a nova configuração do feed na tela Finalizar e clique em Enviar.
Conceder permissões do IAM à conta de serviço do Google SecOps
A conta de serviço do Google SecOps precisa do papel Leitor de objetos do Storage no seu bucket do GCS.
- Acesse Cloud Storage > Buckets.
- Clique no nome do bucket.
- Acesse a guia Permissões.
- Clique em Conceder acesso.
- Informe os seguintes detalhes de configuração:
- Adicionar principais: cole o e-mail da conta de serviço do Google SecOps.
- Atribuir papéis: selecione Leitor de objetos do Storage.
Clique em Salvar.
Tabela de mapeamento de UDM
| Campo de registro | Mapeamento do UDM | Lógica |
|---|---|---|
_1880_full_name_label |
additional.fields |
Mesclado |
_1888_full_name_label |
additional.fields |
Mesclado |
action_duration_label |
additional.fields |
Mesclado |
cookie_label |
additional.fields |
Mesclado |
creator_login_label |
additional.fields |
Mesclado |
creator_team_label |
additional.fields |
Mesclado |
deleteable_label |
additional.fields |
Mesclado |
demo_data_label |
additional.fields |
Mesclado |
interface_label |
additional.fields |
Mesclado |
login_label |
additional.fields |
Mesclado |
record_id_label |
additional.fields |
Mesclado |
table_label_label |
additional.fields |
Mesclado |
type_label |
additional.fields |
Mesclado |
description |
metadata.description |
Mapeado diretamente |
date |
metadata.event_timestamp |
Analisado como MMM dd yyyy HH:mm:ss |
date_created |
metadata.event_timestamp |
Analisado como MMM dd yyyy HH:mm:ss |
date_updated |
metadata.event_timestamp |
Analisado como MMM dd yyyy HH:mm:ss |
timestamp |
metadata.event_timestamp |
Analisado como dd/MMM/yyyy:HH:mm:ss Z |
has_principal |
metadata.event_type |
Mapeado: true → STATUS_UPDATE |
has_principal_user |
metadata.event_type |
Mapeado: true → USER_UNCATEGORIZED |
activity_log_id |
metadata.product_deployment_id |
Mapeado diretamente |
id |
metadata.product_log_id |
Mapeado diretamente |
method |
network.http.method |
Mapeado diretamente |
url |
network.http.referral_url |
Mapeado diretamente |
response_code |
network.http.response_code |
Mapeado diretamente |
byte_transferred |
network.received_bytes |
Mapeado diretamente |
session_duration |
network.session_duration.seconds |
Mapeado diretamente |
client_ip |
principal.asset.ip |
Mesclado |
ip |
principal.asset.ip |
Mesclado |
client_ip |
principal.ip |
Mesclado |
ip |
principal.ip |
Mesclado |
user_primary_team_label |
principal.user.attribute.labels |
Mesclado |
company |
principal.user.company_name |
Mapeado diretamente |
groups |
principal.user.group_identifiers |
Mesclado |
user_name |
principal.user.user_display_name |
Mapeado diretamente |
user |
principal.user.userid |
Mapeado diretamente |
user_login |
principal.user.userid |
Mapeado diretamente |
| N/A | metadata.event_type |
Constante: USER_UNCATEGORIZED |
| N/A | metadata.product_name |
Constante: Agiloft |
| N/A | metadata.vendor_name |
Constante: Agiloft |
Registro de alterações
Ver o registro de alterações deste analisador
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.