PowerShell 有數個設計來改善腳本環境安全性的功能。
執行原則
PowerShell 的執行原則是一項安全功能,可控制 PowerShell 載入組態檔和執行腳本的條件。 此功能有助於防止執行惡意指令碼。 您可以使用組策略設定來設定電腦和使用者的執行原則。 執行原則僅適用於 Windows 平臺。
如需詳細資訊,請參閱 about_Execution_Policies。
使用 SecureString 類別
PowerShell 有數個 Cmdlet,可支援使用 System.Security.SecureString 類別。
而且,如同任何 .NET 類別,您可以在自己的腳本中使用 SecureString 。 不過,Microsoft不建議使用 SecureString 進行新的開發。 Microsoft建議您避免使用密碼,並依賴其他方法來驗證,例如憑證或 Windows 驗證。
PowerShell 會繼續支援 SecureString 類別,以提供回溯相容性。 使用 SecureString 仍然比使用純文字字串更安全。 PowerShell 仍然依賴 SecureString 類型,以避免不小心將內容公開至主控台或記錄中。 請小心使用 SecureString ,因為它可以輕鬆地轉換成純文字字串。 如需使用 SecureString 的完整討論,請參閱 System.Security.SecureString 類別 檔。
模組和指令碼區塊記錄
模組記錄可讓您啟用所選 PowerShell 模組的記錄功能。 此設定在電腦上的所有會話中都有效。 PowerShell 會記錄 Windows PowerShell 事件記錄檔中指定模組的管線執行事件。
腳本區塊記錄可讓您記錄命令、腳本區塊、函式和腳本的處理,無論是以互動方式叫用,還是透過自動化來叫用。 PowerShell 會將此信息記錄至 Microsoft-Windows-PowerShell/Operational 事件記錄檔。
如需詳細資訊,請參閱下列文章:
AMSI 支援
Windows Antimalware 掃描介面 (AMSI) 是一種 API,可讓應用程式將動作傳遞至反惡意代碼掃描器,例如 Windows Defender,以掃描惡意承載。 從 PowerShell 5.1 開始,在 Windows 10 上執行的 PowerShell 會將所有腳本區塊傳遞至 AMSI。
PowerShell 7.3 會擴充它傳送至AMSI進行檢查的數據。 它現在包含所有 .NET 方法調用。
如需AMSI的詳細資訊,請參閱 AMSI如何協助。
限制語言模式
LimitedLanguage 模式藉由限制 PowerShell 會話中允許的 Cmdlet 和 .NET 類型來保護系統。 如需完整描述,請參閱 about_Language_Modes。
應用程式控制
Windows 10 包含兩種可用來控制應用程式的技術:適用於商務的 App Control 和 AppLocker。 PowerShell 會偵測是否強制執行整個系統應用程控原則。 此原則會在執行腳本區塊、腳本檔案或載入模組檔案時套用特定行為,以防止系統上執行任意程序代碼。
商務用應用程控是在Microsoft安全性回應中心 (MSRC) 所定義的服務準則下設計為安全性功能。 商務用 App Control 是適用於 Windows 的慣用應用控制系統。 欲了解更多關於 PowerShell 如何支援 AppLocker 與 App Control for Business 的資訊,請參閱 「使用 App Control 以保護 PowerShell」。
AppLocker 是一個舊有的應用程式控制系統,至今仍支援 Windows 11。 AppLocker 並非 MSRC 定義的維護標準中的安全功能。 欲了解更多服務標準,請參閱 Microsoft 安全性 服務標準(Windows)。
系統鎖定模式
在 PowerShell 中,系統鎖定模式是 Windows 透過 App Control for Business 或 AppLocker 強制執行的系統範圍應用程式控制政策的抽象化。 當應用程式控制政策啟動時,PowerShell 會進入系統鎖定模式。 在系統鎖定模式下,應用程式控制政策決定每個跑道空間的語言模式。
這很重要
沒有系統鎖定模式時,語言模式不會在跑道間傳播。 每個跑道空間會獨立查詢 Windows 應用程式控制政策以判斷其語言模式。
在一個跑道空間設定語言模式不會影響其他跑道。 若沒有作用中的應用程式控制原則,新的 Runspace 預設為 FullLanguage 模式。
軟體用料表 (SBOM)
從 PowerShell 7.2 開始,所有安裝套件都包含軟體材料帳單(SBOM)。 PowerShell 團隊也會為其擁有、但獨立於 PowerShell 發行的模組產出 SBOM。
您可以在下列位置找到 SBOM 檔案:
- 在 PowerShell 中,尋找 位於
$PSHOME/_manifest/spdx_2.2/manifest.spdx.json的 SBOM。 - 至於模組,請在模組的資料夾中 `
_manifest/spdx_2.2/manifest.spdx.json` 下方找到 SBOM。
SBOM 的建立和發佈是將聯邦政府網路安全現代化並增強軟體供應鏈安全性的第一步。 如需這項計畫的更多資訊,請參閱部落格文章 Microsoft 使用 SPDX 產生 SBOM。
PowerShell 遠端執行中的安全資料傳輸
在 PowerShell v7.6-preview5 之前,a Session_Key 可用來加密 SecureString ,再傳送 PowerShell 遠端會話。 PowerShell 遠端通訊協定 (PSRP) 會在需要傳輸物件時 SecureString ,在用戶端和伺服器之間執行金鑰交換。 交換涉及以下步驟:
- 客戶端產生公開/私密金鑰對,並將公開金鑰傳送至伺服器。
- 伺服器會產生對稱加密的會話金鑰。
- 伺服器使用公開金鑰來加密會話金鑰並將其傳送給客戶端。
- 用戶端和伺服器都會使用新的會話金鑰來加密 SecureString 物件。
PowerShell 遠端通訊協定 (PSRP) 會在金鑰交換期間使用演算法 RSAEncryptionPadding.Pkcs1 。 該算法 不 安全,因此密鑰交換不提供任何額外的安全性。
這很重要
您必須使用安全傳輸層,以確保透過 PSRP 進行安全資料傳輸。
從 PowerShell v7.6-preview.5 開始,金鑰交換已被取代。 PSRP 的版本已遞增至 v2.4,並包含下列變更:
當用戶端和伺服器都是 v2.4 或更新版本時,下列 PSRP 訊息已被取代:
- 公鑰
- 公鑰請求
- 加密_SESSION_KEY
當用戶端和伺服器都是 v2.4 或更新版本時,會略過 的
SecureString加密和解密步驟。
此變更是回溯相容的。
- 對於舊的用戶端或伺服器(v2.3 或更低版本),仍會在需要時使用金鑰交換。
- 當用戶端和伺服器都位於同一部電腦上時,PSRP 可以使用具名管道遠端會話。
由於遠端用戶端可以連線到具名管道,而且資料不再使用工作階段金鑰加密,因此具名管道 (用於
Enter-PSHostProcess) 會拒絕遠端用戶端。
安全性服務準則
安全邊界提供了不同信任等級的安全領域程式碼與資料之間的邏輯分離。 安全功能建立在安全邊界之上,提供針對特定威脅的強健防護。 針對此類別的安全功能,Microsoft 計畫透過服務來解決報告中的漏洞。
PowerShell 的安全特性
- 搭配商務用應用程式控制的系統鎖定
- 搭配商務用應用程式控制的受限語言模式
欲了解更多資訊,請參閱 Microsoft 安全性 Servicing Criteria for Windows 文件。
在某些情況下,安全功能可能提供對威脅的保護,卻無法提供強有力的防禦。 這些安全特性通常被稱為 防禦縱深 功能或緩解措施,因為它們提供額外的安全防護,但可能存在設計上的限制,無法完全緩解威脅。 單獨繞過某項縱深防禦安全功能本身並不會直接造成風險,因為攻擊者還必須找出會影響安全邊界的弱點,或必須依賴其他手法,例如社交工程,才能使裝置入侵進展到初始階段。
PowerShell 的防禦深度功能
- 使用 AppLocker 的受限語言模式,或透過會話設定或手動設定來設定
$ExecutionContext.SessionState.LanguageMode - 使用 AppLocker 進行系統鎖定
- 執行原則