首页/系统/Linux 内核与性能调优速查/kernel.unprivileged_bpf_disabled 非特权 BPF
sysctl 内核参数72 条

kernel.unprivileged_bpf_disabled 非特权 BPF

控制非特权用户能否加载 BPF 程序:0 允许、1 禁止、2 禁止且不可回退(现代发行版常见 2);root 不受影响。

非特权 BPF 开关

控制普通用户能否加载 BPF 程序:取值为允许、禁止、禁止且锁定三档。现代发行版多设置为禁止或禁止且锁定,其中锁定档一旦生效就不能通过写入参数恢复为允许,需要重启才能回到允许状态。以特权运行的观测工具不受这个开关限制。

基本信息

适用平台Linux 内核参数
参数名kernel.unprivileged_bpf_disabled
取值0 允许,1 禁止,2 禁止且锁定不可回退
常见默认现代发行版多为 1 或 2
影响范围以特权运行的观测工具不受限制

典型使用场景

  • 容器内加载 BPF 失败,确认是权限还是该开关造成。
  • 安全基线核查:确认非特权加载是否已被禁止。
  • 理解为什么观测工具在普通用户下失败、以特权运行却正常。
  • 评估放开非特权加载的安全代价,判断是否有必要。
  • 排查排障中临时切换取值后无法回退的情况。

查看与验证

查看与验证
sysctl kernel.unprivileged_bpf_disabled        # 查看当前取值
cat /proc/sys/kernel/unprivileged_bpf_disabled # 与上一行对照
sudo bpftrace -l 'tracepoint:syscalls:*' | head -3   # 以特权运行验证工具可用性
bpftrace -e 'tracepoint:sched:sched_switch { @ = count(); }'   # 非特权运行通常会失败
ls -l /proc/sys/kernel/unprivileged_bpf_disabled   # 确认参数是否存在

取值与影响

取值含义回退方式
0 允许普通用户可加载 BPF 程序写入 1 即可禁止
1 禁止普通用户加载失败可由管理员写回 0
2 禁止且锁定加载失败且状态锁定需重启才能回到 0
排障用的观测工具通常以特权运行,本身不依赖非特权开关;把这个开关当成排障拦路虎之前,先确认运行的权限是否足够。
容器场景要同时看两侧:容器自身的权限集合与宿主机的这个开关共同决定加载能否成功。只在容器里排查,往往看不到宿主侧已经禁止了这一能力。
锁定档在排障过程中不可回退,改回允许需要重启机器;在生产环境的变更窗口外不要随意切换这个取值。

易错点

  • 取值进入锁定档后无法直接写回,需要重启才能恢复,排障时随意切换会带来额外停机成本。
  • 容器内加载 BPF 失败只在权限上找原因,忽略宿主机的这个开关与容器能力配置。
  • 为了临时排障长期放开非特权加载,安全边界被降低却无人回收。
  • 把工具失败一律归因于这个开关,实际可能只是普通用户权限不足。
  • 变更前未记录原取值,事后无法恢复到原有安全基线。

数据来源与参考

  • Linux 内核 Documentation/admin-guide/sysctl/kernel.rst
  • Linux 内核 Documentation/bpf/
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌