问题描述
我正在尝试构建一个 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 (将#修改为@)