Docker-seccomp

Posted by AlstonWilliams on February 17, 2019

注:本文翻译自Docker Security – part 2中关于Seccomp的部分.请查看原文来获取更详细的信息.

如果你用的是Ubuntu 14.04,并且是采用编译的方式来使用Docker,那么在你docker run一个容器时,你肯定会遇到这样一个错误: **docker: Error response from daemon: Cannot start container daaa7a0c0b2c916019a68bbbdcc77e44a5b0a56478dc5c310665a00226923035: [9] System error: seccomp: config provided but seccomp not supported. **

这个错误中提到了不支持seccomp.

那到底什么是seccomp呢?

SeccompSecure computing mode的缩写,它是Linux内核提供的一个操作,用于限制一个进程可以执行的系统调用.当然,我们需要有一个配置文件来指明进程到底可以执行哪些系统调用,不可以执行哪些系统调用.

在Docker中,它使用Seccomp来限制一个容器可以执行的系统调用.在Ubuntu14.04系统中,default Docker binary还不支持Seccomp.因此,我们要想使用Seccomp,就得使用static Docker binary来安装Docker.在Ubuntu 14.x以后的版本中,default Docker binary中就默认支持Seccomp了.

默认情况下,Seccomp会禁止容器执行64位Linux系统的313个系统调用的44个.我找不到这个Seccomp的默认配置文件在哪.可能是写在了源码中.

我们下面来描述如何使用Seccomp

首先,创建一个配置文件:/home/smakam14/seccomp/profile.json,其内容为:

{
    "defaultAction": "SCMP_ACT_ALLOW",
    "syscalls": [
        {
            "name": "chmod",
            "action": "SCMP_ACT_ERRNO"
        }
    ]
}

在上面的这个配置文件中,默认情况下,我们允许容器执行全部的系统调用.但是,禁止它执行chmod这个系统调用.

然后,我们用这个Seccomp配置文件来启动一个Docker容器:

docker run –rm -it –security-opt seccomp:/home/smakam14/seccomp/profile.json busybox chmod 400 /etc/hosts

结果如下:

chmod: /etc/hosts: Operation not permitted

我们使用docker inspect来查看容器的详细信息.会看到如下输出:

 "SecurityOpt": [
                "seccomp:     
                  {"defaultAction":"SCMP_ACT_ALLOW",
                  "syscalls":[{"name":"chmod","action":"SCMP_ACT_ERRNO"}]}"
            ],

我们也可以在run一个容器的时候,通过–security-opt seccomp:unconfined参数来允许容器执行全部的系统的调用:

docker run –rm -it –security-opt seccomp:unconfined busybox chmod 400 /etc/hosts