OT远程访问安全_securing-remote-access-to-ot-environment
以下为本文档的中文说明securing-remote-access-to-ot-environment保障 OT 环境远程访问安全是一个专注于工业控制系统ICS和运营技术OT网络远程访问安全加固的高专业度技能。OT 环境涵盖电力能源、石油化工、水处理、交通运输和制造业等国家关键基础设施其安全需求与传统的企业 IT 系统存在本质区别。使用场景包括为工业设施设计和部署安全的远程运维访问方案、对工控网络的边界实施严格访问控制和流量监控、审计和评估现有 OT 远程访问架构的安全漏洞和改进空间。核心特点包括深入阐释 OT 安全与 IT 安全的五个根本差异可用性优先于机密性系统停机比数据泄露后果更严重、实时性和确定性通信要求微秒级延迟影响生产质量、专有的工控协议Modbus/TCP、DNP3、PROFINET、OPC UA 等缺乏内置安全机制、长生命周期设备PLC/RTU 通常运行 10-20 年无法升级和物理安全与环境安全的特殊考量提供多种经过验证的远程访问安全架构方案包括安全跳板机Jump Box/Bastion Host的堡垒机架构、专用加密 VPN 网关连接方案、遵循零信任原则的网络访问ZTNA架构涵盖工控核心协议的安全加固技术措施如 Modbus/TCP 的深度包检测DPI和功能码白名单提供多因素认证MFA/RSA SecurID和基于角色的访问控制RBAC实施指南提供遵从 IEC 62443 系列工业通信网络安全标准的审计检查清单。该技能对于工业控制系统安全工程师而言是不可或缺的参考资料。Securing Remote Access to OT EnvironmentWhen to UseWhen implementing or upgrading remote access architecture for OT environmentsWhen onboarding vendors who require remote access to OT systems for support and maintenanceWhen implementing CIP-005-7 R2 requirements for remote access management including MFAWhen replacing legacy direct VPN access to OT networks with a secure jump server architectureWhen responding to an incident involving unauthorized remote access to industrial control systemsDo not usefor securing IT-only remote access without OT components, for configuring VPN for corporate workers (see general VPN guides), or for physical access control to OT facilities.PrerequisitesDMZ infrastructure (Level 3.5) between corporate IT and OT networksJump server/bastion host platform (CyberArk, BeyondTrust, or hardened Windows/Linux server)Multi-factor authentication solution (Duo, RSA SecurID, YubiKey, smart cards)Session recording capability for audit trail complianceFirewall rules permitting remote access only through the DMZ intermediate systemWorkflowStep 1: Design Secure Remote Access ArchitectureImplement a defense-in-depth remote access architecture with an intermediate system in the DMZ that prevents any direct network connectivity between external users and OT systems.# OT Remote Access Architecture# Key principle: NO direct connection from external networks to OT systemsarchitecture:external_access_point:location:Internet-facing firewallservice:VPN gateway (IKEv2/IPsec or SSL VPN)authentication:Certificate MFA (CIP-005-7 R2.4)controls:-Source IP allowlisting for vendor access-Time-based access windows-Bandwidth rate limitingdmz_intermediate_system:location:Level 3.5 DMZplatform:CyberArk Privileged Access Security or hardened jump serverfunction:Session broker - terminates external connection, initiates new internal connectioncontrols:-All sessions terminate at jump server (no pass-through)-Session recording with keystroke logging-Clipboard and file transfer restrictions-Session timeout after 30 minutes inactivity-Concurrent session limits per userot_internal_access:location:Level 3 / Level 2 OT networkmethod:Jump server initiates RDP/SSH/VNC to OT systemscontrols:-Firewall allows only jump server IP to reach OT-Protocol restricted (RDP 3389, SSH 22, VNC 5900)-Destination-specific per user rolevendor_access:description:Third-party vendor remote accessadditional_controls:-Vendor account disabled by default; enabled on request-Time-limited access windows (enable/disable per session)-OT operator must co-attend vendor sessions-Real-time session monitoring by OT security-No persistent credentials - one-time access tokens# Network flow:# User - VPN - Firewall - DMZ Jump Server - Internal FW - OT System# (Two separate authenticated connections; no direct routing)Step 2: Configure Jump Server with Privileged Access ManagementDeploy and harden the jump server in the DMZ with session management, recording, and role-based access controls.#!/usr/bin/env python3OT Remote Access Session Manager. Manages authorized remote access sessions to OT environments including session creation, monitoring, recording, and termination. Integrates with PAM solutions for credential vaulting. importjsonimporthashlibimportsysfromdataclassesimportdataclass,field,asdictfromdatetimeimportdatetime,timedeltafromenumimportEnumclassSessionState(str,Enum):PENDING_APPROVALpending_approvalAPPROVEDapprovedACTIVEactiveTERMINATEDterminatedEXPIREDexpiredDENIEDdeniedclassUserRole(str,Enum):OT_OPERATORot_operatorOT_ENGINEERot_engineerVENDORvendorSECURITY_ ANALYSTsecurity_analystdataclassclassRemoteAccessSession:session_id:struser_id:struser_role:strsource_ip:strtarget_system:strtarget_ip:strprotocol:strpurpose:strstate:strSessionState.PENDING_APPROVAL mfa_verified:boolFalseapproved_by:strcreated_at:strstarted_at:strended_at:strmax_duration_minutes:int120recording_path:stractions_logged:listfield(default_factorylist)classOTRemoteAccessManager:Manages remote access sessions to OT environment.def__init__(self):self.sessions{}self.active_sessions{}self.access_policies{}self.audit_log[]defdefine_access_policy(self,role,allowed_targets,protocols,max_duration):Define access policy for a user role.self.access_policies[role]{allowed_targets:allowed_targets,allowed_protocols:protocols,max_duration_minutes:max_duration,requires_co_attendance:roleUserRole.VENDOR,requires_approval:roleUserRole.VENDOR,}defrequest_session(self,user_id,user_role,source_ip,target_system,target_ip,protocol,purpose):Request a new remote access session.# Generate unique session IDsession_idhashlib.sha256(f{user_id}{target_ip}{datetime.now().isoformat()}.encode()).hexdigest()[:16]# Check access policypolicyself.access_policies.get(user_role)ifnotpolicy:returnNone,No access policy defined for roleiftarget_systemnotinpolicy[allowed_targets]:self._audit(ACCESS_DENIED,user_id,target_system,fTarget not in allowed list for role{user_role})returnNone,fTarget{target_system}not authorized for role{user_role}ifprotocolnotinpolicy[allowed_protocols]:self._audit(ACCESS_DENIED,user_id,target_system,fProtocol{protocol}not allowed for role{user_role})returnNone,fProtocol{protocol}not authorizedsessionRemoteAccessSession(session_idsession_id,user_iduser_id,user_roleuser_role,source_ipsource_ip,target_systemtarget_system,target_iptarget_ip,protocolprotocol,purposepurpose,max_duration_minutespolicy[max_duration_minutes],created_atdatetime.now().isoformat(),)# Vendor sessions require approvalifpolicy.get(requires_approval):session.stateSessionState.PENDING_APPROVALelse:session.stateSessionState.APPROVED self.sessions[session_id]session self._audit(SESSION_REQUESTED,user_id,target_system,purpose)returnsession_id,Session createddefapprove_session(self,session_id,approver_id):Approve a pending vendor session.sessionself.sessions.get(session_id)ifnotsession:returnFalse,Session not foundifsession.state!SessionState.PENDING_APPROVAL:returnFalse,Session not in pending approval statesession.stateSessionState.APPROVED session.approved_byapprover_id self._audit(SESSION_APPROVED,approver_id,session.target_system,fApproved session{session_id}for{session.user_id})returnTrue,Session approveddefactivate_session(self,session_id,mfa_token):Activate an approved session after MFA verification.sessionself.sessions.get(session_id)ifnotsessionorsession.state!SessionState.APPROVED:returnFalse,Session not approved# Verify MFA (simplified - real implementation calls MFA provider)session.m fa_verifiedTruesession.stateSessionState.ACTIVE session.started_atdatetime.now().isoformat()session.recording_pathf/recordings/{session_id}_{datetime.now().strftime(%Y%m%d)}.mp4self.active_sessions[session_id]session self._audit(SESSION_ACTIVATED,session.user_id,session.target_system,fMFA verified, recording to{session.recording_path})returnTrue,Session activedefterminate_session(self,session_id,reasonmanual):Terminate an active session.sessionself.active_sessions.pop(session_id,None)ifnotsession:sessionself.sessions.get(session_id)ifnotsession:returnFalsesession.stateSessionState.TERMINATED session.ended_atdatetime.now().isoformat()self._audit(SESSION_TERMINATED,session.user_id,session.target_system,reason)returnTruedefcheck_expired_sessions(self):Terminate sessions that have exceeded their maximum duration.nowdatetime.now()expired[]forsid,sessioninlist(self.active_sessions.items()):starteddatetime.fromisoformat(session.started_at)if(now-started).total_seconds()session.max_duration_minutes*60:self.terminate_session(sid,maximum_duration_exceeded)expired.append(sid)returnexpireddef_audit(self,event_type,user_id,target,detail):Write to audit log.self.audit_log.append({timestamp:datetime.now().isoformat(),event:event_type,user:user_id,target:target,detail:detail,})defgenerate_report(self):Generate remote access session report.report[]report.append(*70)report.append(OT REMOTE ACCESS SESSION REPORT)report.append(fDate:{datetime.now().isoformat()})report.append(*70)# Session summarytotallen(self.sessions)activesum(1forsinself.sessions.values()ifs.stateSessionState.ACTIVE)report.append(f\ Total Sessions:{total})report.append(fActive Sessions:{active})# Active sessions detailifself.active_sessions:report.append(\ ACTIVE SESSIONS:)forsid,sinself.active_sessions.items():report.append(f [{sid[:8]}]{s.user_id}({s.user_role}))report.append(f Target:{s.target_system}({s.target_ip}))report.append(f Started:{s.started_at})report.append(f MFA:{Verifiedifs.mfa_verifiedelseNOT VERIFIED})return\ .join(report)if__name____main__:managerOTRemoteAccessManager()# Define policiesmanager.define_access_policy(UserRole.OT_ENGINEER,[HMI-01,HMI-02,EWS-01,HISTORIAN-01],[RDP,SSH],max_duration240,)manager.define_access_policy(UserRole.VENDOR,[DCS-EWS-01],[RDP],max_duration120,)# Request vendor sessionsid,msgmanager.request_session(vendor_honeywell_01,UserRole.VENDOR,203.0.113.50,DCS-EWS-01,10.30.1.20,RDP,DCS firmware update per change request CR-2026-0045)print(fSession request:{msg}({sid}))ifsid:manager.approve_session(sid,ot_manager_01)manager.activate_session(sid,123456)print(manager.generate_report())Key ConceptsTermDefinitionIntermediate SystemSystem in the DMZ that terminates external connections and brokers new connections to OT, preventing direct network access per CIP-005Jump ServerHardened bastion host in the DMZ used for remote access sessions to OT systems with session recording and access controlsSession RecordingCapture of all remote access session activity (screen, keystrokes, commands) for security audit and incident investigationPrivileged Access Management (PAM)System for vaulting credentials, controlling access, and auditing privileged sessions to critical OT systemsCo-AttendanceRequirement for an OT operator to monitor vendor remote access sessions in real timeTime-Limited AccessVendor accounts enabled only for specific maintenance windows and automatically disabled after the window closesTools SystemsCyberArk Privileged Access Security: Enterprise PAM with session management, credential vaulting, and recording for OT remote accessBeyondTrust Privileged Remote Access: Purpose-built remote access solution with session recording and granular access policiesClaroty Secure Remote Access (SRA): OT-specific remote access solution with protocol-aware session controlsDuo Security: MFA provider supporting push notifications, hardware tokens, and biometrics for OT access verificationOutput FormatOT Remote Access Security Report Active Sessions: [N] Pending Approval: [N] Sessions Today: [N] MFA COMPLIANCE: All sessions MFA verified: [Yes/No] Sessions without MFA: [N] VENDOR ACCESS: Active vendor sessions: [N] Co-attended: [N] Recorded: [N]

相关新闻

wxWidgets 3.2.11和3.3.3发布(发布日期:2026年7月7日)

wxWidgets 3.2.11和3.3.3发布(发布日期:2026年7月7日)

在稳定的3.2和最新的3.3系列中同时发布似乎在上一次工作得很好,因此我们今天通过最新稳定的3.2.11版本和wxWidgets的最新开发3.3.3版本再次这样做。如前所述,3.3.3包含3.2.11的所有更改以及3.2系列中没有的其他改进,例如对wxMSW中暗模式支持的…

2026/10/13 18:22:44 阅读更多 →
Nemo Skills API参考:核心接口和命令行工具详解

Nemo Skills API参考:核心接口和命令行工具详解

Nemo Skills API参考:核心接口和命令行工具详解 【免费下载链接】Skills A project to improve skills of large language models 项目地址: https://gitcode.com/gh_mirrors/ne/Skills Nemo Skills是一个强大的开源框架,专门用于提升大型语言模型…

2026/10/8 22:29:28 阅读更多 →
gemma-4-26b-a4b-it-5bit实战应用:10个图像理解和对话生成的实际案例

gemma-4-26b-a4b-it-5bit实战应用:10个图像理解和对话生成的实际案例

gemma-4-26b-a4b-it-5bit实战应用:10个图像理解和对话生成的实际案例 【免费下载链接】gemma-4-26b-a4b-it-5bit 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/gemma-4-26b-a4b-it-5bit 想要在本地运行强大的多模态AI模型吗?gemm…

2026/10/4 22:44:28 阅读更多 →

最新新闻

PHP Excel导入导出实战:PhpSpreadsheet选型、内存优化与踩坑记录

PHP Excel导入导出实战:PhpSpreadsheet选型、内存优化与踩坑记录

最近这段时间一直在捣鼓一个内部报表系统的收尾工作,核心功能就是大家经常挂在嘴边的“PHP Excel导入导出”。标题写了“亲测成功”,真不是标题党——从最开始选型、搭环境,到后来导出报表、导入批量数据,再到中途被内存溢出和文件…

2026/10/13 22:19:57 阅读更多 →
小说网站爬虫实战:从目录到TXT的完整Python实现

小说网站爬虫实战:从目录到TXT的完整Python实现

搞爬虫的人应该都见过这类需求:任选一个小说网站,爬取任意一部小说,以记事本的形式保存。看起来就一句话,实际上踩坑点非常多。我前阵子接了一个类似的项目,目标是抓取一部网络签约小说并输出为纯文本文件,…

2026/10/13 22:19:57 阅读更多 →
C++共享单车租赁系统实战:面向对象设计与状态机实现

C++共享单车租赁系统实战:面向对象设计与状态机实现

1. 项目缘起与整体设计思路1.1 为什么选择共享单车这个场景来练手共享单车租赁管理这个题目,乍一看像是那种课程设计里被用烂了的“XX管理系统”,但我自己真正动手写了一遍之后才发现,它其实是一个被严重低估的练手项目。原因很简单&#xff…

2026/10/13 22:19:57 阅读更多 →
FastAPI生产级实践:异步架构、性能调优与高并发部署全指南

FastAPI生产级实践:异步架构、性能调优与高并发部署全指南

写在最前面:FastAPI这几年在Python后端圈子里讨论度一直不低,但我真正被它"圈粉"是在一次真实迁移之后。某个给内部数据平台用的查询服务,原先用Flask加多线程模式跑,并发一过200就开始超时报警,每次大促前都…

2026/10/13 22:19:57 阅读更多 →
真实可用推广系统源码:从渠道管理到归因分佣的闭环实现

真实可用推广系统源码:从渠道管理到归因分佣的闭环实现

简介:这是一套真实可用的PHP推广系统源码,面向具备PHP开发基础的中高级开发者及互联网营销技术团队,用于快速搭建、定制和优化在线广告推广平台。资源解决广告投放管理、用户行为追踪、转化效果分析与佣金结算等核心营销自动化需求&#xff0…

2026/10/13 22:19:57 阅读更多 →
Python超市管理系统源码实战:Flask+SQLite收银库存全流程

Python超市管理系统源码实战:Flask+SQLite收银库存全流程

简介:这是一份面向Python初学者与课程设计学习者的超市管理系统源码包,围绕员工管理、客户管理、登录验证与商品库存记录等日常运营场景展开,适合用来练习GUI界面搭建、文件持久化存储与模块化组织方式。压缩包共13个文件,约8KB&a…

2026/10/13 22:18:56 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →