no script

你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!

DOCKER容器安全分析与防御策略总结-全面/详细/策略

1. 容器安全的威胁分析

docker容器的安全威胁本质上来源于其基础构建上,由于容器只封装应用和依赖,这使得其必须使用主机的内核来进行运作。因此,只要获取到容器的权限即可实现对内核的访问,包括各种恶意攻击。如果容器中的应用导致内核崩溃,那么整个主机系统也会跟着一起崩塌。

1)docker镜像污染

网络上有来自第三方的众多镜像,其中可能有恶意镜像文件,无疑,在使用恶意镜像后,系统将遭受不可估计的后果。

构建安全,构建方式有基于容器的和基于dockerfile的,风险包括如下:

  • pull 的基础镜像并不是由可信的组织和人员发布,镜像本身存在后门或者其它风险项。
  • 在 Dockerfile 中存储敏感信息。例如配置服务时中使用明文固定密码或凭证等。
  • 安装不必要的软件扩大了攻击面。

仓库安全(例如docker hub,据说30%的docker镜像存在安全漏洞,在享受docker hub带来的便利时也要确保下载镜像的安全性)

  • 选择官方镜像最新版本
  • 下载的镜像需要经过漏洞扫描,需要覆盖操作系统层面和应用层面
  • 对于提供了公开dockerfile的镜像优先选择自己构建,可避免镜像后门植入,确保构建过程的安全可控
2)宿主机的内核攻击

由于docker共享了宿主机的内核机制,如果宿主机的内核存在漏洞,docker也会受到影响。比如:Linux内核3.16以前的版本存在一个内存溢出漏洞CVE-2014-7822,由于splice系统调用在两个文件间拷贝数据时未检查拷贝大小,可溢出覆写内核数据。因此,本地未授权用户可利用此漏洞越界写内存,导致系统崩溃。

3)docker网络攻击

docker通过虚拟网桥构建bridge网络,如果其中一个docker容器被攻陷,那么整个docker网络也会受到影响,比如发动ddos攻击致使网络瘫痪等

4)docker启动等操作不当

docker启动时将宿主机的根目录映射到容器内,造成在容器内可任意更改宿主机的文件系统等,或者使用特权模式启动docker,造成docker可以访问宿主机上任何设备,获取大量的设备访问权限。

docker run -d -v /:/host nginx
docker run -d --privileged nginx
5)docker漏洞攻击

docker应用本身出现的漏洞,例如:

2019年,Docker被爆出来一个逃逸漏洞CVE-2019-5736。该漏洞导致攻击者可以通过特定的容器镜像或者exec操作获取到宿主机runc执行文件时的文件句柄,并修改掉runc的二进制文件,最终获取到宿主机的root执行权限。

Shocker[48],可展示如何从 Docker 容器逃逸并读取到主机某个目录的文件内容。 Shocker 攻击的关键是执行了系统调用 open_by_handle_at 函数,Linux 手册中特别提到调用 open_by_handle_at 函数需要具备 CAP_DAC_READ_SEARCH 能力,而 Docker1.0 版本对 Capability 使用黑名单管理策略,并且没有 限制CAP_DAC_READ_SEARCH 能力,因而引发了容器逃逸的风险。

6)docker daemon攻击

Docker使用的是C/S架构,作为服务端的Docker Daemon会接收客户端通过CLI或者REST API发送的命令,并执行对容器的相应操作。但请求不一定都是由可信任的用户发起的,攻击者可能通过伪造请求的方式,来达到欺骗Daemon端执行危险的操作。

7)私有仓库的安全性

对于docker registry,一方面是考虑docker registry本身的安全性,例如在使用时配置相应的安全证书;另一方面是考虑docker客户端与docker registry交互过程中的安全性,也就是实现用户访问权限限制(密码鉴权、双向ssl机制等)。

镜像安全扫描,比较主流的镜像扫描引擎有docker security scanning(不开源)、clair(开源)和anchore(开源)等。

镜像检测的核心目前仍然是已知系统 CVE 检测。扫描器获取到镜像后,将它分离成相应的层和软件包 (Package)。然后这些 Package 将与多个 CVE 数据库 Package 的名称和版本进行对比,从而判定是否存在漏洞。

2. 容器安全的防御策略

1)Namespace

Namespace即命名空间,也被称为名称空间,这是Linux提供的一种内核级别的环境隔离功能,它的主要用途是对容器提供资源的访问隔离。Docker充分利用了Namespace的技术,使其达到尽可能地隔离容器之间以及对宿主机的影响。目前Namespace支持多种资源的隔离,包括文件系统挂载 、主机名和域名、进程间通信 、进程访问、网络隔离、用户和组隔离等。

2)Cgroup

Cgroup全称为Control Group( 控制组),它也是Docker容器的重要特性。如果说Namespace是用于隔离,那么Cgroup则是限制容器对于资源的占用,如CPU、内存、磁盘/IO等。这个特性非常有用,它避免了某个容器因为被Ddos攻击或者自身程序的问题导致对资源的不断占用,并最终影响到宿主机及上面运行的其他容器,出现“雪崩”的灾难 。

  • 限制cpu
docker run --rm -ti -c 2000 ubuntu bash
  • 限制内存
docker run --rm -ti -m 200M ubuntu bash
  • 限制快设备io
docker run --rm -ti --name container1 ubuntu bash
dd if=/dev/zero of=testfile0 bs=8k mount=5000 oflag=direct
3)ulimit

在Docker1.6之后,可以设置全局默认的ulimit,如设置CPU时间:

sudo docker daemon --default-ulimit cpu=1200
docker run --rm -ti --ulimit cpu=1200 ubuntu bash
4)容器组网

在接入容器隔离不足的情况下,将受信任的和不受信任的容器组网在不同的网络中,可以降低风险。

5)镜像签名

Docker可信镜像及升级框架(The Update Framework,TUF)是Docker 1.8所提供的一个新功能,可以校验镜像的发布者。当发布者将镜像push到远程仓库时,Docker会对镜像用私钥进行签名,之后其他人pull该镜像的时候,Docker就会用发布者的公钥来校验该镜像是否和发布者所发布的镜像一致,是否被篡改过,是否是最新版。

6)日志审核
docker run --rm -ti --log-driver="syslog" ubuntu bash
通过docker inspect ContainerID可以看到容器使用了哪种日志驱动。另外,只有json-file支持docker logs命令,docker logs ContainerID。
7)容器监控

容器的资源使用情况主要指容器对内存、网络I/O、CPU、磁盘I/O的使用情况等。命令:docker stats ContainerID。
查看容器的运行状态,命令:docker ps -a

8)防护文件系统
可读写挂载
docker run --rm -ti ubuntu bash
只读挂载
docker run --rm -ti --read-only ubuntu bash
9)capability

从2.2版开始,Linux有了capability的概念,它打破了Linux操作系统中超级用户/普通用户的概念,让普通用户也可以做只有超级用户才能完成的工作。capability可以作用在进程上,也可以作用在程序文件上。它与sudo不同,sudo可以配置某个用户可以执行某个命令或更改某个文件,而capability则是让程序拥有某种能力。

Capability是Linux内核具有的一个强大特性,可以提供颗粒化的权限访问控制。默认情况下,Docker启动的容器对能力有严格限制,只允许使用内核的一部分能力,包括chown、net_bind_service、fowner、kill、setgid等。

事实上,在大部分情况下程序并不需要真正的root权限,容器只需要具备少数的能力即可。对于能力的颗粒化划分,能保证即使容器被入侵后,也无法获取本地的较高权限,可以进行的破坏有限。

另外,用户可以通过–cap-add和–cap-drop这两个参数来修改能力。如下面的例子,我们将容器的chown 能力去掉后,在容器里就无法改变文件的所有者了。

docker run -it  --cap-drop=chown centos 
[root@65a55b893d3b /]# touch /root/1.txt
[root@65a55b893d3b /]# ls -l /root/1.txt 
-rw-r--r--. 1 root root 0 Jul  3 11:33 /root/1.txt
[root@65a55b893d3b /]# chown daemon /root/1.txt 
chown: changing ownership of '/root/1.txt': Operation not permitted

Docker启动容器的时候,会通过白名单的方式来设置传递给容器的capability,默认情况下,这个白名单只包含CAP_CHOWN等少数的能力。用户也可以通过 -–cap-add 和 -–cap-drop 这两个参数来修改这个白名单。

docker run --rm -ti --cap-drop=chown ubuntu bash
# chown 2.2/etc/hosts
# 返回结果:chown:changing ownership of '/etc/hosts': Operation not permitted
发现禁掉CAP_CHOWN能力后,在容器里就无法改变容器的所有者了。如果不禁掉则正常。如下

$ docker run --rm -ti ubuntu bash
# chown 2.2/etc/hosts
容器应遵循最小权限原则,尽量不要用–privileged参数,不需要的能力全部去掉,甚至禁掉所有的能力。
$ docker run --rm -ti --cap-drop=all ubuntu bash
10)SElinux/AppArmor/Seccomp

AppArmor和SElinux属于MAC (Mandatory Access Control强制性访问控制)系统,AppArmor主要内置在Ubuntu、Debian等操作系统,而SELinux则预装在Redhat、Centos中。MAC系统可以通过定制化的安全策略来控制进程对于资源的访问。目前,在支持SElinux的系统上,Docker的SElinux使用不是默认打开 的,需要在启动Docker daemon时加上–selinux-enabled=true参数。而在支持AppArmor的系统上,对于Docker的安全防护功能是默认打开的。

Seccomp(secure computing mode)是一种Linux内核提供的安全特性,它可以用来限制容器的可执行操作。Seccomp以白名单或黑名单的方式限制进程进行系统调用,通过禁止进程调用不必要的系统功能来减少内核暴露的接口数量,从而降低内核的攻击面。Docker在启动容器时默认会启用Seccomp保护,可通过下面命令进行确认。默认的白名单规则仅保留了Linux中比较常见并且安全的系统调用,具有适度的安全性。

1
chujiao_0a9e6**7125
盘丝大仙我的剑只有我的心上人才能拔出
  • 赞同
  • 威望

相关问题

    Copyright © 2025