
Docker容器安全应用限制Seccomp
Seccomp 简介
SecComp定义了哪些系统调用应该和不应该被容器执行。它们定义在一个JSON文件中,当容器启动时应用该文件。在这个初始步骤中,我们定义了seccomp权限来禁用允许容器运行seccomp。
只有在构建 Docker seccomp
并且内核配置为CONFIG_SECCOMP
启用时,此功能才可用。要检查您的内核是否支持seccomp
:
grep CONFIG_SECCOMP= /boot/config-$(uname -r)
Seccomp的运用
默认
seccomp
配置文件为使用seccomp
运行容器提供了一个合理的默认值,并在300
多个系统调用中禁用了大约44
个系统调用。它具有适度的保护作用,同时提供广泛的应用兼容性。通过下面的链接找到默认的 Docker 配置文件。
https://github1s.com/moby/moby/blob/master/profiles/seccomp/default.json
Centos示例
我们以Centos容器做示例,通过
--security-opt
参数来覆盖默认的Seccomp限制。我们先定义一个Seccomp的Json文件。
vim Seccomp_Centos_Chmod.json
{
"defaultAction": "SCMP_ACT_ALLOW",
"architectures": [
"SCMP_ARCH_X86_64",
"SCMP_ARCH_X86",
"SCMP_ARCH_X32"
],
"syscalls": [
{
"name": "chmod",
"action": "SCMP_ACT_ERRNO",
"args": []
},
{
"name": "chown",
"action": "SCMP_ACT_ERRNO",
"args": []
},
{
"name": "chown32",
"action": "SCMP_ACT_ERRNO",
"args": []
}
]
}
这里我们对chmod
,chown
,chown32
进行了限制
更多关于参数的介绍请参考:https://docs.docker.com/engine/security/seccomp/
docker run --rm -it \
--security-opt seccomp:Seccomp_Centos_Chmod.json \
centos \
chmod 400 /etc/hostname
我们发现它并没有跑起来,其实是因为我们的
Seccomp_Centos_Chmod.json
对它进行了一个限制。
系统识别调用
SecComp 是一个非常低级的协议。为了阻止系统调用,您首先需要确定正在进行哪些调用。
strace还用于识别操作系统正在进行的底层系统调用。虽然 shell 命令称为chmod,但底层系统调用可能不同。
docker run --rm -it \
--cap-add SYS_PTRACE \
--security-opt seccomp:Seccomp_Centos_Chmod.json \
centos \
chmod 400 / &&
echo $?
我们可以发现不同的系统调用它的权限也是不同的,这里显然它是执行成功了的。
通过strace
我们可以判断我们的限制是否有效。
docker run --rm -it \
--cap-add SYS_PTRACE \
--security-opt seccomp:Seccomp_Centos_Chmod.json \
benhall/strace-ubuntu \
strace chmod 400 /
我们可以看到它确实执行成功了。
但我们换一个
Alpine
发现它并没有执行成功
docker run --rm -it \
--cap-add SYS_PTRACE \
--security-opt seccomp:Seccomp_Centos_Chmod.json \
benhall/strace \
strace chmod 400 /
所以我们需要在不同需求中去测试好不同系统的容器调用。
在没有默认 seccomp 配置文件的情况下运行
docker run --rm -it --security-opt seccomp=unconfined debian:jessie \
unshare --map-root-user --user sh -c whoami
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

