Coletar registros do PowerShell
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
- Faça login no console do Google SecOps.
- Acesse Configurações do SIEM > Agentes de coleta.
- 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
- 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 processar o Syslog e enviar ao Google SecOps
- Antes de configurar o arquivo YAML, pare o serviço
observIQ Distro for Open Telemetry Collector
no painel de serviços. Acesse o arquivo de configuração:
- 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. - Abra o arquivo usando um editor de texto (por exemplo,
nano
,vi
ou Notepad).
- Localize o arquivo
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]
Substitua
<customer_id>
pelo ID real do cliente.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.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 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 desecurity_result.detection_fields
paratarget.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 parasecurity_result.detection_fields
.Script Name
foi mapeado paratarget.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 parametadata.product_version
.SystemTime
foi mapeado parametadata.event_timestamp
.- Mapeamos
channel
,keywords
,MessageNumber
,MessageTotal
eScriptBlockId
parasecurity_result.detection_fields
. Path
foi mapeado paratarget.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 paraprincipal.application
.HostId
foi mapeado paraprincipal.resource.product_object_id
.- Mapeamento de
System.Computer
paraprincipal.hostname
eprincipal.asset.hostname
. System.Version
foi mapeado parametadata.product_version
.System.ProcessID
foi mapeado paraprincipal.process.pid
.System.ProviderName
foi mapeado paraprincipal.resource.attribute.labels
.- Mapeamos
HostVersion
,RunspaceId
,PipelineId
,EngineVersion
,DetailSequence
,DetailTotal
,SequenceNumber
eScriptName
paraadditional.fields
. - Mapeamos
System.EventRecordID
,System.Task
,System.Keywords
,System.Opcode
eSystem.ThreadID
parasecurity.detection_fields
.
2023-12-05
Melhoria:
- Mapeamento adicionado para registros JSON não analisados.
Computer
foi mapeado paraprincipal.hostname
.EventLevelName
foi mapeado parasecurity_result.severity
.- Mapeamos
ManagementGroupName
,Source
eTenantId
paraadditional_fields
. RenderedDescription
foi mapeado parasecurity_result.description
.UserName
foi mapeado paraprincipal.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
paraSTATUS_UPDATE
.
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.