从漏洞到防护:浅谈Docker不容忽视的安全问题
在网络时代,几乎所有编写的软件和应用都存在潜在的漏洞,想要完全没有漏洞的应用是几乎不可能实现的,当然Docker也不例外。
Docker容器技术在提供高效、可移植的软件部署环境的同时,也带来了一些安全挑战。针对Docker自身的漏洞,黑客的攻击手段层出不穷,给企业带来了多方面的挑战。
所谓“兵来将挡水来土掩”,今天给大家分享几个常见的Docker安全问题及相对应的防护措施吧。
容器剪得局域网攻击:
docker network create --driver bridge mynetwork
docker run -d --network mynetwork --name container1 image
docker run -d --network mynetwork --name container2 image
所以,在一个主机上部署多个容器需要合理的配置网络,也可以设置相应iptable规则。
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攻击。
Docker与虚拟机的一个重要的区别就是Docker与宿主机共用一个操作系统内核。一旦宿主内核存在可以越权或者提权漏洞,尽管Docker使用普通用户执行,在容器被入侵时,攻击者还可以利用内核漏洞跳到宿主机做更多的事情。
例如之前发现的一个漏洞CVE-2016-5195(脏牛提权)就可以使低权限用户利用该漏洞技术在全版本上实现本地提权,这是一个比较经典的漏洞,虽然在16年就已经被修复,但是还是会影响一些老版本的Linux发行版,所以要及时更新一些有漏洞的内核版本。
共享root用户权限:
如果以root用户权限运行容器,容器内的root用户也就拥有了宿主机的root权限。例如:
你要启动一个容器:
docker run -it --rm --name mycontainer --privileged ubuntu /bin/bash
--privileged的意思就是允许容器内的进程获得几乎所有宿主机的权限,会使容器中的root几乎具有与宿主机root用户相同的权限。
再容器内:
touch /test.sh
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环境的安全性而制定的操作指南。
Docker Daemon配置:使用最新的docker版本,禁止用特权模式(--privileged)来启动容器,需要限制Docker daemon暴露的端口,只在必要时进行开放。
镜像管理:使用官方或可信的镜像来源,禁止使用未知或不受信任的镜像,定期扫描镜像以查找漏洞和不安全的软件包,尽量使用最小化基础镜像,减少潜在攻击。
网络管理:使用docker内置的网络功能进行隔离,比如bridge网络模式,避免在公网中暴露容器端口,可以使用反向代理进行控制。
资源限制:限制容器权限,避免使用--privileged标志,限制容器资源的使用,cpu、内存、io等,防止资源滥用,使用read-only文件系统,防止容器对文件系统的修改。
存储安全:对容器卷使用严格的访问控制,避免敏感数据泄漏,定期备份重要数据,防止数据丢失,使用加密技术保护静态和传输中的数据。
用户身份验证:使用最小权限原则,限制容器内用户的权限,实施强密码策略,必要时采用MFA来保护docker管理的接口,定期审计和更新用户权限的设置。
Docker的安全是一个持续的过程,需要综合考虑镜像构建、容器配置、运行时环境以及持续监控等多个方面。为了应对这些挑战,需要加强网络安全意识,提升防御技术。