3.1.2 活动容器存在的风险
在前面,我们分析了静态容器镜像的风险。那么,当镜像以容器的形式运行起来后,这些活动容器又存在哪些风险呢?
1.不安全的容器应用
与传统IT环境类似,容器环境下的业务代码本身也可能存在Bug甚至安全漏洞。容器技术并不能解决这些问题。无论是SQL注入、XSS和文件上传漏洞,还是反序列化或缓冲区溢出漏洞,它们都有可能出现在容器化应用中。
在图3-1中我们可以看到,容器默认情况下连接到由docker0网桥提供的子网中。如果在启动时配置了端口映射,容器就能够对外提供服务。在这种情况下,前述各种安全漏洞就有可能被外部攻击者利用,从而导致容器被入侵。
2.不受限制的资源共享
与其他虚拟化技术一样,容器并非空中楼阁。既然运行在宿主机上,容器必然要使用宿主机提供的各种资源——计算资源、存储资源等。如果容器使用了过多资源,就会对宿主机及宿主机上的其他容器造成影响,甚至形成资源耗尽型攻击。
然而,在默认情况下,Docker并不会对容器的资源使用进行限制。也就是说,默认配置启动的容器理论上能够无限使用宿主机的CPU、内存、硬盘等资源。在3.4.3节,我们将对此进行详细介绍。
3.不安全的配置与挂载
“配置与挂载”指的是容器在启动时带有的配置选项和挂载选项。我们知道,作为一种虚拟化技术,容器的核心是两大隔离机制:
·Linux命名空间机制:在文件系统、网络、进程、进程间通信和主机名等方面实现隔离。
·cgroups机制:在CPU、内存和硬盘等资源方面实现隔离。
除此以外,Capabilities、Seccomp和AppArmor等机制通过限制容器内进程的权限和系统调用访问能力,进一步提高了容器的安全性。
为什么配置和挂载也可能导致风险呢?因为通过简单的配置和挂载,容器的隔离性将被轻易打破。例如:
·通过配置--privileged选项,容器将不受Seccomp等安全机制的限制,容器内root权限将变得与宿主机上的root权限无异。
·通过配置--net=host,容器将与宿主机处于同一网络命名空间(网络隔离打破)。
·通过配置--pid=host,容器将与宿主机处于同一进程命名空间(进程隔离打破)。
·通过执行挂载--volume /:/host,宿主机根目录将被挂载到容器内部(文件系统隔离被打破)。
因此,用户在对容器进行配置时,一定要慎之又慎。