关于日志记录 Windows

简短说明

PowerShell 将内部操作从引擎、提供程序和 cmdlet 记录到 Windows 事件日志。

长说明

PowerShell 记录有关 PowerShell 操作的详细信息,例如启动和停止引擎和提供程序,以及执行 PowerShell 命令。

注意

Windows PowerShell版本 3.0、4.0、5.0 和 5.1 包括 Windows 事件日志的 EventLog cmdlet。 在这些版本中,若要显示 EventLog cmdlet 的列表,请键入: Get-Command -Noun EventLog。 有关详细信息,请参阅 Windows PowerShell 版本的 cmdlet 文档和about_EventLogs。

在 Windows 上查看 PowerShell 事件日志条目

可以使用 Windows 事件查看器查看 PowerShell 日志。 事件日志位于“应用程序和服务日志”组中,名为 PowerShellCore。 关联的 ETW 提供程序 GUID{f90714a8-5509-434a-bf6d-b1624c8a19a2}

启用脚本块日志记录后,PowerShell 会将以下事件记录到日志中 PowerShellCore/Operational

字段
EventId 4104 / 0x1008
通道 Operational
级别 Verbose
操作码 Create
任务 CommandStart
关键字 Runspace

在 Windows 上注册 PowerShell 事件提供程序

与 Linux 或 macOS 不同,Windows 要求先注册事件提供程序,然后才能将事件写入事件日志。 若要启用 PowerShell 事件提供程序,请从提升的 PowerShell 提示符运行以下命令。

$PSHOME\RegisterManifest.ps1

在 Windows 上注销 PowerShell 事件提供程序

注册事件提供程序时,在用于解码事件的二进制库中放置一个锁。 若要更新此库,必须取消注册提供程序才能释放此锁。

若要注销 PowerShell 提供程序,请从提升的 PowerShell 提示符运行以下命令。

$PSHOME\RegisterManifest.ps1 -Unregister

更新 PowerShell 后,运行 $PSHOME\RegisterManifest.ps1 以注册更新的事件提供程序。

启用脚本块日志记录

启用脚本块日志记录时,PowerShell 会记录它处理的所有脚本块的内容。 启用后,任何新的 PowerShell 会话将记录此信息。

注意

建议在将脚本块日志记录用于除诊断目的以外的任何用途时启用受保护的事件日志记录,如下所述。

可以通过组策略或注册表设置启用脚本块日志记录。

使用组策略

若要启用自动听录,请Turn on PowerShell Script Block Logging通过 Administrative Templates -> Windows Components -> Windows PowerShell在 组策略 中启用该功能。

使用注册表

运行以下函数:

function Enable-PSScriptBlockLogging
{
    $basePath = 'HKLM:\Software\Policies\Microsoft\Windows' +
      '\PowerShell\ScriptBlockLogging'

    if(-not (Test-Path $basePath))
    {
        $null = New-Item $basePath -Force
    }

    Set-ItemProperty $basePath -Name EnableScriptBlockLogging -Value "1"
}

受保护的事件日志记录

提高系统上的日志记录级别会增加记录内容可能包含敏感数据的可能性。 例如,启用脚本日志记录后,可以将脚本使用的凭据或其他敏感数据写入事件日志。 当记录敏感数据的计算机遭到入侵时,日志可以为攻击者提供扩展其范围所需的信息。

为了保护此信息,Windows 10引入了受保护的事件日志记录。 受保护的事件日志记录允许参与的应用程序加密写入事件日志的敏感数据。 稍后,可以在更安全、更集中的日志收集器上解密和处理这些日志。

事件日志内容使用 IETF 加密消息语法 (CMS) 标准进行保护。 CMS 使用公钥加密。 用于加密内容和解密内容的密钥是分开的。

公钥可以广泛共享,不是敏感数据。 使用此公钥加密的任何内容只能由私钥解密。 有关公钥加密的详细信息,请参阅 维基百科 - 公钥加密

若要启用受保护的事件日志记录策略,请将公钥部署到具有要保护的事件日志数据的所有计算机。 相应的私钥用于在更安全的位置(如中央事件日志收集器或 SIEM 聚合器)对事件日志进行后期处理。 可以在 Azure 中设置 SIEM。 有关详细信息,请参阅 泛型 SIEM 集成

通过 组策略 启用受保护的事件日志记录

若要启用受保护的事件日志记录,请Enable Protected Event Logging通过 Administrative Templates -> Windows Components -> Event Logging在 组策略 中启用该功能。 此设置需要加密证书,可以通过以下几种形式之一提供该证书:

  • 例如,base-64 编码的 X.509 证书的内容 (,如证书管理器) 中的 选项提供 Export
  • 可以在本地计算机证书存储中找到的证书的指纹 (可以通过 PKI 基础结构) 进行部署。
  • 证书 (的完整路径可以是本地路径,也可以是远程共享) 。
  • 包含证书或证书 (目录的路径可以是本地或远程共享) 。
  • 可以在本地计算机证书存储中找到的证书的使用者名称 (可以通过 PKI 基础结构) 进行部署。

生成的证书必须具有 Document Encryption 增强的密钥用法 (1.3.6.1.4.1.311.80.1) ,并且 Data Encipherment 必须启用 或 Key Encipherment 密钥用法。

警告

私钥不应部署到计算机日志记录事件。 它应保存在解密消息的安全位置。

解密受保护的事件日志记录消息

假设你有私钥,以下脚本将检索和解密:

Get-WinEvent Microsoft-Windows-PowerShell/Operational |
  Where-Object Id -eq 4104 | Unprotect-CmsMessage

另请参阅

about_Logging_Non-Windows

PowerShell the Blue Team

通用 SIEM 集成