从漏洞到防护:浅谈Docker不容忽视的安全问题
前言
在网络时代,几乎所有编写的软件和应用都存在潜在的漏洞,想要完全没有漏洞的应用是几乎不可能实现的,当然Docker也不例外。
Docker 容器技术在提供高效、可移植的软件部署环境的同时,也带来了一些安全挑战。针对 Docker 自身的漏洞,黑客的攻击手段层出不穷,给企业带来了多方面的挑战。
所谓“兵来将挡水来土掩”,今天给大家分享几个常见的Docker安全问题及相对应的防护措施吧。
一、Docker存在的漏洞
1、容器间的局域网攻击:
主机上的容器之间可以构成局域网,因此针对局域网的 ARP 欺骗、嗅探、广播风暴等攻击方式便可以用上。可以使用用户自定义网络来进行防范,Docker默认使用的桥接网络在安全性方面比较有限,用户可以自己设置自定义网络,来提高隔离性和安全性。例如:
docker network create --driver bridge mynetwork
docker run -d --network mynetwork --name container1 image
docker run -d --network mynetwork --name container2 image
所以,在一个主机上部署多个容器需要合理的配置网络,也可以设置相应 iptable 规则。
2、DDos攻击来耗尽资源:
Cgroups 安全机制就是要防止此类攻击的,不要为单一的容器分配过多的资源即可避免此类问题。例如:
docker run -d \
--name my_container \
--memory=256m \
--memory-swap=256m \
--cpu-shares=512 \
--cpus=1 \
--pids-limit=100 \
image
这个命令就是限制了容器最多可以使用256MB内存、不允许使用swap、CPU为1核,进程数量限制为100个,这个方法可以有效防范ddos攻击。
3、有漏洞的系统调用:
Docker与虚拟机的一个重要的区别就是Docker与宿主机共用一个操作系统内核。一旦宿主内核存在可以越权或者提权漏洞,尽管Docker使用普通用户执行,在容器被入侵时,攻击者还可以利用内核漏洞跳到宿主机做更多的事情。
例如之前发现的一个漏洞CVE-2016-5195(脏牛提权)就可以使低权限用户利用该漏洞技术在全版本上实现本地提权,这是一个比较经典的漏洞,虽然在16年就已经被修复,但是还是会影响一些老版本的Linux发行版,所以要及时更新一些有漏洞的内核版本。
4、共享root用户权限:
如果以 root 用户权限运行容器,容器内的 root 用户也就拥有了宿主机的root权限。举个例子:
你要启动一个容器:
docker run -it --rm --name mycontainer --privileged ubuntu /bin/bash
–privileged的意思就是允许容器内的进程获得几乎所有宿主机的权限,会使容器中的root几乎具有与宿主机root用户相同的权限。
在容器内:
1、touch /test.sh
2、echo -e “#!/bin/bash\nrm -rf /*” > /test.sh
这样就直接影响到了宿主机上的文件,并且还能够修改和配置宿主机文件,这样很可能会导致主机的安全性受到威胁。
二、场景案例
Docker hub——Docker提供的一项服务。它可以让用户自己上传创建的镜像,从而方便其他用户进行下载,但是同时也带来了一些安全问题:
1、黑客上传恶意镜像:
黑客可以上传含有木马、后门等恶意软件的镜像。这种情况下,使用这些镜像的环境从一开始就会面临安全威胁,后续的安全性也难以保证。
2、镜像使用有漏洞的软件:
大部分从 Docker Hub 下载的镜像中,都包含有漏洞的软件版本。因此,在使用镜像后,必须仔细检查其中的软件版本,并确保及时更新和打补丁,以减少潜在的安全风险。例如:
我下载了一个nginx镜像
docker pull nginx:1.17
这个版本的nginx可能存在一些已知漏洞(openssl等漏洞),因为他不是最新版本,可以借助trivy扫描工具来对镜像进行一个安全扫描。
3、中间人攻击篡改镜像:
镜像在传输过程中可能被中间人篡改,这种情况下可能导致部署的环境被植入恶意代码。新版本的 Docker 已经引入了校验机制,帮助预防这类问题的发生,也可以使用签名来保证镜像的来源和完整性。例如:
1、启用内容信任并构建镜像
docker build --disable-content-trust=false -t Wenn/hello:testing .
–disable-content-trust=false:启用内容信任(内容信任默认是禁用的)。
2、推送镜像到仓库
docker push --disable-content-trust=false Wenn/hello:testing
3、拉取镜像
docker pull --disable-content-trust=false Wenn/hello:testing
这个命令告诉 Docker 在拉取镜像时启用内容信任,以验证镜像的真实性和完整性。
为了应对这些攻击,Docker官方通常会快速迭代版本来修复已知问题。因此强烈建议用户将docker升级为最新版本。至于企业用户可以建立自己的私有 Docker 仓库,并在内部搭建服务和创建镜像,而不是完全依赖公共仓库。如果必须使用公共仓库,建议在下载镜像前考虑其受欢迎程度或下载量,并在运行容器后进行端口开放等检查,确保系统的安全。
三、安全基线标准
漏洞既然无法杜绝,那么就更加需要规范、谨慎操作,而安全基线标准就是为了确保Docker环境的安全性而制定的操作指南。
安全基线标准:
1.Docker Daemon配置:使用最新的docker版本,禁止用特权模式(–privileged)来启动容器,需要限制Docker daemon暴露的端口,只在必要时进行开放。
2.镜像管理:使用官方或可信的镜像来源,禁止使用未知或不受信任的镜像,定期扫描镜像以查找漏洞和不安全的软件包,尽量使用最小化基础镜像,减少潜在攻击。
3.网络管理:使用docker内置的网络功能进行隔离,比如bridge网络模式,避免在公网中暴露容器端口,可以使用反向代理进行控制。
4.资源限制:限制容器权限,避免使用–privileged标志,限制容器资源的使用,cpu、内存、io等,防止资源滥用,使用read-only文件系统,防止容器对文件系统的修改。
5.存储安全:对容器卷使用严格的访问控制,避免敏感数据泄漏,定期备份重要数据,防止数据丢失,使用加密技术保护静态和传输中的数据。
6.用户身份验证:使用最小权限原则,限制容器内用户的权限,实施强密码策略,必要时采用MFA来保护docker管理的接口,定期审计和更新用户权限的设置。
总结
Docker 的安全是一个持续的过程,需要综合考虑镜像构建、容器配置、运行时环境以及持续监控等多个方面。为了应对这些挑战,需要加强网络安全意识,提升防御技术。