深入了解 PowerShell 指令碼安全性

適用於:Configuration Manager (目前的分支)

系統管理員有責任驗證其環境中建議的 PowerShell 和 PowerShell 參數使用方式。 以下是一些實用的資源,可協助教育系統管理員有關 PowerShell 的強大功能和潛在風險表面。 本指南旨在協助您降低潛在風險表面,並允許使用安全的指令碼。

PowerShell 指令碼安全性

Configuration Manager 指令碼功能可讓您以視覺化方式檢閱及核准指令碼。 其他系統管理員可以要求允許其指令碼。 系統管理員應注意 PowerShell 指令碼可能具有模糊化的指令碼。 模糊化的指令碼可能是惡意的,在指令碼核准程序期間,很難透過目視檢查來偵測。 以視覺化方式檢閱 PowerShell 指令碼,並使用檢查工具來協助偵測可疑的指令碼問題。 這些工具不一定能判斷 PowerShell 作者的意圖,因此可能會引起對可疑指令碼的注意。 不過,這些工具會要求系統管理員判斷它是惡意還是刻意的指令碼語法。

建議

  • 使用下面引用的各種連結熟悉 PowerShell 安全性指南。
  • 簽署您的腳本:確保腳本安全的另一種方法是在匯入腳本以供使用之前對其進行審查,然後進行簽名。
  • 不要在 PowerShell 指令碼中儲存密碼 () 等祕密,並深入瞭解如何處理祕密。

有關 PowerShell 安全性的一般資訊

選擇此連結集合是為了提供 Configuration Manager 系統管理員了解 PowerShell 指令碼安全性建議的起點。

防禦 PowerShell 攻擊

防範惡意程式碼插入

PowerShell - 藍隊,討論深層指令碼封鎖記錄、受保護的事件記錄、反惡意程式碼掃描介面,以及安全程式碼產生 API

反惡意程式碼掃描介面的 API

PowerShell 參數安全性

傳遞參數是一種讓腳本具有彈性並將決策延遲到執行時間的方法。 這也開啟了另一個風險面。

下列清單包含可防止惡意參數或指令碼插入的建議:

  • 只允許使用預先定義的參數。
  • 使用規則運算式功能,來驗證允許的參數。
    • 範例:如果只允許特定範圍的值,請使用規則運算式來檢查是否能構成該範圍的字元或值。
    • 驗證參數有助於防止使用者嘗試使用某些可以逸出的字元,例如引號。 引號可以有多種類型,因此使用規則運算式來驗證您決定允許的字元通常比嘗試定義所有不允許的輸入更容易。
  • 在PowerShell 資源庫中使用 PowerShell 模組「injection hunter」。
    • 可能會有誤報,因此當某事被標記為可疑時,請尋找意圖,以確定它是否是真正的問題。
  • Microsoft Visual Studio 有指令碼分析程式,可協助檢查 PowerShell 語法。

以下影片標題為「DEF CON 25 - Lee Holmes - Get $pwnd: Attacking Battle Hardened Windows Server」,概述了您可以防範 (的問題類型,尤其是 12:20 至 17:50) 部分:

環境建議

下列清單包含給 PowerShell 系統管理員的一般建議:

  • 部署最新版本的 PowerShell,例如內建於 Windows 10 或更新版本的版本 5 或更新版本。 您也可以部署 Windows Management Framework
  • 啟用並收集 PowerShell 記錄,選擇性地包括受保護的事件記錄。 將這些記錄整合到您的簽章、搜捕和事件回應工作流程中。
  • 在高價值系統上實作 Just Enough 管理,以消除或減少對這些系統的不受限制的管理存取。
  • 部署 Windows Defender 應用程式控制原則,以允許預先核准的系統管理工作使用 PowerShell 語言的完整功能,同時將互動和未經核准的使用限制為有限的 PowerShell 語言子集。
  • 部署 Windows 10 或更新版本,以讓您的防毒軟體提供者擁有所有內容的完整存取權 (包括在執行階段產生或取消模糊化的內容) 由 Windows 指令碼主機處理,包括 PowerShell。