implementing-ot-incident-response-playbook

按照SANS PICERL框架、IEC 62443和NIST SP 800-82,开发并实施OT专用事件响应剧本,解决包括安全关键系统、有限停机容忍度以及IT SOC、OT工程和工厂运营团队协调等ICS特有挑战。

9 stars

Best use case

implementing-ot-incident-response-playbook is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

按照SANS PICERL框架、IEC 62443和NIST SP 800-82,开发并实施OT专用事件响应剧本,解决包括安全关键系统、有限停机容忍度以及IT SOC、OT工程和工厂运营团队协调等ICS特有挑战。

Teams using implementing-ot-incident-response-playbook 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

$curl -o ~/.claude/skills/implementing-ot-incident-response-playbook/SKILL.md --create-dirs "https://raw.githubusercontent.com/killvxk/cybersecurity-skills-zh/main/skills/implementing-ot-incident-response-playbook/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/implementing-ot-incident-response-playbook/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How implementing-ot-incident-response-playbook Compares

Feature / Agentimplementing-ot-incident-response-playbookStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

按照SANS PICERL框架、IEC 62443和NIST SP 800-82,开发并实施OT专用事件响应剧本,解决包括安全关键系统、有限停机容忍度以及IT SOC、OT工程和工厂运营团队协调等ICS特有挑战。

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事件响应剧本

## 适用场景

- 首次为OT构建专用事件响应程序
- 现有IT IR剧本未涵盖ICS/SCADA特定要求
- 准备应对EKANS或LockerGoga等OT勒索软件场景
- 将IR程序与IEC 62443和NERC CIP事件报告要求对齐
- 进行事件后审查以提升OT IR能力

**不适用于**无OT组件的纯IT事件响应(使用标准NIST 800-61剧本)、日常OT安全监控(参见implementing-dragos-platform-for-ot-monitoring),或桌面推演设计(参见performing-ics-tabletop-exercise)。

## 前置条件

- 带关键性评级和安全系统识别的OT资产清单
- 已定义的角色:OT IR负责人、IT SOC分析师、工厂运营经理、过程安全工程师
- 通信计划,包括带外通道(OT事件可能影响IT通信)
- PLC程序、HMI配置和历史数据的已知良好备份
- ICS供应商、Dragos/Claroty支持和CISA ICS-CERT的联系信息

## 工作流程

### 步骤 1:定义OT特定事件分类和响应程序

```python
#!/usr/bin/env python3
"""OT事件响应剧本引擎。

按照SANS PICERL生命周期,针对安全性、
可用性和跨团队协调的ICS特定考虑因素,
实施结构化的OT事件响应程序。
"""

import json
import sys
from datetime import datetime
from enum import Enum
from typing import Dict, List, Optional


class OTIncidentSeverity(Enum):
    SEV1_SAFETY = "SEV1-SAFETY"  # 安全系统受损
    SEV2_PROCESS = "SEV2-PROCESS"  # 主动过程操控
    SEV3_ACCESS = "SEV3-ACCESS"  # 未授权OT访问
    SEV4_RECON = "SEV4-RECON"  # OT网络侦察
    SEV5_IT_SPILLOVER = "SEV5-IT-SPILLOVER"  # 有OT暴露的IT事件


class OTIncidentCategory(Enum):
    RANSOMWARE = "ransomware"
    MALWARE_ICS = "malware_ics_specific"
    UNAUTHORIZED_ACCESS = "unauthorized_ot_access"
    PROCESS_MANIPULATION = "process_manipulation"
    SIS_COMPROMISE = "safety_system_compromise"
    DATA_EXFILTRATION = "ot_data_exfiltration"
    SUPPLY_CHAIN = "supply_chain_compromise"
    INSIDER_THREAT = "insider_threat"


# OT的PICERL阶段定义
PICERL_PHASES = {
    "preparation": {
        "description": "事件发生前的准备工作",
        "ot_specific": [
            "维护所有PLC程序和HMI配置的离线备份",
            "记录每个过程区域的安全关闭程序",
            "建立带外通信(卫星电话、模拟无线电)",
            "预置适用于气隙OT网络的取证工具",
            "维护备用PLC和工程师工作站",
            "每季度进行OT桌面推演",
        ],
    },
    "identification": {
        "description": "检测并确认OT安全事件",
        "ot_specific": [
            "将OT IDS告警与历史数据中的过程异常相关联",
            "验证过程偏差是由网络攻击还是操作原因引起",
            "检查安全仪表系统(SIS)状态和完整性",
            "审查工程师工作站日志中的未授权访问",
            "检查PLC模式变化(RUN/STOP/PROGRAM转换)",
            "评估事件是否仅限于IT或已蔓延到OT",
        ],
    },
    "containment": {
        "description": "限制事件的蔓延和影响",
        "ot_specific": [
            "未经工厂运营批准,绝不关闭OT系统",
            "在工业防火墙处隔离受影响网段(而非断电)",
            "如怀疑远程操控,将PLC切换到本地/手动模式",
            "在维持OT内部通信的同时断开DMZ处的IT-OT管道",
            "在任何修复操作之前保留取证证据",
            "在整个遏制过程中维持安全系统运行",
        ],
    },
    "eradication": {
        "description": "从OT系统中清除威胁",
        "ot_specific": [
            "将运行中的PLC程序与已知良好备份进行比较",
            "从黄金镜像重建被攻陷的工程师工作站",
            "验证历史数据完整性以发现操控证据",
            "检查OT特定位置的持久化机制(HMI上的启动脚本、计划任务)",
            "验证PLC和RTU上的固件完整性",
            "如需根套件级别修复,与ICS供应商协调",
        ],
    },
    "recovery": {
        "description": "将OT运营恢复正常",
        "ot_specific": [
            "从经验证的离线备份恢复PLC程序",
            "在工程监督下分阶段重启过程",
            "在重启期间密切监控过程变量异常",
            "在恢复自动操作前验证安全系统功能",
            "仅在OT经验证清洁后重新启用IT-OT连接",
            "记录事件期间任何过程变量漂移",
        ],
    },
    "lessons_learned": {
        "description": "事件后审查和改进",
        "ot_specific": [
            "在2周内进行IT/OT联合事件后审查",
            "根据观察到的攻击技术更新检测规则",
            "如果横向移动成功,修订网络分段",
            "根据实际恢复时间更新PLC备份计划",
            "按要求向CISA ICS-CERT和行业ISAC报告",
            "在90天内测试更新后的剧本",
        ],
    },
}


class OTIncident:
    """表示一个活跃的OT安全事件。"""

    def __init__(self, title: str, severity: OTIncidentSeverity,
                 category: OTIncidentCategory, affected_systems: List[str]):
        self.id = f"OT-IR-{datetime.now().strftime('%Y%m%d-%H%M%S')}"
        self.title = title
        self.severity = severity
        self.category = category
        self.affected_systems = affected_systems
        self.created = datetime.now().isoformat()
        self.current_phase = "identification"
        self.timeline = []
        self.decisions = []
        self.containment_actions = []

    def log_event(self, phase: str, action: str, actor: str, notes: str = ""):
        """记录一个事件响应操作。"""
        entry = {
            "timestamp": datetime.now().isoformat(),
            "phase": phase,
            "action": action,
            "actor": actor,
            "notes": notes,
        }
        self.timeline.append(entry)
        return entry

    def log_decision(self, decision: str, rationale: str, approved_by: str):
        """记录事件响应期间的关键决策。"""
        entry = {
            "timestamp": datetime.now().isoformat(),
            "decision": decision,
            "rationale": rationale,
            "approved_by": approved_by,
        }
        self.decisions.append(entry)
        return entry


class OTPlaybookEngine:
    """执行OT事件响应剧本。"""

    def __init__(self):
        self.playbooks = self._build_playbooks()

    def _build_playbooks(self) -> Dict:
        """构建特定类别的OT IR剧本。"""
        return {
            OTIncidentCategory.RANSOMWARE: {
                "name": "OT勒索软件响应",
                "reference": "SANS ICS勒索软件防御剧本",
                "immediate_actions": [
                    "未经管理层和法务批准,不得支付赎金",
                    "立即在DMZ防火墙处断开IT-OT管道",
                    "验证SIS/安全系统是否独立运行",
                    "将关键过程切换到手动/本地控制",
                    "保留勒索信和加密文件样本用于取证",
                    "评估勒索软件是否已到达2级或以下",
                ],
                "containment_steps": [
                    "通过禁用OT主机之间的SMB/RDP阻止横向移动",
                    "在维持关键过程通信的同时隔离受影响的VLAN",
                    "禁用OT环境的远程访问VPN",
                    "检查备份基础设施是否完好(勒索软件针对备份)",
                    "清点哪些OT系统被加密,哪些仍可运行",
                ],
                "recovery_priority": [
                    "1. 安全仪表系统(SIS)",
                    "2. 关键过程控制器(连续过程中的PLC)",
                    "3. 供操作员查看的HMI",
                    "4. 数据连续性历史服务器",
                    "5. 工程师工作站",
                    "6. IT-OT连接(最后)",
                ],
                "reporting": [
                    "CISA:按CIRCIA要求在72小时内报告",
                    "行业ISAC:在24小时内共享IOC",
                    "NERC(如适用):对BES影响在1小时内报告",
                ],
            },
            OTIncidentCategory.SIS_COMPROMISE: {
                "name": "安全系统受损响应",
                "reference": "TRITON/TRISIS事件经验教训",
                "immediate_actions": [
                    "立即通知过程安全团队",
                    "验证物理安全装置功能正常(泄压阀、防爆片)",
                    "如SIS完整性不确定,考虑受控过程关闭",
                    "将SIS网络与所有其他网络隔离",
                    "检查SIS是否处于旁路模式或已被解除武装",
                    "联系SIS供应商紧急支持(Schneider Triconex、HIMA等)",
                ],
                "containment_steps": [
                    "将SIS工程师工作站从网络物理断开",
                    "采集SIS工程师工作站的取证镜像",
                    "根据出厂基线验证SIS控制器固件和逻辑",
                    "检查是否有未授权的TriStation/安全协议连接",
                    "检查所有工程师工作站的TRITON指标",
                ],
                "recovery_priority": [
                    "1. 验证所有物理安全屏障完好",
                    "2. 从离线备份(与供应商基线对比验证)重载SIS逻辑",
                    "3. 重新投用前进行完整的SIS验证测试",
                    "4. 由过程安全工程师进行独立验证",
                ],
                "reporting": [
                    "CISA ICS-CERT:针对SIS攻击立即通知",
                    "过程安全监管机构(OSHA、HSE):按司法管辖区要求",
                    "SIS供应商:联系进行根本原因分析",
                ],
            },
        }

    def execute_playbook(self, incident: OTIncident):
        """为事件执行适当的剧本。"""
        playbook = self.playbooks.get(incident.category)
        if not playbook:
            print(f"[!] 没有针对 {incident.category.value} 的特定剧本。使用通用OT IR程序。")
            return

        print(f"\n{'='*70}")
        print(f"OT事件响应剧本已激活")
        print(f"{'='*70}")
        print(f"事件ID: {incident.id}")
        print(f"标题: {incident.title}")
        print(f"严重程度: {incident.severity.value}")
        print(f"类别: {incident.category.value}")
        print(f"剧本: {playbook['name']}")
        print(f"参考: {playbook['reference']}")
        print(f"激活时间: {incident.created}")
        print(f"受影响系统: {', '.join(incident.affected_systems)}")

        print(f"\n--- 即时行动(在前15分钟内执行)---")
        for i, action in enumerate(playbook["immediate_actions"], 1):
            print(f"  {i}. {action}")

        print(f"\n--- 遏制步骤 ---")
        for i, step in enumerate(playbook["containment_steps"], 1):
            print(f"  {i}. {step}")

        print(f"\n--- 恢复优先级顺序 ---")
        for item in playbook["recovery_priority"]:
            print(f"  {item}")

        print(f"\n--- 报告要求 ---")
        for req in playbook["reporting"]:
            print(f"  - {req}")

        # 打印PICERL阶段指引
        print(f"\n--- PICERL阶段检查清单 ---")
        for phase, info in PICERL_PHASES.items():
            print(f"\n  [{phase.upper()}] {info['description']}")
            for item in info["ot_specific"][:3]:
                print(f"    - {item}")


if __name__ == "__main__":
    engine = OTPlaybookEngine()

    # 示例:OT勒索软件事件
    incident = OTIncident(
        title="在3级历史服务器上检测到勒索软件",
        severity=OTIncidentSeverity.SEV2_PROCESS,
        category=OTIncidentCategory.RANSOMWARE,
        affected_systems=["HIST-01", "HIST-02", "ENG-WS-03", "HMI-AREA1"],
    )

    engine.execute_playbook(incident)
```

## 核心概念

| 术语 | 定义 |
|------|------|
| PICERL | SANS事件响应生命周期:准备(Preparation)、识别(Identification)、遏制(Containment)、清除(Eradication)、恢复(Recovery)、经验教训(Lessons Learned) |
| ICS4ICS | 工业控制系统事件指挥系统 - 将FEMA ICS适配到OT网络安全响应 |
| 安全仪表系统(SIS) | 防止危险条件的独立安全控制器;SIS被攻陷可能造成人身伤害 |
| 手动/本地模式(Manual/Local Mode) | 使用本地面板控制操作PLC而非远程SCADA;当远程访问被攻陷时使用 |
| CIRCIA | 关键基础设施网络事件报告法案,要求在72小时内向CISA报告 |
| 已知良好备份(Known-Good Backup) | 经验证的PLC程序和配置离线副本,用作恢复的可信基线 |

## 常见场景

### 场景:勒索软件从IT蔓延到OT 3级

**背景**:勒索软件加密企业IT系统,并通过防护不足的IT/OT管道蔓延到3级历史服务器。2级HMI开始显示连接错误。

**处理方法**:
1. 立即激活勒索软件OT IR剧本
2. 在DMZ防火墙处断开IT-OT连接(南北两侧防火墙)
3. 验证PLC仍在运行且过程稳定(PLC独立于IT运行)
4. 如果网络化HMI受影响,将操作员切换到本地HMI面板
5. 评估哪些2/3级系统被加密,哪些仍可运行
6. 优先恢复HMI可见性,然后是历史服务器,再是工程师工作站
7. 从离线备份恢复 — 未经沙箱测试,切勿尝试使用攻击者提供的工具解密
8. 按CIRCIA要求在72小时内向CISA报告

**注意事项**:不要关闭PLC来"保护"它们免受勒索软件影响 — PLC运行固件而非Windows,通常不受勒索软件影响。关闭PLC会中断物理过程。在IT侧完全修复之前,切勿重新连接IT-OT管道。

## 输出格式

```
OT事件响应报告
==============================
事件ID: OT-IR-YYYYMMDD-HHMMSS
严重程度: SEV[1-5]
类别: [类别]
状态: [活跃/已遏制/已清除/已恢复/已关闭]

时间线:
  [时间戳] - [阶段] - [操作] - [执行人]

受影响系统:
  安全系统: [状态]
  过程控制器: [状态]
  HMI/SCADA: [状态]
  历史服务器: [状态]

决策日志:
  [时间戳] - [决策] - [理由] - [批准人]

已采取的遏制措施:
  1. [操作和时间戳]

恢复状态:
  [系统] - [已恢复/待恢复] - [预计完成时间]
```

Related Skills

triaging-security-incident

9
from killvxk/cybersecurity-skills-zh

使用 NIST SP 800-61r3 和 SANS PICERL 框架对安全事件进行初始分类,确定严重性、范围和所需响应行动。 按类型对事件分类,根据业务影响分配优先级,并路由到相应的响应团队。适用于事件分类、 安全告警分类、严重性评估、事件优先级排序或初始事件分析等请求场景。

triaging-security-incident-with-ir-playbook

9
from killvxk/cybersecurity-skills-zh

使用结构化 IR Playbook 对安全事件进行分类和优先排序,确定严重性、分配响应团队并启动适当的响应程序。

performing-ransomware-response

9
from killvxk/cybersecurity-skills-zh

执行结构化的勒索软件事件响应,从初始检测到遏制、取证分析、解密评估、恢复和事后加固。 处理勒索谈判考量、备份完整性验证和法规通知要求。适用于勒索软件响应、 勒索软件恢复、加密勒索软件、数据加密攻击、赎金支付决策或勒索软件遏制等请求场景。

performing-ransomware-incident-response

9
from killvxk/cybersecurity-skills-zh

执行结构化的勒索软件事件响应,包括遏制、解密评估、从备份恢复以及根除勒索软件持久化机制。

performing-cloud-incident-containment-procedures

9
from killvxk/cybersecurity-skills-zh

在 AWS、Azure 和 GCP 中执行云原生事件遏制,包括隔离受攻陷资源、撤销凭据、保全取证证据,以及应用安全组限制以防止横向移动。

investigating-phishing-email-incident

9
from killvxk/cybersecurity-skills-zh

调查钓鱼(Phishing)邮件事件,从初始用户举报开始,经过邮件头分析、URL/附件引爆、 受影响用户识别和遏制行动,使用 Splunk、Microsoft Defender 和沙箱分析平台等 SOC 工具。 适用于收到的钓鱼邮件举报需要进行完整事件调查以确定范围和影响时。

implementing-zero-trust-with-hashicorp-boundary

9
from killvxk/cybersecurity-skills-zh

使用 HashiCorp Boundary 实现具备动态凭据代理、会话录制和 Vault 集成的身份感知零信任基础设施访问管理。

implementing-zero-trust-with-beyondcorp

9
from killvxk/cybersecurity-skills-zh

使用身份感知代理(IAP,Identity-Aware Proxy)、上下文感知访问策略、设备信任验证和 Access Context Manager,部署 Google BeyondCorp Enterprise 零信任访问控制,对 GCP 资源和内部应用强制执行基于身份和安全态势的访问。

implementing-zero-trust-network-access

9
from killvxk/cybersecurity-skills-zh

通过配置身份感知代理、微分段、基于条件访问策略的持续验证,以及在 AWS、Azure 和 GCP 环境中以 BeyondCorp 风格的架构替代传统 VPN 访问,在云环境中实施零信任网络访问(ZTNA)。

implementing-zero-trust-network-access-with-zscaler

9
from killvxk/cybersecurity-skills-zh

使用 Zscaler 实施零信任网络访问(Zero Trust Network Access,ZTNA),通过 Zscaler Private Access(ZPA)配置应用分段、访问策略和连接器,替代传统 VPN 架构

implementing-zero-trust-in-cloud

9
from killvxk/cybersecurity-skills-zh

本技能指导组织按照 NIST SP 800-207 和 Google BeyondCorp 原则在云环境中实施零信任(Zero Trust)架构,涵盖以身份为中心的访问控制、微分段(Micro-Segmentation)、持续验证、设备信任评估,以及部署身份感知代理(Identity-Aware Proxy)以消除 AWS、Azure 和 GCP 环境中的隐式网络信任。

implementing-zero-trust-for-saas-applications

9
from killvxk/cybersecurity-skills-zh

使用 CASB、SSPM、条件访问策略、OAuth 应用治理和会话控制,为 SaaS 应用实施零信任访问控制, 对云托管服务强制执行身份验证、设备合规性检查和数据保护。