Docker安全

1) 容器内核

Docker 容器中没有没有包含内核,Docker 容器共享宿主机内核,一旦宿主内核存在可以横向越权或者提权漏洞,那么尽管Docker使用普通用户执行,一旦容器被入侵,攻击者还是可以利用内核漏洞逃逸到宿主,做更多事情。

 

2) 容器用户

容器和宿主机共享一个内核,且内核控制的 uid 和 gid 只有一套。所以同一个 uid 在宿主机和容器中代表的是同一个用户(即便在不同的地方显示了不同的用户名),它的权限和宿主机上用户的权限是一样的。

容器中默认使用 root 用户,容器内的 root 用户和宿主机上的 root 用户是同一个。所以比较安全的做法是为容器中的进程指定一个具有合适权限的用户,而不要使用默认的 root 用户。我们可以通过 Dockerfile 中的 USER 命令或者是  docker run 命令的 --user 参数指定容器中进程的用户身份。

当然还有更好的方案,就是应用 Linux 的 user namespace 技术隔离用户。方法可参考:https://docs.docker.com/engine/security/userns-remap/

 

3) 镜像源

Docker提供了docker hub可以让用户上传创建的镜像,以便其他用户下载,快速搭建环境。但同时也带来了一些安全问题。下载的镜像被恶意植入后门,传输的过程中镜像被篡改, 镜像所搭建的环境是否本身就包含漏洞等等。

Docker Content Trust

Docker 1.8中引入了 Content Trust。这是 Docker 允许发布者对其内容进行签名,从而实现可信分发的机制。当用户从存储库中提取镜像时,用户将收到一个证书,其中包含发布者的公钥,从而允许用户验证镜像来自发布者。

当启用Content Trust,Docker Engine 将只对已签名的镜像进行操作,并拒绝运行签名或摘要不匹配的镜像。

$ export DOCKER_CONTENT_TRUST=1

Content Trust 目前已在Docker 官方Hub上启用, 如果需求在本地Registry上使用 Content trust,需要部署Notray,具体可参考:https://github.com/theupdateframework/notary

 

4) 容器间局域网

同一主机上的容器之间可以构成局域网,因此针对局域网的ARP欺骗,嗅探,广播风暴等攻击方式便可以用上。所以在一个主机上部署多个容器需要合理的配置网络,可以通过以下方式实现:

  1. 关闭容器间通信(inter-container communication),这可以防止被入侵的容器能够连接其他容器,但是任何显式链接的容器仍然能够通信。设置守护进程使用--icc=false,并根据需要在docker run时指定-link,或通过 --export=port暴露容器的一个端口。
  2. 使用Iptables规则来控制容器之间的通信。

$ cat /etc/default/docker | grep DOCKER_OPTS=

DOCKER_OPTS="--iptables=true --icc=false"

 

5) 容器DDoS攻击

Docker容器也会遭受DDoS攻击,导致宿主机资源耗尽从而影响到同一宿主机的其它容器。限制单一容器资源即可避免此类问题。

限制内存

docker run 命令 -m 和 -memory-swap 参数可以限制内存和swap大小。

限制CPU

可以通过设置 --cpu-period 和 --cpu-quota参数,使用CFS (Completely Fair Scheduler) 限制单个容器CPU使用。

设置容器ulimits

还可以通过设置 --ulimit 来限制容器可使用的资源,方法可参考:https://docs.docker.com/engine/reference/commandline/run/#set-ulimits-in-container---ulimit

 

6) 容器能力(Capabilities)限制

默认情况下,Docker 容器使用宿主机 kernel 提供的 capabilities 子集运行,Docker默认的能力包括:chown、dac_override、fowner、kill、setgid、setuid、setpcap、net_bind_service、net_raw、sys_chroot、mknod、setfcap、和audit_write。在启动容器时,可以通过 --cap-add 或 --cap-drop 进行控制。例如:

$ docker run --cap-drop setuid --cap-drop setgid -ti <container_name> /bin/sh

 

7) 容器隔离

通过宿主机分割容器,将不同安全级别的容器放在不同的宿主机中,如果发生容器逃逸,攻击者仍然处于分割的宿主机无法轻松访问属于其他用户的容器或数据。例如,处理敏感数据的容器或数据库容器应该与直接向终端用户的前端应用程序的容器分割开,放在不同的宿主机。

 

8) 容器基线扫描

Docker Bench for Security是一个脚本,用于检查在生产环境中部署Docker容器的几十个常见的最佳实践,测试都是自动化的,基于 CIS Docker 1.13 标准。项目地址:https://github.com/docker/docker-bench-security

使用方法:

git clone https://github.com/docker/docker-bench-security.git

cd docker-bench-security

sudo sh docker-bench-security.sh

 

9) 容器漏洞扫描

Clair是一个用于静态分析应用程序容器中的漏洞的开源项目。Clair首先对镜像进行特征的提取,然后再将这些特征匹配CVE漏洞库,若发现漏洞则进行提示,其功能侧重于扫描容器中的 OS 及 APP 的CVE 漏洞。Clair镜像分析是按镜像Layer层级来进行的,如果某一层的软件有漏洞,在上层被删除了,该漏洞还是存在的。

VMware开源的Docker镜像仓库Harbor v1.2以后集成了Clair,但不是默认安装的,安装Harbor时需指定Clair 模块。

./install.sh --with-clair

安装方法可参见:https://github.com/goharbor/harbor/blob/master/docs/installation_guide.md#installation-with-clair

安装完成后,就可以对Harbor中的镜像进行漏洞扫描。使用方法可参见:https://github.com/goharbor/harbor/blob/master/docs/user_guide.md#vulnerability-scanning-via-clair

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章