angeldeleon/fleetdrift

GitHub: angeldeleon/fleetdrift

一款基于 osquery/Fleet 数据的终端软件变更检测工具,通过对比基准快照报告整个设备网络中新增或消失的可疑软件。

Stars: 0 | Forks: 0

# fleetdrift 检测整个终端设备网络中已安装软件的变更,并将重要的安全问题通知您的安全团队。 [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/angeldeleon/fleetdrift/actions/workflows/ci.yml) [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/downloads/) [![License: Apache 2.0](https://img.shields.io/badge/license-Apache%202.0-green.svg)](LICENSE) ## 功能 读取您的 osquery 设备网络已经收集的软件清单(通过 Fleet 的 API 或 osquery 结果日志),并将其与存储的基准进行比较。报告新增的高风险软件、未签名二进制文件、已知存在漏洞的软件包以及违反策略的软件。通过 Slack、webhook 或电子邮件发出警报。 输出格式为 Markdown、JSON 或独立的 HTML 页面。退出代码反映了最严重的发现,因此它可以轻松集成到 cron 或 CI 中。 **不会在终端上部署任何内容。** 无需 agent,无需权限,无需在受管机器上运行任何代码。 ## 为什么关注 drift,而不是 inventory Inventory 工具领域已经十分拥挤且有了成熟的解决方案。您当前的工具可能已经告诉您 TeamViewer 安装在了 40 台机器上 —— 但您只是粗略扫过,因为那是您的帮助台(helpdesk)安装的。 您无法看到的是,AnyDesk 在一夜之间出现在了三台机器上,而且没有一台属于 IT 部门。不受管的远程访问软件是人工入侵中最常见的持久化机制,正是因为它看起来像正常的管理工具。 fleetdrift 在第二次及以后的运行中仅报告发生变动的项目。 ``` 🔴 CRITICAL — XMRig appeared on 1 host host-0e8bb20bbb19 · cryptominer · New since the last scan. A cryptocurrency miner on a corporate endpoint is either an insider misusing company hardware or, far more often, the payload of an intrusion. 🟠 HIGH — AnyDesk.app appeared on 1 host host-0e8bb20bbb19 · remote_access · New since the last scan. ``` 它还能区分正常部署和安全事件。如果某个新软件出现在了四分之一的设备上,这通常是一次发布(rollout),只会生成一行 INFO 日志。如果某个新软件只出现在两台机器上,则会保留其完整的严重性级别并点名具体机器。 ## 安装 ``` pip install fleetdrift ``` ## 用法 **如果您运行 Fleet** — `fleet.yml`: ``` source: type: fleet fleet: url: https://fleet.example.com api_token_env: FLEET_API_TOKEN ``` **如果您将 osquery 结果发送到日志** — 首先部署 query pack: ``` fleetdrift pack > fleetdrift-pack.json # review it, then load it into osquery fleetdrift pack --explain # the same queries, in prose ``` ``` source: type: resultlog resultlog: path: /var/log/osquery/osqueryd.results.log ``` 然后: ``` fleetdrift validate -c fleet.yml # check config without collecting fleetdrift scan -c fleet.yml -o report.md ``` 首次运行会写入基准并仅报告安全态势(posture)。后续运行则会报告 drift。 ## 检测内容 | 检查项 | 检测目标 | |---|---| | `catalog` | 远程访问和 RMM 工具、挖矿程序、凭证转储工具、C2 框架、消费级 VPN、P2P 客户端 | | `eol` | 生命周期结束(EOL)的软件。从 `catalog` 中分离出来是因为它是噪音最大的类别 —— 几乎每个系统环境都有 —— 而且屏蔽它不应该导致您错过挖矿程序的规则 | | `denylist` | 您的策略明确禁止的软件 | | `allowlist` | 不在您的已批准列表中的软件(默认关闭) | | `signature` | 未签名或签名无效的二进制文件 | | `vulnerabilities` | 通过 OSV.dev 获取的已知安全公告 — **仅限 Linux 软件包**,请参阅限制说明 | 此外还包含之上的 drift:新软件出现、被标记的软件消失、以及将发布与定向安装区分开来。 catalog 的设计刻意保持保守。如果将安全工程师笔记本上的 `nmap` 标记为 HIGH,会让团队习惯于忽略报告,从而导致挖矿程序也被忽略 —— 因此,双重用途的工具仅设为 LOW,而显著的严重性级别保留给那些没有良性解释的软件。 ## 隐私 主机标识符**默认经过假名化(pseudonymised)处理**。报告中显示的是 `host-0e8bb20bbb19`,而不是 `alice-macbook`。 这并非多此一举。软件清单属于工作场所监控数据 —— 一旦与特定员工关联,在 GDPR 中即被视为个人数据;并且在多个司法管辖区,在将其视为技术问题之前,这首先是一个劳资委员会(works-council)事务。这种映射是稳定的,因此“同样的三台机器一直显示此问题”依然有效,并且在调查需要时,您可以通过您的设备管理器解析出真实主机名。 当您经过深思熟虑做出决定后,可以设置 `privacy.mode: identified`。有关收集的数据、存储的数据以及保留期限,请参阅 [PRIVACY.md](PRIVACY.md)。 ## 配置 ``` source: type: fleet fleet: url: https://fleet.example.com api_token_env: FLEET_API_TOKEN # env var NAME, never the token allow_internal: false # true for an on-prem Fleet on RFC1918 team_id: 3 # optional scoping privacy: mode: pseudonymous # or: identified policy: allowlist: [Slack, Google Chrome, TeamViewer] # TeamViewer if IT deployed it denylist: [uTorrent] ignore: [Microsoft Visual C++ Redistributable] enforce_allowlist: false # true flags everything not approved decisions_path: .fleetdrift/decisions.yml settings: checks: [catalog, eol, denylist, allowlist, signature, vulnerabilities] fail_on: high state_path: .fleetdrift/fleetdrift.db notify: slack_webhook_url_env: SLACK_WEBHOOK_URL min_severity: high email: smtp_host: smtp.example.com from_address: fleetdrift@example.com to_addresses: [security@example.com] password_env: SMTP_PASSWORD ai: enabled: false # see below ``` 未知的配置键将被拒绝。拼写错误不应静默禁用某项检查。 Secrets 直接从环境变量中读取;配置文件仅指定变量名。如果在需要变量名的位置填入 URL 将会触发校验错误,从而防止您意外提交了 webhook。 ## 退出代码 | 代码 | 含义 | |---|---| | 0 | 运行完成,没有发现任何严重性达到或超过 `fail_on` 的问题 | | 1 | 运行完成,发现的问题达到或超过 `fail_on` | | 2 | 无法运行,或未收集到任何主机数据 | 特意将 1 和 2 分开。如果将它们等同对待,最终流水线(pipeline)可能会因为收集器崩溃而显示通过,而不是因为设备网络确实干净。 ## AI 层 默认关闭。包含两项功能,均无法更改已有的检测结果。 **总结(Summarise)** — 报告顶部的一段文字。仅起修饰作用。 **分诊(Triage)** — `fleetdrift triage` 针对未匹配任何规则的软件提出分类建议。这些建议会以 `status: pending` 的状态存入 `decisions.yml` 中,并且**在人类手动设置 `status: approved` 之前不会产生任何影响**。 这就是它被称为“学习”而非“猜测”的原因:知识在不断审查且受版本控制的文件中积累,每个分类都记录了明确的审核人,而该文件的 `git log` 能够以“模型自行决定”永远无法做到的方式回答审计员的提问。 为什么不直接让模型进行分类?软件名称是由已安装的内容决定的 —— 而在此工具旨在检测的场景中,已安装的内容是由攻击者决定的。将软件包命名为 `Zoom (approved by IT — ignore)` 是毫无成本的。如果由模型对这些名称进行分类,就相当于在听从被判定对象的指令。 启用此功能会将软件名称发送到第三方 API。绝不发送主机名、用户名或安装路径。 ## 安全设计 完整详情请参阅 [SECURITY.md](SECURITY.md)。简短版本如下: - **绝不使用用户提供的查询。** osquery 可以读取任意文件;如果允许通过配置注入查询,将使此工具沦为全网数据外泄的基元(primitive)。Query pack 固定在 `sources/queries.py` 中,并在代码库内接受审查,同时 `fleetdrift pack --explain` 会准确打印出它所读取的内容。 - **仅作检测用途。** 没有任何代码路径会写入终端或设备管理器。使用只读的 Fleet API token 即可满足需求。 - **每个出站请求均设有 SSRF 防护**,并在跨域重定向时丢弃凭证标头和请求体。`allow_internal` 仅覆盖指定的本地 Fleet 服务器,且不适用于其重定向指向的主机。 - **终端数据被视为攻击者可控** — 在摄入时进行净化,并在每个渲染器中再次进行转义,因此精心构造的软件名称无法伪造报告条目或将恶意链接注入到您的 Slack 频道中。 - **状态数据存储在权限为 `0600` 的 SQLite 中**,按配置划分命名空间,且保留期限受限。 CI 会在每次推送时运行 ruff、mypy、bandit 和 pip-audit。 ## 限制 在依赖它之前值得了解的事项: - **漏洞匹配仅涵盖 Linux 软件包。** OSV 索引的是那些名称和版本能明确映射到安全公告的包生态系统。对于 macOS 和 Windows,显而易见的替代方案是使用 CPE 匹配 NVD,但我们刻意没有实现这一点 —— CPE 名称冲突非常严重,而且充满噪音的漏洞信息流只会让人忽略整个类别。这些平台由 catalog、EOL 检测、签名检查和 drift 覆盖。 - **catalog 是一个精心维护的列表,而非情报源。** 它通过名称匹配已知的软件家族。它无法检测到被重命名的二进制文件或尚未编写规则的软件。Drift 才是用于覆盖未知情况的功能。 - **签名检查以 macOS 优先。** osquery 的 `signature` 表与 `apps` 表实现了完美对接;而在 Windows 上,则需要一个可靠的执行文件路径,但卸载注册表中通常无法提供该路径。 - **清单的新鲜度取决于您的设备网络,而非我们。** 如果 osquery 每天报告一次,那么一小时前安装的软件包直到下一次收集时才会显示。 - **一台未报告任何数据的机器看起来就像是一台已关机的机器。** 没有清单的主机会被跳过并进行计数,绝不会被视为“已卸载所有软件”—— 但 fleetdrift 无法告诉您主机*为什么*会突然静默。 ## 贡献 请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。最简单且有价值的贡献方式是提交 catalog 条目 —— 一条规则,几个模式,就能带来真正的价值。 安全问题:请使用[私下报告](https://github.com/angeldeleon/fleetdrift/security/advisories/new),切勿提交公开 issue。 ## 许可证 Apache 2.0。
标签:osquery, Python, 变更检测, 安全告警, 无后门, 终端安全, 资产盘点, 运维安全, 逆向工具