OPC DA chạy được trên một máy nhưng lỗi khi client và server nằm ở hai máy, hoặc tự dưng mất kết nối sau đợt cập nhật Windows: nguyên nhân thường nằm ở xác thực DCOM. Từ bản cập nhật ngày 14/03/2023 của Microsoft, Windows bật vĩnh viễn cơ chế gia cố bảo mật DCOM (DCOM hardening): lệnh kích hoạt (activation) giữa hai máy phải dùng mức xác thực tối thiểu là Packet Integrity, phần mềm OPC nào xin mức thấp hơn sẽ bị từ chối. Trước mắt, cần phần mềm bản mới và tài khoản đúng ở cả hai đầu; về lâu dài, nên bỏ hẳn DCOM khỏi mạng nhà máy.
Vì sao OPC Classic phụ thuộc vào DCOM
OPC Foundation gọi chung OPC Data Access (DA), Alarms & Events (A&E) và Historical Data Access (HDA) là OPC Classic, xây trên công nghệ COM của Microsoft. Client và server cùng một máy thì nói chuyện qua COM cục bộ. Khi nằm ở hai máy khác nhau, cùng các lời gọi đó đi qua DCOM, mà Microsoft mô tả là giao thức đưa đối tượng của ứng dụng ra mạng bằng lời gọi thủ tục từ xa (remote procedure call, RPC).
- Chỉ có trên Windows. Inductive Automation ghi rõ kết nối OPC COM của Ignition chỉ có trên gateway chạy Windows; hệ điều hành khác phải dùng OPC UA.
- Lưu lượng đi cả hai chiều. Cũng trang đó giải thích OPC server gọi ngược (callback) về client để trả dữ liệu. Client có thể kết nối được mà tag vẫn báo chất lượng xấu (bad quality) nếu chiều gọi ngược bị chặn.
- Cổng RPC. Client RPC hỏi bộ ánh xạ điểm cuối (endpoint mapper) ở TCP 135 xem dịch vụ được cấp cổng động nào. Microsoft ghi dải cổng động mặc định từ Windows Vista và Server 2008 trở đi là 49152–65535, và ghi DCOM dùng một cổng ngẫu nhiên trong dải này.
Một trong các lý do OPC Foundation đưa ra khi xây dựng OPC UA là Microsoft đã giảm ưu tiên COM và DCOM để chuyển sang kiến trúc hướng dịch vụ (SOA) đa nền tảng. OPC Foundation cũng mô tả OPC UA là dễ đi qua tường lửa (firewall-friendly).
Microsoft đã thay đổi gì: KB5004442
Bài hỗ trợ KB5004442 của Microsoft mô tả việc gia cố DCOM để xử lý lỗ hổng CVE-2021-26414. Khi bật, DCOM server đòi lệnh kích hoạt phải ở mức xác thực RPC_C_AUTHN_LEVEL_PKT_INTEGRITY (mức 5, trong công cụ cấu hình hiện là Packet Integrity) trở lên. Thay đổi đi qua ba giai đoạn:
| Bản cập nhật | Giai đoạn | Cách hoạt động |
|---|---|---|
| 08/06/2021 | Giai đoạn 1 | Mặc định tắt; bật được bằng một giá trị registry |
| 14/06/2022 | Giai đoạn 2 | Mặc định bật; vẫn tắt được bằng giá trị registry |
| 14/03/2023 | Giai đoạn 3 | Luôn bật, không còn cách tắt |
Giá trị registry đó là RequireIntegrityActivationAuthenticationLevel trong HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Ole\AppCompat. Microsoft chỉ mô tả nó cho các giai đoạn còn bật tắt được; giai đoạn 3 bỏ hẳn khả năng tắt. Các hướng dẫn cũ dùng giá trị này để tắt việc gia cố không còn tác dụng trên máy đã cập nhật đầy đủ.
Cũng trang đó còn hai điểm:
- Client tự nâng mức (auto-elevation). Các bản cập nhật từ tháng 11/2022 đến tháng 01/2023 tự nâng các yêu cầu kích hoạt không ẩn danh (non-anonymous) từ DCOM client của Windows lên Packet Integrity, nên đa số client trên Windows chạy được mà không phải sửa, khi cả hai đầu đã có bản cập nhật tích lũy tháng 01/2023.
- Kích hoạt ẩn danh (anonymous) nằm ngoài phạm vi gia cố. DCOM server nào cho phép kích hoạt ẩn danh thì vẫn cho phép. Đây không phải cách sửa: trên diễn đàn OPC Foundation, quản trị viên cảnh báo DA server chạy không bảo mật sẽ phơi ra cho kẻ tấn công trong mạng.
Phía mã nguồn được giải thích trong bài diễn đàn đó và trong tài liệu (white paper) năm 2022 của Matrikon. OPC client nào tự gọi CoInitializeSecurity, hoặc tự đặt mức xác thực khi tạo đối tượng server, thì phải tự xin Packet Integrity, vì thiết lập riêng của nó đè lên mặc định của Windows. Nếu không, chỉ có bản phần mềm mới của hãng mới giải quyết được; Matrikon ghi rằng chỉnh thiết lập Windows thôi thì không lách được. Cả hai tài liệu này đều viết năm 2022, trước các bản cập nhật tự nâng mức. Nếu trên máy client đã cập nhật đầy đủ mà sự kiện 10037 hoặc 10038 vẫn ghi tên ứng dụng, thì chính nội dung sự kiện của Microsoft cũng bảo liên hệ hãng làm ra ứng dụng đó.
Triệu chứng và ý nghĩa
Microsoft bổ sung các sự kiện lỗi DCOM vào nhật ký System để tìm ra ứng dụng không tương thích. Các sự kiện này chỉ có trên những phiên bản Windows và bản cập nhật liệt kê trong KB5004442, ví dụ từ bản cập nhật tháng 08/2021 cho Windows Server 2019 và tháng 10/2021 cho Windows Server 2012 R2.
| Triệu chứng | Xuất hiện ở đâu | Chỉ ra điều gì |
|---|---|---|
| Sự kiện 10036 | Nhật ký System, máy server | Một user từ một địa chỉ IP bị từ chối vì mức kích hoạt thấp hơn Packet Integrity |
| Sự kiện 10037 | Nhật ký System, máy client | Ứng dụng có tên trong sự kiện tự đặt mức xác thực, và đặt quá thấp; Microsoft khuyên liên hệ hãng |
| Sự kiện 10038 | Nhật ký System, máy client | Ứng dụng dùng mức mặc định, mức này quá thấp; cũng liên hệ hãng |
| 0x80070005 | OPC client | E_ACCESSDENIED: tài khoản, quyền hoặc mức xác thực |
| 0x800706BA | OPC client | Lỗi Windows 1722, RPC server không sẵn sàng: không có đường RPC (mạng, tường lửa, phân giải tên) |
| Kết nối được, rồi bad quality | OPC client | Chiều gọi ngược từ server về client bị hỏng (Inductive Automation) |
| E_CLASSNOTREG, hoặc không thấy server ở máy kia | OPC client | Thiếu OPC Core Components, gồm cả OPC Server Enumerator (OPCEnum), trên một trong hai máy (Inductive Automation) |
Hai mã lỗi lấy từ bảng của Microsoft: 0x80070005 là E_ACCESSDENIED trong danh sách lỗi COM, còn HRESULT_FROM_WIN32 đưa mã lỗi Windows vào dải 0x8007xxxx, nên lỗi 1722 (hệ 16 là 6BA) thành 0x800706BA.
Kiểm tra theo thứ tự
- Xác nhận có DCOM tham gia. Matrikon và Softing đều ghi giao tiếp OPC Classic trên cùng một máy không bị ảnh hưởng. Kết nối cục bộ mà lỗi thì nguyên nhân nằm ngoài việc gia cố.
- Cập nhật đủ cho cả hai máy. Microsoft khuyên cài bản cập nhật bảo mật mới nhất. Trợ giúp của Rockwell cảnh báo máy đã vá và máy chưa vá không giao tiếp ổn định với nhau, vì hai đầu cần cùng một mức xác thực.
- Đọc nhật ký System ở cả hai đầu. Sự kiện 10036 trên server cho biết user và IP của client; 10037 hoặc 10038 trên client cho biết tên ứng dụng.
- Kiểm tra phần mềm OPC có hỗ trợ Packet Integrity. Trợ giúp của Rockwell ghi mức xác thực DCOM tối thiểu mà sản phẩm Rockwell dùng đã được nâng lên Packet Integrity, và dẫn sang thông báo PN1581 để xem các sản phẩm bị ảnh hưởng. Thông báo tháng 02/2023 của Softing liệt kê các sản phẩm mà hãng khuyến nghị mạnh dùng tunnel thay cho DCOM, trong đó có dataFEED OPC Suite 5.19 trở về trước, và ghi hãng không hỗ trợ sự cố kết nối OPC Classic từ xa. Trợ giúp Desigo CC của Siemens ghi mọi thành phần OPC trên đường truyền đều phải hỗ trợ việc gia cố. Hỏi từng hãng xem cần bản nào.
- Kiểm tra mức xác thực đặt ở đâu. Quy trình thử của Matrikon đặt mức mặc định, và mức của từng OPC server trong DCOM Config, về Packet Integrity; Softing ghi Packet Integrity hoặc Packet Privacy. Phần mềm FactoryTalk và RSLinx Classic thì khác: chúng có thiết lập DCOMAuthLevel riêng (là 5 sau khi nâng cấp phần mềm Rockwell) và không dùng thiết lập trong Component Services. Trợ giúp của Rockwell cũng nêu các tùy chọn tương thích ngược cho hệ lẫn máy cũ, tức là gỡ bản vá của Microsoft hoặc hạ mức xác thực, đồng thời ghi rằng mức dưới 5 không được hỗ trợ khi đã cài bản vá. Cập nhật cả hai đầu mới là cách giữ được lớp bảo vệ.
- Kiểm tra tài khoản. Trợ giúp của Rockwell ghi: trong workgroup, mỗi user phải có trên mọi máy tham gia kết nối với cùng tên và cùng mật khẩu, mật khẩu trống thường không dùng được; trong domain thì dùng tài khoản domain. Cấp quyền khởi chạy (launch), kích hoạt (activation) và truy cập (access) của DCOM cho đúng các tài khoản chạy OPC client và server, không cho ai khác.
- Kiểm tra OPC Core Components. Inductive Automation yêu cầu cài ở cả hai máy khi kết nối từ xa, mỗi máy dùng gói 32 bit hoặc 64 bit phù hợp với máy đó.
- Kiểm tra tường lửa cả hai chiều. TCP 135 và dải cổng động phải mở giữa hai máy, kể cả chiều gọi ngược về client, và chỉ giữa hai máy đó. Bài về tường lửa giải thích vì sao không nên thu hẹp dải cổng động quá mức.
Một số hướng dẫn cũ của các hãng gợi ý cấp toàn quyền cho Everyone và ANONYMOUS, hoặc đặt mức xác thực mặc định là None. Làm vậy là bỏ xác thực: việc gia cố không áp dụng cho kích hoạt ẩn danh, nên server mở cho bất kỳ ai tới được nó qua mạng. Chỉ cấp quyền DCOM cho đúng các tài khoản cần dùng. Nếu client cũ không đạt được Packet Integrity, hãy lên kế hoạch theo một trong các hướng dưới đây.
Hướng lâu dài: đưa DCOM ra khỏi mạng
| Hướng | DCOM trên mạng | Thay đổi gì | Ví dụ trong tài liệu hãng |
|---|---|---|---|
| Client và server chung một máy | Không, chỉ COM cục bộ | Cài OPC server lên máy SCADA hoặc historian | Giao tiếp cục bộ không bị ảnh hưởng (Matrikon, Softing) |
| Tunnel hoặc bộ bọc (wrapper) OPC UA | Không; COM chỉ chạy cục bộ | Phần mềm tunnel hoặc gateway trên các máy | Matrikon OPC UA Tunneller, Softing dataFEED OPC Tunnel, Ignition OPC COM Tunneller |
| OPC UA gốc | Không | Client và server đều dùng OPC UA | OPC UA server trong SCADA, historian, bộ driver hoặc bộ điều khiển |
Chung một máy. Nếu cài được OPC DA server lên chính máy SCADA hoặc historian thì đường DCOM biến mất; khi đó máy này cần đường riêng tới bộ điều khiển.
Tunnel hoặc wrapper. Bài trên diễn đàn OPC Foundation gợi ý dùng proxy hoặc wrapper chạy COM cục bộ và OPC UA trên mạng. UA Tunneller của Matrikon kết nối cục bộ với OPC Classic client và server, giữa các thành phần của nó dùng TCP/IP, không phải sửa ứng dụng đang có. Softing khuyên dùng dataFEED OPC Tunnel thay cho DCOM khi kết nối từ xa. OPC COM Tunneller của Ignition đưa các kết nối COM cục bộ ra ngoài qua OPC UA server của Ignition. Hướng dẫn Kepware của PTC cho thấy một cách tương tự: driver OPC UA Client trên một máy đọc Kepware server ở máy khác, còn OPC DA client đọc bản Kepware cục bộ.
OPC UA gốc. OPC UA ra đời năm 2008, chạy trên Windows, Linux và các hệ khác, từ máy tính, máy chủ đám mây tới PLC và vi điều khiển. Phần bảo mật gồm chứng chỉ ứng dụng X.509, ký thông điệp, mã hóa, xác thực người dùng và ghi vết (auditing). Phần 6 của bộ OPC UA lấy cổng opc.tcp 4840 làm địa chỉ cố định (well-known address) của Local Discovery Server; cổng endpoint của từng server do sản phẩm cấu hình. Hướng dẫn của PTC bảo ghi lại cổng đó để mở trên tường lửa, và endpoint mặc định chỉ nhận kết nối có ký và mã hóa. Nên giữ nguyên như vậy: hướng dẫn cũng ghi khi chọn chính sách None thì chứng chỉ không được kiểm tra.
OPC UA nằm thế nào trong zone và conduit thì xem bài về IEC 62443, còn các lớp mà nó nối thì xem SCADA là gì.
Áp dụng trong dự án
- Liệt kê mọi kết nối OPC Classic: máy client, máy server, phiên bản phần mềm hai đầu, là DA, A&E hay HDA, và có đi qua hai máy không. Historian có thể đọc qua giao diện OPC DA, như bài về historian mô tả.
- Hỏi hãng bản hỗ trợ Packet Integrity cho từng client và server, và thử trên máy đã vá trước khi nhà máy cài cập nhật.
- Ưu tiên OPC UA cho kết nối mới và thay dần các kết nối DCOM giữa hai máy trong các đợt nâng cấp.
- Không hạ bảo mật để chữa cháy: không tài khoản dùng chung quyền rộng, không truy cập ẩn danh, không đặt mức xác thực None, và rule tường lửa chỉ cho đúng các máy liên quan.
Trang kết nối thiết bị hiện hữu lên SCADA của TDL mô tả việc đưa thiết bị BACnet/IP lên SCADA qua gateway và KEPServerEX, còn trang SCADA và historian mô tả việc lấy dữ liệu historian từ PLC và hệ thống bên thứ ba qua OPC UA, Kepware và Modbus. Nếu phần bị lỗi là máy trạm FactoryTalk View SE, xem máy trạm FactoryTalk View SE không kết nối.
Câu hỏi thường gặp
Vì sao OPC DA giữa hai máy tính ngừng chạy sau khi cập nhật Windows?
Từ bản cập nhật ngày 14/03/2023, Windows bật vĩnh viễn việc gia cố DCOM và chỉ chấp nhận kích hoạt từ xa ở mức Packet Integrity trở lên. Phần mềm OPC tự xin mức thấp hơn trong mã của nó, hoặc hệ có máy đã vá lẫn máy chưa vá, sẽ lỗi, thường báo truy cập bị từ chối (access denied).
Còn tắt được việc gia cố DCOM bằng khóa registry không?
Không. Microsoft chỉ mô tả giá trị RequireIntegrityActivationAuthenticationLevel cho các giai đoạn còn bật tắt được, và giai đoạn tháng 03/2023 đã bỏ khả năng tắt. Cách sửa là phần mềm OPC hỗ trợ Packet Integrity, hoặc một đường truyền không dùng DCOM giữa hai máy.
Sự kiện DCOM 10036, 10037 và 10038 nghĩa là gì?
Đó là các sự kiện trong nhật ký System mà Microsoft thêm vào để tìm ứng dụng kích hoạt DCOM dưới mức Packet Integrity. Sự kiện 10036 xuất hiện trên máy server, ghi user và IP của client; 10037 và 10038 xuất hiện trên máy client, ghi tên ứng dụng, tương ứng với mức xác thực tự đặt hoặc mức mặc định.
Việc gia cố DCOM có ảnh hưởng OPC UA hay OPC DA chạy trên cùng một máy không?
Matrikon ghi rằng giao tiếp OPC Classic cục bộ và OPC UA không bị ảnh hưởng, Softing cũng ghi như vậy cho client và server cùng một máy. Việc gia cố chỉ liên quan tới DCOM giữa các máy.
OPC DA qua DCOM cần mở những cổng nào trên tường lửa?
TCP 135 cho endpoint mapper của RPC và dải cổng động, mặc định 49152–65535 từ Windows Vista và Server 2008 trở đi, theo cả hai chiều vì server gọi ngược về client. Chỉ mở giữa các máy liên quan.
Nguồn
- Microsoft, KB5004442: Manage changes for Windows DCOM Server Security Feature Bypass (CVE-2021-26414)
- Microsoft, Service overview and network port requirements for Windows
- Microsoft, The default dynamic port range for TCP/IP has changed in Windows Vista and in Windows Server 2008
- Microsoft, COM Error Codes (Generic)
- Microsoft, System Error Codes (1700-3999)
- Microsoft, HRESULT_FROM_WIN32 macro
- OPC Foundation, Classic
- OPC Foundation, Unified Architecture
- OPC Foundation, OPC 10000-6 Mappings, 7.6 Well known addresses
- Diễn đàn OPC Foundation, Microsoft DCOM update, 02/2022 và 06/2022
- Matrikon, 2022 Microsoft Windows DCOM Security Update: Impact and Path Forward, 02/2022
- Rockwell Automation, DCOM security, trợ giúp FactoryTalk Services Platform 6.60
- Softing, Information About OPC Classic Communication in Connection with Microsoft DCOM Security Patch KB5004442 (CVE-2021-26414), 02/2023
- Siemens, OPC Classic: Microsoft DCOM Hardening Changes, trợ giúp Desigo CC
- Inductive Automation, OPC COM, Ignition 8.3
- Inductive Automation, OPC COM Tunneller Module, Ignition 8.1
- PTC, OPC UA Tutorial, trợ giúp Kepware
Đọc ngày 02/11/2026. Bài viết diễn giải, không trích nguyên văn; đọc tài liệu gốc trước khi thiết kế hoặc thao tác.