Recolha registos do PowerShell
Este documento explica como recolher registos do PowerShell para o Google Security Operations através do Bindplane. O analisador transforma os registos não processados do Microsoft PowerShell num modelo de dados unificado (UDM). Primeiro, extrai campos da mensagem de registo não processada, normaliza-os em campos UDM e, em seguida, enriquece os dados com contexto adicional com base em IDs de eventos específicos, criando, em última análise, um evento UDM estruturado para análise de segurança.
Antes de começar
- Certifique-se de que tem uma instância do Google SecOps.
- Certifique-se de que tem o Windows 2016 ou posterior.
- Se estiver a executar o serviço através de um proxy, certifique-se de que as portas da firewall estão abertas.
Obtenha o ficheiro de autenticação de carregamento do Google SecOps
- Inicie sessão na consola Google SecOps.
- Aceda a Definições do SIEM > Agentes de recolha.
- Transfira o ficheiro de autenticação de carregamento. Guarde o ficheiro de forma segura no sistema onde o Bindplane vai ser instalado.
Obtenha o ID de cliente do Google SecOps
- Inicie sessão na consola Google SecOps.
- Aceda a Definições do SIEM > Perfil.
- Copie e guarde o ID do cliente da secção Detalhes da organização.
Instale o agente do Bindplane no Windows
- Abra a Linha de comandos ou o PowerShell como administrador.
Execute o seguinte comando:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
Recursos de instalação adicionais
- Para ver opções de instalação adicionais, consulte este guia de instalação.
Configure o agente Bindplane para carregar o Syslog e enviá-lo para o Google SecOps
- Antes de configurar o ficheiro YAML, pare o
observIQ Distro for Open Telemetry Collector
serviço no painel de serviços. Aceda ao ficheiro de configuração:
- Localize o ficheiro
config.yaml
. Normalmente, encontra-se no diretório/etc/bindplane-agent/
no Linux ou no diretório de instalação no Windows. - Abra o ficheiro com um editor de texto (por exemplo,
nano
,vi
ou Bloco de notas).
- Localize o ficheiro
Edite o ficheiro
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 de cliente real.Atualize
/path/to/ingestion-authentication-file.json
para o caminho onde o ficheiro de autenticação foi guardado na secção Obtenha o ficheiro de autenticação de carregamento do Google SecOps.Depois de guardar o ficheiro
config.yaml
, inicie oobservIQ Distro for Open Telemetry Collector
serviço.
Reinicie o agente do Bindplane para aplicar as alterações
Para reiniciar o agente do Bindplane no Windows, pode usar a consola Services ou introduzir o seguinte comando:
net stop BindPlaneAgent && net start BindPlaneAgent
Tabela de mapeamento da UDM
Campo de registo | Mapeamento de UDM | Lógica |
---|---|---|
AccountName | principal.user.userid | Mapeado diretamente a partir do campo AccountName no registo não processado. |
ActivityID | security_result.detection_fields[0].value | Mapeado diretamente a partir do campo ActivityID no registo não processado. As chavetas são removidas. |
Canal | Não está mapeado para o objeto IDM. | |
collection_time.nanos | Não está mapeado para o objeto IDM. | |
collection_time.seconds | Não está mapeado para o objeto IDM. | |
Comando | Não está mapeado para o objeto IDM. | |
CommandLine | Não está mapeado para o objeto IDM. | |
Computador | principal.hostname | Mapeado diretamente a partir do campo Computer no registo não processado, se estiver presente. |
ContextInfo | Não está mapeado para o objeto IDM. | |
ContextInfo_Command Name | security_result.detection_fields[0].value | Mapeado diretamente a partir do campo ContextInfo_Command Name no registo não processado, se estiver presente. |
ContextInfo_Command Type | security_result.detection_fields[1].value | Mapeado diretamente a partir do campo ContextInfo_Command Type no registo não processado, se estiver presente. |
ContextInfo_Host Application | target.process.command_line | Mapeado diretamente a partir do campo ContextInfo_Host Application no registo não processado se powershell.Host Application não estiver presente. |
ContextInfo_Host ID | target.asset.asset_id | Mapeado diretamente a partir do campo ContextInfo_Host ID no registo não processado se powershell.Host ID não estiver presente. O valor tem o prefixo Host ID: . |
ContextInfo_Host Name | target.hostname | Mapeado diretamente a partir do campo ContextInfo_Host Name no registo não processado se powershell.Host Name não estiver presente. |
ContextInfo_Script Name | target.process.file.full_path | Mapeado diretamente a partir do campo ContextInfo_Script Name no registo não processado se script_name não estiver presente. |
ContextInfo_Sequence Number | security_result.detection_fields[2].value | Mapeado diretamente a partir do campo ContextInfo_Sequence Number no registo não processado, se estiver presente. Convertido numa string. |
ContextInfo_Severity | Não está mapeado para o objeto IDM. | |
create_time.nanos | Não está mapeado para o objeto IDM. | |
create_time.seconds | Não está mapeado para o objeto IDM. | |
customer_id | Não está mapeado para o objeto IDM. | |
dados | Não está mapeado para o objeto IDM. | |
Dados | security_result.detection_fields[0].value | Mapeado diretamente a partir do campo Data no registo não processado, se estiver presente. |
Data_1 | security_result.detection_fields[1].value | Mapeado diretamente a partir do campo Data_1 no registo não processado, se estiver presente. |
Data_2 | security_result.detection_fields[2].value | Mapeado diretamente a partir do campo Data_2 no registo não processado, se estiver presente. |
Domínio | principal.administrative_domain | Mapeado diretamente a partir do campo Domain no registo não processado. |
entradas | Não está mapeado para o objeto IDM. | |
ERROR_EVT_UNRESOLVED | Não está mapeado para o objeto IDM. | |
EventCategory | Não está mapeado para o objeto IDM. | |
EventData | Não está mapeado para o objeto IDM. | |
EventID | metadata.product_event_type, security_result.rule_name | Mapeado diretamente a partir do campo EventID no registo não processado. O valor tem o prefixo EventID: para o campo security_result.rule_name . |
EventLevel | Não está mapeado para o objeto IDM. | |
EventLevelName | security_result.severity | Mapeado com base no valor de EventLevelName :. Information é mapeado para INFORMATIONAL .- Verbose mapeia para LOW . |
EventLog | Não está mapeado para o objeto IDM. | |
EventReceivedTime | Não está mapeado para o objeto IDM. | |
EventType | Não está mapeado para o objeto IDM. | |
EventTime | metadata.event_timestamp | Usado para extrair a data/hora, se estiver presente. |
ExecutionProcessID | principal.process.pid | Mapeado diretamente a partir do campo ExecutionProcessID no registo não processado, se estiver presente e não estiver vazio ou for 0. Convertido numa string. |
ExecutionThreadID | security_result.detection_fields[2].value | Mapeado diretamente a partir do campo ExecutionThreadID no registo não processado, se estiver presente e não estiver vazio ou for 0. Convertido numa string. |
Ficheiro | target.process.file.full_path | Mapeado diretamente a partir do campo File no registo não processado, se estiver presente. |
Aplicação anfitriã | Não está mapeado para o objeto IDM. | |
HostApplication | Não está mapeado para o objeto IDM. | |
Nome do anfitrião | principal.hostname | Mapeado diretamente a partir do campo Hostname no registo não processado. |
id | Não está mapeado para o objeto IDM. | |
Keywords | Não está mapeado para o objeto IDM. | |
log_type | metadata.log_type | Mapeado diretamente a partir do campo log_type no registo não processado. |
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 do computador tem o prefixo Machine ID: . A plataforma está mapeada para a enumeração UDM com base no valor: . win é mapeado para WINDOWS .- mac mapeia para MAC .- lin mapeia para LINUX .– Outros valores são mapeados para UNKNOWN_PLATFORM . |
ManagementGroupName | additional.fields[0].value.string_value | Mapeado diretamente a partir do campo ManagementGroupName no registo não processado, se estiver presente. |
Message.EventTime | metadata.event_timestamp | Usado para extrair a data/hora, se estiver presente. Convertido numa string. |
Message.Message | security_result.description | Mapeado diretamente a partir do campo Message.Message no registo não processado se EventID estiver em [403 , 4103 , 4104 ] e message_message_not_found . As mudanças de linha e as tabulações são substituídas por vírgulas. |
Mensagem | security_result.description | Mapeado diretamente a partir do campo Message no registo não processado, se estiver presente. |
MessageNumber | Não está mapeado para o objeto IDM. | |
MessageSourceAddress | principal.ip | Mapeado diretamente a partir do campo MessageSourceAddress no registo não processado, se estiver presente. |
MessageTotal | Não está mapeado para o objeto IDM. | |
MG | Não está mapeado para o objeto IDM. | |
Código de operação | metadata.description | Mapeado diretamente a partir do campo Opcode no registo não processado. |
OpcodeValue | Não está mapeado para o objeto IDM. | |
Resultado | security_result.detection_fields[0].value | Mapeado diretamente a partir do campo Output no registo não processado, se estiver presente. |
powershell.Command Name | security_result.detection_fields[0].value | Mapeado diretamente a partir do campo powershell.Command Name , se estiver presente. |
powershell.Command Type | security_result.detection_fields[1].value | Mapeado diretamente a partir do campo powershell.Command Type , se estiver presente. |
powershell.Host Application | target.process.command_line | Mapeado diretamente a partir do campo powershell.Host Application no registo não processado, se estiver presente. |
powershell.Host ID | target.asset.asset_id | Mapeado diretamente a partir do campo powershell.Host ID no registo não processado, se estiver presente. O valor tem o prefixo Host ID: . |
powershell.Host Name | target.hostname | Mapeado diretamente a partir do campo powershell.Host Name no registo não processado, se estiver presente. |
powershell.HostApplication | target.process.command_line | Mapeado diretamente a partir do campo powershell.HostApplication no registo não processado, se estiver presente. |
powershell.HostId | target.asset.asset_id | Mapeado diretamente a partir do campo powershell.HostId no registo não processado, se estiver presente. O valor tem o prefixo Host ID: . |
powershell.HostName | target.hostname | Mapeado diretamente a partir do campo powershell.HostName no registo não processado, se estiver presente. |
powershell.Script Name | target.process.file.full_path | Mapeado diretamente a partir do campo powershell.Script Name no registo não processado, se estiver presente. |
powershell.ScriptName | target.process.file.full_path | Mapeado diretamente a partir do campo powershell.ScriptName no registo não processado, se estiver presente. |
powershell.Sequence Number | security_result.detection_fields[2].value | Mapeado diretamente a partir do campo powershell.Sequence Number no registo não processado, se estiver presente. |
powershell.SequenceNumber | security_result.detection_fields[0].value | Mapeado diretamente a partir do campo powershell.SequenceNumber no registo não processado, se estiver presente. |
powershell.UserId | principal.user.userid | Mapeado diretamente a partir do campo powershell.UserId no registo não processado, se estiver presente. |
ID do processo | principal.process.pid | Mapeado diretamente a partir do campo Process ID no registo não processado se ExecutionProcessID e ProcessID não estiverem presentes, estiverem vazios ou forem 0. Convertido numa string. |
ProcessID | principal.process.pid | Mapeado diretamente a partir do campo ProcessID no registo não processado se ExecutionProcessID não estiver presente, estiver vazio ou for 0. Convertido numa string. |
ProviderGuid | metadata.product_deployment_id | Mapeado diretamente a partir do campo ProviderGuid no registo não processado. As chavetas são removidas. |
PSEdition | Não está mapeado para o objeto IDM. | |
PSRemotingProtocolVersion | Não está mapeado para o objeto IDM. | |
PSVersion | Não está mapeado para o objeto IDM. | |
RecordNumber | metadata.product_log_id | Mapeado diretamente a partir do campo RecordNumber no registo não processado. Convertido numa string. |
RenderedDescription | security_result.description | Mapeado diretamente a partir do campo RenderedDescription no registo não processado, se estiver presente. |
Utilizador RunAs | Não está mapeado para o objeto IDM. | |
ScriptBlockId | Não está mapeado para o objeto IDM. | |
ScriptBlockText | security_result.detection_fields[0].value | Mapeado diretamente a partir do campo ScriptBlockText no registo não processado, se estiver presente. |
ID do ScriptBlock | Não está 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 é mapeado para MEDIUM .- crit mapeia para HIGH .O valor bruto também está mapeado para security_result.severity_details . |
source.collector_id | Não está mapeado para o objeto IDM. | |
source.customer_id | Não está mapeado para o objeto IDM. | |
Origem | additional.fields[1].value.string_value | Mapeado diretamente a partir do campo Source no registo não processado, se estiver presente. |
SourceModuleName | principal.resource.name | Mapeado diretamente a partir do campo SourceModuleName no registo não processado. |
SourceModuleType | principal.resource.resource_subtype | Mapeado diretamente a partir do campo SourceModuleType no registo não processado. |
SourceName | metadata.product_name | Mapeado diretamente a partir do campo SourceName no registo não processado. |
start_time.nanos | Não está mapeado para o objeto IDM. | |
start_time.seconds | Não está mapeado para o objeto IDM. | |
TenantId | additional.fields[2].value.string_value | Mapeado diretamente a partir do campo TenantId no registo não processado, se estiver presente. |
ThreadID | Não está mapeado para o objeto IDM. | |
timestamp.nanos | Não está mapeado para o objeto IDM. | |
timestamp.seconds | Não está mapeado para o objeto IDM. | |
escrever | Não está mapeado para o objeto IDM. | |
UserID | principal.user.windows_sid | Mapeado diretamente a partir do campo UserID no registo não processado. |
Nome de utilizador | principal.user.userid | Mapeado diretamente a partir do campo Username no registo não processado se AccountName não estiver presente. |
metadata.vendor_name | Definido como Microsoft . |
|
metadata.event_type | Definido 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. Definido como PROCESS_TERMINATION se EventID for 403 e _HostApplication estiver presente em Message , ou se EventID for 403 e NewEngineState for Stopped . Definido 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. Definido 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 | Definido como Powershell se SourceName não estiver presente. |
|
security_result.action | Definido como ALLOW . |
|
security_result.detection_fields[0].key | Definido como Activity ID . |
|
security_result.detection_fields[1].key | Definido como Sequence Number . |
|
security_result.detection_fields[2].key | Definido como ExecutionThreadID . |
|
additional.fields[0].key | Definido como Management Group Name . |
|
additional.fields[1].key | Definido como Source . |
|
additional.fields[2].key | Definido como TenantId . |
|
principal.asset.platform_software.platform | Definido 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 | Definido como _Path se EventID for 4104 e _Path estiver presente em Message . Definido como file_path se EventID for 4104 e file_path estiver presente em Message . Definido como _HostApplication se EventID for 403 e _HostApplication estiver presente em Message . |
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais da Google SecOps.