Python AppArmor子配置文件未应用于Docker容器

Python AppArmor子配置文件未应用于Docker容器,python,docker,apparmor,Python,Docker,Apparmor,我正在尝试构建一个Docker映像,它将充当Python囚禁的沙箱。为此,我想对我的容器应用某个AppArmor配置文件。我的问题是,我无法将子“python”概要文件应用于实际的容器 下面是如何重现这个问题:首先,编写一个“docker python sandbox”AppArmor概要文件,内容如下: #include <tunables/global> profile docker-python-sandbox flags=(attach_disconnected,medi

我正在尝试构建一个Docker映像,它将充当Python囚禁的沙箱。为此,我想对我的容器应用某个AppArmor配置文件。我的问题是,我无法将子“python”概要文件应用于实际的容器

下面是如何重现这个问题:首先,编写一个“docker python sandbox”AppArmor概要文件,内容如下:

#include <tunables/global>


profile docker-python-sandbox flags=(attach_disconnected,mediate_deleted) {
    ################# copy-pasted from apparmor.d/docker
    #include <abstractions/base>
    network,
    capability,
    file,
    umount,

    deny @{PROC}/* w,   # deny write for all files directly in /proc (not in a subdir)
    # deny write to files not in /proc/<number>/** or /proc/sys/**
    deny @{PROC}/{[^1-9],[^1-9][^0-9],[^1-9s][^0-9y][^0-9s],[^1-9][^0-9][^0-9][^0-9]*}/** w,
    deny @{PROC}/sys/[^k]** w,  # deny /proc/sys except /proc/sys/k* (effectively /proc/sys/kernel)
    deny @{PROC}/sys/kernel/{?,??,[^s][^h][^m]**} w,  # deny everything except shm* in /proc/sys/kernel/
    deny @{PROC}/sysrq-trigger rwklx,
    deny @{PROC}/mem rwklx,
    deny @{PROC}/kmem rwklx,
    deny @{PROC}/kcore rwklx,

    deny mount,

    deny /sys/[^f]*/** wklx,
    deny /sys/f[^s]*/** wklx,
    deny /sys/fs/[^c]*/** wklx,
    deny /sys/fs/c[^g]*/** wklx,
    deny /sys/fs/cg[^r]*/** wklx,
    deny /sys/firmware/efi/efivars/** rwklx,
    deny /sys/kernel/security/** rwklx,

    # suppress ptrace denials when using 'docker ps' or using 'ps' inside a container
    ptrace (trace,read) peer=docker-default,
    ################# end of copy-paste

    # deny access to all
    deny /tmp/forbidden-all w,

    # create python child profile
    /usr/bin/python cx,
    profile /usr/bin/python {
        deny /tmp/forbidden w,
    }
}
#包括
profile docker python沙盒标志=(连接\u断开,中间\u删除){
#################从apparmor.d/docker粘贴的副本
#包括概要文件。在第二部分中,我们拒绝对“/tmp/planded all”的写访问权。此外,我们(尝试)拒绝对python可执行文件“/tmp/planded”的写访问权

以下是我应用此配置文件的尝试:

$ sudo apparmor_parser --replace ./docker-python-sandbox
$ docker run --rm -it --security-opt apparmor=docker-python-sandbox python:3.8 /usr/bin/python -c 'open("/tmp/forbidden", "w").write("h4cked"); print("managed to write to forbidden file"); open("/tmp/forbidden-all", "w").write("h4cked")'
managed to write to forbidden file
Traceback (most recent call last):
  File "<string>", line 1, in <module>
IOError: [Errno 13] Permission denied: '/tmp/forbidden-all'
$sudo apparmor\u解析器--替换。/docker python沙盒
$docker run--rm-it--security opt apparmor=docker python沙盒python:3.8/usr/bin/python-c'open(“/tmp/forbidden”,“w”)。write(“h4cked”);print(“管理写入禁止文件”);open(“/tmp/forbidden all”,“w”)。write(“h4cked”)'
设法写入禁止的文件
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
IOError:[Errno 13]权限被拒绝:'/tmp/planded all'
如我们所见,我们成功地阻止了对“/tmp/planded all”的写入,但未能阻止Python访问“/tmp/planded”


在主机上,我可以成功创建一个应用这两个限制的配置文件。这使我认为Docker容器忽略了子配置文件。这个结论正确吗?是设计的吗?如果不正确,有没有办法解决这个问题?

您确定要调用这样的二进制文件吗?如果激活了这样的子配置文件?(假设您已经阅读了,是的,我正在调用此二进制文件,正如您在上面的
docker run
命令中所看到的。此外,我确信子配置文件已加载,因为它在主机上工作。是的,我熟悉这两页文档。您是否尝试忽略/更新缓存?
sudo apparmor_解析器--replace-W./docker pyth在sandbox上
发现apparmor配置是不正确的,因为/usr/bin/python实际上是一个符号链接。不幸的是,我现在没有时间找出适合此用例的确切正确配置。