# Performing Indicator Lifecycle Management

> 指标生命周期管理跟踪 IOC 从初始发现到验证、富化、部署、监控和最终停用的全过程。本技能涵盖实施 IOC 质量评估、老化策略、置信度衰减评分、误报跟踪、命中率监控和自动到期的系统化流程，以维护高质量、可操作的指标数据库，最大限度减少分析师疲劳并提高检测效能。

- Skill: `killvxk/performing-indicator-lifecycle-management` (Agent Skill, multi-file: 8 files)
- Install (CLI): `npx skillmds@latest add killvxk/performing-indicator-lifecycle-management`
- Raw SKILL.md: https://api.skillmd.com/api/skills/killvxk/performing-indicator-lifecycle-management/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: Apache-2.0
- Author: killvxk (https://skillmd.com/u/killvxk)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/killvxk/performing-indicator-lifecycle-management

---

# 执行指标生命周期管理

## 概述

指标生命周期管理跟踪 IOC 从初始发现到验证、富化、部署、监控和最终停用的全过程。本技能涵盖实施 IOC 质量评估、老化策略、置信度衰减评分、误报跟踪、命中率监控和自动到期的系统化流程，以维护高质量、可操作的指标数据库，最大限度减少分析师疲劳并提高检测效能。

## 前置条件

- Python 3.9+，安装 `pymisp`、`requests`、`stix2` 库
- 用于指标存储的 MISP 或 OpenCTI 实例
- 具备 IOC 监控列表能力的 SIEM（Splunk、Elastic）
- 了解 IOC 类型、置信度评分和 TLP 分类

## 核心概念

### 指标生命周期阶段
1. **发现**：从威胁情报、恶意软件分析或事件响应中首次识别 IOC
2. **验证**：通过富化来源（VirusTotal、Shodan）核实 IOC
3. **富化**：添加额外上下文（WHOIS、被动 DNS、威胁行为者归因）
4. **部署**：将 IOC 推送到检测系统（SIEM、IDS、防火墙）
5. **监控**：跟踪命中率、误报率和检测效能
6. **审查**：定期评估 IOC 的相关性和准确性
7. **停用**：根据老化策略使 IOC 过期或移除

### 置信度衰减
指标置信度随时间降低，因为对手会轮换基础设施。基于时间的衰减函数自动降低置信度评分，确保旧指标不会产生过多告警。典型半衰期：IP 地址（30 天）、域名（90 天）、文件哈希（365 天）。

### 质量指标
- **命中率**：生成真正告警的已部署 IOC 百分比
- **误报率**：IOC 告警中良性的百分比
- **覆盖率**：已知威胁技术中具有 IOC 覆盖的百分比
- **新鲜度**：数据库中活跃指标的平均年龄

## 操作步骤

### 步骤 1：实现 IOC 生命周期状态机

```python
from datetime import datetime, timedelta
from enum import Enum

class IOCState(Enum):
    DISCOVERED = "discovered"      # 已发现
    VALIDATED = "validated"        # 已验证
    ENRICHED = "enriched"          # 已富化
    DEPLOYED = "deployed"          # 已部署
    MONITORING = "monitoring"      # 监控中
    UNDER_REVIEW = "under_review"  # 审查中
    RETIRED = "retired"            # 已停用

class IOCLifecycle:
    def __init__(self, ioc_type, value, source, initial_confidence=50):
        self.ioc_type = ioc_type
        self.value = value
        self.source = source
        self.confidence = initial_confidence
        self.state = IOCState.DISCOVERED
        self.created = datetime.utcnow()
        self.last_updated = datetime.utcnow()
        self.last_seen = None
        self.hit_count = 0
        self.false_positive_count = 0
        self.history = [{"state": "discovered", "timestamp": self.created.isoformat()}]

    def transition(self, new_state: IOCState, reason=""):
        self.state = new_state
        self.last_updated = datetime.utcnow()
        self.history.append({
            "state": new_state.value,
            "timestamp": self.last_updated.isoformat(),
            "reason": reason,
        })

    def apply_decay(self):
        """根据 IOC 类型半衰期应用置信度衰减。"""
        half_lives = {"ip": 30, "domain": 90, "hash": 365, "url": 60}
        half_life = half_lives.get(self.ioc_type, 90)
        age_days = (datetime.utcnow() - self.created).days
        decay_factor = 0.5 ** (age_days / half_life)
        self.confidence = max(0, int(self.confidence * decay_factor))

    def record_hit(self, is_true_positive=True):
        self.hit_count += 1
        self.last_seen = datetime.utcnow()
        if not is_true_positive:
            self.false_positive_count += 1
            if self.false_positive_count > 3:
                self.transition(IOCState.UNDER_REVIEW, "误报过多")

    def should_retire(self):
        max_ages = {"ip": 90, "domain": 180, "hash": 730, "url": 120}
        max_age = max_ages.get(self.ioc_type, 180)
        age_days = (datetime.utcnow() - self.created).days
        return age_days > max_age and self.hit_count == 0
```

## 验收标准

- IOC 生命周期状态机在各阶段间正确转换
- 置信度衰减根据 IOC 类型半衰期降低评分
- 命中率和误报跟踪功能正常
- 老化策略自动标记指标进行审查/停用
- 质量指标仪表盘显示 IOC 数据库健康状态

## 参考资料

- [MISP 指标生命周期](https://www.misp-project.org/)
- [STIX 指标有效期](https://docs.oasis-open.org/cti/stix/v2.1/stix-v2.1.html)
- [IOC 质量框架](https://www.first.org/)

