PowerShell para auditar logs de segurança no Windows

Imagine que alguém passou as últimas 48 horas tentando adivinhar a senha de um usuário no seu servidor Windows. Sem monitoramento, você nunca saberia — até o dia em que eles acertassem. O Windows registra tudo isso no Security Event Log. O problema é que o Event Viewer é lento, cheio de cliques e impossível de automatizar. O PowerShell resolve isso em uma linha.
Get-WinEvent: o cmdlet certo para eventos de segurança
Existe o Get-EventLog (legado) e o Get-WinEvent (moderno). Use sempre o Get-WinEvent — ele é significativamente mais rápido em logs grandes, suporta filtragem por hash direto na consulta (sem trazer tudo pra memória primeiro) e não está sendo mais desenvolvido no PowerShell 7+. O Get-EventLog sequer existe no PowerShell Core rodando em Linux.
Para ler o Security Log você precisa de um terminal elevado (Executar como Administrador). Se tentar sem privilégios, vai receber um erro de acesso negado — não é bug, é comportamento esperado de um log que guarda dados sensíveis de autenticação.
# Verificar os últimos 50 eventos do log de segurança
Get-WinEvent -LogName Security -MaxEvents 50 | Select-Object TimeCreated, Id, MessageOs Event IDs que você precisa conhecer
O Windows tem centenas de IDs de evento, mas para auditar segurança no dia a dia, uns poucos cobrem a grande maioria dos cenários críticos:
- 4624 — Logon bem-sucedido (qualquer login na máquina)
- 4625 — Falha de logon (senha errada, conta bloqueada, usuário inválido)
- 4634 / 4647 — Logoff (sessão encerrada)
- 4648 — Logon com credenciais explícitas (pass-the-hash, runas)
- 4688 — Novo processo criado (requer auditoria de criação de processo ativa)
- 4698 — Tarefa agendada criada (vetor clássico de persistência de malware)
- 4720 — Conta de usuário criada
- 4732 — Membro adicionado a grupo privilegiado (ex: Administradores)
- 4776 — Autenticação NTLM local (relevante para detectar ataques laterais)
Se você gerencia Active Directory, adicione também o 4768 (requisição de Kerberos TGT) e 4771 (falha de pré-autenticação Kerberos) à sua lista de observação.
Detectar logins falhos nas últimas 24 horas
Este é o caso de uso mais comum. Qualquer servidor exposto à internet acumula tentativas de login constantemente — especialmente na porta 3389 (RDP) e em contas de serviço com senhas fracas.
# Listar falhas de logon das últimas 24 horas
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4625
StartTime = (Get-Date).AddDays(-1)
} | ForEach-Object {
[PSCustomObject]@{
Hora = $_.TimeCreated
Usuario = $_.Properties[5].Value
IP = $_.Properties[19].Value
Motivo = $_.Properties[8].Value
}
} | Sort-Object Hora -DescendingO acesso via $_.Properties[n].Value extrai campos específicos do evento sem precisar parsear texto. As propriedades do evento 4625 são fixas: índice 5 é o nome de usuário alvo, 19 é o endereço IP de origem, 8 é o sub-status de falha (código que indica se a conta não existe, senha errada, conta bloqueada etc.).
Identificar brute force: agrupar por IP atacante
Uma ou duas falhas podem ser erro humano. Cinquenta falhas do mesmo IP em dez minutos são brute force. O PowerShell agrupa isso em segundos:
# Top 10 IPs com mais falhas de logon (últimos 7 dias)
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4625
StartTime = (Get-Date).AddDays(-7)
} | ForEach-Object {
$_.Properties[19].Value
} | Where-Object { $_ -ne '-' -and $_ -ne '' } |
Group-Object |
Sort-Object Count -Descending |
Select-Object -First 10 Count, NameUm IP aparecendo com centenas de tentativas é candidato imediato para bloqueio no firewall ou no Windows Firewall via New-NetFirewallRule. O caso do ataque à Trellix e de várias outras operações de ransomware começaram com brute force em contas expostas sem proteção adequada.
Verificar tarefas agendadas criadas recentemente (persistência)
Criar uma tarefa agendada é um dos mecanismos de persistência mais usados por malware — e o Windows loga cada criação com o evento 4698. Se você não tem criado tarefas agendadas manualmente, qualquer ocorrência desse ID merece atenção:
# Tarefas agendadas criadas nas últimas 48 horas
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4698
StartTime = (Get-Date).AddHours(-48)
} | Select-Object TimeCreated, MessageExportar relatório de auditoria para CSV
Para enviar por e-mail ou arquivar, basta canalizar o resultado para Export-Csv. Isso funciona com qualquer um dos scripts acima — troque o final da pipeline:
# Exportar falhas de logon para CSV
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4625
StartTime = (Get-Date).AddDays(-7)
} | ForEach-Object {
[PSCustomObject]@{
Hora = $_.TimeCreated
Usuario = $_.Properties[5].Value
IP = $_.Properties[19].Value
}
} | Export-Csv -Path ".\falhas-logon-$(Get-Date -Format 'yyyyMMdd').csv" -NoTypeInformation -Encoding UTF8O nome do arquivo inclui a data automaticamente via Get-Date -Format 'yyyyMMdd'. Se você nunca usou isso, o post PowerShell para iniciantes cobre os fundamentos de pipeline e formatação de objetos que tornam esses scripts possíveis.
Ativar auditoria de criação de processo (evento 4688)
Por padrão, o Windows não registra quais processos foram criados — o que deixa um ponto cego enorme para detectar execução de ferramentas maliciosas. Para ativar via Group Policy localmente:
# Verificar política atual de auditoria de processos
auditpol /get /subcategory:"Process Creation"
# Ativar auditoria de criação de processo (requer admin)
auditpol /set /subcategory:"Process Creation" /success:enable /failure:enableDepois de ativar, você pode combinar isso com filtros no evento 4688 para detectar execução de powershell.exe com argumentos codificados em base64 — padrão clássico de execução de payload ofuscado. Para ambientes corporativos, a recomendação é gerenciar isso via GPO centralizado e integrar os logs num SIEM, mas mesmo localmente já é um passo significativo de visibilidade.
Conclusão
Event logs existem em todo ambiente Windows, mas ficam invisíveis sem ferramentas para consultá-los de forma eficiente. Com Get-WinEvent e filtros por hash, você tira relatórios de segurança em segundos — sem terceirizar isso para um produto caro. Se você gerencia servidores Windows e ainda não tem esse tipo de verificação no seu checklist semanal, vale começar pelos eventos 4625 e 4698: são os dois que mais frequentemente revelam algo que não deveria estar acontecendo. Se quiser camadas extras de monitoramento de rede além dos logs locais, o NextDNS com filtragem de DNS criptografado é um complemento prático para ambientes domésticos e pequenas empresas. Passou por alguma situação onde os logs ajudaram a identificar um problema? Conta nos comentários.




Comentários