1. 概述
Docker 容器的安全性,在很大程度上依赖于Linux 系统自身。目前, 在评估Docker 的安全性时, 主要考虑下面几个方面:
- Linux 内核的命名空间机制提供的容器隔离安全;
- Linux 控制组机制对容器资源的控制能力安全;
- Linux 内核的能力机制所带来的操作权限安全;
- Docker程序(特别是服务端)本身的抗攻击性;
- 其他安全增强机制(包括AppArmor 、SELinux 等)对容器安全性的影响;
- 通过第三方工具(如Docker Bench 工具)对Docker 环境的安全性进行评估。
2. 命名空间
当用docker [container] run 命令启动一个容器时, Docker 将在后台为容器创建一个独立的命名空间。命名空间提供了最基础也是最直接的隔离, 在容器中运行的进程不会被运行在本地主机上的进程和其他容器通过正常渠道发现和影响。
通过命名空间来实现的隔离并不是那么绝对。运行在容器中的应用可以直接访问系统内核和部分系统文件。因此, 用户必须保证容器中应用是安全可信的(这跟保证运行在系统中的软件是可信的一个道理), 否则本地系统将可能受到威胁, 即必须保证镜像的来源和自身可靠。
一个容器要想与其他容器互不干扰需要能够隔离如下内容:文件系统、网络、进程间的通信、用户和用户组权限、进程内的PID与宿主机中的PID等。
namespace | 隔离内容 | 系统调用参数 |
---|---|---|
UTS | 主机名与域名 | CLONE_NEWUTS |
IPC | 信号量、消息队列和共享内存 | CLONE_NEWIPC |
Network | 网络设备、网络栈、端口等 | CLONE_NEWNET |
PID | 进程编号 | CLONE_NEWPID |
Mount | 挂载点(文件系统) | CLONE_NEWNS |
User | 用户和用户组 | CLONE_NEWUSER |
3. Cgroups
cgroups是Linux的另外一个强大的内核工具,有了cgroups,不仅可以限制被namespace隔离起来的资源,还可以为资源设置权重、计算使用量、操控任务(进程或县城)启停等。
cgroups具有以下功能:
-
资源限制:cgroups可以对任务使用的资源总额进行限制;
-
优先级分配:通过分配的CPU时间片数量以及磁盘IO带宽大小,控制任务运行的优先级;
-
资源统计:统计系统的资源使用量,如CPU使用时长,内存用量等;
-
任务控制:对任务进行挂起、恢复等操作。
4. Docker服务端的防护
最近改进的Linux 命名空间机制将可以实现使用非root 用户来运行全功能的容器。这将从根本上解决了容器和主机之间共享文件系统而引起的安全问题。
目前, Docker 自身改进安全防护的目标是实现以下两个重要安全特性:
将容器的root 用户映射到本地主机上的非root 用户, 减轻容器和主机之间因权限提升而引起的安全问题;
允许Docker 服务端在非root 权限下运行, 利用安全可靠的子进程来代理执行需要特权权限的操作。这些子进程将只允许在限定范围内进行操作, 例如仅仅负责虚拟网络设定或文件系统管理、配置操作等。
5. 更多安全特性的使用
除了默认启用的能力机制之外, 还可以利用一些现有的安全软件或机制来增强Docker的安全性, 例如GRSEC、AppArmor、SELinux 等,用户可以自定义更加严格的访问控制机制来定制安全策略。
(1)AppArmor
Apparmor可以将进程的权限与进程capabilities能力联系在一起,实现对进程的强制性访问控制(MAC)。在Docker中,我们可以使用Apparmor来限制用户只能执行某些特定命令、限制容器网络、文件读写权限等功能。
(2) SElinux
SELinux主要提供了强制访问控制(MAC),即不再是仅依据进程的所有者与文件资源的rwx权限来决定有无访问能力。能在攻击者实施了容器突破攻击后增加一层壁垒。Docker提供了对SELinux的支持。
(3) Capability
Capabilities简单来说,就是指开放给进程的权限,是Linux内核一个强大的特性,可以提供细粒度的权限访间控制。Linux 内核自2.2版本起支持能力机制, 将权限划分为更加细粒度的操作能力, 既可以作用在进程上, 也可以作用在文件上。
默认情况下, Docker 启动的容器有严格限制, 只允许使用内核的一部分能力, 包括chown 、dac_ override 、fowner 、K计1、setg过、s.etuid 、setpcap 、net_bind_ service 、net_raw 、sys—chroot 、mknod 、setfcap 、audit_write, 等等。
默认情况下, Docker 采用白名单机制, 禁用了必需的一些能力之外的其他权限,目前支持CAP_CHOWN 、CAP_DAC_OVERRIDE 、CAP_FSETID 、CAP—FOWNER 、CAP_MKNOD 、CAP_ NET—R AW 、CAP_SETGID 、CAP—SETUID 、CAP_SETFCAP 、CAP_SETPCAP 、CAP_NET_ BIND_ SERVICE 、CAP_SYS_CHROOT 、CAP_KILL 、CAP—AUDIT—W阳TE 等。
(4)Seccomp系统调用过滤
使用Seccomp可以限制进程能够调用的系统调用(system call)的范围,Docker提供的默认 Seccomp 配置文件已经禁用了大约 44 个超过 300+ 的系统调用,满足大多数容器的系统调用诉求。
(5)区别说明
Each of these security features have different purposes, and there is actually little overlap. They all function to reduce the damage that a process can cause once it has been pompromised. They are all very low-overhead and can be used to significantly improve the security of software.
Seccomp is a Linux feature that allows a userspace program to set up syscall filters. These filters specify which system calls are permitted, and what arguments they are permitted to have. It is a very low-level filter that reduces the attack surface area of the kernel. For example, a bug in keyctl() that allows simple calls to that syscall to elevate privileges would not necessarily be usable for privesc in a program which has restricted access to that call.
AppArmor is a Mandatory Access Control framework that functions as an LSM (Linux Security Module). It is used to whitelist or blacklist a subject’s (program’s) access to an object (file, path, etc.). AppArmor may be used to allow a program to have read access to /etc/passwd, but not /etc/shadow. The policies can also be used to restrict capabilities, or even limit network access.
Capabilities and capability dropping is a general technique whereby a privileged process revokes a subset of the privileges it is endowed with. A root process can drop, for example, the capabilities required to create raw connections to the network, or the capabilities required to bypass standard UNIX file permissions (DAC), even though it remains root. This technique is not very fine-grained as there are only a limited number of capabilities that can be dropped, but it reduces the damage a program can do if it has been compromised nonetheless.
In general, you should know that:
Seccomp reduces the chance that a kernel vulnerability will be successfully exploited.
AppArmor prevents an application from accessing files it should not access.
Capability dropping reduces the damage a compromised privileged process can do.
6. 使用第三方检测工具
在已经有了一些进行自动化检查的开源工具, 比较出名的有Docker Bench和clair。