菜单
文档breadcrumb arrow Beylabreadcrumb arrow 安全
Grafana Cloud

Beyla 安全、权限和能力

Beyla 需要访问各种 Linux 接口来对应用程序进行埋点,例如读取 /proc 文件系统、加载 eBPF 程序以及管理网络接口过滤器。这些操作中的许多都需要提升的权限。最简单的解决方案是以 root 身份运行 Beyla,但这在不适合完全 root 访问的设置中可能效果不佳。为了解决这个问题,Beyla 被设计为仅使用其当前配置所需的特定 Linux 内核能力。

Linux 内核能力

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

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

shell
sudo setcap cap_net_admin,cap_net_raw+ep myprogram

此示例授予 myprogram CAP_NET_ADMINCAP_NET_RAW 能力,允许它管理网络设置而无需完整的超级用户权限。

通过仔细选择和分配能力,您可以在降低特权升级风险的同时,仍然让进程执行所需的操作。

更多信息可在 capabilities 手册页中找到。

Beyla 操作模式

Beyla 可以在两种不同的模式下运行:应用可观测性模式和网络可观测性模式。这些模式并非互斥,可以根据需要结合使用。有关启用这些模式的更多详细信息,请参阅配置文档

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

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

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

您可以设置 BEYLA_ENFORCE_SYS_CAPS=1,这会使 Beyla 在所需能力不可用时立即失败。

Beyla 所需的能力列表

Beyla 的功能需要以下能力列表

能力在 Beyla 中的使用
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 以确定内核版本,Beyla 用其确定要启用的适当支持功能集。
CAP_CHECKPOINT_RESTORE访问 /proc 文件系统中的符号链接,Beyla 用其获取各种进程和系统信息。
CAP_SYS_PTRACE访问 /proc/pid/exe 和可执行模块,Beyla 用其扫描可执行符号并对程序的各个部分进行埋点。
CAP_SYS_RESOURCE增加可用锁定内存量,仅限内核 < 5.11
CAP_SYS_ADMIN通过 bpf_probe_write_user() 进行库级别的 Go 追踪上下文传播以及 BPF 指标导出器访问 BTF 数据

性能监控任务

CAP_PERFMON 的访问受 kernel.perf_event_paranoid 内核设置控制的 perf_events 访问控制的约束,可以通过 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,这意味着 Beyla 需要 CAP_SYS_ADMIN 才能工作,更多信息请参考关于如何监控任务性能的部分。

如果您更喜欢只使用 CAP_PERFMON,您可以配置节点将 kernel.perf_event_paranoid = 1。我们提供了一些示例说明如何操作,请注意您的结果可能会因您的具体设置而异。

AKS

创建配置文件

json
{
  "sysctls": {
    "kernel.sys_paranoid": "1"
  }
}

创建或更新您的 AKS 集群

sh
az aks create --name myAKSCluster --resource-group myResourceGroup --linux-os-config ./linuxosconfig.json

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

EKS (使用 EKS Anywhere 配置)

创建配置文件

yaml
apiVersion: anywhere.eks.amazonaws.com/v1alpha1
kind: VSphereMachineConfig
metadata:
  name: machine-config
spec:
  hostOSConfiguration:
    kernel:
      sysctlSettings:
        kernel.sys_paranoid: "1"

部署或更新您的 EKS Anywhere 集群

sh
eksctl create cluster --config-file hostosconfig.yaml

EKS (修改节点组设置)

更新节点组

yaml
apiVersion: eks.eks.amazonaws.com/v1beta1
kind: ClusterConfig
...
nodeGroups:
  - ...
    os: Bottlerocket
    eksconfig:
      ...
      sysctls:
        kernel.sys_paranoid: "1"

使用 AWS Management Console、AWS CLI 或 eksctl 将更新的配置应用到您的 EKS 集群。

更多信息请参考EKS 主机操作系统配置文档

示例场景

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

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

所需能力

  • CAP_BPF
  • CAP_NET_RAW

设置所需能力并启动 Beyla

shell
sudo setcap cap_bpf,cap_net_raw+ep ./bin/beyla
BEYLA_NETWORK_METRICS=1 BEYLA_NETWORK_PRINT_FLOWS=1 bin/beyla

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

所需能力

  • CAP_BPF
  • CAP_NET_ADMIN
  • CAP_PERFMON

设置所需能力并启动 Beyla

shell
sudo setcap cap_bpf,cap_net_admin,cap_perfmon+ep ./bin/beyla
BEYLA_NETWORK_METRICS=1 BEYLA_NETWORK_PRINT_FLOWS=1 BEYLA_NETWORK_SOURCE=tc bin/beyla

应用可观测性

所需能力

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

设置所需能力并启动 Beyla

shell
sudo setcap cap_bpf,cap_dac_read_search,cap_perfmon,cap_net_raw,cap_sys_ptrace+ep ./bin/beyla
BEYLA_OPEN_PORT=8080 BEYLA_TRACE_PRINTER=text bin/beyla

带有追踪上下文传播的应用可观测性

所需能力

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

设置所需能力并启动 Beyla

shell
sudo setcap cap_bpf,cap_dac_read_search,cap_perfmon,cap_net_raw,cap_sys_ptrace,cap_net_admin+ep ./bin/beyla
BEYLA_ENABLE_CONTEXT_PROPAGATION=all BEYLA_OPEN_PORT=8080 BEYLA_TRACE_PRINTER=text bin/beyla

内部 eBPF 追踪器能力要求参考

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

以下列表将每个内部 tracer 映射到其所需的能力,旨在为开发者、贡献者以及对 Beyla 内部机制感兴趣的人员提供参考

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

  • 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 程序中使用指针算术

(应用可观测性) Watcher

  • 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 套接字,用于将 beyla_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 套接字,用于将 beyla_socket__http_filter 附加到网络接口
  • CAP_SYS_PTRACE:访问 /proc/pid/exe 以及 /proc 中的其他节点
  • CAP_SYS_ADMIN:用于基于探针 (bpf_probe_write_user()) 的库级别上下文传播