OBI 安全、权限和功能

OBI 所需的权限和功能

OBI 需要访问各种 Linux 接口来检测应用程序,例如从 /proc 文件系统读取、加载 eBPF 程序以及管理网络接口过滤器。其中许多操作都需要提升的权限。最简单的解决方案是作为 root 用户运行 OBI,但如果完全 root 访问权限不理想,这可能无法很好地工作。为了解决这个问题,OBI 被设计为仅使用其当前配置所需的特定 Linux 内核功能。

Linux 内核功能

Linux 内核功能是一种控制对特权操作访问的精细化系统。它们允许您向进程授予特定权限,而无需授予它们完整的超级用户或 root 访问权限,这有助于遵循最小特权原则来提高安全性。功能将通常与 root 相关的权限分解为内核中更小的特权操作。

功能被分配给进程和可执行文件。通过使用 setcap 等工具,管理员可以为二进制文件分配特定的功能,使其能够执行仅需的操作,而无需作为 root 运行。例如

sudo setcap cap_net_admin,cap_net_raw+ep myprogram

此示例将 CAP_NET_ADMINCAP_NET_RAW 功能授予 myprogram,使其无需完整的超级用户权限即可管理网络设置。

通过仔细选择和分配功能,您可以降低权限升级的风险,同时仍允许进程执行其所需的操作。

有关更多信息,请参阅 capabilities 手册页

OBI 操作模式

OBI 可以以两种不同的模式运行:应用程序可观测性网络可观测性。这些模式并非相互排斥,可以根据需要一起使用。有关启用这些模式的更多详细信息,请参阅 配置文档

OBI 读取其配置并检查所需的功能,如果缺少任何功能,它会显示警告,例如

time=2025-01-27T17:21:20.197-06:00 level=WARN msg="Required system capabilities not present, OBI may malfunction" error="the following capabilities are required: CAP_DAC_READ_SEARCH, CAP_BPF, CAP_CHECKPOINT_RESTORE"

OBI 然后尝试继续运行,但缺少功能可能会导致后续错误。

您可以设置 OTEL_EBPF_ENFORCE_SYS_CAPS=1,这将导致 OBI 在所需功能不可用时立即失败。

OBI 所需的功能列表

OBI 需要以下功能列表才能正常运行

功能在 OBI 中的用途
CAP_BPF启用常规 BPF 功能和套接字过滤器 (BPF_PROG_TYPE_SOCK_FILTER) 程序,用于在网络可观测性模式下捕获网络流。
CAP_NET_RAW用于创建 AF_PACKET 套接字,这是用于捕获网络可观测性模式下网络流的套接字过滤器程序的机制。
CAP_NET_ADMIN加载 BPF_PROG_TYPE_SCHED_CLS TC 程序所需,这些程序用于捕获网络流和跟踪上下文传播,适用于网络和应用程序可观测性
CAP_PERFMON用于跟踪上下文传播、一般应用程序可观测性和网络流监控。允许 TC 程序直接访问数据包,加载内核中的 eBPF 探测器以及这些程序使用的指针算术。
CAP_DAC_READ_SEARCH访问 /proc/self/mem 以确定内核版本,OBI 使用它来确定要启用的支持功能集的适当组合。
CAP_CHECKPOINT_RESTORE访问 /proc 文件系统中的符号链接,OBI 使用它来获取各种进程和系统信息。
CAP_SYS_PTRACE访问 /proc/pid/exe 和可执行模块,OBI 使用它来扫描可执行符号并检测程序的不同部分。
CAP_SYS_RESOURCE增加可用锁定内存量,仅适用于内核 < 5.11
CAP_SYS_ADMIN通过 bpf_probe_write_user() 进行库级别的 Go 跟踪上下文传播,以及 BPF 指标导出器访问 BTF 数据

性能监控任务

CAP_PERFMON 的访问受 perf_events 访问控制的约束,该控制由 kernel.perf_event_paranoid 内核设置管理,可以通过 sysctl 或修改文件 /proc/sys/kernel/perf_event_paranoid 进行调整。kernel.perf_event_paranoid 的默认设置通常是 2,这在 内核文档perf_event_paranoid 部分以及更全面的 perf-security 文档中有所说明。

一些 Linux 发行版为 kernel.perf_event_paranoid 定义了更高的级别,例如基于 Debian 的发行版 也使用 kernel.perf_event_paranoid=3,这在没有 CAP_SYS_ADMIN 的情况下禁止访问 perf_event_open()。如果您运行的发行版的 kernel.perf_event_paranoid 设置高于 2,您可以修改配置将其降低到 2,或使用 CAP_SYS_ADMIN 而不是 CAP_PERFMON

在 AKS/EKS 上部署

AKS 和 EKS 环境都带有默认将 sys.perf_event_paranoid > 1 设置为内核,这意味着 OBI 需要 CAP_SYS_ADMIN 才能工作,请参阅关于如何监控任务性能的部分以获取更多信息。

如果您希望仅使用 CAP_PERFMON,您可以配置您的节点将 kernel.perf_event_paranoid = 1 设置为 1。我们提供了一些如何执行此操作的示例,请记住,您的结果可能会因您的具体设置而异。

AKS

创建 AKS 配置文件
{
  "sysctls": {
    "kernel.sys_paranoid": "1"
  }
}
创建或更新您的 AKS 集群
az aks create --name myAKSCluster --resource-group myResourceGroup --linux-os-config ./linuxosconfig.json

有关更多信息,请参阅“自定义 Azure Kubernetes Service (AKS) 节点池的节点配置

EKS (使用 EKS Anywhere 配置)

创建 EKS Anywhere 配置文件
apiVersion: anywhere.eks.amazonaws.com/v1alpha1
kind: VSphereMachineConfig
metadata:
  name: machine-config
spec:
  hostOSConfiguration:
    kernel:
      sysctlSettings:
        kernel.sys_paranoid: '1'
部署或更新您的 EKS Anywhere 集群
eksctl create cluster --config-file hostosconfig.yaml

EKS (修改节点组设置)

更新节点组
apiVersion: eks.eks.amazonaws.com/v1beta1
kind: ClusterConfig
...
nodeGroups:
  - ...
    os: Bottlerocket
    eksconfig:
      ...
      sysctls:
        kernel.sys_paranoid: "1"

使用 AWS 管理控制台、AWS CLI 或 eksctl 将更新后的配置应用于您的 EKS 集群。

有关更多信息,请参阅 EKS host OS 配置文档

示例场景

以下示例场景展示了如何以非 root 用户运行 OBI

通过套接字过滤器获取网络指标

所需的功能

  • CAP_BPF
  • CAP_NET_RAW

设置所需的功能并启动 OBI

sudo setcap cap_bpf,cap_net_raw+ep ./bin/obi
OTEL_EBPF_NETWORK_METRICS=1 OTEL_EBPF_NETWORK_PRINT_FLOWS=1 bin/obi

通过流量控制获取网络指标

所需的功能

  • CAP_BPF
  • CAP_NET_ADMIN
  • CAP_PERFMON

设置所需的功能并启动 OBI

sudo setcap cap_bpf,cap_net_admin,cap_perfmon+ep ./bin/obi
OTEL_EBPF_NETWORK_METRICS=1 OTEL_EBPF_NETWORK_PRINT_FLOWS=1 OTEL_EBPF_NETWORK_SOURCE=tc bin/obi

应用程序可观测性

所需的功能

  • CAP_BPF
  • CAP_DAC_READ_SEARCH
  • CAP_CHECKPOINT_RESTORE
  • CAP_PERFMON
  • CAP_NET_RAW
  • CAP_SYS_PTRACE

设置所需的功能并启动 OBI

sudo setcap cap_bpf,cap_dac_read_search,cap_perfmon,cap_net_raw,cap_sys_ptrace+ep ./bin/obi
OTEL_EBPF_OPEN_PORT=8080 OTEL_EBPF_TRACE_PRINTER=text bin/obi

通过跟踪上下文传播实现应用程序可观测性

所需的功能

  • CAP_BPF
  • CAP_DAC_READ_SEARCH
  • CAP_CHECKPOINT_RESTORE
  • CAP_PERFMON
  • CAP_NET_RAW
  • CAP_SYS_PTRACE
  • CAP_NET_ADMIN

设置所需的功能并启动 OBI

sudo setcap cap_bpf,cap_dac_read_search,cap_perfmon,cap_net_raw,cap_sys_ptrace,cap_net_admin+ep ./bin/obi
OTEL_EBPF_CONTEXT_PROPAGATION=all OTEL_EBPF_OPEN_PORT=8080 OTEL_EBPF_TRACE_PRINTER=text bin/obi

内部 eBPF Tracer 功能要求参考

OBI 使用跟踪器,这是一组实现底层功能的 eBPF 程序。跟踪器可以加载和使用不同类型的 eBPF 程序,每种程序都需要自己的功能集。

下面的列表将每个内部跟踪器与其所需的功能进行映射,旨在为开发人员、贡献者以及对 OBI 内部感兴趣的人员提供参考。

(网络可观测性) 套接字流获取器

  • CAP_BPF:用于 BPF_PROG_TYPE_SOCK_FILTER
  • CAP_NET_RAW:用于创建 AF_PACKET 套接字并将套接字过滤器附加到网络接口

(网络可观测性) 流获取器 (tc)

  • CAP_BPF
  • CAP_NET_ADMIN:用于加载 PROG_TYPE_SCHED_CLS eBPF TC 程序,用于检查网络流量
  • CAP_PERFMON:用于直接访问数据包内存(通过 struct __sk_buff::data)以及允许 eBPF 程序中的指针算术

(应用程序可观测性) 监视器

  • CAP_BPF
  • CAP_CHECKPOINT_RESTORE
  • CAP_DAC_READ_SEARCH:用于访问 /proc/self/mem 以确定内核版本
  • CAP_PERFMON:用于加载需要指针算术的 BPF_PROG_TYPE_KPROBE eBPF 程序

(应用程序可观测性) 支持 Go 以外的语言

  • CAP_BPF
  • CAP_DAC_READ_SEARCH
  • CAP_CHECKPOINT_RESTORE
  • CAP_PERFMON
  • CAP_NET_RAW:用于创建 AF_PACKET 套接字,该套接字用于将 obi_socket__http_filter 附加到网络接口
  • CAP_SYS_PTRACE:用于访问 /proc/pid/exe/proc 中的其他节点

(应用程序和网络可观测性) TC 模式下的网络监控和上下文传播

  • CAP_BPF
  • CAP_DAC_READ_SEARCH
  • CAP_PERFMON
  • CAP_NET_ADMIN:允许加载 BPF_PROG_TYPE_SCHED_CLSBPF_PROG_TYPE_SOCK_OPSBPF_PROG_TYPE_SK_MSG,这些都由跟踪上下文传播和网络监控使用

(应用程序可观测性) GO Tracer

  • CAP_BPF
  • CAP_DAC_READ_SEARCH
  • CAP_CHECKPOINT_RESTORE
  • CAP_PERFMON
  • CAP_NET_RAW:用于创建 AF_PACKET 套接字,该套接字用于将 obi_socket__http_filter 附加到网络接口
  • CAP_SYS_PTRACE:用于访问 /proc/pid/exe/proc 中的其他节点
  • CAP_SYS_ADMIN:用于基于探针(bpf_probe_write_user())的库级别上下文传播