【从漏洞到防护:浅谈Docker不容忽视的安全问题】

从漏洞到防护:浅谈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 的安全是一个持续的过程,需要综合考虑镜像构建、容器配置、运行时环境以及持续监控等多个方面。为了应对这些挑战,需要加强网络安全意识,提升防御技术。

  • 16
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值