4. Agent 核心功能:日志采集、元数据提取、策略匹配、阻断/放行决策

准入 Agent 是部署在终端或网络边界上的轻量级执行单元,其核心职责可抽象为一条闭环链路:采集 → 提取 → 匹配 → 决策。四个环节必须满足低延迟、高可靠、可审计三大要求,才能在不影响业务连续性的前提下,实现日志检索准入门禁的实时控制。

4.1 功能全景与模块划分

Agent 内部按功能域划分为四个独立模块,模块间通过内存管道或本地 IPC 通信,避免单点故障扩散。下表列出各模块的输入、输出与关键约束:

模块 输入 输出 关键约束
日志采集 文件、系统日志、网络流 结构化日志事件 采集延迟 ≤ 200ms;磁盘 I/O 隔离
元数据提取 结构化日志事件 增强元数据(用户、进程、地理位置等) 提取耗时 ≤ 50ms;支持自定义字段
策略匹配 增强元数据 + 策略规则集 匹配结果(命中/未命中) 规则数 ≤ 10,000 条;匹配延迟 ≤ 10ms
阻断/放行决策 匹配结果 + 上下文状态 决策动作(ALLOW / BLOCK / CHALLENGE) 决策幂等;支持回滚审计
设计要点:四个模块必须支持独立升级与降级。例如,当策略匹配模块因规则变更需要重启时,日志采集与元数据提取应继续运行,数据暂存于环形缓冲区,避免日志丢失。

4.2 日志采集:多源异构归一化

Agent 需要同时采集文件日志(如 Nginx access.log)、系统日志(如 syslog、Windows Event Log)以及网络流日志(如 NetFlow/IPFIX)。采集层采用 插件式输入 架构,每种数据源对应一个独立 Input Plugin。

  • 文件采集:基于 inotify + 偏移量持久化,支持日志轮转(logrotate)场景下的断点续采。
  • 系统日志:通过 Unix Domain Socket 或 Windows ETW 订阅实时事件,避免轮询开销。
  • 网络流:监听 UDP 端口接收流数据,使用固定大小缓冲区防止丢包。
# 日志采集配置示例(YAML 风格)
input:
  - type: file
    path: /var/log/nginx/access.log
    offset_file: /var/lib/agent/offsets/nginx.offset
    multiline_flush_interval: 5s

  - type: syslog
    protocol: unix
    path: /run/systemd/journal/syslog
    facility: ["auth", "authpriv"]

  - type: netflow
    port: 2055
    buffer_size: 65536
    timeout: 30s
避坑提示:不要在生产环境使用 glob 模式实时扫描海量日志目录。应使用白名单路径列表 + inotify 事件驱动,避免 CPU 和磁盘 I/O 被扫描操作打满。

4.3 元数据提取:上下文增强引擎

原始日志通常只包含 IP、端口、时间戳等基础字段。元数据提取模块负责将原始字段转换为安全决策所需的上下文信息,例如:将源 IP 映射为地理位置、将进程 PID 映射为可执行文件路径、将用户 ID 映射为部门与角色。

提取引擎采用 链式处理器 模式,每个处理器只负责一种元数据转换,处理器之间通过上下文对象传递数据:

  1. GeoIP 处理器:查询本地 GeoIP 数据库,输出国家、城市、ASN。
  2. 进程解析器:通过 /proc 或 Windows API 获取进程命令行、父进程、启动时间。
  3. 用户映射器:对接 LDAP/AD 或本地用户数据库,输出用户组与权限等级。
  4. 威胁情报标记器:将 IP/域名与本地威胁情报缓存比对,输出风险标签。
// 元数据提取链伪代码
public class MetadataPipeline {
    private List<Processor> processors;

    public EnhancedEvent process(RawEvent event) {
        EnhancedEvent enhanced = new EnhancedEvent(event);
        for (Processor p : processors) {
            if (!p.process(enhanced)) {
                // 处理器返回 false 表示跳过,不阻断整条链
                continue;
            }
        }
        return enhanced;
    }
}

4.4 策略匹配:规则引擎与快速检索

策略匹配模块是决策的核心。Agent 本地维护一份从管理端同步的策略规则集,每条规则包含 条件表达式 和 动作。匹配引擎需要支持以下能力:

  • 字段级匹配:支持等于、不等于、包含、正则、CIDR 范围、数值范围。
  • 逻辑组合:AND / OR / NOT 嵌套,最多支持 5 层深度。
  • 优先级裁决:高优先级规则优先匹配,同优先级下按首次命中原则。
  • 快速失效:使用布隆过滤器或前缀树对高频字段(如源 IP、用户 ID)做预过滤,减少全量规则遍历。
规则 ID 条件 动作 优先级
R001 source.ip IN 10.0.0.0/8 AND user.role != "admin" BLOCK 100
R002 dest.port == 22 AND geo.country == "CN" CHALLENGE 50
R003 threat.label CONTAINS "malware" BLOCK 200
性能基线:在 10,000 条规则、5 个匹配字段的条件下,单次匹配延迟应控制在 10ms 以内。超过该阈值时,建议启用规则编译缓存或切换为基于 rete 网络的规则引擎。

4.5 阻断/放行决策:动作执行与审计

决策模块接收策略匹配结果,结合当前 Agent 状态(如网络连接数、系统负载)做出最终动作。动作类型分为三种:

  • ALLOW(放行):日志事件正常进入 ELK 管道,不做任何拦截。
  • BLOCK(阻断):丢弃日志事件,并向管理端上报阻断记录。对于网络流日志,可联动 iptables/nftables 插入临时阻断规则。
  • CHALLENGE(挑战):将日志事件暂存至本地隔离区,要求用户进行二次认证(如 MFA)后才放行。

所有决策结果必须写入本地审计日志,格式如下:

{
  "timestamp": "2025-03-21T14:30:00.123Z",
  "agent_id": "agent-node-7",
  "event_id": "evt-9a8b7c6d",
  "decision": "BLOCK",
  "rule_id": "R001",
  "reason": "Internal IP from non-admin user",
  "action_detail": "drop_packet | log_only"
}

4.6 Agent 核心功能架构图

下图展示四个核心模块之间的数据流与依赖关系:

Agent 核心功能架构图 Agent 核心功能架构图 日志采集 文件 / syslog / 网络流 元数据提取 GeoIP / 进程 / 用户映射 策略匹配 规则引擎 / 布隆过滤器 阻断/放行决策 ALLOW / BLOCK / CHALLENGE 结构化事件 增强元数据 匹配结果 决策动作 ELK 管道 / 审计日志 模块间通过内存管道通信 延迟合计 ≤ 260ms

4.7 决策流程与状态机

决策模块内部维护一个轻量级状态机,确保每个日志事件只被处理一次且结果可追溯。状态转换如下:

决策状态机 决策状态机 PENDING MATCHING ALLOW BLOCK CHALLENGE 事件到达 规则未命中 规则命中 需二次认证 阻断后上报
幂等保证:每个事件在进入 PENDING 状态时生成全局唯一 ID(UUID v7),决策结果写入本地 RocksDB 实例。即使 Agent 崩溃重启,已决策的事件不会重复处理,未决策的事件从 PENDING 状态重新进入匹配流程。

4.8 关键设计原则总结

  • 低耦合:四个模块通过标准化事件接口交互,任一模块可独立替换或升级。
  • 可观测:每个模块暴露 Prometheus 指标(处理延迟、吞吐量、错误计数),便于 ELK 统一监控。
  • 安全优先:决策模块默认执行 白名单策略——未匹配任何规则的日志事件默认放行,但必须记录审计日志。
  • 资源隔离:日志采集使用独立线程池,元数据提取使用协程池,策略匹配使用无锁环形缓冲区,避免模块间资源争抢。