#夏日挑战赛#Docker容器实战:容器安全性分析 原创 精华

发布于 2022-7-15 12:40
浏览
3收藏

[本文正在参加星光计划3.0–夏日挑战赛] https://ost.51cto.com/posts/13641#comment

 

容器是基于操作系统实现的虚拟化,相比于传统的物理主机和虚拟机,在安全上会面临更多的风险。对于容器的使用者而言,学习并了解容器的安全相关知识是一项重要的工作。

本文将围绕容器安全的主旨进行介绍,读者在阅读后对于相关方面的应用能有更多理解。


一. 容器的安全威胁
在容器的应用中,最大的安全隐患来自于其与主机共享内核的模式,这是容器能实现轻量化的原因,但也让其受攻击的范围变得更大。

要理解这一点并不难,我们可以将容器与虚拟机来做个对比。

在虚拟机环境,每台虚拟机都包含了一个独立的操作系统,可以单独地完成绝大部分事务处理,而只需要与宿主机之间保留非常少的交互接口即可。这使得它们之间的攻击面变得非常小,如果黑客要透过虚拟机来攻击到宿主机,需要先找到Hypervisor层的漏洞并进行攻破才有可能实现。虚拟机具有良好的隔离性,不止能更好防护攻击,也保证了不会因为虚拟机的崩溃而影响到宿主机。

#夏日挑战赛#Docker容器实战:容器安全性分析-开源基础软件社区

而在容器的环境中,由于容器只封装应用和依赖,这使得其必须使用主机的内核来进行运作。因此,只要获取到容器的权限即可实现对内核的访问,包括攻击。如果容器中的应用导致内核崩溃,那么整个主机系统也会跟着一起崩塌。
#夏日挑战赛#Docker容器实战:容器安全性分析-开源基础软件社区

在了解完容器的弱点之后,我们再来看下容器在使用中会面临哪些安全威胁:


1. 镜像污染

目前,Docker Hub上面有着数量众多的第三方上传镜像,这些镜像质量参差不齐。在这其中,不排除有黑客故意上传包含了恶意程序的镜像,并伪装成业务镜像供用户下载使用。当用户误用此类镜像启动容器时,无疑会导致容器被入侵。因此,用户必须保证容器所使用的镜像是可受信任的,尽可能不使用非信任的第三方镜像。

 

2. 网络攻击 

Docker默认使用bridge网络,该网络会创建一个虚拟网桥,连接在同一个网桥之间的容器可以互相访问。当某个容器被入侵时,黑客有可能顺着网络访问到宿主机中的其他容器。同时 ,攻击者也可以通过DDos等方式,攻击容器的服务来耗尽主机的资源,从而引起整个宿主机的崩溃。

 

3. 内核攻击

当黑客获取到容器权限时,由于共享内核的缘故,理论上可通过对内核的攻击来达到控制或影响主机的地步 。例如,Linux内核3.16以前的版本存在一个内存溢出漏洞CVE-2014-7822,由于splice系统调用在两个文件间拷贝数据时未检查拷贝大小,可溢出覆写内核数据。因此,本地未授权用户可利用此漏洞越界写内存,导致系统崩溃。

 

4. 操作不当

用户在配置容器时,由于某些错误操作可能会将主机置于危险的境地。如:在启动容器时将主机的根目录映射到容器中,那么理论上容器就可以对主机的文件系统进行任意修改,造成极大的安全风险。

$ docker run -d -v /:/host nginx

 

又或者在启用容器时使用特权模式(--privileged),此时Docker容器被允许可以访问主机上的所有设备,并可以获取大量设备文件的访问权限。

$ docker run -d --privileged nginx


5. 针对Docker  Daemon的攻击

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

 

6. Docker漏洞攻击

Docker本身属于应用程序,不可避免地会有出现代码的漏洞,这可能导致程序受到攻击。

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

 

二. Docker的安全防护

针对容器在安全方面存在的威胁,Docker社区也使用了不少安全措施来进行应对,以便能够让用户更安全地使用容器。

 

下面是Docke在安全上的主要防护策略:

1. Namespace

Namespace即命名空间,也被称为名称空间,这是Linux提供的一种内核级别的环境隔离功能,它的主要用途是对容器提供资源的访问隔离。Docker充分利用了Namespace的技术,使其达到尽可能地隔离容器之间以及对宿主机的影响。

目前Namespace支持多种资源的隔离,包括文件系统挂载 、主机名和域名、进程间通信 、进程访问、网络隔离、用户和组隔离等。

 

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

 

3. 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


4. Docker Daemon安全防护

Docker社区希望实现由非root权限来启动Docker Daemon,这对于Docker的安全性是一种较大的强化。但要解决这个问题面临着不小的困难,因为创建容器需要执行很多特权操作,如挂载文件系统、配置网络等。在19.03版本中Rootless模式作为实验性功能推出,并在20.10版本中毕业。该功能对于使用会有较多限制,如不支持overlay网络,AppArmor特性等。同时该模式对内核版本要求高,如果要使用默认的overlay2 存储驱动,需要至少5.11的内核版本。

同时,为了加强对服务端的保护,Docker的REST API(客户端用来与服务端通信的接口)在0.5.2之后,由原先绑定在127.0.0.1上的TCP套接字改为使用本地Unix套接字机制代替,因为前者更容易受到跨站请求伪造攻击。

$ netstat -lnpx
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node   PID/Program name     Path
unix  G2      [ ACC ]     STREAM     LISTENING     644610   1/systemd            /var/run/docker.sock
......

 

 

 5.  其他安全机制


除了上面介绍的安全机制外,Docker还支持结合现有的安全软件或机制来增强自身的安全性,例如:AppArmor、SELinux、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中比较常见并且安全的系统调用,具有适度的安全性。

$ grep CONFIG_SECCOMP= /boot/config-$(uname -r)
CONFIG_SECCOMP=y


有关更多安全相关的内容,读者可自行查看Docker官网,在此不过多列举。

 

总结:
虽然容器面临着不少安全威胁,但用户并不需要为此过多担忧。就如本文所述,Docker在安全方面已经有着非常多的应对措施,可以很好地保证容器的安全性和可靠性。

目前,Docker作为生产环境的容器化产品,已在各大企业中被广泛使用。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
标签
已于2022-7-15 12:40:45修改
5
收藏 3
回复
举报
回复
添加资源
添加资源将有机会获得更多曝光,你也可以直接关联已上传资源 去关联
    相关推荐