)
簡介這份PDF資料聚焦微軟KB5004442安全更新面向工業(yè)自動化領(lǐng)域的OPC Classic運維人員、DCOM應(yīng)用開發(fā)者及系統(tǒng)管理員用于評估CVE-2021-26414修補后DCOM安全機制變更對OPC通信的沖擊。資源包僅含1個PDF文件約398KB內(nèi)容圍繞DCOM安全更新概述、對OPC Classic客戶端與服務(wù)器的影響、微軟分階段更新時間表、受影響Windows版本清單及緩解措施展開并給出注冊表項啟用與禁用方法、CoInitializeSecurity函數(shù)身份驗證級別調(diào)整要點以及2022年6月14日默認啟用、2023年3月14日后無法禁用等關(guān)鍵節(jié)點。讀者可據(jù)此判斷現(xiàn)有OPC Classic應(yīng)用是否需升級掌握測試與臨時規(guī)避思路并了解遷移至OPC UA或OPC Tunneller等替代方案。目前已有460人學(xué)習(xí)下載適合需要快速排查DCOM安全更新兼容性問題的技術(shù)人員參考。1. OPC 連不上服務(wù)器KB5004442 之后 DCOM 拒絕激活的典型現(xiàn)場如果你在 2022 年 6 月之后突然發(fā)現(xiàn) OPC Classic 客戶端連不上遠程服務(wù)器事件日志里冒出 10036、10037、10038 這類 DCOM 錯誤大概率不是網(wǎng)絡(luò)斷了也不是 OPC 服務(wù)掛了而是 Windows 的 DCOM 安全強化更新 KB5004442 在起作用。這個補丁對應(yīng) CVE-2021-26414微軟從 2021 年 6 月就開始推送但默認禁用新策略給了將近兩年的緩沖期。很多人當時測試沒問題就忘了這回事結(jié)果 2023 年 3 月 14 日一過注冊表開關(guān)徹底失效OPC Classic 的遠程連接直接翻車。這類故障折騰人的地方在于網(wǎng)絡(luò) ping 得通、DCOMCNFG 里權(quán)限看著也對、服務(wù)也在跑但客戶端就是報“拒絕訪問”或“服務(wù)器不可用”。下面按報錯現(xiàn)象、根因定位、可執(zhí)行修復(fù)、避坑記錄、快速排查的順序把這條鏈路拆開講清楚。2. 報錯 10036/10037/10038先分清是客戶端還是服務(wù)器在拒絕2.1 三個事件 ID 分別代表什么KB5004442 啟用后系統(tǒng)會在事件日志里記錄 DCOM 激活失敗的具體原因。這三個 ID 是最直接的線索事件 ID記錄位置含義10036服務(wù)器端系統(tǒng)日志服務(wù)器端身份驗證級別策略不允許該用戶從某 IP 激活 DCOM 服務(wù)器10037客戶端系統(tǒng)日志應(yīng)用程序顯式設(shè)置了低于數(shù)據(jù)包完整性的身份驗證級別10038客戶端系統(tǒng)日志應(yīng)用程序使用默認激活身份驗證級別但低于數(shù)據(jù)包完整性要求10036 出現(xiàn)在服務(wù)器上說明請求已經(jīng)到達服務(wù)器但被服務(wù)器的 DCOM 安全策略擋了。10037 和 10038 出現(xiàn)在客戶端上區(qū)別在于10037 是應(yīng)用程序自己調(diào)用了CoInitializeSecurity并顯式設(shè)了一個低級別10038 是應(yīng)用程序根本沒調(diào)走了系統(tǒng)默認設(shè)置而默認值不夠。2.2 用 PowerShell 快速拉出相關(guān)事件不要手動在事件查看器里翻直接跑命令過濾# 在服務(wù)器端查 10036在客戶端查 10037/10038 Get-WinEvent -FilterHashtable {LogNameSystem; Id10036,10037,10038} -MaxEvents 50 | Select-Object TimeCreated, Id, MachineName, Message | Format-List這條命令把三個事件 ID 一起拉出來MachineName能幫你確認是哪臺機器記錄的。如果只在服務(wù)器上看到 10036客戶端沒有 10037/10038說明客戶端可能根本沒走到激活階段先查網(wǎng)絡(luò)和 RPC 端口。如果客戶端有 10037重點看消息里的%5字段——那是應(yīng)用程序設(shè)置的身份驗證級別值5 才是RPC_C_AUTHN_LEVEL_PKT_INTEGRITY小于 5 就會被拒。2.3 確認注冊表開關(guān)的當前狀態(tài)KB5004442 的行為由一個注冊表值控制# 路徑HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Ole\AppCompat # 值名稱RequireIntegrityActivationAuthenticationLevel # 類型REG_DWORD # 數(shù)據(jù)0x00000000 禁用0x00000001 啟用用 reg query 查reg query HKLM\SOFTWARE\Microsoft\Ole\AppCompat /v RequireIntegrityActivationAuthenticationLevel如果返回“找不到指定的注冊表項或值”說明該值未定義系統(tǒng)按默認處理。在 2022 年 6 月 14 日到 2023 年 3 月 14 日之間未定義等于禁用2023 年 3 月 14 日之后未定義等于強制啟用且無法通過設(shè) 0 來關(guān)閉。這一點是很多人的誤區(qū)以為沒設(shè)過就沒事實際上時間一到自動生效。注意修改這個注冊表值后必須重啟設(shè)備才生效不是重啟服務(wù)就行。3. 修復(fù) OPC 連接失敗從注冊表緩解到代碼級改造3.1 臨時緩解在允許的時間窗口內(nèi)禁用安全功能如果你還在 2023 年 3 月 14 日之前或者系統(tǒng)尚未安裝強制啟用的補丁可以用注冊表臨時關(guān)掉# 以管理員身份運行 reg add HKLM\SOFTWARE\Microsoft\Ole\AppCompat /v RequireIntegrityActivationAuthenticationLevel /t REG_DWORD /d 0x00000000 /f # 重啟設(shè)備 shutdown /r /t 0/d 0x00000000表示禁用/f強制覆蓋已有值。執(zhí)行完必須重啟否則 DCOM 運行時不會重新讀取這個配置。這個操作只是緩兵之計2023 年 3 月 14 日之后同樣的命令會被系統(tǒng)忽略設(shè)了也沒用。3.2 服務(wù)器端把默認身份驗證級別提到數(shù)據(jù)包完整性服務(wù)器端的問題通常出在 DCOMCNFG 的默認設(shè)置上。手動改的路徑是組件服務(wù) → 計算機 → 我的電腦 → 右鍵屬性 → 默認屬性 → 默認身份驗證級別改為“數(shù)據(jù)包完整性”。對應(yīng)的注冊表位置在# 默認身份驗證級別 reg add HKLM\SOFTWARE\Microsoft\Ole /v LegacyAuthenticationLevel /t REG_DWORD /d 0x00000005 /f0x00000005對應(yīng)RPC_C_AUTHN_LEVEL_PKT_INTEGRITY。改完后同樣需要重啟。如果服務(wù)器上有多個 OPC Server 對象每個對象的自定義 DCOM 權(quán)限也要單獨檢查確保沒有覆蓋成更低級別。3.3 客戶端CoInitializeSecurity 調(diào)用與不調(diào)用的區(qū)別客戶端分兩種情況。如果 OPC Classic 客戶端代碼里調(diào)用了CoInitializeSecurity需要把身份驗證級別參數(shù)改成RPC_C_AUTHN_LEVEL_PKT_INTEGRITY// C 示例顯式設(shè)置數(shù)據(jù)包完整性 CoInitializeSecurity( NULL, // 安全描述符 -1, // 認證服務(wù)數(shù)量 NULL, // 認證服務(wù)列表 NULL, // 保留參數(shù) RPC_C_AUTHN_LEVEL_PKT_INTEGRITY, // 關(guān)鍵身份驗證級別 RPC_C_IMP_LEVEL_IMPERSONATE, // 模擬級別 NULL, // 認證列表 EOAC_NONE, // 能力標志 NULL // 保留參數(shù) );RPC_C_AUTHN_LEVEL_PKT_INTEGRITY的值是 5它要求每個數(shù)據(jù)包都驗證完整性而不是只在連接建立時驗證一次。如果客戶端不調(diào)用這個函數(shù)系統(tǒng)會用默認 DCOM 設(shè)置代替只要默認設(shè)置已經(jīng)改成數(shù)據(jù)包完整性就不會受影響。所以排查時先確認客戶端到底調(diào)沒調(diào)再決定是改代碼還是改系統(tǒng)默認值。3.4 長期方案OPC Tunneller 或遷移到 OPC UA如果供應(yīng)商短期內(nèi)給不出支持數(shù)據(jù)包完整性的新版本可以考慮用 OPC Tunneller 把 DCOM 通信封裝成普通 TCP 隧道繞過 DCOM 安全策略。更徹底的方案是遷移到 OPC UA它原生支持證書和消息安全不依賴 Windows DCOM。遷移成本不低但對于 2023 年 3 月 14 日之后還在用舊版 OPC Classic 的系統(tǒng)這幾乎是唯一能徹底擺脫時間壓力的路徑。4. 避坑記錄KB5004442 排查中最容易踩的五個坑4.1 坑一以為沒設(shè)注冊表就不會啟用現(xiàn)象系統(tǒng)從未手動配置過RequireIntegrityActivationAuthenticationLevel但 2023 年 3 月 14 日之后 OPC 突然斷了。原因該值未定義時2023 年 3 月 14 日之后系統(tǒng)按強制啟用來處理不是按禁用。解決不要依賴“沒設(shè)過”這個狀態(tài)提前用reg query確認實際生效值并在測試環(huán)境驗證。4.2 坑二改了注冊表但沒重啟現(xiàn)象注冊表值已經(jīng)改成 0OPC 還是連不上。原因DCOM 運行時在系統(tǒng)啟動時讀取該配置不重啟不會重新加載。解決改完必須shutdown /r /t 0不能只重啟 OPC 服務(wù)或 DCOM Server Process Launcher。4.3 坑三只改客戶端或只改服務(wù)器現(xiàn)象客戶端事件日志里 10037 消失了但服務(wù)器端 10036 還在報。原因DCOM 激活需要兩端都滿足最低身份驗證級別只改一端不夠。解決客戶端和服務(wù)器同時檢查客戶端看CoInitializeSecurity或默認級別服務(wù)器看 DCOMCNFG 默認屬性和每個 OPC Server 對象的自定義權(quán)限。4.4 坑四把 10036 當成網(wǎng)絡(luò)故障去查現(xiàn)象看到“拒絕激活”就去查防火墻、RPC 端口、DNS。原因10036 是安全策略拒絕不是網(wǎng)絡(luò)不通。網(wǎng)絡(luò)層能通但 DCOM 安全層不放行。解決先看事件消息里的身份驗證級別值小于 5 就直接往安全配置方向查不要浪費時間在網(wǎng)絡(luò)上。4.5 坑五在 2023 年 3 月 14 日之后還試圖用注冊表禁用現(xiàn)象執(zhí)行reg add ... /d 0x00000000后重啟OPC 依然連不上。原因該日期之后安全功能強制啟用注冊表禁用開關(guān)失效。解決只能從供應(yīng)商獲取支持數(shù)據(jù)包完整性的更新版本或者轉(zhuǎn)向 OPC Tunneller / OPC UA。5. 快速定位這類問題的排查順序與驗證方法遇到 OPC Classic 連接失敗不要一上來就重啟服務(wù)或重裝軟件。我一般按下面這個順序走基本能在十分鐘內(nèi)判斷問題出在哪一層。第一步確認時間線和補丁狀態(tài)。查系統(tǒng)是否安裝了 KB5004442 相關(guān)更新以及當前日期是否已過 2023 年 3 月 14 日。這一步?jīng)Q定了后面所有操作的方向。第二步拉事件日志。服務(wù)器端查 10036客戶端查 10037 和 10038。三個 ID 的組合能直接告訴你是客戶端設(shè)低了10037、客戶端沒設(shè)而默認低了10038還是服務(wù)器端策略拒絕10036。第三步查注冊表實際生效值。不要只看有沒有手動設(shè)過用reg query看返回值。未定義、0、1 三種狀態(tài)對應(yīng)不同的行為階段。第四步檢查 DCOMCNFG 默認身份驗證級別和 OPC Server 對象的自定義權(quán)限。默認級別必須是數(shù)據(jù)包完整性自定義權(quán)限不能覆蓋成更低。第五步確認客戶端是否調(diào)用CoInitializeSecurity。調(diào)用了就查代碼里的級別參數(shù)沒調(diào)用就查系統(tǒng)默認值是否已改對。第六步如果以上都正確但依然失敗用 OPC Tunneller 做隔離測試確認是否還有 DCOM 之外的依賴問題。驗證方法上最直接的是在非生產(chǎn)環(huán)境把注冊表設(shè)為 1 強制啟用然后跑一遍全鏈路連接測試。如果啟用后連接失敗、禁用后恢復(fù)說明問題確實在 DCOM 安全強化上。這個測試要在 2023 年 3 月 14 日之前做之后就沒有禁用這個選項了。從那以后我每次給 OPC Classic 系統(tǒng)做升級或遷移都會先把 KB5004442 的時間表和注冊表狀態(tài)查一遍再檢查客戶端和服務(wù)器的身份驗證級別最后才動網(wǎng)絡(luò)和防火墻。這個順序幫我省了很多來回折騰的時間。希望幫到你。本文還有配套的精品資源點擊獲取