如何在启用 SELinux 的 Centos 7 上的 docker 中允许 bpf 系统调用?

pat*_*lea 7 kernel centos selinux docker bpf

我正在运行一个 docker 容器,用于监控 Centos 7 服务器中的其他容器。由于 SELinux 默认启用,因此当它使用以下信息调用任何 bpf 操作时,它会阻止我的监控进程:

type=AVC msg=audit: avc:  denied  { map_create } for
pid=16739 comm="monitor" scontext=system_u:system_r:spc_t:s0 
tcontext=system_u:system_r:spc_t:s0 tclass=bpf permissive=0
Run Code Online (Sandbox Code Playgroud)

我正在使用这样的 test-bpf.c 程序

#define _GNU_SOURCE
#include <stdio.h>
#include <string.h>
#include <linux/bpf.h>
#include <unistd.h>
#include <sys/syscall.h>

int main() {
    union bpf_attr attr = {
        .map_type = BPF_MAP_TYPE_HASH,
        .key_size = 4,
        .value_size = 4,
        .max_entries = 256,
    };
    int ret = syscall(__NR_bpf, BPF_MAP_CREATE, &attr, 120);
    fprintf(stderr, "ret = %d (%s)\n", ret, strerror((ret > 0) ? 0 : ret));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

和一个 Dockerfile 像

FROM ubuntu:20.04
ADD strace /usr/bin/strace
ADD test-bpf /test-bpf
Run Code Online (Sandbox Code Playgroud)

并使用--privileged --security-opt seccomp=unconfined -v /sys/kernel/debug:/sys/kernel/debug.

如果 docker 服务器在 ubuntu(默认情况下禁用 SELinux)上运行,则此方法有效。我可以更新主机上的 SELinux 策略以允许容器中的 bpf 调用吗?docker 服务器可以修改 SELinux 策略以启用 bpf 调用吗?