本页所有数值均为早期访问阶段测量得到的典型区间,采自启用了 SIP 的、经过公证的
EDRApp.app 构建版本。macOS 端点的数据量取决于工作负载:一台运行构建、容器和 IDE
的开发者笔记本产生的 file_open 流量,远高于自助终端或高管的收发邮件与浏览网页的机器。
请将这些数值视为规划基线,而非 SLA。受支持的操作系统矩阵参见
系统要求。每个端点的事件速率
macOS 采集器订阅 12 种 Apple Endpoint Security (ES) 事件类型(大多为 NOTIFY; 少数为用于 Agent 自我保护的 AUTH),外加一个每条流的网络数据源,并将它们以 JSON 行的 形式输出,由转发器发送到 Hilt 的edr-collector。数据量极大程度上由 file_open 主导
——单台 macOS 主机通常每分钟发出数千条 ES 事件,其中绝大多数是文件打开。Apple
自身的框架指南也指出,macOS 每台主机每分钟会发出数千条 ES 事件,我们的实时数据也印证了这一点。
下表展示了一台已注册的开发者 Mac(Zin's MacBook Pro,Apple Silicon)的一个代表性
15 分钟窗口,已归一化为每分钟速率。file_open 约占全部遥测的 95% 以上。
为何
file_open 会占主导。 进程对文件系统的每一次访问——动态库加载、字体与缓存读取、
plist 查找、IDE 索引、Spotlight、包管理器——都会表现为一次打开/创建。一台繁忙的开发者机器
在编译或运行容器时,file_open 会在短时间内飙升至每分钟数万条。这正是采集器在任何数据
离开主机之前先施加积极的用户态过滤的原因(参见
Agent 过滤)。
低频事件才是高价值信号。 exec 携带 argv、签名标识(signing_id、team_id、
cdhash)以及 code_signature 信任判定;btm_add 表示注册了一个启动 agent/守护进程
或登录项(持久化);xattr_set/xattr_delete 是 Gatekeeper 隔离标记篡改;
signal 是一次终止尝试。这些事件在数据量上几乎不占份额,却正是检测工程师会去查询的事件。
完整字段清单参见
事件数据模型。
事件量分布
由于分布如此偏斜,容量规划本质上就是一个file_open 问题。一台 Mac 发送的事件中,大约
每 20 条就有 19 条是文件打开;其余所有事件加起来——进程、网络、持久化、设备、signal、
xattr——只占百分之几。
一个实际的推论:调优
file_open 过滤器是控制端点 CPU 和摄取带宽的单一最高杠杆手段。
其他事件族即使全部启用,也不会实质性地拨动数据量的指针。
System Extension 的 CPU 与内存占用
采集器以经过公证的 macOS 应用EDRApp.app 形式发布,其中内嵌两个在用户态运行的
Apple System Extension(不存在内核扩展):
ESensor—— Endpoint Security system extension。这是订阅上述 ES 事件的遥测传感器。 bundle id 为Hilt.EDRApp.ESensor。NetFilter—— 一个 NetworkExtension 内容过滤 system extension,提供每条流的网络归因。 bundle id 为Hilt.EDRApp.NetFilter。
csrutil disable、SIP 保持启用),其占用与普通的加固
用户态进程相当。
关于占用的说明。
- macOS 在扩展的消息队列上同步投递 ES 事件。传感器的任务是快速分类、过滤并入队,从而绝不
成为繁忙机器的瓶颈。内存主要被每进程缓存和签名标识缓存占用,它们让辅助进程可以折叠归并到
其所属应用(例如
Google Chrome Helper→Google Chrome),并传播responsible_pid/session_id。 - 上述数值针对的是仅 NOTIFY 的遥测模式。Agent 会将少数事件订阅为 AUTH
(
signal、unlink、rename),纯粹用于自我保护(它可以拒绝对自身的篡改);由于这些 事件罕见,AUTH 处理增加的稳态开销可以忽略,但它确实会让传感器对这些特定操作保持在同步决策 路径上。 - CPU 随未过滤的
file_open速率而扩展,而非随发送数据量——昂贵的工作在于检视这股洪流。 过滤发生在序列化之前,因此收紧过滤器可以同时降低 CPU 和带宽。
这些是早期访问阶段的测量值。采集器不会对 System Extension 本身施加硬性的 CPU 或内存上限;
扩展的生命周期由 Apple 管理。如果你的主机群策略需要严格上限,请与你的客户团队协调——设备端资源
上限不属于早期访问阶段的发布模型。
网络带宽
转发器以批量、压缩、出站的 HTTPS 将事件发送到所配置的 Hilt 摄取端点。不存在入站套接字, 也不存在 phone-home——只有指向那一个已配置端点的出站 HTTPS(参见 网络与安全)。 带宽同样是过滤之后file_open 数据量的函数。每个事件都是一行紧凑的 JSON;占主导的
file_open 记录很小(路径、标志、行为主体、签名标识、应用归因)。批处理与压缩正是让这股洪流
在网络上变得可承受的关键。
是什么推高了网络成本。
- 压缩在此类负载上通常能达到很高的压缩比,因为事件 JSON 高度重复(相同的路径、bundle id 和签名标识反复出现),因此压缩后的出站流量只是原始行数据量的一小部分。
- 批处理摊薄了 TLS 与请求开销:事件被累积后一并刷出,而不是每个事件一次请求,这使得连接 开销在数据量上升时保持平稳。
- 过滤优先——由于积极的用户态
file_open过滤在转发器看到任何事件之前就已运行,网络上的 字节反映的是过滤后的数据量,而非原始的 ES 洪流。
采集器层如何随主机数量扩展
在服务端,macOS 主机流经与 Linux 相同的管道,并配以 macOS 专属的富化平台:1
转发器 → edr-collector
每台 Mac 的转发器 LaunchDaemon 将压缩的 HTTPS 批次发送到 Hilt 的
edr-collector。连接为仅出站、长连接/批量,因此采集器看到的请求速率与主机数量成正比,
而非与原始事件速率成正比。2
edr-collector → MSK Kafka
采集器按类别将事件路由到 MSK Kafka 主题:
dag.endpoint.exec、dag.endpoint.file 和 dag.endpoint.net。由于
file_open 占数据量的 95% 以上,dag.endpoint.file 主题承载了绝大部分分区负载,
应最先进行容量规划。3
富化(ENRICH_PLATFORM=macos)
富化服务消费这些主题,标注代码签名信任与应用归因,并规范化记录。这是随主机群聚合事件数/秒
而扩展的消费者层。
4
ClickHouse(endpoint_events)
富化后的行落入专门构建的、macOS 原生的
endpoint_events 表。存储与查询成本随主机群总事件量
而扩展——同样由 file_open 主导。5
仪表盘
macOS 主机会出现在 Collectors 主机群视图中,并带有 macOS
主机类型徽章,同时也出现在 Investigate、Networks、Files 和 Users 视图中。
- 决定该层规模的是聚合数据量,而不仅仅是主机数量。 一个粗略的主机群估算方法:将主机数量乘以 每台主机的稳态速率(混合工作站主机群可用 ~5,000–15,000 事件/min,开发者密集型群体则要高得多), 得到用于 Kafka 分区和富化消费者容量规划的聚合事件数/秒。仅一台参考 Mac 在活跃的开发者使用期间, 就在 15 分钟内产生了约 844,000 行(约 940/秒)——因此重度主机在估算中占主导。
- 优先为
file_open路径规划容量。 由于分布如此偏斜,dag.endpoint.file分区以及以文件 事件为键的 macOS 富化消费者,是最先饱和的组件。exec/net路径相对轻量。 - 出站流量受压缩约束。 服务端摄取带宽随上文压缩后的每台主机出站流量线性扩展;macOS 主机在 采集器上不存在扇出放大。
- 每台主机的富化成本是均匀的。 每个 macOS 事件都携带相同的代码签名与应用归因富化,因此富化 CPU 干净地跟随聚合事件速率——不存在主机特定的富化热点。
调优杠杆
当主机群的数据量或出站流量高于预算时,可用的杠杆按杠杆效应从大到小排列如下:- 收紧
file_open过滤。 这占数据量的 95% 以上;排除高频变动的缓存和构建目录,是对端点 CPU 和出站流量同时的单一最大幅度削减。参见 Agent 过滤。 - 限定进程事件的范围。
exec/fork本已是低数据量;大多数主机群无需采取任何措施,但它们是 每字节信号价值最高的事件,通常应保持开启。 - 保留安全长尾事件的开启状态。
btm_add、xattr_set/xattr_delete、mount和signal都是事件驱动且罕见的——它们增加的数据量可忽略,却提供了持久化、隔离标记篡改、可移动 介质和终止尝试的可见性。
本采集器不做什么
与 macOS 采集器设计的其余部分保持一致:- 不对 System Extension 施加设备端资源上限。 扩展的生命周期由 Apple 管理;采集器不会像
Linux VM 安装程序对 systemd 单元那样,对 ES 扩展施加硬性的
CPUQuota/MemoryMax。设备端 资源上限不属于早期访问模型。 - 不存在入站侦听器。 带宽严格为出站、批量、压缩的 HTTPS,指向那一个已配置的摄取端点——不存在 需要规划容量的入站套接字,也不存在 phone-home。
- 不进行原始数据包捕获。 网络带宽反映的是
net_flow连接元数据(目标、端口、字节数、 bundle id),而非载荷——因此网络遥测只为数据量增加约 1–2%,绝不会带来数据包捕获规模的负载。 - 不发送文件内容。
file_open是元数据(路径、标志、行为主体、签名标识);采集器从不读取或 发送文件内容,因此文件数据量受事件数量约束,而非文件大小。
macOS 采集器处于早期访问阶段。这些页面中描述的、启用 SIP 的经公证
.pkg 安装方式是目标
发布模型;macOS 上尚不提供自动更新和设备端隔离响应。随着主机群规模超越早期访问阶段的部署,容量
规划数值将会更新。