第229篇:终端检测与响应(EDR)在网络侧联动

关键词:EDR、终端检测、威胁响应、网络联动、SOAR、威胁狩猎、IOC、自动化响应

一、引言

EDR(Endpoint Detection and Response,终端检测与响应)专注于终端层面的威胁检测和响应。然而,仅靠 EDR 无法解决网络层面的安全问题。当 EDR 检测到终端感染时,网络侧设备(防火墙、交换机、WAF)需要快速联动,对威胁进行隔离和阻断,形成"检测-响应-处置"的完整闭环。

EDR 与网络侧设备的联动,是将终端安全与网络安全打通的关键。

二、核心概念

2.1 EDR 核心能力

能力 说明 实现方式
数据采集 采集终端进程、文件、注册表、网络连接等数据 内核驱动/ETW
行为分析 分析进程行为链、父子进程关系 规则引擎/ML
威胁检测 识别恶意行为、攻击链 签名+行为+AI
事件关联 关联多终端事件发现横向移动 图分析
响应处置 隔离终端、终止进程、删除文件 Agent 下发指令
取证调查 保留事件证据、时间线重建 日志归档

2.2 EDR 与网络设备联动架构

EDR 与网络设备联动架构 - 图示

2.3 IOC 类型与联动

IOC 类型 示例 网络侧处置
恶意 IP 185.220.101.1 防火墙阻断出站/入站
恶意域名 evil-c2.com DNS 拦截、域名黑名单
恶意 URL evil.com/payload.exe URL 过滤阻断
恶意文件哈希 SHA256:abc123... 防火墙文件过滤
恶意邮箱 attacker@evil.com 邮件网关拦截
恶意证书指纹 SSL 证书 SHA1 SSL 检测阻断

三、技术细节

3.1 EDR 事件到网络响应的自动化流程

EDR 事件到网络响应的自动化流程 - 图示

3.2 SOAR Playbook 编排

Playbook 名称 触发条件 自动化动作
勒索软件响应 EDR检测到勒索行为 隔离终端、阻断C2 IP、通知管理员
C2 通信阻断 EDR检测到C2连接 防火墙阻断IP/域名、DNS拦截
横向移动处置 EDR检测到SMB暴力破解 隔离源终端、阻断目标端口
数据外泄响应 EDR检测到大量数据传出 阻断外联、隔离终端、取证
钓鱼邮件处置 EDR检测到恶意宏执行 邮件撤回、终端隔离、用户通知

3.3 网络侧联动接口

接口类型 协议 用途
REST API HTTPS 防火墙策略下发
Syslog UDP/514 EDR 日志上报
STIX/TAXII HTTPS 威胁情报共享
SNMP Trap UDP/162 网络设备告警
Netconf SSH 交换机策略配置
RADIUS CoA UDP/3799 动态端口隔离

四、实战配置/案例分析

4.1 华为 iMaster SecoManager 联动配置

# 1. 在防火墙上配置威胁情报联动
# 启用威胁情报功能
threat-intelligence
 enable

 # 配置EDR平台地址(接收IOC同步)
 source edr_platform
  server 10.1.1.160
  protocol rest
  auth-mode token
  token cipher EDR@Token@2024
  sync-interval 60
  # 同步的IOC类型
  ioc-type ip domain url file-hash
 quit
quit

# 2. 配置防火墙自动策略更新
# 当收到EDR的恶意IP时自动添加阻断策略
security-policy
 rule name Auto_Block_EDR_IP
  source-zone any
  destination-zone any
  # 动态地址对象,由EDR平台更新
  destination-address dynamic-edr-malicious-ip
  action deny
  log-action enable
  statistics enable
 quit

 rule name Auto_Block_EDR_Domain
  source-zone any
  destination-zone any
  destination-domain dynamic-edr-malicious-domain
  action deny
  log-action enable
 quit
quit

# 3. 配置交换机端口隔离联动
# 当EDR判定某终端感染时,通过RADIUS CoA隔离端口
# (需要在交换机上启用RADIUS动态授权)
radius
 scheme edr_radius
  primary accounting 10.1.1.200
  # 启用CoA支持
  coa enable
 coa key cipher CoA@2024
 quit
quit

aaa
 domain edr_isolation
  radius-server scheme edr_radius
 quit
quit

interface GigabitEthernet0/0/1
 # 支持RADIUS动态授权变更
 port-authen dot1x enable
 port-authen radius coa enable
quit

# 4. 配置防火墙与EDR的事件上报
# 防火墙将安全事件上报到EDR平台
security-log
 server-group edr_log_server
  server 1
   address 10.1.1.160
   protocol syslog
   port 514
   format cef
  quit
 quit
quit

4.2 SOAR 自动化编排脚本(Python)

#!/usr/bin/env python3
"""
EDR-网络联动自动化响应脚本
当EDR检测到高威胁事件时,自动在网络侧执行阻断
"""
import requests
import json
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# 配置
FW_API_URL = "https://10.1.1.10:8443/api/v2"
FW_TOKEN = "firewall_api_token"
SW_API_URL = "https://10.1.1.11:8443/api/v2"
SW_TOKEN = "switch_api_token"
EDR_API_URL = "https://10.1.1.160:8443/api/v1"
EDR_TOKEN = "edr_api_token"


def get_threat_details(edr_event_id):
    """从EDR获取威胁详情"""
    headers = {"Authorization": f"Bearer {EDR_TOKEN}"}
    resp = requests.get(
        f"{EDR_API_URL}/events/{edr_event_id}",
        headers=headers
    )
    return resp.json()


def block_ip_on_firewall(ip_address, reason):
    """在防火墙上阻断IP"""
    headers = {
        "Authorization": f"Bearer {FW_TOKEN}",
        "Content-Type": "application/json"
    }
    payload = {
        "rule_name": f"EDR_Block_{ip_address}",
        "source_zone": "any",
        "destination_zone": "any",
        "destination_address": ip_address,
        "action": "deny",
        "description": f"EDR联动阻断: {reason}",
        "auto_generated": True
    }
    resp = requests.post(
        f"{FW_API_URL}/security-policy/rules",
        headers=headers,
        json=payload
    )
    logger.info(f"防火墙IP阻断: {ip_address}, 状态: {resp.status_code}")
    return resp.status_code == 200


def block_domain_on_firewall(domain, reason):
    """在防火墙上阻断域名"""
    headers = {
        "Authorization": f"Bearer {FW_TOKEN}",
        "Content-Type": "application/json"
    }
    payload = {
        "domain": domain,
        "action": "block",
        "description": f"EDR联动阻断: {reason}",
        "auto_generated": True
    }
    resp = requests.post(
        f"{FW_API_URL}/dns-filter/blacklist",
        headers=headers,
        json=payload
    )
    logger.info(f"防火墙域名阻断: {domain}, 状态: {resp.status_code}")
    return resp.status_code == 200


def isolate_switch_port(mac_address, reason):
    """在交换机上隔离端口"""
    headers = {
        "Authorization": f"Bearer {SW_TOKEN}",
        "Content-Type": "application/json"
    }
    payload = {
        "mac_address": mac_address,
        "action": "isolate",
        "vlan_id": 999,  # 隔离VLAN
        "description": f"EDR联动隔离: {reason}"
    }
    resp = requests.post(
        f"{SW_API_URL}/port-isolation",
        headers=headers,
        json=payload
    )
    logger.info(f"交换机端口隔离: {mac_address}, 状态: {resp.status_code}")
    return resp.status_code == 200


def edr_auto_response(edr_event_id):
    """EDR事件自动化响应主流程"""
    # 1. 获取威胁详情
    threat = get_threat_details(edr_event_id)
    logger.info(f"威胁事件: {threat.get('event_type')}, "
                f"终端: {threat.get('endpoint_name')}, "
                f"严重度: {threat.get('severity')}")

    # 2. 仅处理高严重度事件
    if threat.get('severity') not in ['high', 'critical']:
        logger.info("严重度不足,跳过自动响应")
        return

    results = {}

    # 3. 阻断恶意IP
    for ip in threat.get('malicious_ips', []):
        results[f"fw_block_{ip}"] = block_ip_on_firewall(
            ip, threat.get('event_type')
        )

    # 4. 阻断恶意域名
    for domain in threat.get('malicious_domains', []):
        results[f"fw_block_{domain}"] = block_domain_on_firewall(
            domain, threat.get('event_type')
        )

    # 5. 隔离受感染终端
    mac = threat.get('endpoint_mac')
    if mac:
        results["switch_isolate"] = isolate_switch_port(
            mac, threat.get('event_type')
        )

    logger.info(f"联动响应结果: {results}")
    return results


if __name__ == "__main__":
    event_id = "edr_event_20240101_001"
    edr_auto_response(event_id)

4.3 故障排查案例:EDR 联动隔离误伤正常终端

故障现象:EDR 检测到一台终端存在可疑行为并触发自动隔离,但后续调查确认该终端运行的是合法的系统更新程序,属于误报。被隔离的终端影响了正在进行的生产维护工作。

排查步骤:

  1. 查看 EDR 告警详情
# 登录EDR管理平台查看告警
# 事件ID: EDR-2024-0115-0023
# 终端: PC-WinAdmin-015
# 检测类型: 可疑PowerShell执行
# 行为: 执行PowerShell下载远程脚本
# 严重度: High
# 处置: 已自动隔离
  1. 分析根因
  2. 管理员使用 PowerShell 执行了系统补丁批量下载脚本
  3. EDR 的行为检测规则将"PowerShell + 远程下载"判定为潜在的恶意脚本执行
  4. 该行为模式与常见的恶意软件下载载荷相似
  5. 自动响应 Playbook 判定为高威胁,直接执行了网络侧隔离

  6. 解决方案

# 方案1: 将合法管理员终端加入EDR白名单
# 在EDR管理平台:
# 终端白名单添加:PC-WinAdmin-015
# 白名单规则:排除PowerShell远程下载检测

# 方案2: 调整Playbook,高威胁需要人工确认
# 在SOAR平台修改Playbook:
# 严重度=High 的事件改为"人工确认后自动响应"
# 仅严重度=Critical 的事件执行自动隔离

# 方案3: 配置EDR告警分级联动
# 在SecoManager联动配置中:
# - Critical: 自动隔离+网络阻断
# - High: 通知管理员+网络限速(不隔离)
# - Medium: 仅记录+通知
# - Low: 仅记录

# 方案4: 在防火墙上配置白名单策略(管理员IP优先放行)
security-policy
 rule name Admin_White
  source-zone trust
  destination-zone any
  source-address admin-server-group
  action permit
  log-action enable
 quit

 rule name EDR_Auto_Block
  source-zone any
  destination-zone any
  destination-address dynamic-edr-malicious-ip
  action deny
  log-action enable
 quit
quit

# 紧急恢复被误隔离的端口
# 在交换机上手动恢复
interface GigabitEthernet0/0/15
 port-authen dot1x re-enable
quit

五、总结

知识点 要点
EDR 能力 终端行为检测、事件关联、响应处置
联动架构 EDR → SOAR → 防火墙/交换机
IOC 联动 IP、域名、URL、文件哈希同步
自动化响应 SOAR Playbook 编排
联动接口 REST API、Syslog、STIX/TAXII、CoA
误报处理 白名单、分级联动、人工确认
华为方案 iMaster SecoManager + CSF + USG

思考

  1. EDR 自动联动网络侧隔离终端可能误伤业务,如何设计"安全但可控"的自动化策略?
  2. 当 EDR 和网络侧设备(如防火墙)对同一事件给出不同判定结果时,应该以哪个为准?
  3. 在没有 SOAR 平台的中小型企业,如何实现 EDR 与防火墙的基本联动?

下篇预告:第230篇:数据防泄漏(DLP)的网络侧实现