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 Collector
no 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
,vi
ou Bloco de Notas).
- 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 do cliente real.Atualize
/path/to/ingestion-authentication-file.json
para 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.