Recolha registos de segurança do ServiceNow

Suportado em:

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:
    • admin ou sn_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

  1. Aceda a Definições do SIEM > Feeds.
  2. Clique em Adicionar novo feed.
  3. Na página seguinte, clique em Configurar um único feed.
  4. No campo Nome do feed, introduza um nome para o feed (por exemplo, ServiceNow Security Events).
  5. Selecione Webhook como o Tipo de origem.
  6. Selecione ServiceNow Security como Tipo de registo.
  7. Clicar em Seguinte.

Configure parâmetros do feed

  1. Especifique valores para os seguintes parâmetros de entrada:

    • Delimitador de divisão: introduza \n para 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.
  2. Clicar em Seguinte.

  3. 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

  1. Clique em Gerar chave secreta para gerar uma chave secreta para autenticar este feed.
  2. Copie e guarde a chave secreta num local seguro.

  3. Aceda ao separador Detalhes.

  4. 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
  5. Clique em Concluído.

Crie uma chave de API para autenticação

  1. Aceda à página Google Cloud Credenciais da consola.
  2. Clique em Criar credenciais e, de seguida, selecione Chave de API.
  3. Clique em Restringir chave.
  4. Em Restrições de API:
    • Selecione Restringir chave.
    • Selecione API Google SecOps (API Chronicle).
  5. Clique em Guardar.
  6. 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.

  1. No ServiceNow, aceda a System Properties > sys_properties.list.
  2. Clique em Novo.
  3. Crie a primeira propriedade:
    • Nome: x_chronicle.endpoint_url
    • Valor: cole o URL do ponto final do feed do passo anterior
    • Tipo: string
  4. Clique em Enviar.
  5. 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)
  6. Clique em Enviar.
  7. 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)
  8. 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.

  1. Aceda a System Definition > Script Includes.
  2. Clique em Novo.
  3. Forneça os seguintes detalhes de configuração:
    • Nome: ChronicleWebhookUtil
    • Nome da API: ChronicleWebhookUtil
    • Chamável pelo cliente: não selecionado
    • Ativo: selecionado
  4. 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'
    };
    
  5. 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.

  1. Aceda a Definição do sistema > Regras empresariais.
  2. Clique em Novo.
  3. Faculte os seguintes detalhes de configuração:

    Quando executar:

    Campo Valor
    Nome Chronicle - Export Security Incident
    Tabela Security Incident [sn_si_incident]
    Ativo Marcado
    Avançado Marcado
    Quando after
    Inserir Marcado
    Atualizar Marcado
    Eliminar Opcional (selecione para acompanhar as eliminações)
    Encomendar 100
  4. Clique 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);
    
  5. 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.

  1. Aceda a Definição do sistema > Regras empresariais.
  2. Clique em Novo.
  3. Faculte os seguintes detalhes de configuração:

    Campo Valor
    Nome Chronicle - Export Observable
    Tabela Observable [sn_si_observable]
    Ativo Marcado
    Avançado Marcado
    Quando after
    Inserir Marcado
    Atualizar Marcado
    Encomendar 100
  4. Clique 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);
    
  5. 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.

  1. Aceda a Definição do sistema > Regras empresariais.
  2. Clique em Novo.
  3. Faculte os seguintes detalhes de configuração:

    Campo Valor
    Nome Chronicle - Export System Log
    Tabela System Log [syslog]
    Ativo Marcado
    Avançado Marcado
    Quando after
    Inserir Marcado
    Encomendar 100
    Condição current.level == "error" || current.source.indexOf("login") != -1
  4. Clique 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);
    
  5. 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.

  1. Aceda a Definição do sistema > Regras empresariais.
  2. Clique em Novo.
  3. Faculte os seguintes detalhes de configuração:

    Campo Valor
    Nome Chronicle - Export Audit Changes
    Tabela Audit [sys_audit]
    Ativo Marcado
    Avançado Marcado
    Quando after
    Inserir Marcado
    Encomendar 100
    Condiçã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'
    ```
    
  4. 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);
    
  5. 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.