Recolha registos de segurança do ServiceNow
Este documento explica como exportar eventos de segurança do ServiceNow para o Google Security Operations através de webhooks de saída configurados através de regras empresariais. Uma etiqueta de carregamento identifica o analisador que normaliza os dados de registo não processados para o formato UDM estruturado.
Arquitetura de integração
Esta integração usa regras empresariais do ServiceNow para enviar eventos de segurança para o 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:
- Envio acionado por eventos: eventos enviados imediatamente quando são criados ou atualizados
- Em tempo real: latência baixa (segundos)
- Exportação seletiva: configure que tabelas e eventos exportar
- Não exportação em massa: não envia dados do histórico
Antes de começar
Certifique-se de que cumpre os seguintes pré-requisitos:
- Uma instância do Google SecOps
- Uma instância do ServiceNow com o plugin Security Incident Response (SIR) instalado
- Uma conta de utilizador do ServiceNow com as seguintes funções:
adminousn_si.admin(para criar regras empresariais)- Acesso a Definição do sistema > Regras empresariais
- Acesso a System Definition > Script Includes
- Acesso privilegiado à consola Google Cloud Google (para a criação de chaves de API)
Tabelas de segurança do ServiceNow para exportação
As tabelas seguintes contêm dados relevantes para a segurança para análise de SIEM:
| Tabela | Nome da API | Descrição | Prioridade |
|---|---|---|---|
| Incidente de segurança | sn_si_incident |
Incidentes de segurança, investigações | ELEVADO |
| Observável | sn_si_observable |
IOCs: endereços IP, domínios, hashes de ficheiros | ELEVADO |
| Registo do sistema | syslog |
Eventos de autenticação, falhas de início de sessão | MEDIUM |
| Auditoria | sys_audit |
Alterações ao nível do campo, modificações de autorizações | MEDIUM |
| Atribuição de funções de utilizador | sys_user_has_role |
Concessões/revogações de funções | BAIXO |
| Constatação de segurança | sn_si_finding |
Deteções e conclusões de segurança | BAIXO |
Este guia fornece exemplos de regras empresariais para as tabelas de prioridade ALTA. Pode estender a integração a tabelas adicionais usando o mesmo padrão.
Configure um feed no Google SecOps para carregar eventos de segurança do ServiceNow
Configure o feed de webhook
- Aceda a Definições do SIEM > Feeds.
- Clique em Adicionar novo feed.
- Na página seguinte, clique em Configurar um único feed.
- No campo Nome do feed, introduza um nome para o feed (por exemplo,
ServiceNow Security Events). - Selecione Webhook como o Tipo de origem.
- Selecione ServiceNow Security como Tipo de registo.
- Clicar em Seguinte.
Configure parâmetros do feed
Especifique valores para os seguintes parâmetros de entrada:
- Delimitador de divisão: introduza
\npara separar as linhas do registo. - Espaço de nomes do recurso: o espaço de nomes do recurso.
- Etiquetas de carregamento: etiquetas aplicadas a todos os eventos deste feed.
- Delimitador de divisão: introduza
Clicar em Seguinte.
Reveja a nova configuração do feed no ecrã Finalizar e, de seguida, clique em Enviar.
Gere a chave secreta e obtenha o URL do ponto final
- Clique em Gerar chave secreta para gerar uma chave secreta para autenticar este feed.
Copie e guarde a chave secreta num local seguro.
Aceda ao separador Detalhes.
Copie o URL do ponto final do feed do campo Informações do ponto final.
- Exemplo de URL do ponto final:
https://malachiteingestion-pa.googleapis.com/v2/unstructured/projects/PROJECT_ID/locations/LOCATION/instances/INSTANCE_ID/logTypes/SERVICENOW_SECURITY:import
- Exemplo de URL do ponto final:
Clique em Concluído.
Crie uma chave de API para autenticação
- Aceda à página Google Cloud Credenciais da consola.
- Clique em Criar credenciais e, de 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 Guardar.
- Copie a chave da API e guarde-a num local seguro.
Configure as credenciais de integração do ServiceNow
Armazene as credenciais do Google SecOps como propriedades do sistema do ServiceNow para acesso seguro.
- No ServiceNow, aceda a System Properties > sys_properties.list.
- Clique em Novo.
- Crie a primeira propriedade:
- Nome:
x_chronicle.endpoint_url - Valor: cole o URL do ponto final do feed do passo anterior
- Tipo:
string
- Nome:
- Clique em Enviar.
- Clique em Novo para criar a segunda propriedade:
- Nome:
x_chronicle.api_key - Valor: cole a Google Cloud chave da API
- Tipo:
password(isto encripta o valor)
- Nome:
- Clique em Enviar.
- Clique em Novo para criar a terceira propriedade:
- Nome:
x_chronicle.secret_key - Valor: cole a chave secreta do feed do Google SecOps
- Tipo:
password(isto encripta o valor)
- Nome:
- Clique em Enviar.
Crie um script de inclusão de utilitários de webhook reutilizável
Este Script Include fornece uma função reutilizável para enviar eventos para o Google SecOps a partir de qualquer regra empresarial.
- Aceda a System Definition > Script Includes.
- Clique em Novo.
- Forneça os seguintes detalhes de configuração:
- Nome:
ChronicleWebhookUtil - Nome da API:
ChronicleWebhookUtil - Chamável pelo cliente: não selecionado
- Ativo: selecionado
- Nome:
No campo Script, introduza 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.
Crie regras empresariais para a exportação de eventos
As regras empresariais são acionadas automaticamente quando os registos são criados ou atualizados em tabelas do ServiceNow. Crie uma regra empresarial para cada tabela que quer exportar para o Google SecOps.
Regra empresarial: incidentes de segurança
Esta regra empresarial exporta eventos de incidentes de segurança para o Google SecOps.
- Aceda a Definição do sistema > Regras empresariais.
- Clique em Novo.
Faculte os seguintes detalhes de configuração:
Quando executar:
Campo Valor Nome Chronicle - Export Security IncidentTabela Security Incident [sn_si_incident]Ativo Marcado Avançado Marcado Quando afterInserir Marcado Atualizar Marcado Eliminar Opcional (selecione para acompanhar as eliminações) Encomendar 100Clique no separador Avançadas, aceda ao campo Script e introduza 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)
Esta regra empresarial exporta dados observáveis (endereços IP, domínios, hashes de ficheiros) para o Google SecOps.
- Aceda a Definição do sistema > Regras empresariais.
- Clique em Novo.
Faculte os seguintes detalhes de configuração:
Campo Valor Nome Chronicle - Export ObservableTabela Observable [sn_si_observable]Ativo Marcado Avançado Marcado Quando afterInserir Marcado Atualizar Marcado Encomendar 100Clique no separador Avançadas, aceda ao campo Script e introduza 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 empresarial: eventos de início de sessão do sistema
Esta regra empresarial exporta eventos de autenticação e início de sessão para o Google SecOps.
- Aceda a Definição do sistema > Regras empresariais.
- Clique em Novo.
Faculte os seguintes detalhes de configuração:
Campo Valor Nome Chronicle - Export System LogTabela System Log [syslog]Ativo Marcado Avançado Marcado Quando afterInserir Marcado Encomendar 100Condição current.level == "error" || current.source.indexOf("login") != -1Clique no separador Avançadas, aceda ao campo Script e introduza 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 empresarial: registo de auditoria (alterações de autorizações)
Esta regra empresarial exporta alterações ao nível do campo para fins de registo de auditoria.
- Aceda a Definição do sistema > Regras empresariais.
- Clique em Novo.
Faculte os seguintes detalhes de configuração:
Campo Valor Nome Chronicle - Export Audit ChangesTabela Audit [sys_audit]Ativo Marcado Avançado Marcado Quando afterInserir Marcado Encomendar 100Condição Veja o script seguinte Condição (filtre apenas alterações 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 no separador Avançadas, aceda ao campo Script e introduza 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: tabelas adicionais para exportação
Alterações à atribuição de funções de utilizador
Exporte concessões e revogações de funções para auditoria de segurança.
Crie uma regra empresarial 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);
Resultados de segurança
Exporte deteções e conclusões de segurança.
Crie uma regra empresarial 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 de feeds do Google SecOps. Para informações sobre os requisitos de cada tipo de feed, consulte o artigo Configuração do feed por tipo.
Se tiver problemas ao criar feeds, contacte o apoio técnico da Google SecOps.
Tabela de mapeamento da UDM
| Campo do ServiceNow | Mapeamento da UDM | Lógica |
|---|---|---|
number |
metadata.product_event_type |
Número do incidente ou do evento |
short_description |
security_result.summary |
Breve descrição do evento de segurança |
severity |
security_result.severity |
Nível de gravidade do evento |
priority |
security_result.priority |
Prioridade do evento |
caller |
principal.user.userid |
Utilizador que denunciou ou acionou o evento |
affected_user |
target.user.userid |
Utilizador afetado pelo evento de segurança |
assigned_to |
security_result.action_details |
Analista atribuído ao incidente |
sys_created_on |
metadata.event_timestamp |
Data/hora de 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 observável (endereço IP, domínio, hash de ficheiro) |
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais da Google SecOps.