Docker容器安全应用限制Seccomp 电脑版发表于:2021/6/21 12:47 ![Docker远征](https://img.tnblog.net/arcimg/hb/656ec4beace04f5e9a7b1d58b6368639.jpg "Docker远征") >#Docker容器安全应用限制Seccomp [TOC] Seccomp 简介 ------------ >SecComp定义了哪些系统调用应该和不应该被容器执行。它们定义在一个JSON文件中,当容器启动时应用该文件。在这个初始步骤中,我们定义了seccomp权限来禁用允许容器运行seccomp。 tn>只有在构建 Docker `seccomp`并且内核配置为`CONFIG_SECCOMP`启用时,此功能才可用。要检查您的内核是否支持`seccomp`: ```bash grep CONFIG_SECCOMP= /boot/config-$(uname -r) ``` ![](https://img.tnblog.net/arcimg/hb/4b4581f49f7b4c508d6ca908c0e2d457.png) Seccomp的运用 ------------ >默认`seccomp`配置文件为使用`seccomp`运行容器提供了一个合理的默认值,并在`300`多个系统调用中禁用了大约`44 `个系统调用。它具有适度的保护作用,同时提供广泛的应用兼容性。通过下面的链接找到默认的 Docker 配置文件。 https://github1s.com/moby/moby/blob/master/profiles/seccomp/default.json ### Centos示例 >我们以Centos容器做示例,通过`--security-opt`参数来覆盖默认的Seccomp限制。我们先定义一个Seccomp的Json文件。 ```bash vim Seccomp_Centos_Chmod.json ``` ```bash { "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": [] } ] } ``` tn>这里我们对`chmod`,`chown`,`chown32`进行了限制 更多关于参数的介绍请参考:https://docs.docker.com/engine/security/seccomp/ ```bash docker run --rm -it \ --security-opt seccomp:Seccomp_Centos_Chmod.json \ centos \ chmod 400 /etc/hostname ``` ![](https://img.tnblog.net/arcimg/hb/13997a76e4494b12b7b8f44f9a917247.png) >我们发现它并没有跑起来,其实是因为我们的`Seccomp_Centos_Chmod.json`对它进行了一个限制。 系统识别调用 ------------ >SecComp 是一个非常低级的协议。为了阻止系统调用,您首先需要确定正在进行哪些调用。 strace还用于识别操作系统正在进行的底层系统调用。虽然 shell 命令称为chmod,但底层系统调用可能不同。 ```bash docker run --rm -it \ --cap-add SYS_PTRACE \ --security-opt seccomp:Seccomp_Centos_Chmod.json \ centos \ chmod 400 / && echo $? ``` ![](https://img.tnblog.net/arcimg/hb/60c39f68b9c0455d8e6d711a88e678b9.png) tn>我们可以发现不同的系统调用它的权限也是不同的,这里显然它是执行成功了的。 通过`strace`我们可以判断我们的限制是否有效。 ```bash docker run --rm -it \ --cap-add SYS_PTRACE \ --security-opt seccomp:Seccomp_Centos_Chmod.json \ benhall/strace-ubuntu \ strace chmod 400 / ``` >我们可以看到它确实执行成功了。 ![](https://img.tnblog.net/arcimg/hb/dfd8f526e0544f6582475549070fe7f2.png) >但我们换一个`Alpine`发现它并没有执行成功 ```bash docker run --rm -it \ --cap-add SYS_PTRACE \ --security-opt seccomp:Seccomp_Centos_Chmod.json \ benhall/strace \ strace chmod 400 / ``` ![](https://img.tnblog.net/arcimg/hb/c0882a603ccd4bdb8427072d78ff252f.png) tn>所以我们需要在不同需求中去测试好不同系统的容器调用。 在没有默认 seccomp 配置文件的情况下运行 ------------ ```bash docker run --rm -it --security-opt seccomp=unconfined debian:jessie \ unshare --map-root-user --user sh -c whoami ```