一般而言我们认为这些系统调用是可以禁止容器调用的:kexec_load, open_by_handle_at, init_module, finit_module, delete_module, iopl, ioperm, swapon, swapoff, sysfs, sysctl, adjtimex, clock_adjtime, lookup_dcookie, perf_event_open, fanotify_init, kcmp.
我们也在寻求其他可以禁止的系统调用,欢迎给提议。除此之外,我们考虑禁止调用许多旧的网络调用: Amateur Radio X.25 (3), IPX (4), Appletalk (5), Netrom (6), Bridge (7), ATM VPC (8), X.25 (9), Amateur Radio X.25 PLP (11), DECNet (12), NetBEUI (13), Security (14), PF_KEY key management API (15), 还有所有比AF_NETLINK (16)需求的权限更多的系统调用。
加入系统调用过滤器的另一个方面就是可以过滤掉所有非本架构的调用,例如X86-64的电脑默认情况下是无法使用32位的系统接口的。我们希望这个方案被设置成为seccomp的默认选项。
禁止了其他架构的系统调用,我们可以简单地认为我们直接缩小了一半被内核提权、内核攻击的风险。
调整seccomp类似于系统capabilities和selinux标签,我们允许使用命令行自己决定自己需要使用/禁止那些系统调用:
`docker run -d --security-opt seccomp:allow:clock_adjtime ntpd`
这条命令将会允许容器内使用clock_adjtime调用,因为是ntpd服务,所以必须得用来调整时间。
同样,
`docker run -d --security-opt seccomp:deny:getcwd /bin/sh`
这条命令将会禁止容器内执行的shell查询当前自己所在的目录。RedHat的Matt Heon有一个展示这个功能的短片。
视频地址:https://www.youtube.com/watch?feature=player_embedded&v=sw3NjVMMXz8
我们默认会禁止很多的系统调用,但是仍旧有很多很危险的系统调用没有被禁止。你可以全部禁止,然后慢慢地加入希望使用的系统调用。
`docker run -d --security-opt seccomp:deny:all --security-opt seccomp:allow:getcwd /bin/sh`
事实上,docker中运行sh需要比getcwd更多的系统调用。被禁止掉的调用都会记录在`/var/log/autit/audit.log`。如果audit没有运行的话,那么将会记录在`/var/log/messages`中。
我们将会继续增强docker的安全功能。如果linux内核中出现新的安全功能,或者linux内核中有安全功能的改进,我们也会去尽量的利用这些功能,加固容器的安全性。
另一个方面是我们开始关注容器的管理。目前的管理方式是,如果你能有权限对docker的socket和端口发送数据的话,那么你就能对docker做任何事情。(译注:尤其是端口,docker remote api这种东西目前完全是无法禁止的) 很遗憾的是目前我们的解决办法只有禁止非root用户的/run/docker.socket接口的访问。我们也开始着手增加授权,这样管理员就能证明自己是管理员,而不是有权力访问接口的别的用户。我们也开始增加适当的管理记录的功能,将管理员对某些容器的是否是特权运行的情况记录到syslog或者journalctl。除此之外,我们还可能增加基于角色的访问控制(RBAC),简单的来说,就是超级管理员控制其他的管理员。例如:
一星级管理员只允许开启、停止容器。
二星级管理员有权利新建非特权的容器。
三星级管理员有最大的权力运行所有的容器,并且赋予容器最大的权限。
结论当这些安全措施实施之后,docker容器会更大程度的让你的宿主机远离风险。我们的目标就是让纸也能包下火(the ability for containers to contain,呼应译文第一段)。
CentOS 6/7系列安装Docker
在Ubuntu Trusty 14.04 (LTS) (64-bit)安装Docker