OPC(OLE for Process Control)是用于工业自动化的一种通信标准,在 ICS 环境中的应用十分广泛,其中 OPC DA(Data Access)是早期使用较多的一种 OPC 协议。相较于近些年较为常见的 OPC UA,OPC DA 十分依赖 Windows 操作系统的 DCOM 技术,这在十几年前可能还便于工程师迅速组网并建立连接,但在 ICT 飞速发展的今天,其在通讯方式、跨平台性等多方面都展现出了一定弊端。但是对于 ICS 安全研究人员来说,OPC DA 依旧是仍在使用的技术之一,所以还是有必要进行了解和研究。

本文就来聊一下如何搭建 OPC DA 的通讯环境。

基础环境

OPC DA Server

  • Windows 10 Enterprise LTSC 2021
  • KEPServerEX 6.4.321.0

OPC DA Client

  • Windows 10 Enterprise LTSC 2021
  • KEPServerEX OPC Quick Client

安装

Kepware 在 Free Demo 上还是比较友好的,包括 KEPServerEX 在内的所有产品都可以直接在官网下载演示版本,功能与正式购买的版本一致,只是在使用 2 小时后会关闭软件,需要重新启动。

可以在 Kepware 官网的 KEPServerEX 连接平台 | OPC 服务器 | Kepware 页面填写一个表单来获取演示版本的软件,或者我更推荐注册一个 My Kepware 账号,这样就可以在 My Kepware 的首页下载任意版本的 Demo,以及 TIA Portal Utility 工具。

My Kepware 页面

服务器的安装过程就不再赘述,无脑下一步即可。

客户端在安装时只选择 OPC Quick Client 即可。

KEPServerEX OPC Quick Client 安装

配置

OPC DA 主要以 Windows 操作系统的 DCOM 技术为基础,而 DCOM 显然不是一个开箱即用的技术,需要先在 Windows 中进行一大堆配置。好在 Kepware 为我们提供了一个配置指南,跟随指南一步步配置完成就可以使用 OPC DA 了。配置指南可以在 Remote OPC DA (DCOM) Configuration Guide - Kepware 下载。

配置用户及用户组

不同于访问 Web 服务器,要想从远程访问一个 OPC DA 服务器,你需要的不仅是服务器的 IP(或者主机名),还有用户凭据,这意味着必须先配置用户及用户组。

对一个 Windows 局域网而言,常用的网络资源管理模式基本就是域和工作组。对工作组来说, OPC DA 服务器与客户端必须使用相同的密码登录相同的用户;对域来说,只需要在域控中加入用户就可以了。

配置一个域显然要比使用工作组麻烦一点,况且每台 Windows 电脑都默认加入了“WORKGROUP”工作组,所以下文中会以工作组的模式来配置。

创建本地用户及用户组

按 Win + R,输入“lusrmgr.msc”启动本地用户和组管理,创建一个新用户 OPCUser,密码为 123456

创建新用户

然后创建一个新用户组 OPCGroup

创建新用户组

将用户添加到用户组

右键点击刚才创建的用户组,点击“添加到组”,在弹出的属性窗口中点击“添加”。在选择用户窗口输入刚才创建的用户的名称“OPCUser”,点击“检查名称”,此时用户名会变成带有下划线的完整格式,点击“确定”即可。

将用户添加到用户组

之后,用户组属性对话框中就会显示刚才添加的成员。

用户已被添加到用户组

前文中提到, OPC DA 服务器与客户端必须使用相同的密码登录相同的用户,所以在服务器与客户端上都需要进行上述操作。

配置服务器运行时环境

配置完用户及用户组后,需要对 OPC DA 服务器的运行时环境进行相应的配置。

OPC 连接安全

为了连接安全,首先要确认 KEPServerEX 使用了 DCOM 提供的安全选项,从而强制启用用户认证。同时指南中提到,2022 年 6 月之后的 Windows 系统不再支持禁用这一选项,所以需要确认这个选项是否开启。

右键点击任务栏中的 KEPServerEX 图标,点击“设置”,在弹出的设置对话框中点击“运行时选项”选项卡,确认“OPC 连接安全”中的“使用 DCOM 配置设置”复选框是选中状态,之后点击“确定”。

KEPServerEX 运行时选项

设置服务登录身份

当 OPC 服务器以服务模式运行时,那么服务必须设置为以指定用户身份来运行,这样客户端才能对服务器发来的回调进行鉴权。

按 Win + R,输入“services.msc”启动服务管理,找到 KEPServerEX 的运行时服务“KEPServerEX 6.4 Runtime”,右键点击该服务,点击“属性”,打开服务属性对话框。

在对话框中点击“登录”选项卡,将登录身份选为“此账户”,之后点击右侧的“浏览”,在弹出的选择用户对话框输入之前创建的用户的名称“OPCUser”,点击“检查名称”,此时用户名会变成带有下划线的完整格式,点击“确定”即可。

最后输入用户密码,点击确认,然后重启服务即可。

KEPServerEX Runtime 服务登录身份

配置 DCOM

配置完运行时环境后,理论上 OPC DA 服务器就可以正常运行了,但是要从远程进行 OPC DA 通讯的话,还需要针对 DCOM 进行一些配置。

配置应用程序

首先需要对作为 DCOM 组件的 KEPServerEX 进行配置。

按 Win + R,输入“dcomcnfg”启动组件服务管理,在左侧依次展开“组件服务->计算机->我的电脑->DCOM 配置”,找到“KEPServerEX 6.4”组件。

组件服务管理

右键点击该组件,点击“属性”,打开组件属性对话框,在“常规”选项卡中,确认“身份验证级别”选项是“默认”。

KEPServerEX 组件属性 - 常规

点击“位置”选项卡,确认“在此计算机上运行应用程序”复选框是选中状态。

KEPServerEX 组件属性 - 位置

点击“安全”选项卡,确认“启动和激活权限”选项是“自定义”。

KEPServerEX 组件属性 - 安全

接着点击“启动和激活权限”右侧的“编辑”,在弹出的启动和激活权限对话框中点击“添加”,输入之前创建的用户组名称“OPCGroup”,点击“检查名称”然后点击“确定”,这样就将整个 OPC 用户组添加了进来。之后,在下方权限框中对所有权限勾选“允许”,接着点击“确定”。

KEPServerEX 组件属性 - 安全 - 启动和激活权限

然后点击“访问权限”右侧的“编辑”,重复前一步添加用户组“OPCGroup”,对所有权限勾选“允许”,之后点击“确定”。

KEPServerEX 组件属性 - 安全 - 访问权限

最后点击“确定”,关闭组件属性对话框。

配置系统属性

接着需要配置一些系统相关的 DCOM 设置。

回到组件服务管理,依次展开“组件服务->计算机”,右键点击“我的电脑”,点击“属性”,打开我的电脑属性对话框。

组件服务管理 - 我的电脑

点击“默认属性”选项卡,确认“在此计算机上启用分布式 COM”复选框是选中状态,“默认身份验证级别”选择“数据包完整性”,“默认模拟级别”选择“标识”。

我的电脑属性 - 默认属性

点击“COM 安全”选项卡。

我的电脑属性 - COM 安全

点击“访问权限”中的“编辑限制”,在弹出的访问权限对话框中,选择“ANONYMOUS LOGON”用户,并在下方权限框中对所有权限勾选“允许”,之后点击“确定”。

我的电脑属性 - COM 安全 - 访问权限

点击“启动和激活权限”中的“编辑限制”,在弹出的启动和激活权限对话框中,重复之前的步骤添加用户组“OPCGroup”,并在下方权限框中对所有权限勾选“允许”,之后点击“确定”。

我的电脑属性 - COM 安全 - 启动和激活权限

最后点击“确定”,关闭我的电脑属性对话框。

配置防火墙

众所周知,Windows 防火墙只会带来各种莫名其妙的麻烦,尤其对于测试环境来说,首先要做的就是关掉 Windows 防火墙。Kepware 官方指南中提供了添加入站规则的步骤说明,就是将相关程序和 135 端口添加到规则中,有需要的话可以自行操作。

关闭 Windows Defender 防火墙也很简单,按 Win + R,输入“firewall.cpl”启动 Windows Defender 防火墙管理,点击左侧“启用或关闭 Windows Defender 防火墙”,将“专用网络设置”和“公用网络设置”都选择“关闭 Windows Defender 防火墙”即可。

Windows Defender 防火墙

别忘了在服务器与客户端上都需要进行上述操作。

配置网络发现

开启网络发现的话可以在 OPC 客户端浏览 OPC 服务器,但是如果通过输入 IP 地址以及 ProgID 来连接的话,网络发现就不是必须的了。

配置方法同样很简单,打开“网络和共享中心”,点击左侧“更改高级共享设置”,选择“启用网络发现”即可。

配置本地安全策略

当 OPC 客户端与服务器是以工作组的形式连接时,就需要对本地安全策略进行相应的配置。

服务器策略

服务器侧的设置决定了本地用户的鉴权策略,当共享和安全模型设为“经典”时,远程用户使用与本地用户相同的用户名和密码登录,会遵循相同的访问级别。这一步操作仅在服务器侧完成。

按 Win + R,输入“secpol.msc”启动本地安全策略管理,依此在左侧选择“本地策略->安全选项”,在右侧策略中找到“网络访问:本地账户的共享和安全模型”,双击打开属性对话框,选择“经典 - 对本地用户进行身份验证,不改变其本来身份”,点击“确定”即可。

服务器侧本地安全策略

客户端策略

客户端侧的策略决定了匿名登录所拥有的权限,当这一选项被启用时,匿名登录会被视作 Everyone 来授予权限,反之则不然。这一步操作仅在客户端侧完成。

按 Win + R,输入“secpol.msc”启动本地安全策略管理,依此在左侧选择“本地策略->安全选项”,在右侧策略中找到“网络访问:将 Everyone 权限应用于匿名用户”,双击打开属性对话框,选择“已启用”,点击“确定”即可。

客户端侧本地安全策略

最后的最后,记得重启系统。

到这里,所有 DCOM 及 OPC DA 的配置就都完成了,接下来就可以使用 OPC DA 客户端连接服务器,进行通信了。

使用

安装并配置完 KEPServerEX 后,就可以直接使用了。

首先我们在服务器和客户端的 Windows 系统中都使用 OPCUser 用户登录,并在服务器上启动“KEPServerEX 6 Configuration”,可以看到 KEPServerEX 默认提供了一些模拟器和数据源示例,方便测试连通性等。

KEPServerEX 6 Configuration 界面

然后在客户端启动“OPC Quick Client”(在开始菜单中),点击“Edit->New Server Connection”。

OPC Quick Client 创建新连接

在弹出的服务器属性对话框中,输入 OPC DA 服务器的地址(或设备名称),以及 Prog ID,之后点击“确定”。默认情况下,Prog ID 为“Kepware.KEPServerEX.V6”。

OPC Quick Client 创建新连接 - 服务器属性

此时左侧窗口会出现服务器名称,正常连通状况下会显示绿色的小方块。右键点击服务器名称,点击“Auto Create Tags”。

OPC Quick Client 自动创建标签

展开服务器名称,就可以看到数据组和标签的信息了。

OPC Quick Client

此时,OPC DA 客户端就与服务器建立了通讯,接下来就可以对标签进行监视及读写等操作了。