AppLocker・App Control for Business(WDAC)與業務應用程式發布 ── 在被「執行控制」封鎖之前

· · Windows, 資安, 資訊系統, AppLocker, WDAC, Smart App Control, 程式碼簽章, 發布

「安裝到客戶的電腦上後,應用程式無法啟動。點兩下也沒有任何反應」──在受託開發的 Windows 應用程式發布現場,收到這類諮詢的頻率正在上升。追查原因後發現,連錯誤對話方塊都不顯示就把應用程式擋下來的,正是客戶端日漸普及的應用程式執行控制

Windows 中有多種機制,可以只讓指定的應用程式執行。分別是AppLockerApp Control for Business(長期以來被稱為 WDAC=Windows Defender Application Control)、以及面向個人使用者的Smart App Control。在資安對策的脈絡中,多半是從「導入方」的角度解說,但本文換個視角,改從開發並發布應用程式的一方來整理。內容包含自家業務應用程式在客戶環境中被封鎖的典型模式、被封鎖時該看哪個記錄檔才能確定原因,以及開發、發布方能夠事先採取的對策。同時也整理了考慮在自家電腦導入時,資訊系統部門視角下的要點。

1. 先講結論

  • 執行控制要區分成四種來思考。發出警告讓使用者自行選擇的SmartScreen、以使用者/群組為單位控制規則的AppLocker、以整台機器為對象的App Control for Business,以及對個人自動生效的Smart App Control(見第 2 章的判斷表)。
  • 「AppLocker 只限 Enterprise 版」這個常識已經過時。自 KB 5024351 起,Windows 10 版本 2004 以後以及所有 Windows 11,強制套用已不再需要特定版本。1
  • App Control for Business 可用於 Windows 10/11 的所有用戶端版本,以及 Windows Server 2016 以後。Microsoft 建議,只要可行就應優先使用 App Control 而非 AppLocker。2
  • 發布方對策的核心是程式碼簽章。不只 exe,還要為包含 DLL 在內的所有二進位檔案與安裝程式,以一致的發行者資訊簽署(第 5 章)。隨著 Smart App Control 的普及,未簽署的應用程式在個人電腦上也可能無法執行。3
  • 封鎖的證據可以透過事件記錄檔確定。AppLocker 要看「AppLocker - EXE and DLL」的事件 8004,App Control 則以「CodeIntegrity - Operational」的事件 3077 為主戰場(見第 4 章的判斷表)。45
  • PowerShell 指令碼有時不是被「封鎖」,而是變成「以受限模式執行」。在 App Control 環境中,不符合原則的指令碼會以受限語言模式(Constrained Language Mode)執行,因此會出現「能運作,但部分處理會失敗」這種難以察覺的異常。5
  • 導入方要從稽核模式開始。AppLocker 與 App Control 都有一種模式,不實際封鎖,只記錄「原本應該會被封鎖的項目」,對應的就是事件 8003、3076。45

2. 區分四種機制

首先看整體地圖。由於名稱相似容易混淆,這裡依「由誰管理」「以什麼單位」「如何生效」來區分。

機制 對象 生效方式 管理者
SmartScreen 主要是下載的檔案 警告(預設使用者可以繞過,但也有禁止繞過的管理原則) OS 預設
Smart App Control Windows 11 的個人使用電腦 自動封鎖(依簽章與雲端評估判定) OS(自動)
AppLocker 網域/受管理的電腦 以規則允許/拒絕。可依使用者、群組區分 資訊系統部門
App Control for Business(原 WDAC) 受管理的電腦 以規則允許/拒絕。套用於整台機器、所有使用者 資訊系統部門

2.1. SmartScreen ── 唯一以「警告」阻止的機制

SmartScreen 是「對信譽不佳的項目提出警告」的機制,預設情況下使用者可以自行繞過。不過在受管理的環境中,有時會啟用禁止繞過警告本身的原則,此時 SmartScreen 實質上也會發揮封鎖的作用(這個議題已在「Windows SmartScreen 與程式碼簽章」中討論過)。

從發布方的角度來看,SmartScreen 的特徵在於:即使沒有管理員撰寫規則,預設也會生效,以及封鎖的理由不是原則,而是「信譽」。因此,應對方式也和其他三種不同,不是請客戶撰寫允許規則,而是要靠簽章與信譽的累積來解決。以下 2.2~2.4 節,則是不發出警告、而是直接封鎖的機制。

2.2. AppLocker ── 可依使用者控制的老前輩

AppLocker 是 Windows 7 引進的執行控制機制,可以根據程式碼簽章憑證的屬性(發行者)、來自簽章中繼資料的檔案屬性(原始檔名、版本)或雜湊值、以及檔案路徑來定義規則。原則既可以套用到整台電腦,也能套用到特定的使用者、群組2

版本需求是誤解特別多的地方。目前的文件說得很清楚:自 KB 5024351 起,Windows 10 版本 2004 以後以及所有 Windows 11,強制套用 AppLocker 原則已不再需要特定版本。在較舊的版本(2004 之前的 Windows 10,以及 Windows Server 2019)中,仍保留過去的限制:透過群組原則發布的強制套用僅限 Enterprise 與 Server 版,透過 MDM 發布則所有版本皆可。1

把「Pro 版能做什麼」拆成能否建立規則建立的規則是否實際生效(強制套用)這兩件事來整理,結果如下表。正因為這兩者是不同的事,舊常識才會一直流傳下來。1

環境 建立、編輯規則 建立的規則能否強制套用
Windows 11(含 Pro 在內的所有版本) 可以 可以(KB 5024351 以後,無版本限制)
Windows 10 版本 2004 以後 + KB 5024351(含 Pro 在內的所有版本) 可以 可以(無版本限制)
Windows 10 版本 2004 之前/到 Windows Server 2019 為止 可以 透過群組原則發布的原則僅限 Enterprise 與 Server 版。透過 MDM 發布則所有版本皆可
Windows 8.1 Pro 可以 不行(可以建立,但不會被強制套用)

常有人誤以為「在 Pro 環境下連建立都做不到」,但建立規則在任何版本都能做到。過去有分別的其實是強制套用,而且就算在當時,只要透過 MDM 發布,Pro 版也能強制套用。可套用的規則種類(可執行檔、Windows 安裝程式、指令碼、DLL、封裝應用程式)不會因版本而改變。1 另外,無論哪個版本,只要 Application Identity 服務(AppIDSvc)沒有執行,規則就不會被評估(第 6 章)。

不過 AppLocker 有一項重要的但書。Microsoft 自己明確指出,AppLocker 不符合作為安全性功能的服務基準(MSRC 的 servicing criteria)。也就是說,即使發現繞過手法,本身也不會被當作安全性弱點處理。2

2.3. App Control for Business ── 作為安全性功能的正牌選擇

App Control for Business 是 Windows 10 中以「Device Guard」「可組態程式碼完整性(WDAC)」形式登場的機制的現行名稱。原則會套用到整台機器,並影響裝置上的所有使用者。可以作為規則依據的有:簽章憑證的屬性、檔案屬性或雜湊值、Microsoft 的 Intelligent Security Graph(ISG)評估、發起安裝的處理程序(受管理安裝程式)、檔案路徑(Windows 10 1903 以後)、以及啟動來源處理程序。2

這個機制是依 MSRC 的服務基準所定義,設計為安全性功能。適用條件也很寬鬆,Windows 10/11 的任何用戶端版本,或 Windows Server 2016 以後都能建立、套用原則。發布方式可使用 Intune 等 MDM、Configuration Manager、PowerShell。也能透過群組原則發布,但僅限於在 Windows Server 2016/2019 上運作的單一原則格式。2

關於該選用哪一個,Microsoft 的方針很明確:只要 App Control 能實作,就應該優先使用。App Control 持續在改進,而 AppLocker 雖然會收到安全性修正,卻不再新增功能。AppLocker 適合的場合是:混雜著舊版 Windows、想要發布同一份原則時;共用電腦需要依使用者、群組套用不同規則時;以及作為 App Control 的補充,追加以使用者為單位的限制時。2

2.4. Smart App Control ── 「自行」進駐個人電腦的執行控制

Smart App Control 是 Windows 11 面向個人使用者的保護功能。當使用者嘗試執行應用程式時,雲端安全服務會確認是否能對該應用程式的安全性做出預測,並封鎖被判定為惡意的應用程式,以及沒有有效簽章、無法確認信任的應用程式。新電腦會從評估模式開始,由 Windows 自動判斷是否適合該使用者,決定啟用或停用(像開發者這種容易頻繁被封鎖的使用者,會自動關閉)。3

對發布方而言,這件事的意義很單純:即使是不受企業管理的電腦,也就是小型事業者或個人事業主客戶的電腦,如今也已進入預設就內建執行控制的時代。就算沒有任何管理員撰寫原則,未簽署的應用程式仍可能被封鎖。Microsoft 給開發者的建議中,也提到要用有效憑證為應用程式簽署以避免被封鎖。3

3. 您的應用程式被封鎖的典型模式

以下依原因列出在受託開發、套裝軟體發布現場實際會遇到的模式。

模式 發生的現象 根本原因
exe 已簽署但 DLL 未簽署 主程式啟動後立刻當掉/依功能單位失敗 啟用 DLL 規則的環境中,所有二進位檔案都是驗證對象
自解壓縮封存檔或展開到暫存資料夾 展開到 %TEMP% 的 exe 無法啟動 在路徑規則允許範圍(Program Files 等)之外執行
自動更新替換了新版本 更新後就無法啟動 在採用雜湊規則的客戶環境中,每次更新雜湊值都會改變
只簽署安裝程式,MSI 未簽署 安裝本身失敗 MSI、指令碼也是控制對象(屬於「AppLocker - MSI and Script」記錄檔管轄)
隨附的 PowerShell 指令碼無法運作 應用程式能啟動,但部分功能失敗 在 App Control 環境中,原則之外的指令碼會以受限語言模式執行5
事後加入外掛程式、擴充 DLL 只有新增的模組無法運作 後來加入的 DLL 不在允許規則之列
安裝到可寫入的資料夾 依環境不同,有時能動有時不能動 路徑規則通常是以「不允許使用者可寫入的路徑」為前提設計的

共通的癥結在於,「允許執行一方所依據的根據(簽章、路徑、雜湊)」,發布方沒能穩定地提供。就算客戶的資訊系統部門想撰寫發行者規則,若簽章只涵蓋部分二進位檔案,就只能改用雜湊規則,而雜湊規則會在您每次發行更新版時失效。表面上封鎖的責任似乎在導入方,但實際上很多情況是讓規則容易失效的原因出在發布方

4. 用記錄檔確定發生了什麼事

「無法啟動」的原因是否出在執行控制,不必靠猜測,可以用事件記錄檔確定。要查看的位置分成兩個系統。

4.1. AppLocker 的事件

請查看事件檢視器的 Applications and Services Logs\Microsoft\Windows\AppLocker 底下。4 為第一次開啟的讀者,這裡寫下操作路徑。

事件檢視器(在開始功能表輸入「事件檢視器」,或以執行檔案名稱執行 eventvwr.msc> 應用程式與服務記錄 > Microsoft > Windows > AppLocker > EXE and DLL / MSI and Script / Packaged app-Deployment / Packaged app-Execution

若作業系統介面為英文,路徑會顯示為 Applications and Services Logs > Microsoft > Windows > AppLocker。若想省去操作 GUI 的麻煩,可以用系統管理員身分開啟 PowerShell,用下面這一行讀取(請客戶協助確認時,把這行指令交給對方也是最快的方法)。

# 取出最近 24 小時內 AppLocker 的封鎖(8004)與稽核(8003)事件
Get-WinEvent -FilterHashtable @{
    LogName   = 'Microsoft-Windows-AppLocker/EXE and DLL'
    Id        = 8003, 8004
    StartTime = (Get-Date).AddDays(-1)
} | Format-List TimeCreated, Id, Message
記錄檔 事件 意義
EXE and DLL 8002 已允許並執行
EXE and DLL 8003 稽核模式:若強制套用,原本會被封鎖
EXE and DLL 8004 已封鎖(強制模式)
MSI and Script 8005 / 8006 / 8007 指令碼、MSI 的允許/稽核/封鎖
Packaged app 8020~8025 封裝應用程式(MSIX/AppX)的允許/稽核/封鎖
8008 AppLocker 不支援的 SKU

事件會記錄目標檔案的路徑、允許或封鎖、套用的規則種類(路徑、雜湊、發行者)與規則名稱,以及規則所指使用者、群組的 SID。4 不過解讀方式需要留意。在允許清單型的運用下,多數封鎖並非「符合某條拒絕規則」,而是沒有符合任何一條允許規則的隱性拒絕。在這種情況下,8004 能確定的只到「確實被封鎖的事實與目標檔案」,規則名稱並不能作為線索。命中明確的拒絕規則時,規則名稱本身就是原因;但在隱性拒絕的情況下,就必須對照目前套用中的原則,找出「究竟缺少哪一條允許規則」。

4.2. App Control for Business(WDAC)的事件

App Control 的封鎖記錄在另一個位置:Applications and Services Logs\Microsoft\Windows\CodeIntegrity\Operational。exe、DLL、驅動程式的控制記錄在這裡,MSI、指令碼、COM 的控制則記錄在前面提到的「AppLocker - MSI and Script」記錄檔,兩者是這樣分工的。5

事件檢視器 > 應用程式與服務記錄 > Microsoft > Windows > CodeIntegrity > Operational(英文介面則為 Applications and Services Logs > Microsoft > Windows > CodeIntegrity > Operational

# 一併查看 App Control 的封鎖(3077)、稽核(3076),以及對應的簽章資訊(3089)
Get-WinEvent -FilterHashtable @{
    LogName   = 'Microsoft-Windows-CodeIntegrity/Operational'
    Id        = 3076, 3077, 3089
    StartTime = (Get-Date).AddDays(-1)
} | Sort-Object TimeCreated | Format-List TimeCreated, Id, Message

在「不確定是被哪個機制封鎖的」狀態下,把這兩份記錄檔以相同時間範圍並排比對,是最確實的做法。

記錄檔 事件 意義
CodeIntegrity - Operational 3076 稽核模式的主要封鎖事件:若強制套用,原本會被封鎖
CodeIntegrity - Operational 3077 強制模式的主要封鎖事件:未通過原則而被封鎖
CodeIntegrity - Operational 3089 被封鎖(或稽核封鎖)檔案的簽章資訊。以相關 ID 與 3076/3077 對照
CodeIntegrity - Operational 3033 因簽章失效、過期等原因造成的封鎖(有時會與 3077 同時發生)
AppLocker - MSI and Script 8028 / 8029 指令碼、MSI 的稽核/封鎖
AppLocker - MSI and Script 8036 COM 物件的封鎖
AppLocker - MSI and Script 8039 / 8040 封裝應用程式的稽核/封鎖

3089 容易被忽略,但很重要。每個檔案的每個簽章都會產生一筆事件,若檔案未簽署,就會產生一筆「簽章數為 0」的事件。「明明已經簽署,卻被當作未簽署處理」「殘留舊憑證的簽章」之類發布方的疏漏,都可以在這裡確定5

指令碼的行為有其特別需要注意之處。事件 8029 表示「指令碼被封鎖」,但實際的強制方式取決於指令碼主機端的行為,例如 PowerShell 並不會完全阻止不符合原則的指令碼,而是以受限語言模式(Constrained Language Mode)執行5 由於 .NET 物件的建立會受到廣泛限制,因此會出現「指令碼本身能執行,但中途某一行會失敗」這種不上不下的異常。若應用程式隨附了指令碼,不了解這種異常模式會使調查拖得更久(指令碼簽章的實務作法可參考「PowerShell 的執行原則與指令碼簽章」)。

另外,「AppLocker - MSI and Script」記錄檔在 Windows Server Core 版中並不存在5 在調查伺服器部署的應用程式時,請記住這一點。

5. 發布方的對策 ── 打造「容易撰寫規則」的應用程式

與其等被封鎖後才處理,正確做法是在發布時就讓客戶的資訊系統部門能夠撰寫穩定的允許規則。要做的事其實不多。

  1. 為所有二進位檔案加上 Authenticode 簽章。不只是 exe,還包括自行建置的 DLL、安裝程式(MSI/安裝用 exe)、以及隨附的指令碼。發行者規則是以簽章中繼資料(發行者、產品名稱、檔名、版本)為根據的,因此只要有簽章,就能請對方寫出「允許此發行者的此產品,不論版本」這種能承受更新的規則2 憑證請選擇由受信任憑證授權單位核發、以 RSA 為基礎的憑證。自我簽署憑證或內部 CA 的憑證,在不信任該 CA 的客戶電腦上無法通過驗證,Smart App Control 也不支援。此外,Smart App Control 的簽章檢查並不支援 ECC(橢圓曲線)簽章,因此若以 ECC 憑證簽署,在個人電腦上可能會被視同未簽署。6 App Control 也有相同的限制,以簽署者為基礎的規則只支援 RSA(最高 4096 位元),以 ECDSA 簽署的檔案無法用發行者規則允許(簽章資訊的 3089 事件會出現 VerificationError = 23)。7 若因為「ECC 比較新、比較強」而選用它,在執行控制的觀點下反而會造成反效果。
  2. 務必附加時間戳記。即使憑證過期,簽章的有效性仍能保持。簽章的實務步驟以及與 SmartScreen 的關係,已整理在另一篇文章中。
  3. 讓發行者資訊與檔案的版本資源保持穩定。更新憑證時,若主體(組織名稱)改變,發行者規則就會失效。若要變更公司名稱表記方式或憑證取得來源,請將事先通知客戶的內容納入版本說明。另一個容易被忽略的地方是,發行者規則中的「產品名稱」「原始檔名」「版本」,並非取自憑證,而是取自各檔案的版本資源(組件資訊)。若把這些欄位留空,或是每次發行版本都更改產品名稱或執行檔名,即使簽署者相同,鎖定產品、檔案層級的規則也會失效。
  4. 讓執行檔的存放位置貼近標準。安裝到 Program Files 底下,並停止那種在執行時把 exe/DLL 展開到 %TEMP%%APPDATA% 再啟動的設計。因為在可寫入位置執行的設計,與採用路徑規則的環境根本上不相容。
  5. 重新檢視自動更新的設計。更新程式本身也要簽署,讓更新流程成為「以已簽署的二進位檔案取代已簽署的二進位檔案」的封閉流程。若透過 Intune 或 Configuration Manager 發布,只要客戶端把該發布代理程式組態為受管理安裝程式,就能採用允許透過該安裝程式導入之二進位檔案的運用方式。這不是自動生效,而是以管理員端的明確組態為前提,但只要事先準備好支援無聲安裝的 MSI,就能把這個選項交給客戶(自動更新的安全設計整理在「自動更新的安全性」)。
  6. 事先準備好被封鎖時所需的資訊。在「導入手冊」中明確記載簽章的主體、執行所需的二進位檔案清單、安裝路徑,客戶的資訊系統部門光憑這些就能撰寫規則。發生問題時,只要指定第 4 章的事件 ID 請對方確認,往返一次就能解決。

這六點,也直接適用於對 Smart App Control 的準備。已簽署、且累積了信譽的二進位檔案,比較不容易被個人電腦的自動封鎖攔下。3

5.1. 第一次取得程式碼簽章憑證時

光說「來簽章吧」會卡在原地無法前進,這裡寫下還沒有憑證時的下一步該怎麼做。

憑證的選擇方式。可用的是由公開憑證授權單位(商用 CA)核發的程式碼簽章憑證。自我簽署憑證或內部 CA 的憑證,在不信任該 CA 的客戶電腦上無法驗證,因此不能用於發布的軟體。公開 CA 的憑證分為進行企業實在性確認的OV,以及審查更嚴格的EV,但就 AppLocker 或 App Control 的發行者規則而言,兩者能寫出的規則沒有差別。App Control 雖然準備了「必須使用 EV 簽署」的規則選項(Required:EV Signers),但文件中明確指出目前尚不支援,因此就執行控制而言,目前沒有理由選擇 EV。7

費用的思考方式。金額會因 CA 與有效期限而不同,前提是需要另行報價,不過先了解費用結構有助於比較。自 2023 年 6 月 1 日起,依照 CA/Browser Forum 的基準,不論 OV 或 EV,都必須以相當於 FIPS 140-2 Level 2 以上的硬體(HSM 或 USB 權杖)產生並保管私鑰8 也就是說,費用不只包含「憑證本體」,還包含「權杖、HSM,或是 CA 提供的雲端簽章服務使用費」。若想在 CI/CD 中自動簽署,雲端簽章服務比實體權杖更容易組態,請在報價時一併討論簽章的運用方式。

最基本的簽章指令。使用 Windows SDK 內附的 signtool

:: 進行簽署(以 SHA-256 雜湊,附加 RFC 3161 時間戳記)
signtool sign /fd sha256 /tr <時間戳記伺服器的 URL> /td sha256 /a MyApp.exe

:: 確認簽章(以 Authenticode 原則驗證,並顯示詳細資訊)
signtool verify /pa /v MyApp.exe

/fd 是檔案的雜湊演算法,/tr 是 RFC 3161 時間戳記伺服器的 URL,/td 是時間戳記的雜湊演算法,/a 是指定從憑證存放區自動選擇適當憑證。時間戳記伺服器的 URL 請使用購買憑證的 CA 所提供的位址。若要以權杖或 HSM 的金鑰簽署,CSP/KSP 的指定方式會寫在 CA 的操作手冊中。DLL 和安裝程式都能用同一道指令簽署,因此在建置流程最後統一執行是最可靠的做法。

更新憑證時,什麼會壞掉。發行者規則的依據是簽章的發行者資訊(憑證鏈與主體)。因此以下這些變更,會讓客戶端的規則在不知不覺中失去一致性。

  • 變更了公司名稱表記方式(例如:把憑證主體從 Komura Soft LLC 改成 合同會社小村軟體)。即使是同一家公司,只要字串不同,就是不同的發行者。
  • 更換了 CA。App Control 的 Publisher 層級規則是「中繼 CA(PCA)憑證 + 葉憑證的 CN」的組合,因此 CA 一改變,PCA 也會跟著改變,就無法一致。7
  • 變更了執行檔名或產品名稱。FilePublisher 層級的規則,除了上述內容,還包含原始檔名(OriginalFileName)與最低版本。7

這些情況的症狀都一樣:從替換成更新版本的那一刻起,只有在該環境中無法啟動應用程式。而且從客戶端來看,只覺得是「更新後就壞了」,不會意識到原因出在簽章上。更新或變更憑證時,請在版本說明中並列新舊簽章資訊(主體、核發 CA),讓客戶的資訊系統部門能夠新增規則。

6. 導入方(資訊系統部門)的要點

在自家電腦上導入執行控制的一方,本文只整理要點。

  1. 選擇技術。原則上以 App Control for Business 為主。共用電腦需要以使用者為單位控制,或是混雜舊版作業系統的環境,則併用 AppLocker。2 像資訊站終端這類固定用途的電腦,先用殼層限制(「資訊站模式與指派的存取」)縮小範圍後再考慮,規則會比較單純。
  2. 務必從稽核模式開始。若是 AppLocker 的「僅稽核」,事件 8003、8006;若是 App Control 的稽核模式,事件 3076、8028,都會記錄「若強制套用原本會被封鎖的項目」。45 蒐集到業務流程跑過一輪後再切換為強制套用的做法,和 SMB 簽署、NTLM 限制完全相同。另外,使用 AppLocker 時有一個前提:AppLocker 的原則若 Application Identity 服務(AppIDSvc)沒有執行就不會被評估,即使設定為稽核模式也不會產生事件。開始稽核之前,請在目標終端上組態這項服務為自動啟動。
  3. 將例外建立台帳。持續維持未簽署狀態使用的舊業務應用程式,會以雜湊規則登錄為例外。這份清單本身就是「總有一天該汰換」的清單,請與資產管理連結,每年重新檢視。

為了不必再連結到其他文章,這裡直接寫下步驟 2「從稽核模式開始」的最低限度流程。

AppLocker 的情況(3 個步驟)

  1. 啟用稽核模式。在群組原則管理編輯器(本機的話用 secpol.msc)中開啟電腦設定 > 原則 > Windows 設定 > 安全性設定 > 應用程式控制原則 > AppLocker,在 AppLocker 上按右鍵選擇內容。針對每個規則集合(可執行檔、Windows 安裝程式、指令碼、封裝應用程式)勾選「已設定」,並選擇「僅稽核」。同時為各集合建立預設規則,並在目標終端將 Application Identity 服務(AppIDSvc)組態為自動啟動(若這項服務未執行,原則就不會被評估,也不會產生事件)。
  2. 蒐集事件。在業務流程跑過一輪之前,蒐集 Microsoft-Windows-AppLocker/EXE and DLL 的事件8003(exe/DLL)與 MSI and Script8006(指令碼、MSI)。4 這裡需要注意。第 4 章的 PowerShell 把記錄檔名稱固定為「EXE and DLL」,因此照原樣執行不會抓到指令碼與 MSI 的 8006。既然記錄檔是分開的,就必須像下面這樣分別執行兩次。

     # 在稽核模式下,從兩份記錄檔蒐集「若強制套用原本會被封鎖的項目」
     $since = (Get-Date).AddDays(-7)
     $collections = @(
         @{ LogName = 'Microsoft-Windows-AppLocker/EXE and DLL';    Id = 8003 }
         @{ LogName = 'Microsoft-Windows-AppLocker/MSI and Script'; Id = 8006 }
     )
     foreach ($c in $collections) {
         Get-WinEvent -FilterHashtable ($c + @{ StartTime = $since }) -ErrorAction SilentlyContinue |
             Select-Object TimeCreated, LogName, Id, Message
     }
    

    若某份記錄檔中一筆對應事件都沒有,Get-WinEvent 會傳回錯誤,因此加上了 -ErrorAction SilentlyContinue。若封裝應用程式也在控制範圍內,請以相同方式加入 Packaged app-Deployment / Packaged app-Execution。請確認是否也涵蓋到了月結、年結批次作業。

  3. 切換為強制套用。先把 8003 與 8006 中出現的項目納入允許規則,再到同一個內容畫面把設定改為「強制執行規則」。切換之後,要監控8004(exe/DLL 的封鎖)與8007(指令碼、MSI 的封鎖)。

App Control for Business 的情況流程也相同,先在原則 XML 中放入規則選項 3(Enabled:Audit Mode再發布(可用 App Control Policy Wizard 或 Set-RuleOption Cmdlet 設定),蒐集30768028後,再移除這個選項切換為強制套用。Microsoft 也建議先以 Enabled:Audit Mode 確認影響範圍。7

7. 總結

  • 執行控制要區分「發出警告」的 SmartScreen,以及「封鎖」的 AppLocker/App Control for Business/Smart App Control 來思考(不過在禁止繞過警告的管理原則下,SmartScreen 實質上也會發揮封鎖的作用)。
  • AppLocker 的版本限制已經放寬(Windows 10 2004 以後、Windows 11 全版本),App Control 則原本就能在所有用戶端版本使用。「我們的客戶用 Pro 版所以無關」這種說法已經站不住腳了。12
  • 因為 Smart App Control,即使是沒有人管理的個人電腦,也已經有了執行控制。未簽署的發布物,光是這一點就可能無法執行。3
  • 封鎖與否要靠事件記錄檔確定。AppLocker 以 8004(EXE and DLL 記錄檔)、App Control 則以 3077 與簽章資訊的 3089(CodeIntegrity - Operational 記錄檔)為主戰場。45
  • 發布方的對策,是為所有二進位檔案一致地簽章、附加時間戳記、標準化的安裝位置、已簽署的自動更新,以及在導入手冊中提供資訊。打造讓客戶容易撰寫規則的應用程式,就是封鎖對策的全部。
  • 導入方要以稽核模式(8003/3076)蒐集完一輪後再切換為強制套用。這個做法和其他安全性強化措施相同。

相關文章

相關諮詢領域

合同會社小村軟體承接在執行控制環境(AppLocker/App Control for Business)下運作的業務應用程式開發、改造,內建程式碼簽章的發布、自動更新設計,以及客戶環境中應用程式無法啟動事件的調查。

參考連結

  1. Microsoft Learn, Requirements to use AppLocker。關於自 KB 5024351 起,Windows 10 版本 2004 以後以及所有 Windows 11,強制套用 AppLocker 原則不再需要特定版本;在比版本 2004 更舊的 Windows(含 Windows Server 2019)中,透過群組原則發布的原則僅支援 Enterprise 與 Server 版,透過 MDM 發布的原則則支援所有版本;在 Windows 10/11 與 Windows Server 2012 R2 以後,可以組態、強制套用封裝應用程式、可執行檔、Windows 安裝程式、指令碼、DLL 的規則等內容。  2 3 4 5

  2. Microsoft Learn, App Control and AppLocker Overview。關於 App Control for Business 在 Windows 10 中導入,並被設計為依 MSRC(Microsoft Security Response Center)服務基準所定義的安全性功能;最初以 Device Guard 的一部分、名稱為「可組態程式碼完整性」發行;App Control 原則套用到整台機器並影響裝置上的所有使用者;規則的依據是簽章憑證的屬性、來自簽章中繼資料的檔案屬性或雜湊值、Intelligent Security Graph 的評估、受管理安裝程式、檔案路徑(Windows 10 1903 以後)、以及啟動來源處理程序;App Control 原則可在 Windows 10/11 的任何用戶端版本或 Windows Server 2016 以後建立、套用,可透過 MDM(Intune 等)、Configuration Manager、PowerShell 發布,透過群組原則發布則僅限於在 Windows Server 2016/2019 上運作的單一原則格式;AppLocker 在 Windows 7 中導入,不符合作為安全性功能的服務基準;AppLocker 原則可套用到整台電腦或個別的使用者、群組,規則的依據是簽章憑證的屬性、檔案屬性、路徑;只要可行就應該使用 App Control 而非 AppLocker,App Control 持續在改進,而 AppLocker 只會收到安全性修正、不再新增功能;AppLocker 適合用於作業系統混雜的環境,以及共用電腦上依使用者、群組區分的原則,也能作為 App Control 的補充等內容。  2 3 4 5 6 7 8 9

  3. Microsoft Support, What is Smart App Control?。關於 Smart App Control 在 Windows 11 中,應用程式執行時會確認雲端安全服務是否能對該應用程式的安全性做出確信的預測,並封鎖被判定為惡意,或是沒有有效簽章、無法確認信任的應用程式;新環境會從評估模式開始,對容易頻繁遇到封鎖的使用者(如開發者)Windows 會自動關閉 Smart App Control;判定會同時使用雲端評估與應用程式是否具有有效簽章兩項依據;給開發者的建議中列出了以有效憑證為應用程式簽署;以及它會與其他安全性軟體並行運作等內容。  2 3 4 5

  4. Microsoft Learn, Using Event Viewer with AppLocker。關於 AppLocker 事件記錄檔會記錄目標檔案的路徑、允許或封鎖、規則種類(路徑、雜湊、發行者)、規則名稱、規則所指使用者/群組的 SID;事件 8002 表示允許 exe/DLL、8003 表示在稽核模式下「若強制套用原本會被封鎖」、8004 表示在強制模式下封鎖 exe/DLL、8005~8007 表示指令碼、MSI 的允許/稽核/封鎖、8020~8025 與封裝應用程式相關、8008 表示 AppLocker 不支援的 SKU;以及「AppLocker - EXE and DLL」記錄檔可能產生非常多事件,因此蒐集組態需要留意等內容。  2 3 4 5 6 7

  5. Microsoft Learn, Understanding App Control event IDs。關於 App Control 的事件記錄在「CodeIntegrity - Operational」(exe、DLL、驅動程式的控制與原則套用)與「AppLocker - MSI and Script」(MSI、指令碼、COM 物件的控制)兩個位置;事件 3076 是稽核模式的主要封鎖事件,表示若強制套用原本會被封鎖,3077 是強制模式的主要封鎖事件;3089 是針對被封鎖或稽核封鎖的檔案,依每個簽章產生的簽章資訊事件,未簽署檔案會產生一筆簽章數為 0 的事件,並可用相關 Activity ID 與 3076/3077 等對照;3033 表示因簽章失效、過期等原因造成的封鎖;8028/8029 表示指令碼、MSI 的稽核/封鎖,實際的強制方式由指令碼主機控制,例如 PowerShell 會以受限語言模式(Constrained Language Mode)執行未被 App Control 原則允許的指令碼;8036 是 COM 物件的封鎖,8039/8040 是封裝應用程式的稽核/封鎖;以及「AppLocker - MSI and Script」的事件不包含在 Windows Server Core 版中等內容。  2 3 4 5 6 7 8 9 10

  6. Microsoft Learn, Code signing for Smart App Control。關於 Smart App Control 允許執行以 RSA 為基礎的數位憑證所簽署的應用程式,以及 Smart App Control 的簽章檢查不支援橢圓曲線密碼(ECC)簽章等內容。 

  7. Microsoft Learn, Understand App Control for Business policy rules and file rules。關於 App Control 的原則規則選項 3 為「Enabled:Audit Mode」,會記錄若原則被強制套用原本應會被封鎖的應用程式、二進位檔案、指令碼;要切換為強制模式須移除此選項;Microsoft 建議新原則應先以稽核模式驗證;規則選項的變更可使用 App Control Policy Wizard 或 Set-RuleOption Cmdlet;規則選項 8「Required:EV Signers」目前尚未受支援;以簽署者為基礎的規則只支援 RSA(最高 4096 位元),不支援 ECDSA 等 ECC 演算法,若嘗試以 ECC 簽章允許,對應的 3089 簽章資訊事件會出現 VerificationError = 23;檔案規則層級的 Publisher 是「PCA 憑證(通常是根憑證下一層)+葉憑證的 CN」的組合,FilePublisher 則是在此基礎上再加上已簽署檔案的 FileName 屬性(預設為資源標頭中的 OriginalFileName)與最低版本號等內容。  2 3 4 5

  8. CA/Browser Forum, Code Signing Baseline Requirements。關於程式碼簽章憑證的私鑰,自 2023 年 6 月 1 日起核發的憑證,不論 EV 或非 EV,都要求使用符合 FIPS 140-2 Level 2 或 Common Criteria EAL4+ 以上要求的硬體加密模組(HSM 或權杖)產生並保管金鑰對,且私鑰須處於無法匯出的狀態等內容。 

共用相同標籤的最新文章。能以相近的主題延伸理解。

與本文相近的主題頁面。以本文為起點,可進一步連到相關服務與其他文章。

本文連結到以下服務頁面,歡迎從最接近的入口查看。

常見問題

整理諮詢這個主題時常見的問題。

AppLocker 在 Pro 版是不是不能用?
這個常識已經過時了。自 KB 5024351 起,Windows 10 版本 2004 以後以及所有 Windows 11,強制套用 AppLocker 原則已不再需要特定版本。過去「透過群組原則發布的強制套用僅限 Enterprise 與 Server 版」這項限制,只適用於比版本 2004 更舊的 Windows 10,以及 Windows Server 2019 為止(即使在這些舊版本上,只要透過 MDM 發布,所有版本都能使用)。即便是以 Pro 版終端機為主的中小企業環境,現在 AppLocker 也已經是可選方案之一。
程式碼簽章憑證應該買 EV 的嗎?
就 AppLocker 或 App Control for Business 的發行者規則而言,無論是 OV(企業實在性確認)還是 EV 憑證,都能根據簽署者資訊建立規則。另外,「用 EV 的話 SmartScreen 警告從一開始就會消失」這種理解已經過時,現在即使是以 EV 簽署的檔案,也必須和 OV 一樣,以信譽需要逐步累積為前提來看待(這個議題已整理在另一篇文章「Windows SmartScreen 與程式碼簽章」中)。比起憑證的種類,更重要的是讓包含 DLL 與安裝程式在內的所有二進位檔案都以一致的主體(Subject)簽署、附加時間戳記,並在憑證更新時也維持發行者資訊的穩定。因為發行者規則正是依賴這份簽署者資訊撰寫的,若每次發行版本簽署狀態都不一致,客戶端的規則就會失效。
客戶環境中自家應用程式似乎被封鎖了,但記錄檔裡什麼都找不到。應該看哪裡?
原因大多是應該查看的記錄檔分成兩個系統。AppLocker 對 exe/DLL 的封鎖記錄在「AppLocker - EXE and DLL」記錄檔的事件 8004(稽核模式則為 8003),指令碼與 MSI 則記錄在「AppLocker - MSI and Script」記錄檔的 8007(稽核模式為 8006)。另一方面,App Control for Business(WDAC)造成的封鎖記錄在「CodeIntegrity - Operational」記錄檔的事件 3077(稽核模式為 3076),對應的簽章資訊則記錄在 3089。此外,若指令碼、MSI、COM 被 App Control 攔下,會記錄在「AppLocker - MSI and Script」記錄檔的 8029、8036、8040。在不確定是哪個機制在作用的狀態下調查時,請把 CodeIntegrity - Operational 與 AppLocker 底下的記錄依時間對照確認。
要讓自家應用程式不被 Smart App Control 封鎖,需要做什麼?
實質上就是程式碼簽章。Smart App Control 在應用程式執行時,會確認雲端安全服務對其安全性的預測,以及該應用程式是否具有有效簽章,並封鎖被判定為惡意,或是無法確認信任的未簽署應用程式。Microsoft 給開發者的建議中,也提到要用有效憑證為應用程式簽署。不過需要留意簽章演算法:Smart App Control 的簽章檢查並不支援橢圓曲線密碼(ECC)簽章,只有以 RSA 為基礎的憑證簽署的應用程式才會被允許執行。Smart App Control 並非企業管理功能,而是 Windows 11 面向個人使用者的保護機制,會從評估模式開始自動決定啟用或停用,因此就發布方而言,安全的做法是抱持「未簽署的執行檔在個人電腦上可能無法執行」這個前提來處理。

作者檔案

本文作者的個人檔案頁面。

Go Komura

小村軟體有限公司 代表

以 Windows 軟體開發、技術諮詢與故障調查為中心,在難以重現的故障調查與既有資產仍在運作的專案上具有優勢。

回到部落格一覽