osquery 5 发布:macOS 端集成 EndpointSecurity 框架

osquery 5.0.1 版本正式发布,引入基于 EndpointSecurity 的进程事件表,提升 macOS 端点可见性。本文详细介绍 EndpointSecurity 集成方法、使用教程及从 4.x 迁移到 5.x 的注意事项。

宣布 osquery 5:现支持 macOS 的 EndpointSecurity

Sharvil Shah
2021 年 11 月 10 日
osquery, engineering-practice, open-source
原文发布于 2021 年 10 月 6 日

TL;DR:osquery 5.0.1 版本现已发布。osquery 是一款跨平台开源端点可见性代理,此版本引入了基于 EndpointSecurity 的 macOS 进程事件表,是项目的重要里程碑。阅读下文,了解如何将 EndpointSecurity 集成到 osquery 中,以及如何在组织内开始使用。

Apple 对 macOS 安全的新规则

多年来,Apple 逐步借鉴 iOS 的策略加强 macOS 安全性。五年前,从 OS X 10.11 El Capitan 引入系统完整性保护(SIP)开始,限制了 root 用户的权限。此后,Apple 加速推进 macOS 安全改进,引入了更严格的 GateKeeper 要求,并强制实施代码签名、应用二进制文件和软件包公证。

Entitlements 是另一项强化 macOS 安全的功能。由 Apple 授予并嵌入相应的代码签名,entitlement 允许应用或二进制文件使用受限的 API 或框架。这些新的锁定 API 替代了以前仅在内核模式“内核扩展”中可用的 API。作为仅用户模式的可执行文件,osquery 项目已经很好地适应了这些新 API,遵循了许多平台采用的内核外操作系统完整性趋势。

什么是 EndpointSecurity?

Apple 在最近的 macOS 版本中逐渐弃用了内核扩展。为替代内核扩展,Apple 开发了 EndpointSecurity 框架和 API。结合所需的 entitlements,EndpointSecurity 框架使用户模式进程能够实时订阅来自 macOS 内核的事件。EndpointSecurity 替代了内核模式授权框架 kauth 和用于从内核获取审计跟踪的传统框架 OpenBSM。

与 OpenBSM 相比,EndpointSecurity 更可靠、性能更高,并且据称能捕获更多进程事件。有关 EndpointSecurity 的深入评测,请查看我们的 Sinter 博客文章,这是我们团队对 EndpointSecurity 的首次演示。

这些安全功能对最终用户大有裨益。我们在改造 osquery(一直作为基本独立的 CLI 可执行文件部署)时,经历了陡峭的学习曲线,需要适应新的签名和打包流程,但我们认为这些努力是值得的。

如何使用 osquery 与 EndpointSecurity:迷你教程

随着 osquery 5.0.1 版本的发布,我们实现了 es_process_events 表。在跟随教程操作之前,请先检查此表的模式。

在 osqueryi 中操作

开始使用 osquery 的最简单方法是使用 osqueryi,即交互式 osquery shell。从 osquery.io 下载官方的 macOS 安装程序包,并像安装其他应用一样进行安装。

在 5.0.1 版本中,osquery 现在以应用包的形式安装在 /opt/osquery/lib/osquery.app 中,osqueryi 是 /usr/local/bin 中的一个符号链接。

接下来,在系统偏好设置中授予终端模拟器应用(无论是 Terminal.app、iTerm2.app 还是其他终端模拟器)“完全磁盘访问”权限。完全磁盘访问是 Apple 的透明同意与控制(TCC)框架的一部分,这是另一项 macOS 安全功能,并且是启用 EndpointSecurity 所必需的。在下一节中,我们将解释如何为注册了移动设备管理(MDM)解决方案的 Mac 自动授予此权限。

最后,以 root 权限运行 osqueryi,并提供 --disable_events=false--disable_endpointsecurity=false 标志,以交互方式启动 osquery,启用临时事件和基于 EndpointSecurity 的 es_process_events 表。

以下是 osqueryi 捕获自上次启动以来发生的最近进程事件的示例。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
➜  ~ sudo osqueryi --disable_events=false --disable_endpointsecurity=false
Using a virtual database. Need help, type '.help'
osquery> .mode line
osquery> select * from es_process_events;

        version = 4
        seq_num = 178
 global_seq_num = 574
            pid = 8522
           path = /Applications/Xcode.app/Contents/Developer/usr/share/xcs/Nginx/sbin/nginx
         parent = 1
original_parent = 1
        cmdline = /Library/Developer/XcodeServer/CurrentXcodeSymlink/Contents/Developer/usr/share/xcs/Nginx/sbin/nginx -c /Library/Developer/XcodeServer/CurrentXcodeSymlink/Contents/Developer/usr/share/xcs/xcsnginx/xcsnginx.conf
  cmdline_count = 3
            env = XPC_SERVICE_NAME=com.apple.xcsnginx PATH=/usr/bin:/bin:/usr/sbin:/sbin XPC_FLAGS=1 LOGNAME=_xcsnginx USER=_xcsnginx HOME=/var/_xcsnginx SHELL=/bin/false TMPDIR=/var/folders/xl/xl5_qxqd1095w75dfmq92c4w0000f3/T/
      env_count = 8
            cwd = /Applications/Xcode.app/Contents/Developer/usr/share/xcs/Nginx
            uid = 451
           euid = 450
            gid = 450
           egid = 450
       username = _xcsnginx
     signing_id = com.apple.nginx
        team_id =
         cdhash = 7fde0ccc9dcdb7d994e82a880d684c5418368460
platform_binary = 1
      exit_code =
      child_pid =
           time = 1631617834
     event_type = exec


        version = 4
        seq_num = 193
 global_seq_num = 552
            pid = 8077
           path = /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/Metadata.framework/Versions/A/Support/mdworker_shared
         parent = 1
original_parent = 1
        cmdline =
  cmdline_count = 0
            env =
      env_count = 0
            cwd =
            uid = 501
           euid = 20
            gid = 20
           egid = 20
       username = sharvil
     signing_id = com.apple.mdworker_shared
        team_id =
         cdhash = 993abbb7ffcd0d3216808513f8212f4fa1fa07d7
platform_binary = 1
      exit_code = 9
      child_pid =
           time = 1631617820
     event_type = exit

为 MDM 管理的 Mac 部署 PPPC 配置文件

虽然 osqueryi 是交互式内省、监控和开发适合环境的查询的优秀工具,但大多数 osquery 部署是以守护进程模式配合配置文件进行的。

对于注册了 MDM 的 Mac 主机,可以通过推送隐私偏好策略控制(PPPC)配置配置文件自动且静默地授予完全磁盘访问权限。对于此配置文件,您需要 systemPolicyAllFiles 键(授予完全磁盘访问权限)和 CodeRequirement 键。

使用 codesign 工具输出 CodeRequirement,并复制输出中“designated =>”之后的所有内容。

1
2
3
4
5
6
> codesign  -dr - /opt/osquery/lib/osquery.app/Contents/MacOS/osqueryd
Executable=/opt/osquery/lib/osquery.app/Contents/MacOS/osqueryd
designated => identifier "io.osquery.agent" and anchor apple generic and
certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate
leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate
leaf[subject.OU] = "3522FA9PXF"

要完成 systemPolicyAllFiles,标识符应为 io.osquery.agent,标识符类型应为 bundleID

综合以上,以下是一个完整的 PPPC 配置文件的示例,授予 osquery 完全磁盘访问权限。请注意,您需要更新 PayloadOrganization 和其他相关字段(此处以粗体显示)。

您可能需要查阅 MDM 提供商的文档以获取有关 PPPC 配置文件的更多信息。

从 osquery 4.x 迁移到 5.x

随着 5.0.1 版本的发布,osquery 现在在 macOS 上以应用包的形式安装在 /opt/osquery/lib/osquery.app 中,新的包标识符是 io.osquery.agent。如果您从 4.9 版本升级 osquery,需要停止 osquery launchd 服务,并在安装 5.0.1 版本后重新启动它,因为 osquery 本身不提供清理旧版本工件、二进制文件和配置文件的机制。另外需要注意的是,包安装程序不会安装 LaunchDaemon 来启动 osqueryd。您可以使用提供的 osqueryctl start 脚本复制示例 LaunchDaemon plist 和相关配置来启动 osqueryd 守护进程。

类似的更改适用于 Linux 和 Windows 主机。请查阅 osquery wiki 上的安装指南以了解更多信息。

更强大的基础

我们快速开发了一个带有 EndpointSecurity 集成的 osquery 工作概念验证;实际上,我们在 5.0.1 版本发布前几个月就将该功能合并到了 osquery 中。但要实际“开启” EndpointSecurity 功能,我们必须克服大量的技术债务:

  • 迁移到具有兼容 macOS 版本的 CI 运行器
  • 更新构建的 SDK 要求并放弃 macOS 10.11 支持
  • 完全重新打包 osquery 为应用包
  • 设置新的私有 GitHub 仓库以保存新的签名密钥
  • 设置公共仓库以托管生成签名包的新自动化 CI/CD 流水线
  • 更改 POSIX 系统上的默认安装路径
  • 研究并实现 macOS 公证
  • 记录新的 macOS 隐私权限以及生成 MDM 配置文件以应用这些权限的过程

最后,我们必须推广所有这些破坏性更改,并处理社区的所有反馈。确实,我们需要进行的更改数量保证了 osquery 的新主要版本,从 4.9 版本升级到 5.0.1。

2019 年 6 月,Facebook 和 Linux 基金会成立了 osquery 基金会,这是一个新的社区实体,旨在加速 osquery 项目的开发和开放参与。一个多利益相关者的技术指导委员会(包括 Trail of Bits)自此一直在更新和维护 osquery。在整个项目开发过程中,项目独立性的最大技术障碍之一是缺乏自动化的打包和代码签名流水线。得益于社区今年将 EndpointSecurity 集成到 osquery 中的努力,这条流水线终于就位。Facebook 的原始 osquery 开发人员现在可以完全将密钥(字面意义和象征意义上)交给社区。

osquery 项目无疑只有通过其开源社区的持续参与和支持才能实现。我们特别感谢我们的客户赞助商 Atlassian,以及过去和现在为 osquery 社区做出贡献的同仁。

未来方向

现在我们已经将 EndpointSecurity 集成到 osquery 中,该工具在 macOS 上具有各种新的检测能力。现在添加文件事件监视器、内核扩展加载事件甚至内存映射事件应该会容易得多。我们为 EndpointSecurity 奠定的自动化代码签名和打包基础可能为其他需要权限/entitlement 的 macOS 事件监视框架(如 NetworkExtension)集成到 osquery 中铺平道路。

Trail of Bits 多年来一直处于 osquery 开发的前沿。您希望我们将项目带向何方?联系我们,讨论如何帮助实现您的想法!

如果您喜欢这篇文章,请分享:
Twitter、LinkedIn、GitHub、Mastodon、Hacker News

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计