Coletar registros do PowerShell

Compatível com:

Este documento explica como coletar logs do PowerShell para as operações de segurança do Google usando o Bindplane. O analisador transforma os registros brutos do Microsoft PowerShell em um modelo de dados unificado (UDM). Primeiro, ele extrai campos da mensagem de registro bruta, os normaliza em campos do UDM e, em seguida, enriquece os dados com mais contexto com base em IDs de eventos específicos, criando um evento estruturado do UDM para análise de segurança.

Antes de começar

  • Verifique se você tem uma instância do Google SecOps.
  • Verifique se você tem o Windows 2016 ou mais recente.
  • Se estiver executando por trás de um proxy, verifique se as portas do firewall estão abertas.

Receber o arquivo de autenticação de ingestão do Google SecOps

  1. Faça login no console do Google SecOps.
  2. Acesse Configurações do SIEM > Agentes de coleta.
  3. Faça o download do arquivo de autenticação de transferência. Salve o arquivo com segurança no sistema em que o BindPlane será instalado.

Receber o ID de cliente do Google SecOps

  1. Faça login no console do Google SecOps.
  2. Acesse Configurações do SIEM > Perfil.
  3. Copie e salve o ID do cliente na seção Detalhes da organização.

Instalar o agente do Bindplane no Windows

  1. Abra o Prompt de Comando ou o PowerShell como administrador.
  2. Execute este comando:

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    

Outros recursos de instalação

Configurar o agente do Bindplane para processar o Syslog e enviar ao Google SecOps

  1. Antes de configurar o arquivo YAML, pare o serviço observIQ Distro for Open Telemetry Collector no painel de serviços.
  2. Acesse o arquivo de configuração:

    1. Localize o arquivo config.yaml. Normalmente, ele está no diretório /etc/bindplane-agent/ no Linux ou no diretório de instalação no Windows.
    2. Abra o arquivo usando um editor de texto (por exemplo, nano, vi ou Notepad).
  3. Edite o arquivo config.yaml da seguinte forma:

    receivers:
      windowseventlog/powershell:
        channel: Microsoft-Windows-PowerShell/Operational
        max_reads: 100
        poll_interval: 5s
        raw: true
        start_at: end
    
    processors:
      batch:
    
    exporters:
      chronicle/powershell:
        endpoint: malachiteingestion-pa.googleapis.com
        # Adjust the path to the credentials file you downloaded in Step 1
        creds: '/path/to/ingestion-authentication-file.json'
        log_type: 'POWERSHELL'
        override_log_type: false
        raw_log_field: body
        customer_id: '<customer_id>'
    
    service:
      pipelines:
        logs/winpowershell:
          receivers:
            - windowseventlog/powershell
          processors: [batch]
          exporters: [chronicle/powershell] 
    
  4. Substitua <customer_id> pelo ID real do cliente.

  5. Atualize /path/to/ingestion-authentication-file.json para o caminho em que o arquivo de autenticação foi salvo na seção Receber o arquivo de autenticação de transferência do Google SecOps.

  6. Depois de salvar o arquivo config.yaml, inicie o serviço observIQ Distro for Open Telemetry Collector.

Reinicie o agente do Bindplane para aplicar as mudanças

  • Para reiniciar o agente do Bindplane no Windows, use o console Services ou digite o seguinte comando:

    net stop BindPlaneAgent && net start BindPlaneAgent
    

Tabela de mapeamento do UDM

Campo de registro Mapeamento do UDM Lógica
AccountName principal.user.userid Mapeado diretamente do campo AccountName no registro bruto.
ActivityID security_result.detection_fields[0].value Mapeado diretamente do campo ActivityID no registro bruto. As chaves são removidas.
Canal Não mapeado para o objeto IDM.
collection_time.nanos Não mapeado para o objeto IDM.
collection_time.seconds Não mapeado para o objeto IDM.
Comando Não mapeado para o objeto IDM.
CommandLine Não mapeado para o objeto IDM.
Computador principal.hostname Mapeado diretamente do campo Computer no registro bruto, se presente.
ContextInfo Não mapeado para o objeto IDM.
ContextInfo_Command Name security_result.detection_fields[0].value Mapeado diretamente do campo ContextInfo_Command Name no registro bruto, se presente.
ContextInfo_Command Type security_result.detection_fields[1].value Mapeado diretamente do campo ContextInfo_Command Type no registro bruto, se presente.
ContextInfo_Host Application target.process.command_line Mapeado diretamente do campo ContextInfo_Host Application no registro bruto se powershell.Host Application não estiver presente.
ID do ContextInfo_Host target.asset.asset_id Mapeado diretamente do campo ContextInfo_Host ID no registro bruto se powershell.Host ID não estiver presente. O valor tem o prefixo Host ID:.
ContextInfo_Host Name target.hostname Mapeado diretamente do campo ContextInfo_Host Name no registro bruto se powershell.Host Name não estiver presente.
ContextInfo_Script Name target.process.file.full_path Mapeado diretamente do campo ContextInfo_Script Name no registro bruto se script_name não estiver presente.
Número de sequência de ContextInfo security_result.detection_fields[2].value Mapeado diretamente do campo ContextInfo_Sequence Number no registro bruto, se presente. Convertido em uma string.
ContextInfo_Severity Não mapeado para o objeto IDM.
create_time.nanos Não mapeado para o objeto IDM.
create_time.seconds Não mapeado para o objeto IDM.
customer_id Não mapeado para o objeto IDM.
dados Não mapeado para o objeto IDM.
Dados security_result.detection_fields[0].value Mapeado diretamente do campo Data no registro bruto, se presente.
Data_1 security_result.detection_fields[1].value Mapeado diretamente do campo Data_1 no registro bruto, se presente.
Data_2 security_result.detection_fields[2].value Mapeado diretamente do campo Data_2 no registro bruto, se presente.
Domínio principal.administrative_domain Mapeado diretamente do campo Domain no registro bruto.
entries Não mapeado para o objeto IDM.
ERROR_EVT_UNRESOLVED Não mapeado para o objeto IDM.
EventCategory Não mapeado para o objeto IDM.
EventData Não mapeado para o objeto IDM.
EventID metadata.product_event_type, security_result.rule_name Mapeado diretamente do campo EventID no registro bruto. O valor tem o prefixo EventID: para o campo security_result.rule_name.
EventLevel Não mapeado para o objeto IDM.
EventLevelName security_result.severity Mapeado com base no valor de EventLevelName:
- Information é mapeado para INFORMATIONAL.
: Verbose é mapeado para LOW.
EventLog Não mapeado para o objeto IDM.
EventReceivedTime Não mapeado para o objeto IDM.
EventType Não mapeado para o objeto IDM.
EventTime metadata.event_timestamp Usado para extrair o carimbo de data/hora, se presente.
ExecutionProcessID principal.process.pid Mapeado diretamente do campo ExecutionProcessID no registro bruto, se presente e não vazio ou 0. Convertido em uma string.
ExecutionThreadID security_result.detection_fields[2].value Mapeado diretamente do campo ExecutionThreadID no registro bruto, se presente e não vazio ou 0. Convertido em uma string.
Arquivo target.process.file.full_path Mapeado diretamente do campo File no registro bruto, se presente.
Aplicativo host Não mapeado para o objeto IDM.
HostApplication Não mapeado para o objeto IDM.
Nome do host principal.hostname Mapeado diretamente do campo Hostname no registro bruto.
id Não mapeado para o objeto IDM.
Palavras-chave Não mapeado para o objeto IDM.
log_type metadata.log_type Mapeado diretamente do campo log_type no registro bruto.
Máquina principal.asset.asset_id, principal.asset.platform_software.platform_version O campo Machine é analisado para extrair o ID da máquina e as informações da plataforma. O ID da máquina tem o prefixo Machine ID:. A plataforma é mapeada para a enumeração do UDM com base no valor:
- win é mapeado para WINDOWS.
: mac é mapeado para MAC.
: lin é mapeado para LINUX.
: outros valores são mapeados para UNKNOWN_PLATFORM.
ManagementGroupName additional.fields[0].value.string_value Mapeado diretamente do campo ManagementGroupName no registro bruto, se presente.
Message.EventTime metadata.event_timestamp Usado para extrair o carimbo de data/hora, se presente. Convertido em uma string.
Message.Message security_result.description Mapeado diretamente do campo Message.Message no registro bruto se EventID estiver em [403, 4103, 4104] e message_message_not_found. As tabulações e os retornos de carro são substituídos por vírgulas.
Mensagem security_result.description Mapeado diretamente do campo Message no registro bruto, se presente.
MessageNumber Não mapeado para o objeto IDM.
MessageSourceAddress principal.ip Mapeado diretamente do campo MessageSourceAddress no registro bruto, se presente.
MessageTotal Não mapeado para o objeto IDM.
MG Não mapeado para o objeto IDM.
Opcode metadata.description Mapeado diretamente do campo Opcode no registro bruto.
OpcodeValue Não mapeado para o objeto IDM.
Saída security_result.detection_fields[0].value Mapeado diretamente do campo Output no registro bruto, se presente.
powershell.Command Name security_result.detection_fields[0].value Mapeado diretamente do campo powershell.Command Name, se presente.
powershell.Command Type security_result.detection_fields[1].value Mapeado diretamente do campo powershell.Command Type, se presente.
powershell.Host Application target.process.command_line Mapeado diretamente do campo powershell.Host Application no registro bruto, se presente.
powershell.Host ID target.asset.asset_id Mapeado diretamente do campo powershell.Host ID no registro bruto, se presente. O valor tem o prefixo Host ID:.
powershell.Host Name target.hostname Mapeado diretamente do campo powershell.Host Name no registro bruto, se presente.
powershell.HostApplication target.process.command_line Mapeado diretamente do campo powershell.HostApplication no registro bruto, se presente.
powershell.HostId target.asset.asset_id Mapeado diretamente do campo powershell.HostId no registro bruto, se presente. O valor tem o prefixo Host ID:.
powershell.HostName target.hostname Mapeado diretamente do campo powershell.HostName no registro bruto, se presente.
powershell.Script Name target.process.file.full_path Mapeado diretamente do campo powershell.Script Name no registro bruto, se presente.
powershell.ScriptName target.process.file.full_path Mapeado diretamente do campo powershell.ScriptName no registro bruto, se presente.
powershell.Sequence Number security_result.detection_fields[2].value Mapeado diretamente do campo powershell.Sequence Number no registro bruto, se presente.
powershell.SequenceNumber security_result.detection_fields[0].value Mapeado diretamente do campo powershell.SequenceNumber no registro bruto, se presente.
powershell.UserId principal.user.userid Mapeado diretamente do campo powershell.UserId no registro bruto, se presente.
ID do processo principal.process.pid Mapeado diretamente do campo Process ID no registro bruto se ExecutionProcessID e ProcessID não estiverem presentes, estiverem vazios ou forem 0. Convertido em uma string.
ProcessID principal.process.pid Mapeado diretamente do campo ProcessID no registro bruto se ExecutionProcessID não estiver presente, vazio ou 0. Convertido em uma string.
ProviderGuid metadata.product_deployment_id Mapeado diretamente do campo ProviderGuid no registro bruto. As chaves são removidas.
PSEdition Não mapeado para o objeto IDM.
PSRemotingProtocolVersion Não mapeado para o objeto IDM.
PSVersion Não mapeado para o objeto IDM.
RecordNumber metadata.product_log_id Mapeado diretamente do campo RecordNumber no registro bruto. Convertido em uma string.
RenderedDescription security_result.description Mapeado diretamente do campo RenderedDescription no registro bruto, se presente.
Usuário RunAs Não mapeado para o objeto IDM.
ScriptBlockId Não mapeado para o objeto IDM.
ScriptBlockText security_result.detection_fields[0].value Mapeado diretamente do campo ScriptBlockText no registro bruto, se presente.
ID do ScriptBlock Não mapeado para o objeto IDM.
Gravidade security_result.severity, security_result.severity_details Mapeado com base no valor de Severity:
- verbose ou info é mapeado para LOW.
: warn ou err são mapeados para MEDIUM.
: crit é mapeado para HIGH.
O valor bruto também é mapeado para security_result.severity_details.
source.collector_id Não mapeado para o objeto IDM.
source.customer_id Não mapeado para o objeto IDM.
Origem additional.fields[1].value.string_value Mapeado diretamente do campo Source no registro bruto, se presente.
SourceModuleName principal.resource.name Mapeado diretamente do campo SourceModuleName no registro bruto.
SourceModuleType principal.resource.resource_subtype Mapeado diretamente do campo SourceModuleType no registro bruto.
SourceName metadata.product_name Mapeado diretamente do campo SourceName no registro bruto.
start_time.nanos Não mapeado para o objeto IDM.
start_time.seconds Não mapeado para o objeto IDM.
TenantId additional.fields[2].value.string_value Mapeado diretamente do campo TenantId no registro bruto, se presente.
ThreadID Não mapeado para o objeto IDM.
timestamp.nanos Não mapeado para o objeto IDM.
timestamp.seconds Não mapeado para o objeto IDM.
tipo Não mapeado para o objeto IDM.
UserID principal.user.windows_sid Mapeado diretamente do campo UserID no registro bruto.
Nome de usuário principal.user.userid Mapeado diretamente do campo Username no registro bruto se AccountName não estiver presente.
metadata.vendor_name Defina como Microsoft.
metadata.event_type Defina como PROCESS_LAUNCH se EventID for 4104 e _Path estiver presente em Message ou se EventID for 4103 ou se EventID estiver em [800, 600, 400] e powershell.ScriptName e powershell.HostApplication estiverem presentes. Defina como PROCESS_TERMINATION se EventID for 403 e _HostApplication estiver presente em Message ou se EventID for 403 e NewEngineState for Stopped. Defina como STATUS_UPDATE se EventID for 4104 e _Path não estiver presente em Message ou se EventID for 4103 e no_value, script_name estiver vazio, script_name_not_found e host_application_not_found forem verdadeiros ou se EventID for 53504 ou EventID for 40962 ou EventID for 40961 ou se EventID estiver vazio e MessageSourceAddress estiver presente. Defina como USER_UNCATEGORIZED se EventID estiver vazio e Username estiver presente. Defina como GENERIC_EVENT se EventID estiver vazio e MessageSourceAddress e Username não estiverem presentes.
metadata.product_name Defina como Powershell se SourceName não estiver presente.
security_result.action Defina como ALLOW.
security_result.detection_fields[0].key Defina como Activity ID.
security_result.detection_fields[1].key Defina como Sequence Number.
security_result.detection_fields[2].key Defina como ExecutionThreadID.
additional.fields[0].key Defina como Management Group Name.
additional.fields[1].key Defina como Source.
additional.fields[2].key Defina como TenantId.
principal.asset.platform_software.platform Defina como WINDOWS se platform_software contiver win, MAC se contiver mac, LINUX se contiver lin e UNKNOWN_PLATFORM caso contrário.
target.process.file.full_path Defina como _Path se EventID for 4104 e _Path estiver presente em Message. Defina como file_path se EventID for 4104 e file_path estiver presente em Message. Defina como _HostApplication se EventID for 403 e _HostApplication estiver presente em Message.

Alterações

2025-01-29

Melhoria:

  • O mapeamento de ScriptBlockText foi alterado de security_result.detection_fields para target.process.command_line.

2025-01-28

Melhoria:

  • Adição de gsub para oferecer suporte ao novo formato de registros JSON.

2025-01-09

Melhoria:

  • Payload foi mapeado para security_result.detection_fields.
  • Script Name foi mapeado para target.file.full_path.

2024-11-28

Melhoria:

  • Suporte adicionado para um novo padrão de registros SYSLOG.

2024-08-20

Melhoria:

  • gsub foi adicionado para remover caracteres extras e analisar registros JSON.

2024-08-14

Melhoria:

  • Version foi mapeado para metadata.product_version.
  • SystemTime foi mapeado para metadata.event_timestamp.
  • Mapeamos channel, keywords, MessageNumber, MessageTotal e ScriptBlockId para security_result.detection_fields.
  • Path foi mapeado para target.process.file.full_path.

2024-07-24

Melhoria:

  • Adição de suporte a um novo padrão de registros JSON.

2024-07-20

Melhoria:

  • HostApplication foi mapeado para principal.application.
  • HostId foi mapeado para principal.resource.product_object_id.
  • Mapeamento de System.Computer para principal.hostname e principal.asset.hostname.
  • System.Version foi mapeado para metadata.product_version.
  • System.ProcessID foi mapeado para principal.process.pid.
  • System.ProviderName foi mapeado para principal.resource.attribute.labels.
  • Mapeamos HostVersion, RunspaceId, PipelineId, EngineVersion, DetailSequence, DetailTotal, SequenceNumber e ScriptName para additional.fields.
  • Mapeamos System.EventRecordID, System.Task, System.Keywords, System.Opcode e System.ThreadID para security.detection_fields.

2023-12-05

Melhoria:

  • Mapeamento adicionado para registros JSON não analisados.
  • Computer foi mapeado para principal.hostname.
  • EventLevelName foi mapeado para security_result.severity.
  • Mapeamos ManagementGroupName, Source e TenantId para additional_fields.
  • RenderedDescription foi mapeado para security_result.description.
  • UserName foi mapeado para principal.user.userid.

2023-09-14

Melhoria:

  • Mapeamentos adicionados para registros JSON não analisados.
  • O "winlog.activity_id" foi mapeado para "security_result.detection_fields".
  • O "winlog.api" foi mapeado para "additional.fields".
  • O mapeamento de "winlog.channel" e "winlog.process.thread.id" para "security_result.about.resource.attribute.labels".
  • O "winlog.computer_name" foi associado a "principal.hostname".
  • Mapeou "winlog.event_id" para "metadata.product_event_type" e "security_result.rule_name".
  • O "winlog.opcode" foi mapeado para "metadata.description".
  • O "winlog.process.pid" foi associado a "principal.process.pid".
  • O mapeamento de "winlog.provider_guid" para "metadata.product_deployment_id".
  • O "winlog.provider_name" foi mapeado para "metadata.product_name".
  • O "winlog.record_id" foi mapeado para "metadata.product_log_id".
  • O "winlog.user.domain" foi mapeado para "principal.administrative_domain".
  • O "winlog.user.identifier" foi mapeado para "principal.user.windows_sid".
  • O "winlog.user.name" foi mapeado para "principal.user.userid".

2023-07-05

Melhoria:

  • Para "EventID = 403", mapeou "metadata.event_type" para "STATUS_UPDATE" quando o valor de "HostApplication" não estava presente.
  • O valor de "target.file.full_path" foi extraído do registro usando um padrão Grok quando "Path" está vazio.
  • A função gsub foi adicionada para renomear "@timestamp" como "EventTime".

2022-11-09

Melhoria:

  • O campo "ProviderGuid" é mapeado para "metadata.product_deployment_id".
  • O campo "ExecutionProcessID" é mapeado para "principal.process.pid".
  • O campo "ProcessID" ou "ID do processo" é mapeado para "principal.process.pid".
  • O campo "SourceModuleType" é mapeado para "principal.resource.resource_subtype".
  • O campo "SourceModuleName" é mapeado para "principal.resource.name".
  • O campo "Machine" é mapeado para "principal.asset.asset_id".
  • O campo "MessageSourceAddress" é mapeado para "principal.ip".
  • O campo "Arquivo" é mapeado para "target.process.file.full_path".
  • O campo "Host Application" ou "Command" é mapeado para "target.process.command_line".
  • O campo "Saída" é mapeado para "security_result.detection_fields".
  • O campo "Message" é mapeado para "security_result.description".
  • O campo "ActivityID" está mapeado para "security_result.detection_fields".
  • Foi adicionado o seguinte mapeamento quando o EventID é "4103".
  • O campo "ID do host" ou "ID do host do ContextInfo" é mapeado para "target.asset.asset_id".
  • O campo "Nome do host" ou "ContextInfo_Nome do host" é mapeado para "target.hostname".
  • O campo "ContextInfo_Script Name" é mapeado para "target.process.file.full_path".
  • O campo "ContextInfo_Host Application" é mapeado para "target.process.command_line".
  • O campo "ContextInfo_Command Name" é associado a "security_result.detection_fields".
  • O campo "ContextInfo_Command Type" é mapeado para "security_result.detection_fields".
  • O campo "ContextInfo_Sequence Number" ou "Sequence Number" é mapeado para "security_result.detection_fields".
  • Foi adicionado o seguinte mapeamento quando o EventID é "800", "600" ou "400".
  • O campo "UserId" é mapeado para "principal.user.userid".
  • O campo "HostApplication" é mapeado para "target.process.command_line".
  • O campo "HostId" é mapeado para "target.asset.asset_id".
  • O campo "HostName" é mapeado para "target.hostname".
  • O campo "ScriptName" é mapeado para "target.process.file.full_path".
  • O campo "SequenceNumber" está mapeado para "security_result.detection_fields".

2022-10-13

Correção de bugs:

  • Analisou os registros com falhas fazendo as seguintes mudanças.
  • Foram adicionadas verificações de on_error em campos que falharam na análise no caso de valores nulos. Campos como "opcode" e "host application".
  • Foi adicionada uma nova origem, "ContextInfo", para a análise de KV quando "Message" não está presente nos registros.
  • Melhoria:
  • O event_type foi modificado de GENERIC_EVENT para STATUS_UPDATE.

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