implementing-conduit-security-for-ot-remote-access
按照IEC 62443区域和管道模型实现OT远程访问的安全管道架构,部署跳板服务器、启用MFA的网关、会话录制和基于审批的工作流,在不直接暴露OT网络的情况下控制供应商和工程师对工业控制系统的访问。
Best use case
implementing-conduit-security-for-ot-remote-access is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
按照IEC 62443区域和管道模型实现OT远程访问的安全管道架构,部署跳板服务器、启用MFA的网关、会话录制和基于审批的工作流,在不直接暴露OT网络的情况下控制供应商和工程师对工业控制系统的访问。
Teams using implementing-conduit-security-for-ot-remote-access should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/implementing-conduit-security-for-ot-remote-access/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How implementing-conduit-security-for-ot-remote-access Compares
| Feature / Agent | implementing-conduit-security-for-ot-remote-access | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
按照IEC 62443区域和管道模型实现OT远程访问的安全管道架构,部署跳板服务器、启用MFA的网关、会话录制和基于审批的工作流,在不直接暴露OT网络的情况下控制供应商和工程师对工业控制系统的访问。
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# 为OT远程访问实现管道安全
## 适用场景
- 将来自IT或供应商直接进入OT控制网络的VPN连接替换为安全管道
- 实现符合IEC 62443的远程访问路径管道架构
- 为第三方供应商维护ICS设备部署安全远程访问
- 为特权OT系统访问构建基于审批的访问工作流
- 修复关于SCADA系统不受控远程访问的审计发现
**不适用于**设计整体Purdue Model分段(参见implementing-purdue-model-network-segmentation)、部署仅IT远程访问解决方案,或配置对PLC的本地控制台访问。
## 前置条件
- 使用双防火墙架构部署的IT/OT DMZ(3.5级)
- 跳板服务器或特权访问管理(PAM)平台(CyberArk、BeyondTrust)
- 用于OT远程访问用户的多因素认证(MFA)基础设施
- 用于合规和取证的会话录制能力
- 访问请求的审批工作流系统(ServiceNow、工单系统)
## 工作流程
### 步骤 1:设计远程访问管道架构
```yaml
# IEC 62443 OT远程访问管道安全架构
# 所有远程访问终止于DMZ - 永不直接通达OT
conduit_architecture:
remote_access_conduit:
conduit_id: "RA-001"
source_zone: "企业IT(4级)"
destination_zone: "OT DMZ(3.5级)"
security_level_target: "SL3"
components:
external_gateway:
type: "VPN集中器"
location: "企业DMZ"
ip: "10.200.1.10"
protocols: ["IPsec", "SSL-VPN"]
authentication: "需要MFA(证书 + OTP)"
dmz_jump_server:
type: "特权访问工作站"
location: "OT DMZ(3.5级)"
ip: "10.10.150.20"
os: "Windows Server 2022(加固版)"
controls:
- "禁用本地管理员账户"
- "禁用USB端口"
- "默认禁用剪贴板传输"
- "启用会话录制(所有击键和屏幕)"
- "最长会话时长: 4小时"
- "空闲15分钟后自动注销"
- "强制执行应用程序白名单"
ot_access_gateway:
type: "工业远程访问网关"
location: "OT DMZ / 3级边界"
ip: "10.10.150.25"
controls:
- "仅可到达预先批准的目标IP"
- "协议级过滤(仅RDP、SSH、VNC)"
- "有时间限制的会话,自动过期"
- "基于审批的访问(工厂经理必须授权)"
data_flow:
- step: 1
description: "用户通过企业VPN进行MFA认证"
source: "远程用户"
destination: "VPN集中器"
protocol: "IPsec/SSL-VPN"
- step: 2
description: "用户连接到OT DMZ中的跳板服务器"
source: "VPN隧道"
destination: "DMZ跳板服务器"
protocol: "RDP with NLA"
- step: 3
description: "从跳板服务器,用户访问特定OT系统"
source: "DMZ跳板服务器"
destination: "批准的OT目标"
protocol: "RDP/SSH/VNC"
condition: "仅在经理批准且在时间窗口内"
prohibited_flows:
- "从外部到1/2级OT设备的直接VPN隧道"
- "OT会话期间允许互联网访问的分割隧道"
- "未扫描从跳板服务器到OT的文件传输"
- "持久性VPN连接(禁用自动重连)"
vendor_access_conduit:
conduit_id: "VA-001"
source_zone: "供应商外部网络"
destination_zone: "OT DMZ(3.5级)"
security_level_target: "SL3"
workflow:
request:
- "供应商通过门户提交访问请求(提前24小时)"
- "请求包括: 目的、目标系统、持续时间、人员"
- "工厂运营经理审查并批准/拒绝"
- "批准后生成有时间限制的凭据"
session:
- "供应商通过专用供应商VPN网关连接"
- "MFA认证(供应商通过短信/应用接收OTP)"
- "会话落在供应商专用跳板服务器(与内部跳板隔离)"
- "所有操作录制(视频 + 击键日志)"
- "OT工程师实时监控供应商会话"
termination:
- "会话在批准的结束时间自动终止"
- "凭据自动撤销"
- "会话录制归档90天"
- "访问日志转发至SIEM"
```
### 步骤 2:实现访问控制和监控
```python
#!/usr/bin/env python3
"""OT Remote Access Conduit Manager.
Manages approval-based remote access to OT systems through
secure conduit architecture with session recording, MFA
enforcement, and time-limited access windows.
"""
import json
import sys
from datetime import datetime, timedelta
from typing import Dict, List, Optional
from enum import Enum
class AccessRequestStatus(Enum):
PENDING = "pending"
APPROVED = "approved"
REJECTED = "rejected"
ACTIVE = "active"
EXPIRED = "expired"
REVOKED = "revoked"
class RemoteAccessRequest:
"""Represents an OT remote access request."""
def __init__(self, requestor: str, requestor_type: str, purpose: str,
target_systems: List[str], duration_hours: int,
requested_start: str):
self.id = f"OT-RA-{datetime.now().strftime('%Y%m%d-%H%M%S')}"
self.requestor = requestor
self.requestor_type = requestor_type # "internal_engineer" 或 "vendor"
self.purpose = purpose
self.target_systems = target_systems
self.duration_hours = duration_hours
self.requested_start = requested_start
self.status = AccessRequestStatus.PENDING
self.created = datetime.now().isoformat()
self.approved_by = None
self.session_id = None
self.audit_trail = []
def approve(self, approver: str, conditions: str = ""):
"""Approve the access request."""
self.status = AccessRequestStatus.APPROVED
self.approved_by = approver
self.audit_trail.append({
"timestamp": datetime.now().isoformat(),
"action": "APPROVED",
"actor": approver,
"conditions": conditions,
})
def reject(self, rejector: str, reason: str):
"""Reject the access request."""
self.status = AccessRequestStatus.REJECTED
self.audit_trail.append({
"timestamp": datetime.now().isoformat(),
"action": "REJECTED",
"actor": rejector,
"reason": reason,
})
class OTConduitManager:
"""Manages OT remote access conduit security."""
def __init__(self):
self.access_requests: Dict[str, RemoteAccessRequest] = {}
self.active_sessions: Dict[str, dict] = {}
self.policy = self._load_policy()
def _load_policy(self) -> dict:
"""Load remote access policy."""
return {
"max_session_hours": 4,
"idle_timeout_minutes": 15,
"mfa_required": True,
"session_recording": True,
"clipboard_transfer": False,
"file_transfer": "scan_required",
"advance_notice_hours": 24,
"vendor_escort_required": True,
"prohibited_targets": ["SIS-*", "SAFETY-*"],
"allowed_protocols": ["RDP", "SSH", "VNC"],
"blocked_protocols": ["Telnet", "FTP", "SMB"],
}
def submit_request(self, request: RemoteAccessRequest) -> str:
"""Submit a new remote access request."""
# 对策略进行验证
violations = []
if request.duration_hours > self.policy["max_session_hours"]:
violations.append(
f"时长 {request.duration_hours}h 超过最大值 {self.policy['max_session_hours']}h"
)
for target in request.target_systems:
for prohibited in self.policy["prohibited_targets"]:
pattern = prohibited.replace("*", "")
if target.startswith(pattern):
violations.append(f"目标 {target} 在禁止列表中(安全系统)")
if violations:
print(f"[!] 发现策略违规:")
for v in violations:
print(f" - {v}")
return ""
self.access_requests[request.id] = request
print(f"[+] 访问请求 {request.id} 已提交待审批")
return request.id
def list_pending_requests(self):
"""List all pending access requests for approval."""
pending = [r for r in self.access_requests.values()
if r.status == AccessRequestStatus.PENDING]
print(f"\n{'='*65}")
print("待处理OT远程访问请求")
print(f"{'='*65}")
if not pending:
print(" 无待处理请求")
return
for req in pending:
print(f"\n 请求: {req.id}")
print(f" 申请人: {req.requestor} ({req.requestor_type})")
print(f" 目的: {req.purpose}")
print(f" 目标: {', '.join(req.target_systems)}")
print(f" 时长: {req.duration_hours} 小时")
print(f" 开始: {req.requested_start}")
print(f" 提交: {req.created}")
def generate_audit_report(self):
"""Generate audit report of all remote access activity."""
print(f"\n{'='*65}")
print("OT远程访问审计报告")
print(f"{'='*65}")
print(f"报告日期: {datetime.now().isoformat()}")
print(f"请求总数: {len(self.access_requests)}")
status_counts = {}
for req in self.access_requests.values():
status = req.status.value
status_counts[status] = status_counts.get(status, 0) + 1
print(f"\n请求状态:")
for status, count in status_counts.items():
print(f" {status}: {count}")
print(f"\n详细审计跟踪:")
for req in self.access_requests.values():
print(f"\n {req.id} - {req.requestor} ({req.requestor_type})")
print(f" 状态: {req.status.value}")
print(f" 目标: {', '.join(req.target_systems)}")
for entry in req.audit_trail:
print(f" [{entry['timestamp']}] {entry['action']} 由 {entry['actor']}")
if __name__ == "__main__":
manager = OTConduitManager()
# 供应商访问请求
vendor_req = RemoteAccessRequest(
requestor="John Smith - Siemens Field Service",
requestor_type="vendor",
purpose="S7-1500控制器的年度PLC固件更新",
target_systems=["PLC-REACTOR-01", "PLC-REACTOR-02"],
duration_hours=3,
requested_start="2025-03-15T08:00:00",
)
req_id = manager.submit_request(vendor_req)
if req_id:
manager.list_pending_requests()
# 模拟审批
manager.access_requests[req_id].approve(
approver="Plant Manager - Jane Doe",
conditions="OT工程师必须监督供应商会话",
)
manager.generate_audit_report()
```
## 核心概念
| 术语 | 定义 |
|------|------|
| 管道(Conduit) | IEC 62443中定义了安全策略的安全区域之间的受控通信路径 |
| 跳板服务器(Jump Server) | 位于DMZ中的加固中间服务器,所有OT远程访问必须经过此服务器 |
| 会话录制(Session Recording) | 捕获远程访问会话期间所有屏幕活动、击键和命令,用于审计 |
| 基于审批的访问(Approval-Based Access) | 要求工厂运营经理授权才能激活远程访问凭据的工作流 |
| 供应商陪同(Vendor Escort) | 内部OT工程师实时监控供应商远程会话的做法 |
| 紧急访问(Break-Glass Access) | 关键情况下绕过正常审批工作流的紧急访问程序 |
## 输出格式
```
OT远程访问管道报告
==================================
日期: YYYY-MM-DD
管道状态:
内部访问管道: [活跃/非活跃]
供应商访问管道: [活跃/非活跃]
访问请求(过去30天):
已提交: [数量]
已批准: [数量]
已拒绝: [数量]
平均会话时长: [小时]
策略合规性:
MFA执行率: [100%]
会话录制率: [100%]
有时间限制的会话: [合规%]
阻止的禁止目标尝试: [数量]
```Related Skills
triaging-security-incident
使用 NIST SP 800-61r3 和 SANS PICERL 框架对安全事件进行初始分类,确定严重性、范围和所需响应行动。 按类型对事件分类,根据业务影响分配优先级,并路由到相应的响应团队。适用于事件分类、 安全告警分类、严重性评估、事件优先级排序或初始事件分析等请求场景。
triaging-security-incident-with-ir-playbook
使用结构化 IR Playbook 对安全事件进行分类和优先排序,确定严重性、分配响应团队并启动适当的响应程序。
triaging-security-alerts-in-splunk
在 Splunk Enterprise Security 中对安全告警进行分类,通过 SPL 查询和事件审查(Incident Review) 仪表板对重要事件进行严重性分类、调查、关联相关遥测并做出升级或关闭决策。 适用于 SOC 分析师需要处理关联搜索产生的告警队列、确定调查优先级, 或需要为交接给二/三级分析师记录分类决策时。
testing-websocket-api-security
测试 WebSocket API 实现中的安全漏洞,包括 WebSocket 升级时缺少身份认证、跨站 WebSocket 劫持(Cross-Site WebSocket Hijacking,CSWSH)、通过 WebSocket 消息进行的注入攻击、输入校验不足、通过消息泛洪实施拒绝服务,以及通过 WebSocket 帧造成的信息泄露。测试人员使用 Burp Suite 拦截 WebSocket 握手和消息,构造恶意 payload,并测试 WebSocket 通道上的授权绕过。适用于 WebSocket 安全测试、WS 渗透测试、CSWSH 攻击或实时 API 安全评估相关请求。
testing-jwt-token-security
在安全测试活动中,评估 JSON Web Token(JWT)实现中的密码学弱点、算法混淆攻击和授权绕过漏洞。
testing-for-broken-access-control
系统性测试 Web 应用程序中的访问控制缺陷,包括权限提升、缺失的功能级检查以及不安全的直接对象引用。
testing-api-security-with-owasp-top-10
使用自动化和手工测试技术,针对 OWASP API 安全 Top 10 风险对 REST 和 GraphQL API 端点进行系统性评估。
securing-remote-access-to-ot-environment
本技能涵盖为操作员、工程师和供应商实施OT/ICS环境的安全远程访问,同时防止可能危害工业运营的未授权访问。涉及跳板服务器架构、多因素认证、会话记录、特权访问管理、供应商远程访问控制,以及符合IEC 62443和NERC CIP-005远程访问要求。
performing-wireless-security-assessment-with-kismet
使用 Kismet 通过被动射频监控进行无线网络安全评估,检测流氓接入点(Rogue AP)、隐藏 SSID、弱加密和未授权客户端。
performing-ssl-tls-security-assessment
使用 sslyze Python 库评估 SSL/TLS 服务器配置,评估加密套件、证书链、协议版本、HSTS 头部,以及 Heartbleed 和 ROBOT 等已知漏洞。
performing-soap-web-service-security-testing
通过分析 WSDL 定义,测试 XML 注入(XML Injection)、XXE、WS-Security 绕过和 SOAPAction 欺骗,对 SOAP Web 服务执行安全测试。
performing-serverless-function-security-review
对 AWS Lambda、Azure Functions 和 GCP Cloud Functions 中的无服务器函数(Serverless Function)执行安全审查,识别过度宽松的执行角色(Execution Role)、不安全的环境变量、注入漏洞和缺失的运行时保护措施。