前言
Docker 是一套开源的应用容器引擎,可以方便地实现应用程序的移植和部署。虽然 Docker 确实是一个强大的工具,但是不同的 Docker 使用模式会带来不同的安全风险。在这篇文章中,我们将会深入分析这些风险,并探索如何避免它们。
安全隐患
1. 容器之间的安全隔离
Docker 的容器隔离在很大程度上依赖于 Linux 内核的命名空间和控制组机制。尽管 Docker 网络和文件系统隔离貌似有效地限制了容器内部的访问权限,但是一些未经授权的操作仍然可能使得容器之间互相照顾。
示例代码
通常情况下,我们可以通过 Docker 的 IP 范围和端口映射来控制容器之间的网络流量。但是,如果一个容器中安装了其他容器的 root 密钥,那么恶意攻击者就可以利用这个漏洞从容器中突出来。下面是一段利用同一主机上的多个容器之间 root 密钥暴露的示例代码:
-- -------------------- ---- ------- - ------ ---- --- ----------- --------- - ----- ---------- - ---- ------ ------- -------------------- - ------ ---- --- ----------- --------- - ------- ------ -- ------- ------- -- ---- - ---- -- --------- ---------------------------------- - --- --- --------- -- -- ----------- - ----------- -- ---- - -- -- -------------------------------- ----------------- - ---------- ------------- -------------------- -- -----------
上述代码中,container-a 中的 /tmp/share/file.txt 文件和 container-b 中的 /etc/shadow 文件不同属于不同的容器。然而,由于它们共享同一个主机,且共享同样的 root 密钥,Attackers 可以利用这一点直接从 container-b 中读取 /etc/shadow 文件。
2. Docker 引擎的安全隐患
Docker 引擎通常使用 root 权限运行,这可能会导致一些安全问题。例如,攻击者可能会使用注入命令等技术从 Docker Engine 直接访问主机 系统。
示例代码
下面是一个利用 Docker Engine 的特权容器从 host 主机中直接读取文件的示例代码:
$ docker run -it --privileged=true ubuntu:16.04 /bin/bash # echo "I am the privileged container" >/tmp/privileged # curl -o /tmp/share/hostrootfs.tar /proc/$$/root.tar $ tar xvf /tmp/share/hostrootfs.tar $ cat /etc/shadow
如上述代码所示,攻击者可以利用特权容器直接从 host 主机中读取 /etc/shadow 文件的内容。
防范方法
1. 强制网络隔离
为了防止容器之间的相互干扰,您可以在运行容器时使用 --link 和 --net 选项来强制网络隔离。例如:
$ docker run -itd --name server-a --net my-net alpine:3.8 $ docker run -itd --name server-b --link server-a:server-a --net my-net alpine:3.8
在上面的命令中,server-a 和 server-b 之间的通信只能通过网络隧道来实现。此外,您还可以使用 Docker 的网络隧道来加强容器安全性,如使用 VPN 或密钥身份验证。
2. 限制挂载点
为了防止恶意攻击者在容器之间传递文件和数据,您可以使用 --read-only 和 --tmpfs 选项来限制挂载点。例如:
$ docker run -itd --name server-c --read-only --tmpfs /tmp alpine:3.8
在上述命令中,容器 server-c 只能在内部进行读取操作,并将 /tmp 目录储存在于内存的影像中。这将可以有效地防止容器内部进行数据的传递,保证了安全性。
3. 将 Docker Engine 限制为非特权用户
建议您不要在 root 用户下启动 Docker 引擎。相反,您可以在 non-root 用户下使用 Docker,这会降低 Docker 引擎本身的访问权限,从而减少恶意攻击的可能性。
$ sudo groupadd docker $ sudo usermod -aG docker $USER $ docker run hello-world
以上命令将创建一个新的 docker 用户组并将当前用户加入到用户组中。当需要使用 Docker 时,您可以使用新的组凭据来启动 Docker 引擎。
结论
尽管 Docker 确实相当强大,但在使用时需要格外留意安全问题。我们深入探讨了 Docker 中容器之间的相互干扰和 Docker 引擎本身的安全隐患,并提供了一些常见的防范措施,如强制使用网桥隔离,限制挂载点,使用非特权用户运行 Docker Engine 等。最终,我们还要提醒读者务必考虑自己的需求,做出最合适的决策。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66f40998f40ec5a964e7040b