Coletar registros de segurança do ServiceNow
Este documento explica como exportar eventos de segurança do ServiceNow para o Google Security Operations usando webhooks de saída configurados por regras de negócios. Um rótulo de ingestão identifica o analisador que normaliza dados de registro brutos para o formato UDM estruturado.
Arquitetura de integração
Essa integração usa regras de negócios do ServiceNow para enviar eventos de segurança ao Google SecOps em tempo real:
ServiceNow Security Tables ↓ (Business Rules trigger on insert/update) ServiceNow RESTMessageV2 API ↓ (HTTP POST) Google Security Operations Webhook Endpoint ↓ (Parser: SERVICENOW_SECURITY) Unified Data Model (UDM)
Características da integração:
- Push orientado por eventos: eventos enviados imediatamente quando criados ou atualizados
- Tempo real: baixa latência (segundos)
- Exportação seletiva: configure quais tabelas e eventos exportar.
- Não é uma exportação em massa: não envia dados históricos
Antes de começar
Verifique se você tem os pré-requisitos a seguir:
- Uma instância do Google SecOps
- Uma instância do ServiceNow com o plug-in Resposta a incidentes de segurança (SIR) instalado
- Uma conta de usuário do ServiceNow com os seguintes papéis:
adminousn_si.admin(para criar regras de negócios)- Acesso a Definição do sistema > Regras de negócios
- Acesso a Definição do sistema > Inclusões de script
- Acesso privilegiado ao console do Google Google Cloud (para criação de chaves de API)
Tabelas de segurança do ServiceNow para exportação
As tabelas a seguir contêm dados relevantes para a segurança para análise do SIEM:
| Tabela | Nome da API | Descrição | Prioridade |
|---|---|---|---|
| Incidente de segurança | sn_si_incident |
Incidentes e investigações de segurança | ALTA |
| Observável | sn_si_observable |
IOCs: endereços IP, domínios, hashes de arquivo | ALTA |
| Registro do sistema | syslog |
Eventos de autenticação, falhas de login | MEDIUM |
| Auditoria | sys_audit |
Mudanças no nível do campo, modificações de permissão | MEDIUM |
| Atribuição de função do usuário | sys_user_has_role |
Concessões/revogações de papéis | BAIXA |
| Descoberta de segurança | sn_si_finding |
Detecções e descobertas de segurança | BAIXA |
Este guia fornece exemplos de regras de negócios para as tabelas de alta prioridade. É possível estender a integração para outras tabelas usando o mesmo padrão.
Configurar um feed no Google SecOps para ingerir eventos de segurança do ServiceNow
Configurar o feed de webhook
- Acesse Configurações do SIEM > Feeds.
- Clique em Adicionar novo feed.
- Na próxima página, clique em Configurar um único feed.
- No campo Nome do feed, insira um nome para o feed (por exemplo,
ServiceNow Security Events). - Selecione Webhook como o Tipo de origem.
- Selecione Segurança do ServiceNow como o Tipo de registro.
- Clique em Próxima.
Configurar parâmetros de feed
Especifique valores para os seguintes parâmetros de entrada:
- Delimitador de divisão: insira
\npara separar as linhas de registro. - Namespace do recurso: o namespace do recurso.
- Rótulos de ingestão: rótulos aplicados a todos os eventos deste feed.
- Delimitador de divisão: insira
Clique em Próxima.
Revise a nova configuração do feed na tela Finalizar e clique em Enviar.
Gerar chave secreta e recuperar o URL do endpoint
- Clique em Gerar chave secreta para autenticar o feed.
Copie e salve a chave secreta em um local seguro.
Acesse a guia Detalhes.
Copie o URL do endpoint do feed no campo Informações do endpoint.
- Exemplo de URL de endpoint:
https://malachiteingestion-pa.googleapis.com/v2/unstructured/projects/PROJECT_ID/locations/LOCATION/instances/INSTANCE_ID/logTypes/SERVICENOW_SECURITY:import
- Exemplo de URL de endpoint:
Clique em Concluído.
Criar chave de API para autenticação
- Acesse a página Credenciais do consoleGoogle Cloud .
- Clique em Criar credenciais e, em seguida, selecione Chave de API.
- Clique em Restringir chave.
- Em Restrições de API:
- Selecione Restringir chave.
- Selecione API Google SecOps (API Chronicle).
- Clique em Salvar.
- Copie a chave de API e salve-a em um local seguro.
Configurar credenciais de integração do ServiceNow
Armazene as credenciais do Google SecOps como propriedades do sistema ServiceNow para acesso seguro.
- No ServiceNow, acesse Propriedades do sistema > sys_properties.list.
- Clique em Novo.
- Crie a primeira propriedade:
- Nome:
x_chronicle.endpoint_url - Valor: cole o URL do endpoint do feed da etapa anterior.
- Tipo:
string
- Nome:
- Clique em Enviar.
- Clique em Nova para criar a segunda propriedade:
- Nome:
x_chronicle.api_key - Valor: cole a chave de API Google Cloud .
- Tipo:
password(isso criptografa o valor)
- Nome:
- Clique em Enviar.
- Clique em Nova para criar a terceira propriedade:
- Nome:
x_chronicle.secret_key - Valor: cole a chave secreta do feed do Google SecOps.
- Tipo:
password(isso criptografa o valor)
- Nome:
- Clique em Enviar.
Criar um Script Include de utilitário de webhook reutilizável
Esse Script Include fornece uma função reutilizável para enviar eventos ao Google SecOps de qualquer regra de negócios.
- Acesse Definição do sistema > Inclusões de script.
- Clique em Novo.
- Informe os seguintes detalhes de configuração:
- Nome:
ChronicleWebhookUtil - Nome da API:
ChronicleWebhookUtil - Chamada do cliente: desmarcada
- Ativo: marcado
- Nome:
No campo Script, insira o seguinte código:
var ChronicleWebhookUtil = Class.create(); ChronicleWebhookUtil.prototype = { initialize: function() { // Read credentials from System Properties this.endpointURL = gs.getProperty('x_chronicle.endpoint_url'); this.apiKey = gs.getProperty('x_chronicle.api_key'); this.secretKey = gs.getProperty('x_chronicle.secret_key'); }, sendEvent: function(eventData, eventType) { try { // Validate credentials if (!this.endpointURL || !this.apiKey || !this.secretKey) { gs.error('[Chronicle] Missing configuration. Check System Properties: x_chronicle.*'); return false; } // Prepare payload var payload = { event_type: eventType, timestamp: new GlideDateTime().getDisplayValue(), data: eventData, source: "ServiceNow", source_instance: gs.getProperty('instance_name') }; // Create REST message var request = new sn_ws.RESTMessageV2(); request.setEndpoint(this.endpointURL + '?key=' + this.apiKey); request.setHttpMethod('POST'); // Set headers request.setRequestHeader('Content-Type', 'application/json'); request.setRequestHeader('x-chronicle-auth', this.secretKey); // Set request body request.setRequestBody(JSON.stringify(payload)); // Execute request var response = request.execute(); var statusCode = response.getStatusCode(); var responseBody = response.getBody(); // Check response if (statusCode == 200 || statusCode == 201 || statusCode == 204) { gs.info('[Chronicle] Event sent successfully: ' + eventType + ' | Status: ' + statusCode); return true; } else { gs.error('[Chronicle] Failed to send event: ' + eventType + ' | Status: ' + statusCode + ' | Response: ' + responseBody); return false; } } catch (ex) { gs.error('[Chronicle] Exception sending event: ' + ex.message); return false; } }, type: 'ChronicleWebhookUtil' };Clique em Enviar.
Criar regras de negócios para exportação de eventos
As regras de negócios são acionadas automaticamente quando os registros são criados ou atualizados nas tabelas do ServiceNow. Crie uma regra de negócios para cada tabela que você quer exportar para o Google SecOps.
Regra de negócios: incidentes de segurança
Essa regra de negócios exporta eventos de incidentes de segurança para o Google SecOps.
- Acesse Definição do sistema > Regras de negócios.
- Clique em Novo.
Informe os seguintes detalhes de configuração:
Quando executar:
Campo Valor Nome Chronicle - Export Security IncidentTabela Security Incident [sn_si_incident]Ativo Selecionado Avançado Selecionado Quando afterInserir Selecionado Atualizar Selecionado Excluir Opcional (marque para rastrear exclusões) Ordem 100Clique na guia Avançado, acesse o campo Script e insira o seguinte código:
(function executeRule(current, previous /*null when async*/) { // Extract incident data var incidentData = { sys_id: current.getValue('sys_id'), number: current.getValue('number'), short_description: current.getValue('short_description'), description: current.getValue('description'), state: current.getDisplayValue('state'), priority: current.getDisplayValue('priority'), severity: current.getDisplayValue('severity'), risk_score: current.getValue('risk_score'), category: current.getDisplayValue('category'), subcategory: current.getDisplayValue('subcategory'), assigned_to: current.getDisplayValue('assigned_to'), assignment_group: current.getDisplayValue('assignment_group'), caller: current.getDisplayValue('caller'), affected_user: current.getDisplayValue('affected_user'), opened_at: current.getValue('opened_at'), closed_at: current.getValue('closed_at'), resolved_at: current.getValue('resolved_at'), sys_created_on: current.getValue('sys_created_on'), sys_updated_on: current.getValue('sys_updated_on'), sys_created_by: current.getValue('sys_created_by'), sys_updated_by: current.getValue('sys_updated_by'), work_notes: current.getValue('work_notes'), close_notes: current.getValue('close_notes') }; // Send to Chronicle var chronicleUtil = new ChronicleWebhookUtil(); chronicleUtil.sendEvent(incidentData, 'security_incident'); })(current, previous);Clique em Enviar.
Regra de negócios: observáveis (IOCs)
Essa regra de negócios exporta dados observáveis (endereços IP, domínios, hashes de arquivos) para o Google SecOps.
- Acesse Definição do sistema > Regras de negócios.
- Clique em Novo.
Informe os seguintes detalhes de configuração:
Campo Valor Nome Chronicle - Export ObservableTabela Observable [sn_si_observable]Ativo Selecionado Avançado Selecionado Quando afterInserir Selecionado Atualizar Selecionado Ordem 100Clique na guia Avançado, acesse o campo Script e insira o seguinte código:
(function executeRule(current, previous) { var observableData = { sys_id: current.getValue('sys_id'), value: current.getValue('value'), type: current.getDisplayValue('type'), finding: current.getDisplayValue('finding'), sighting_count: current.getValue('sighting_count'), notes: current.getValue('notes'), security_tags: current.getValue('security_tags'), mitre_technique: current.getDisplayValue('mitre_technique'), mitre_tactic: current.getDisplayValue('mitre_tactic'), mitre_malware: current.getDisplayValue('mitre_malware'), sys_created_on: current.getValue('sys_created_on'), sys_created_by: current.getValue('sys_created_by') }; var chronicleUtil = new ChronicleWebhookUtil(); chronicleUtil.sendEvent(observableData, 'observable'); })(current, previous);Clique em Enviar.
Regra de negócios: eventos de login do sistema
Essa regra de negócios exporta eventos de autenticação e login para o Google SecOps.
- Acesse Definição do sistema > Regras de negócios.
- Clique em Novo.
Informe os seguintes detalhes de configuração:
Campo Valor Nome Chronicle - Export System LogTabela System Log [syslog]Ativo Selecionado Avançado Selecionado Quando afterInserir Selecionado Ordem 100Condição current.level == "error" || current.source.indexOf("login") != -1Clique na guia Avançado, acesse o campo Script e insira o seguinte código:
(function executeRule(current, previous) { var logData = { sys_id: current.getValue('sys_id'), level: current.getValue('level'), source: current.getValue('source'), message: current.getValue('message'), sys_created_on: current.getValue('sys_created_on'), sys_created_by: current.getValue('sys_created_by') }; var chronicleUtil = new ChronicleWebhookUtil(); chronicleUtil.sendEvent(logData, 'system_log'); })(current, previous);Clique em Enviar.
Regra de negócios: trilha de auditoria (mudanças de permissão)
Essa regra de negócios exporta mudanças no nível do campo para fins de auditoria.
- Acesse Definição do sistema > Regras de negócios.
- Clique em Novo.
Informe os seguintes detalhes de configuração:
Campo Valor Nome Chronicle - Export Audit ChangesTabela Audit [sys_audit]Ativo Selecionado Avançado Selecionado Quando afterInserir Selecionado Ordem 100Condição Confira o script a seguir Condição (filtrar apenas mudanças críticas):
```javascript current.tablename == 'sys_user_has_role' || current.tablename == 'sys_user_group_member' || current.tablename == 'sn_si_incident' || current.fieldname == 'active' || current.fieldname == 'locked_out' ```Clique na guia Avançado, acesse o campo Script e insira o seguinte código:
(function executeRule(current, previous) { var auditData = { sys_id: current.getValue('sys_id'), tablename: current.getValue('tablename'), documentkey: current.getValue('documentkey'), fieldname: current.getValue('fieldname'), oldvalue: current.getValue('oldvalue'), newvalue: current.getValue('newvalue'), user: current.getDisplayValue('user'), reason: current.getValue('reason'), sys_created_on: current.getValue('sys_created_on') }; var chronicleUtil = new ChronicleWebhookUtil(); chronicleUtil.sendEvent(auditData, 'audit_change'); })(current, previous);Clique em Enviar.
Opcional: outras tabelas para exportação
Mudanças na atribuição de função do usuário
Exporte concessões e revogações de papéis para auditoria de segurança.
Crie uma regra de negócios na tabela
sys_user_has_role:(function executeRule(current, previous) { var roleData = { sys_id: current.getValue('sys_id'), user: current.getDisplayValue('user'), role: current.getDisplayValue('role'), granted_by: current.getDisplayValue('granted_by'), state: current.getValue('state'), sys_created_on: current.getValue('sys_created_on') }; var chronicleUtil = new ChronicleWebhookUtil(); chronicleUtil.sendEvent(roleData, 'role_assignment'); })(current, previous);
Descobertas de segurança
Exporte detecções e descobertas de segurança.
Crie uma regra de negócios na tabela
sn_si_finding:(function executeRule(current, previous) { var findingData = { sys_id: current.getValue('sys_id'), finding: current.getValue('finding'), confidence: current.getValue('confidence'), severity: current.getDisplayValue('severity'), observable: current.getDisplayValue('observable'), sys_created_on: current.getValue('sys_created_on') }; var chronicleUtil = new ChronicleWebhookUtil(); chronicleUtil.sendEvent(findingData, 'finding'); })(current, previous);
Para mais informações sobre feeds do Google SecOps, consulte a documentação sobre feeds do Google SecOps. Para informações sobre os requisitos de cada tipo de feed, consulte Configuração de feed por tipo.
Se você tiver problemas ao criar feeds, entre em contato com o suporte da SecOps do Google.
Tabela de mapeamento do UDM
| Campo do ServiceNow | Mapeamento do UDM | Lógica |
|---|---|---|
number |
metadata.product_event_type |
Número do incidente ou evento |
short_description |
security_result.summary |
Breve descrição do ocorrência de segurança |
severity |
security_result.severity |
Nível de gravidade do evento |
priority |
security_result.priority |
Prioridade do evento |
caller |
principal.user.userid |
Usuário que informou ou acionou o evento |
affected_user |
target.user.userid |
Usuário afetado pelo ocorrência de segurança |
assigned_to |
security_result.action_details |
Analista atribuído ao incidente |
sys_created_on |
metadata.event_timestamp |
Carimbo de data/hora da criação do evento |
value (observável) |
network.ip ou network.dns.questions.name |
Valor observável (IP, domínio, hash) |
type (observável) |
security_result.detection_fields.value |
Tipo de observável (endereço IP, domínio, hash de arquivo) |
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.