powershell安全核心在于执行策略、脚本块日志、jea最小权限及凭证安全:生产环境推荐remotesigned,高敏感系统用allsigned;启用id 4104日志审计高危命令;通过jea限制远程会话权限;凭证应使用windows凭据管理器或kerberos认证,禁用硬编码与securestring。
powershell 不是单纯用来“自动化”的工具,它是 windows 系统安全运维的中枢。真正提升安全度,不靠堆功能,而在于用对策略、管住执行、看清行为、限制权限。
执行策略必须设对,不是可选项
执行策略(Execution Policy)是 PowerShell 安全的第一道闸门,它不阻止脚本运行,但能阻断未经验证的代码加载。
- 生产环境强烈推荐
RemoteSigned:本地脚本可直接运行,从网络下载的脚本必须带有效数字签名 - 高敏感系统可用
AllSigned,所有脚本(含本地)都需签名验证 - 绝对避免
Unrestricted或Bypass,这两者等于关闭防护
设置命令需管理员权限执行:Set-ExecutionPolicy RemoteSigned -Scope LocalMachine -Force
策略可通过组策略统一部署(路径:计算机配置 → 管理模板 → Windows 组件 → Windows PowerShell),确保全网一致。
开启脚本块日志,让每行命令都有迹可循
默认情况下,PowerShell 不记录具体执行了什么命令。启用脚本块日志后,所有 Invoke-Expression、& {…}、IEX 等高危操作都会写入事件日志(ID 4104)。
启用方式(管理员权限):
$regPath = "HKLM:\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging" New-Item $regPath -Force | Out-Null Set-ItemProperty $regPath -Name EnableScriptBlockLogging -Value 1
之后通过以下命令快速筛查异常:
Get-WinEvent -LogName "Microsoft-Windows-PowerShell/Operational" -Id 4104 -MaxEvents 50 |
Where-Object {$_.Message -match "iex|invoke-expression|downloadstring"} |
Select-Object TimeCreated, Message
用 JEA 构建最小权限远程会话
普通管理员远程登录后可执行任意命令,风险极高。Just Enough Administration(JEA)允许你定义“只能运行哪几个命令”的受限会话。
例如,为资产盘点人员创建仅能运行 Get-ComputerInfo 和 Get-NetAdapter 的角色:
- 编写角色能力文件(
.psrc),只包含允许的 cmdlet - 创建会话配置文件,指定
SessionType = 'RestrictedRemoteServer' - 注册并启用该配置:
Register-PSSessionConfiguration -Path .\AssetReader.pssc -Name AssetReader -Force
用户连接时必须显式指定配置名:
Windows-Android_SSH_Remote_Control下载通过 SSH 隧道从 Android 设备在互联网上对 Windows PC 实现完整远程控制的设置与使用指南,适用于远程桌面访问、安全 RDP 等。
Enter-PSSession -ComputerName srv01 -ConfigurationName AssetReader
此时即使拿到凭证,也无法执行
Remove-Item或Invoke-Mimikatz。
凭证不硬编码,也不依赖 SecureString
硬编码密码是重大风险;而 SecureString 在 PowerShell 7+ 中已不被推荐(微软明确提示其保护能力有限)。更稳妥的做法是:
- 使用 Windows 凭据管理器存储凭据(
cmdkey+Get-Credential -Credential) - 在域环境中优先采用 Kerberos 或证书认证,避免密码传输
- 对于自动化任务,使用托管服务标识(MSI)或 Azure AD 应用注册获取令牌,而非用户名/密码
PowerShell 安全的本质,是把“谁能在什么条件下运行什么”变成可配置、可审计、可收敛的规则。它不靠复杂工具堆砌,而靠清晰边界和持续验证。










