🛡? 第17章|PowerShell 安全警報——高分學習筆記(運維實戰向)
一句話核心:PowerShell 的“安全設計目標”是——不替你越權;盡量防“誤觸發不可信腳本”;并非反惡意軟件的最后防線。
1)PowerShell 的安全模型,你必須先認清
- 不增權、不越權:你在 GUI 做不到的,PowerShell 也做不到。腳本不會讓低權限用戶“神功附體”。
- 目標是“防誤執行”:保護用戶不小心運行未知來源腳本;不是阻止你“有意”去跑某個腳本。
- 惡意軟件不是 PowerShell 的問題:一旦系統被入侵,攻擊者可調用任何技術(含 .NET、WMI、PowerShell…)。安全邊界在殺軟/EDR/最小權限/補丁等處。
2)執行策略(Execution Policy):功能與定位
定位:防誤觸腳本的使用規范,不是強安全邊界。
查看/設置:
Get-ExecutionPolicy
Set-ExecutionPolicy RemoteSigned -Scope LocalMachine # 需管理員
# 也可單次會話覆蓋:
powershell.exe -ExecutionPolicy Bypass
常見策略對比(記憶表)
策略 | 能否跑腳本 | 適用場景 | 風險/說明 |
---|---|---|---|
Restricted (默認) | 否(交互命令可執行) | 極簡/拒跑腳本的終端 | 學習環境/無自動化 |
AllSigned | 需要受信任 CA簽名 | 高安全要求團隊 | 維護成本最高 |
RemoteSigned | 本地腳本可跑;遠程/下載腳本需簽名 | 官方推薦的平衡方案 | 適配度高 |
Unrestricted | 全部可跑(首次提示) | 實驗/緊急排障 | 風險大 |
Bypass | 完全放行 | 內嵌主機應用自行做安全 | 常用于程序內托管 PS,不建議常態化 |
組策略:本地計算機策略 → 用戶配置 → 管理模板 → Windows 組件 → Windows PowerShell
GPO 會覆蓋本地設置;但命令行
-ExecutionPolicy
仍可臨時覆蓋(因此它不是“硬”安全邊界)。
3)代碼簽名(Code Signing):實名 + 防篡改
它解決了什么?
- 是誰寫的:通過**證書頒發機構(CA)**簽發的代碼簽名證書識別作者/組織。
- 有沒有改過:腳本簽名包含腳本副本摘要,執行時用公鑰核驗,一改就壞。
最佳實踐工作流
-
準備證書
- 優先用企業 PKI 或商業 CA 的“代碼簽名證書”(Class 3/Code Signing)。
- 沒有 PKI?可先用自簽(僅用于內部/測試)。
-
給腳本簽名
# 1) 選一張代碼簽名證書
$cert = Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert | Select-Object -First 1
# 2) 對腳本簽名
Set-AuthenticodeSignature .\Deploy.ps1 $cert
- 在需要執行腳本的機器上設置策略(建議):
Set-ExecutionPolicy RemoteSigned
自簽證書(測試/內部)
$cert = New-SelfSignedCertificate `-Type CodeSigningCert `-Subject "CN=Corp PS Code Signing" `-CertStoreLocation Cert:\CurrentUser\My
Set-AuthenticodeSignature .\MyScript.ps1 $cert
信任鏈很關鍵:只信任驗證流程可靠的 CA。信任一個不嚴謹的 CA = 等于不設防。
4)Windows 里額外兩道“防手滑”
.ps1
默認不是“可執行”類型:雙擊默認用記事本打開,避免誤執行。- 必須顯式路徑:同目錄腳本需
.\test.ps1
或絕對路徑。
這能防“命令劫持”(有人放個dir.ps1
誘你誤執行):
.\dir # 執行當前目錄腳本
dir # 執行內置命令(非腳本)
5)那些“看似漏洞”的誤解
- 復制粘貼代碼到控制臺、或你主動執行腳本 → 執行策略不攔;這正是它的設計目標(防誤,不防故意)。
- “能不能用腳本讓普通用戶做管理員事?”→ 不能。除非你給了更高權限(例如任務計劃/Scheduled Task、服務賬號、CredSSP/RunAs 等“封裝”手段)。
6)團隊落地建議(含企業運維做法)
-
策略基線:
- 開發/運維跳板機:
RemoteSigned
- 普通辦公終端:
Restricted
或RemoteSigned
(視實際自動化需求) - 絕不常態化
Unrestricted/Bypass
- 開發/運維跳板機:
-
簽名治理:
- 統一用企業 PKI 發放代碼簽名證書;關鍵庫/腳本強制簽名(
AllSigned
可用于核心產線機)。 - 選用支持“保存即簽”的編輯器(PowerShell Studio / VSCode + 擴展等)降低成本。
- 統一用企業 PKI 發放代碼簽名證書;關鍵庫/腳本強制簽名(
-
文化與流程:
- 從不直接運行網上腳本;先讀后跑,必要時“白盒審計”(尤其對含方法調用/注冊表改寫/網絡出站的腳本)。
- 腳本倉庫管理:版本控制(Git)、強制 Code Review、發布簽名。
-
別動這倆:
- 不要把
.ps1
關聯為“可執行”。 - 不要關閉“顯式路徑”要求(避免命令劫持)。
- 不要把
7)速查命令清單(收藏)
# 查策略
Get-ExecutionPolicy -List# 設策略(機器級)
Set-ExecutionPolicy RemoteSigned -Scope LocalMachine# 單次會話覆蓋(排障/受控使用)
powershell.exe -ExecutionPolicy Bypass# 查看/選擇代碼簽名證書
Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert# 新建自簽(測試/內網)
New-SelfSignedCertificate -Type CodeSigningCert `-Subject "CN=Corp PS Code Signing" -CertStoreLocation Cert:\CurrentUser\My# 給腳本簽名
Set-AuthenticodeSignature .\Script.ps1 (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert | Select -First 1)# 學習文檔
Get-Help about_Signing
Get-Help about_Command_Precedence
8)動手實驗(考試同款)
- 用管理員打開 PowerShell,設置策略為
RemoteSigned
;驗證本地腳本可跑、下載腳本需簽名。 - 用
New-SelfSignedCertificate
生成自簽證書,對腳本Set-AuthenticodeSignature
簽名后執行。 - 試試在當前目錄直接敲腳本名與
.\script.ps1
的差異,理解防命令劫持。 - 用
powershell.exe -ExecutionPolicy Bypass
啟動臨時會話,體會“非安全邊界”的本質(僅實驗環境使用)。
9)考點速背(面試/筆試)
- 執行策略的目的?防誤執行不可信腳本,不是安全邊界。
- 最推薦策略?
RemoteSigned
(平衡)。 - AllSigned 與 RemoteSigned 區別?AllSigned 要求所有腳本簽名;RemoteSigned 僅遠程/下載腳本需簽名。
- 為什么要顯式路徑
.\
? 防命令劫持。 - 代碼簽名價值?識別作者 + 防篡改(公私鑰、信任鏈)。