系统学习 学习路径总入口:先选领域,再建立模型,最后用故障演练验证

把执行策略、签名、凭据、日志和受限语言模式放在一起看,避免把 PowerShell 当成天然安全的沙箱

适用场景

编写会被他人或计划任务执行的脚本、从网络分发脚本、在服务器上保存凭据、为运维开放受限远程入口时,需要系统性考虑安全边界。也适合审计“为什么这台机器上的脚本行为和其他机器不同”。

如果只是一次性本地命令,不需要引入签名和 JEA;但执行策略、下载来源和凭据处理仍然适用。

核心概念

5.1 与 7.x 差异

常用操作

# 1. 先看各作用域的执行策略,理解现状而不是直接改成 Bypass
PS C:\> Get-ExecutionPolicy -List

# 2. 检查下载脚本的签名状态和签名者
PS C:\> Get-AuthenticodeSignature .\Deploy.ps1 | Format-List Status, StatusMessage, SignerCertificate

# 3. 用代码签名证书签名;签名后修改文件会使签名失效
PS C:\> $cert = Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert | Select-Object -First 1
PS C:\> Set-AuthenticodeSignature -FilePath .\Deploy.ps1 -Certificate $cert

# 4. 交互式获取凭据,避免把明文密码写进脚本
PS C:\> $cred = Get-Credential
PS C:\> Invoke-Command -ComputerName SRV01 -Credential $cred -ScriptBlock { whoami }

# 5. 查看当前语言模式,受限环境不应被脚本自行绕过
PS C:\> $ExecutionContext.SessionState.LanguageMode

# 6. 7.x 用 SecretManagement 读取机密,不把密码放进脚本
PS C:\> Get-Secret -Name DbPassword -Vault LocalStore

# 7. 转录会话输出;转录不是防篡改审计,敏感输出要另外处理
PS C:\> Start-Transcript -Path C:\Logs\session.txt
PS C:\> Stop-Transcript

# 8. 查看脚本块日志是否开启,定位“谁执行了什么代码”
PS C:\> Get-WinEvent -LogName 'Microsoft-Windows-PowerShell/Operational' -MaxEvents 20 |
>>     Where-Object Id -eq 4104

易错点

相关命令

参考链接

读完自测

合上页面,先回答,再展开对照。

  1. 执行策略设为 AllSigned 后,为什么仍然不能把它当作安全边界?
  2. 下载的脚本签名有效,是否就可以直接在生产机执行?
  3. 7.x 在 Linux 上,执行策略还能阻止未签名脚本吗?
答案
  1. 执行策略只是 PowerShell 的加载护栏,恶意程序可以绕过或改用其他解释器;它不限制进程权限、网络访问或代码内容。
  2. 不可以。签名只证明文件未被篡改及签名者身份,不证明来源可信或代码安全;还要审查内容、来源、权限和运行环境。
  3. 不能。执行策略只在 Windows 上生效,Linux/macOS 上通常是 Unrestricted,需要靠文件权限、最小权限账户和审计来控制。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令