Coletar registros do PowerShell
Este documento explica como coletar registros do PowerShell para o Google Security Operations usando o Bindplane. O analisador transforma registros brutos do Microsoft PowerShell em um modelo de dados unificado (UDM). Primeiro, ele extrai campos da mensagem de registro bruta, normaliza-os em campos da UDM e enriquece os dados com contexto adicional com base em IDs de eventos específicos, criando um evento estruturado da 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 uma versão mais recente.
- Se você 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
- Faça login no console do Google SecOps.
- Acesse Configurações do SIEM > Agentes de coleta.
- Baixe o arquivo de autenticação de ingestão. Salve o arquivo de forma segura no sistema em que o Bindplane será instalado.
Receber o ID do cliente do Google SecOps
- Faça login no console do Google SecOps.
- Acesse Configurações do SIEM > Perfil.
- Copie e salve o ID do cliente na seção Detalhes da organização.
Instalar o agente do Bindplane no Windows
- Abra o Prompt de Comando ou o PowerShell como administrador.
Execute este comando:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
Outros recursos de instalação
- Para mais opções de instalação, consulte este guia de instalação.
Configurar o agente do Bindplane para ingerir o Syslog e enviar ao Google SecOps
- Antes de configurar o arquivo YAML, pare o Service
observIQ Distro for Open Telemetry Collectorno painel "Serviços". Acesse o arquivo de configuração:
- Localize o arquivo
config.yaml. Normalmente, ele fica no diretório/etc/bindplane-agent/no Linux ou no diretório de instalação no Windows. - Abra o arquivo usando um editor de texto (por exemplo,
nano,viou Bloco de Notas).
- Localize o arquivo
Edite o arquivo
config.yamlda 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]Substitua
<customer_id>pelo ID do cliente real.Atualize
/path/to/ingestion-authentication-file.jsonpara o caminho em que o arquivo de autenticação foi salvo na seção Receber arquivo de autenticação de ingestão do Google SecOps.Depois de salvar o arquivo
config.yaml, inicie o ServiçoobservIQ 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 Serviços ou insira 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. |
| ContextInfo_Host ID | 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. |
| ContextInfo_Sequence Number | 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 é prefixado com Machine ID:. A plataforma é mapeada para a enumeração da UDM com base no valor: - win mapeia 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. Retornos de carro e tabulações 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, 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 for 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 mapeia para LOW.- warn ou err é mapeado 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 todos verdadeiros, ou se EventID for 53504, ou se EventID for 40962, ou se EventID for 40961, ou se EventID estiver vazio e MessageSourceAddress estiver presente. Defina como USER_UNCATEGORIZED se EventID estiver vazio e Username estiver presente. Definido 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. |
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.