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

问题描述

我正在尝试构建一个 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,}
}

第一部分是从样板 docker-default 配置文件复制粘贴的。在第二部分,我们拒绝对“/tmp/forbidden-all”的写访问。此外,我们(尝试)拒绝对 python 可执行文件的“/tmp/forbidden”写访问。

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

$ 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'

如我们所见,我们成功阻止了对“/tmp/forbidden-all”的写入,但未能阻止 Python 访问“/tmp/forbidden”。

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...