Security與原Modbus TCP分層
Modbus/TCP Security把原本的mbap ADU放進TLS通道,官方規格稱mbap/TLS/TCP並指定系統埠802;傳統Modbus/TCP仍使用502。TLS提供機密性、完整性、端點憑證認證與防重播能力,但前提是client與server都實作並配置mbaps。
| 項目 | 802 Modbus Security | 502原Modbus TCP |
|---|---|---|
| 傳輸 | TLS包覆mbap | 明文mbap/TCP |
| 身分 | x.509互認 | 非Security規格 |
| 角色 | 產品特定授權 | 不可由502推論 |
| 設備能力 | 須明示支援 | 舊設備常見 |
VPN包覆舊設備只是在網路邊界提供另一層通道保護,舊設備仍只會說原生Modbus TCP/502。不能因為路由器建立VPN就宣稱設備支援Modbus Security或擁有802服務;採購要分開記錄設備能力、閘道能力和安全架構。
安全導入先做能力盤點:讀取產品資料表是否明示Modbus Security、是否提供802 listener、TLS版本、互相憑證、角色授權與憑證撤換。若只寫支援Modbus TCP,不足以推論支援802。網路圖要把舊502、TLS802、VPN閘道和防火牆規則畫成不同元件。
任何正式切換都需依變更程序審核。
憑證與角色
規格描述x.509v3憑證、互相TLS認證及憑證中的角色資訊;授權規則仍由產品或客戶配置。先盤點信任根、server憑證、client憑證、私鑰保護、有效期、撤銷策略與角色到權限的映射,不自行猜命令、檔案路徑或PLC API。
具體流程是先在測試環境建立不含現場私鑰的憑證清單,核對issuer、subject、SAN、有效期與角色OID,再以產品明示的管理介面載入。任何不支援角色授權的產品都只能依其官方能力描述,不能把憑證CN當成通用權限。
憑證資料表至少保存序號、指紋、issuer、subject、SAN、Not Before、Not After、信任根版本、角色與部署位置。私鑰不可放入教學範例或版本庫;本文不提供假造的openssl命令或廠商管理API,因為不同設備的載入和重啟語意並不相同。
服務切換要分開驗證:先確認802 TLS連線與憑證互認,再送一筆只讀請求;接著以有效但無寫入角色的client測試授權拒絕;最後以過期、錯CA憑證測試新握手拒絕,再用與設定目標名稱不符的server SAN驗證身分拒絕。每一項都保存伺服器日誌、client錯誤、連線埠和憑證指紋。
更新與拒絕測試
憑證更新不能只換server檔案。規劃重疊有效期、先載入新信任根、再更新server或client、建立新TLS連線、執行讀取驗證,最後撤除舊憑證。每一步保留版本、操作者、時間和回復方式,避免現場同時失去雙向信任。
| 測試 | 輸入 | 預期 |
|---|---|---|
| 過期 | client過期憑證 | 握手拒絕 |
| 錯CA | 未信任簽發者 | 握手拒絕 |
| server身分不符 | 有效鏈但SAN不符客戶端預期名稱 | 身分驗證失敗,按產品名稱核對規則測試 |
| 錯角色 | 有效憑證但無寫權 | 授權拒絕 |
| 禁止自動降級 | 隔離測試中讓802不可用 | 客戶端報錯,不自動另連明文502 |
測試表要包含過期憑證、未來生效憑證、錯誤簽發CA、SAN/身分不符、私鑰不匹配、撤銷或不被產品支援的角色。預期結果是TLS握手拒絕或應用授權拒絕,且原有安全服務不悄悄降級到502。
自訂更新演練以切換日T為基準:T-14盤點與簽發;若更換CA,T-7先讓雙方加入必要的新信任鏈;T-3更新client;T-2更新server;每一步都以新的完整TLS握手立即驗證,不能等到T-1才測。確認所有合法端點已移轉且保留可控復原方法後,T才撤除舊信任。若只是同CA續期,不必無故更換信任根。日期是排程例子,須符合實際有效期與維護時間。
VPN架構仍可能有價值,例如保護不支援Security的舊設備與管理網路,但它的安全邊界是VPN端點而不是Modbus設備本身。若文件要求設備原生Security,就必須採用明示支援802、TLS和憑證角色的產品或閘道,不能以網路拓撲文字替代。
案例與運維限制
案例一:測試server仍開802,client先用即將到期憑證建立連線並完成一次讀取;換上過期client憑證後重新連線,預期握手被拒,不能用既有TCP連線繼續推論更新成功。恢復時載入已驗證的新憑證並重新建立TLS。
案例二:client憑證有效但角色只允許讀取,送出寫入請求時,TLS通道仍可存在,但產品授權層應依角色和功能碼拒絕;這不是憑證過期,也不是把所有錯誤都歸為TLS。官方規格說角色到權限的演算法是產品特定。依此規範角色授權拒絕使用Modbus例外01,但相同例外也可有功能不支援等原因,要用授權日誌區分。
拒絕測試應驗證沒有降級:把過期client送到802,記錄握手失敗;再嘗試502,若舊設備仍可通,這只是另一個未受TLS保護的服務,不能把測試報告寫成Security通過。應由網路政策決定是否封鎖502。
發生憑證失敗時先分辨時鐘錯誤、信任根錯誤、身分名稱不符、私鑰不配對、角色不允許和服務未監聽802。不要刪除驗證或退回502來追求連線成功;修復後重新建立TLS並從最小權限讀取測試開始。
運維交接時要說明信任根更新與時鐘同步責任。TLS憑證依賴有效時間,若控制器RTC錯誤,尚未到期的憑證也可能被判無效。部署前用受控時間測試,恢復正常時鐘後再進行正式連線。伺服器和client的日誌要能對應同一個握手與交易,否則難以判斷是網路、防火牆、TLS或角色授權造成拒絕。
憑證更新測試要確認確實做了完整握手。既有TLS連線或session resumption可能沿用先前認證狀態,單純重開應用畫面不足以證明新憑證已生效;依產品管理方式結束舊會話,保存本次使用的憑證指紋與握手日誌。不得只改系統時鐘測試而影響其他生產服務。
驗收 FAQ與限制
驗收先確認802與502的服務分流,再確認TLS版本、雙向憑證、身分驗證、角色授權、過期拒絕與日誌。每次測試記錄連線埠、憑證指紋、握手結果、授權結果和是否有降級路徑;不做實際服務變更時,只在隔離測試環境用產品文件定義的步驟演練。
FAQ1:VPN能把502變成802嗎?不能,VPN與設備原生協定不同。FAQ2:憑證CN就是角色嗎?不能,角色需依規格和產品明示的憑證擴充與授權規則。FAQ3:TLS握手成功就能寫入嗎?不一定,還要通過每次請求的產品授權。FAQ4:更新憑證只重啟client即可嗎?依產品流程,可能需雙方信任根與server/client同步更新。本文不提供可直接執行的憑證命令或PLC API。
參考:Modbus/TCP Security Protocol Specification
參考:Modbus specifications index
角色授權不是單純TLS握手結果。規格指出伺服器可從x.509憑證擴充取得client角色,再用產品特定的roles-to-rights規則判斷每次請求。
正式交付還要列出802與502是否同時存在、誰可存取、防火牆規則、憑證到期通知、撤銷與回復程序。任何未由產品文件證明的角色名稱、憑證命令、PLC函式或降級行為都應列為待確認,不可寫成已支援。
測試表中的拒絕結果應保留原始錯誤類別與時間戳,並確認沒有意外建立未加密替代連線。安全驗收的完成條件是可解釋地允許合法請求,也可穩定拒絕過期、錯身分和未授權請求。
本篇沒有指定Q系列CPU、通訊模組或TLS閘道型號。能使用一般Modbus TCP不構成Security能力證據;所有允許與拒絕結果是待執行的驗收條件,並非本篇已操作設備得到的結果。