Coletar registros do Microsoft PowerShell
Este documento explica como ingerir registros do Microsoft PowerShell no Google Security Operations usando o agente Bindplane.
O Microsoft PowerShell é uma estrutura de gerenciamento de configuração e automação de tarefas da Microsoft, composta por um shell de linha de comando e uma linguagem de script. Os registros do PowerShell capturam a execução de scripts, a atividade de módulos e as invocações de comandos, oferecendo visibilidade das operações do PowerShell para monitoramento de segurança e análise forense.
Antes de começar
Verifique se você tem os pré-requisitos a seguir:
- Instância do Google SecOps
- Windows Server 2016 ou mais recente
- Conectividade de rede entre o host do Windows e o Google SecOps
- Se você estiver executando por trás de um proxy, verifique se as portas do firewall estão abertas de acordo com os requisitos do agente Bindplane.
- Acesso administrativo ao host do Windows para configurar o registro em log do PowerShell e instalar o agente do Bindplane
Configurar a geração de registros do PowerShell
A geração de registros do PowerShell precisa ser ativada em hosts Windows antes da coleta de registros. Por padrão, o registro em log do PowerShell é mínimo. Ative o registro em bloco de scripts para capturar atividades detalhadas do PowerShell.
Ativar o registro de bloqueio de script usando a política de grupo
- Abra o Editor de Política de Grupo Local executando
gpedit.msccomo administrador. - Acesse Configuração do computador > Modelos administrativos > Componentes do Windows > Windows PowerShell.
- Clique duas vezes em Ativar o registro em log de blocos de script do PowerShell.
- Selecione Ativado.
- Se quiser, marque Registrar eventos de início / fim de invocação de bloco de script para capturar eventos de início e fim de cada bloco de script. Essa opção gera um grande volume de registros.
- Clique em OK.
- Abra o Prompt de comando como administrador e execute
gpupdate /forcepara aplicar a política imediatamente.
Ativar o registro de bloqueio de script usando o registro
Como alternativa, é possível ativar o registro de bloqueio de script definindo o seguinte valor de registro:
- Abra o Editor do Registro executando
regeditcomo administrador. - Acesse
HKLM\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging. - Se a chave não existir, crie-a.
- Crie um Valor DWORD (32 bits) chamado
EnableScriptBlockLogginge defina o valor como1. - Reinicie as sessões do PowerShell para que a mudança entre em vigor.
O registro em bloco de scripts do PowerShell grava eventos no canal de log de eventos Microsoft-Windows-PowerShell/Operational com a ID do evento 4104.
Opcional: ativar a geração de registros de módulos
O Module Logging registra detalhes da execução do pipeline para módulos especificados. Para ativar o registro de módulos em todos os módulos, faça o seguinte:
- No Editor de Política de Grupo Local, acesse Configuração do Computador > Modelos Administrativos > Componentes do Windows > Windows PowerShell.
- Clique duas vezes em Ativar o registro de módulos.
- Selecione Ativado.
- Clique em Mostrar ao lado de Nomes dos módulos.
- Insira
*para registrar todos os módulos. - Clique em OK na janela Nomes de módulos.
- Clique em OK na janela Registro do módulo.
- Execute
gpupdate /forcepara aplicar a política.
Os eventos de registro do módulo são gravados no log de eventos do Windows PowerShell com o ID do evento 4103.
Opcional: ativar a transcrição
A transcrição cria um registro baseado em texto de todas as entradas e saídas da sessão do PowerShell. Para ativar a transcrição, faça o seguinte:
- No Editor de Política de Grupo Local, acesse Configuração do Computador > Modelos Administrativos > Componentes do Windows > Windows PowerShell.
- Clique duas vezes em Ativar a transcrição do PowerShell.
- Selecione Ativado.
- Opcionalmente, especifique um diretório de saída da transcrição. Se ficar em branco, as transcrições serão salvas na pasta "Documentos" de cada usuário.
- Marque Incluir cabeçalhos de invocação para incluir carimbos de data/hora e metadados.
- Clique em OK.
- Execute
gpupdate /forcepara aplicar a política.
As transcrições são gravadas em arquivos de texto com nomes que começam com PowerShell_transcript.
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 > Agente de coleta.
- Clique em Fazer o download para baixar o arquivo de autenticação de ingestão.
Salve o arquivo com segurança no host do Windows em que o agente do 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
Instale o agente do Bindplane no host do Windows de acordo com as instruções a seguir.
Instalação do 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" /quietAguarde a conclusão da instalação.
Execute o seguinte comando para confirmar a instalação:
sc query observiq-otel-collectorO serviço vai aparecer como EM EXECUÇÃO.
Outros recursos de instalação
Para mais opções de instalação e solução de problemas, consulte o guia de instalação do agente do Bindplane.
Configurar o agente do Bindplane para coletar registros do PowerShell
Localizar o arquivo de configuração do Windows
Localize o arquivo de configuração do Windows da seguinte maneira:
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
Editar o arquivo de configuração
Substitua todo o conteúdo de
config.yamlpela seguinte configuração:receivers: windowseventlog/powershell: channel: Microsoft-Windows-PowerShell/Operational max_reads: 100 poll_interval: 5s raw: true start_at: end processors: batch: exporters: chronicle/powershell: compression: gzip creds_file_path: 'C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json' customer_id: '<CUSTOMER_ID>' endpoint: malachiteingestion-pa.googleapis.com log_type: 'POWERSHELL' raw_log_field: body override_log_type: false service: pipelines: logs/powershell: receivers: - windowseventlog/powershell processors: - batch exporters: - chronicle/powershell
Parâmetros de configuração
Substitua os seguintes marcadores de posição:
Configuração do receptor:
channel: o canal de registro de eventos do Windows a ser coletado. Para o registro em bloco de script do PowerShell, useMicrosoft-Windows-PowerShell/Operational. Para o registro de módulos, useWindows PowerShell.raw: defina comotruepara enviar XML bruto do log de eventos do Windows para o Google SecOps.start_at: defina comoendpara coletar apenas novos eventos depois que o agente for iniciado. Defina comobeginningpara coletar todos os eventos atuais.
Configuração do exportador:
<CUSTOMER_ID>: substitua pelo ID do cliente da etapa anterior.creds_file_path: caminho completo para o arquivo de autenticação de ingestão. Copie o arquivo de autenticação baixado para esse local.endpoint: URL do endpoint regional. Use o endpoint da sua região do Google SecOps:- EUA:
malachiteingestion-pa.googleapis.com - Europa:
europe-malachiteingestion-pa.googleapis.com - Ásia:
asia-southeast1-malachiteingestion-pa.googleapis.com - Consulte a lista completa em Endpoints regionais.
- EUA:
log_type: defina comoPOWERSHELLpara usar o analisador do PowerShell.
Salve o arquivo de configuração.
Depois de editar, salve o arquivo clicando em Arquivo > Salvar.
Reinicie o agente do Bindplane para aplicar as mudanças
Windows
Usando o prompt de comando ou o PowerShell como administrador:
net stop observiq-otel-collector && net start observiq-otel-collectorOu usando o console de serviços:
- Pressione
Win+R, digiteservices.msce pressione Enter. - Localize o Coletor do OpenTelemetry da observIQ.
- Clique com o botão direito do mouse e selecione Reiniciar.
Verifique se o serviço está em execução:
sc query observiq-otel-collectorVerifique se há erros nos registros:
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
- Pressione
Verificar a ingestão de registros
Depois de configurar o agente do Bindplane e reiniciar o serviço, os registros do PowerShell vão começar a fluir para o Google SecOps.
- Faça login no console do Google SecOps.
- Acesse Investigar > Pesquisar.
Execute a seguinte pesquisa para verificar se os registros do PowerShell estão sendo ingeridos:
metadata.log_type = "POWERSHELL"Verifique se os eventos aparecem com carimbos de data/hora recentes.
Os eventos de registro em bloco de script do PowerShell (ID do evento 4104) vão aparecer com detalhes dos blocos de script executados, incluindo o conteúdo do script, o ID do bloco de script e o contexto de execução.
Tabela de mapeamento do UDM
| Campo de registro | Mapeamento do UDM | Lógica |
|---|---|---|
| HostId | principal.resource.product_object_id | Identificador exclusivo do objeto de produto associado ao recurso principal. |
| System.Version | metadata.product_version | Versão do produto que gerou o evento |
| System.EventId, EventID, winlog.event_id | metadata.product_event_type | Tipo de evento conforme definido pelo produto |
| Computer, System.Computer, computer, winlog.computer_name | principal.hostname | Nome do host da entidade principal |
| Computer, System.Computer, computer, winlog.computer_name | principal.asset.hostname | Nome do host do recurso associado ao principal |
| System.EventRecordID, RecordNumber, winlog.record_id | metadata.product_log_id | Identificador exclusivo da entrada de registro no sistema de geração de registros do produto. |
| System.Opcode, opcode, winlog.opcode | metadata.description | Descrição do evento ou contexto adicional |
| ProviderGuid, winlog.provider_guid | metadata.product_deployment_id | Identificador exclusivo da implantação do produto. |
| System.ProcessID, ProcessID, ExecutionProcessID, execution.process_id, winlog.process.pid | principal.process.pid | ID do processo principal |
| SourceModuleName | principal.resource.name | Nome do recurso associado ao principal |
| SourceModuleType | principal.resource.resource_subtype | Subtipo do recurso associado ao principal |
| security.user_id, UserID, winlog.user.identifier | principal.user.windows_sid | Identificador de segurança (SID) do Windows para o usuário principal |
| metadata.event_type | Tipo de evento (por exemplo, USER_LOGIN, NETWORK_CONNECTION) | |
| SourceName, winlog.provider_name | metadata.product_name | Nome do produto que gerou o evento |
| AccountName, Username, UserName, winlog.user.name | principal.user.userid | ID do usuário principal |
| Domínio, winlog.user.domain | principal.administrative_domain | Domínio administrativo do principal |
| Path, target_file, ScriptName, script_name, ContextInfo_Script Name, file_path | target.process.file.full_path | Caminho completo para o arquivo associado ao processo de destino. |
| HostName, powershell.Host Name, ContextInfo_Host Name | target.hostname | Nome do host da entidade de destino |
| HostName, powershell.Host Name, ContextInfo_Host Name | target.asset.hostname | Nome do host do recurso associado ao destino |
| Host ID, HostID, ContextInfo_Host ID | target.asset.asset_id | Identificador exclusivo do recurso de destino |
| Nombre_de_comando, ContextInfo_Command Name, CommandName | target.application | Nome do aplicativo associado ao destino |
| HostApplication, ContextInfo_Host Application | target.process.command_line | Linha de comando usada para iniciar o processo de destino |
| ScriptBlockText | target.process.command_line | Linha de comando usada para iniciar o processo de destino |
| MessageSourceAddress | principal.ip | Endereço IP do principal |
| MessageSourceAddress | principal.asset.ip | Endereço IP do recurso associado ao principal |
| Nombre_de_host | principal.application | Nome do aplicativo associado ao principal |
| Version_de_host | principal.platform_version | Versão da plataforma associada ao principal. |
| Id_de_host | principal.resource.id | Identificador exclusivo do recurso principal |
| Application_host | principal.process.file.full_path | Caminho completo para o arquivo associado ao processo principal. |
| HostApplication | principal.process.command_line | Linha de comando usada para iniciar o processo principal |
| Usuario, admin_domain | principal.user.userid | ID do usuário principal |
| Usuario, admin_domain | principal.administrative_domain | Domínio administrativo do principal |
| CommandLine | principal.process.command_line | Linha de comando usada para iniciar o processo principal |
| Machine, machine_id | principal.asset.asset_id | Identificador exclusivo do recurso principal. |
| Machine, platform_software | principal.asset.platform_software.platform | Tipo de plataforma do recurso (por exemplo, WINDOWS, LINUX) |
| Machine, platform_software | principal.asset.platform_software.platform_version | Versão do software da plataforma no recurso |
| MessageSourceAddress | intermediary.ip | Endereço IP da entidade intermediária |
| MessageSourceAddress, Hostname | intermediary.hostname | Nome do host da entidade intermediária |
| MessageSourceAddress, Hostname | intermediary.asset.hostname | Nome do host do recurso associado ao intermediário. |
| MessageSourceAddress | intermediary.port | Número da porta usada pelo intermediário |
| HostApplication | target.process.command_line | Linha de comando usada para iniciar o processo de destino |
| HostId | target.asset.asset_id | Identificador exclusivo do recurso de destino |
| SequenceNumber, ContextInfo_Sequence Number, Sequence Number | security_result.detection_fields | Pares de chave-valor de informações de detecção adicionais |
| ProviderName | principal.resource.attribute.labels | Rótulos ou atributos associados ao recurso principal |
| NewEngineState | additional.fields | Outros campos personalizados não cobertos pelo esquema UDM padrão |
| PreviousEngineState | additional.fields | Outros campos personalizados não cobertos pelo esquema UDM padrão |
| ScriptName | additional.fields | Outros campos personalizados não cobertos pelo esquema UDM padrão |
| ManagementGroupName | additional.fields | Outros campos personalizados não cobertos pelo esquema UDM padrão |
| Origem | additional.fields | Outros campos personalizados não cobertos pelo esquema UDM padrão |
| RenderedDescription | security_result.description | Descrição do resultado de segurança ou da ação realizada |
| TenantId | additional.fields | Outros campos personalizados não cobertos pelo esquema UDM padrão |
| Nome de usuário | principal.user.userid | ID do usuário principal |
| ActivityID | security_result.detection_fields | Pares de chave-valor de informações de detecção adicionais |
| ExecutionThreadID, execution.thread_id, winlog.process.thread.id | security_result.detection_fields | Pares de chave-valor de informações de detecção adicionais |
| Saída | security_result.detection_fields | Pares de chave-valor de informações de detecção adicionais |
| Dados | security_result.detection_fields | Pares de chave-valor de informações de detecção adicionais |
| Data_1 | additional.fields | Outros campos personalizados não cobertos pelo esquema UDM padrão |
| data_1 | security_result.detection_fields | Pares de chave-valor de informações de detecção adicionais |
| Data_2 | security_result.detection_fields | Pares de chave-valor de informações de detecção adicionais |
| winlog.activity_id | security_result.detection_fields | Pares de chave-valor de informações de detecção adicionais |
| winlog.api | additional.fields | Outros campos personalizados não cobertos pelo esquema UDM padrão |
| winlog.channel | principal.resource.attribute.labels | Rótulos ou atributos associados ao recurso principal |
| Deslocamento | additional.fields | Outros campos personalizados não cobertos pelo esquema UDM padrão |
| SeverityValue | security_result.detection_fields | Pares de chave-valor de informações de detecção adicionais |
| intermediário | intermediário | Detalhes sobre entidades intermediárias envolvidas no evento |
| security_result | security_result | Resultado geral de segurança, incluindo ações, gravidades e detecções |
| metadata.vendor_name | Nome do fornecedor que produziu o evento. | |
| SourceName | metadata.product_name | Nome do produto que gerou o evento |
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.