非特权 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 |
排障用的观测工具通常以特权运行,本身不依赖非特权开关;把这个开关当成排障拦路虎之前,先确认运行的权限是否足够。
容器场景要同时看两侧:容器自身的权限集合与宿主机的这个开关共同决定加载能否成功。只在容器里排查,往往看不到宿主侧已经禁止了这一能力。
锁定档在排障过程中不可回退,改回允许需要重启机器;在生产环境的变更窗口外不要随意切换这个取值。