Beyla 安全、权限和能力
Beyla 需要访问各种 Linux 接口来对应用程序进行埋点,例如读取 /proc
文件系统、加载 eBPF 程序以及管理网络接口过滤器。这些操作中的许多都需要提升的权限。最简单的解决方案是以 root 身份运行 Beyla,但这在不适合完全 root 访问的设置中可能效果不佳。为了解决这个问题,Beyla 被设计为仅使用其当前配置所需的特定 Linux 内核能力。
Linux 内核能力
Linux 内核能力是一种细粒度的系统,用于控制对特权操作的访问。它们允许您授予进程特定权限,而无需赋予其完整的超级用户或 root 访问权限,这有助于通过遵循最小特权原则来提高安全性。能力将通常与 root 相关联的权限分解为内核中更小的特权操作。
能力被分配给进程和可执行文件。通过使用 setcap
等工具,管理员可以为二进制文件分配特定的能力,使其只需执行所需操作即可,而无需以 root 身份运行。例如
sudo setcap cap_net_admin,cap_net_raw+ep myprogram
此示例授予 myprogram
CAP_NET_ADMIN
和 CAP_NET_RAW
能力,允许它管理网络设置而无需完整的超级用户权限。
通过仔细选择和分配能力,您可以在降低特权升级风险的同时,仍然让进程执行所需的操作。
更多信息可在 capabilities 手册页中找到。
Beyla 操作模式
Beyla 可以在两种不同的模式下运行:应用可观测性模式和网络可观测性模式。这些模式并非互斥,可以根据需要结合使用。有关启用这些模式的更多详细信息,请参阅配置文档。
Beyla 读取其配置并检查所需的能力,如果缺少任何能力,它会显示警告,例如
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
创建配置文件
{
"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 配置)
创建配置文件
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 Management Console、AWS CLI 或 eksctl 将更新的配置应用到您的 EKS 集群。
更多信息请参考EKS 主机操作系统配置文档。
示例场景
以下示例场景展示了如何以非 root 用户身份运行 Beyla
通过套接字过滤器获取网络指标
所需能力
CAP_BPF
CAP_NET_RAW
设置所需能力并启动 Beyla
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
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
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
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_CLS
、BPF_PROG_TYPE_SOCK_OPS
和BPF_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()
) 的库级别上下文传播