Docker容器安全性分析( 七 )


cAdvisor在宿主机上以容器方式运行,通过挂载在本地卷,可对同一台宿主机上运行的所有容器进行实时监控和性能数据采集,具体包括CPU使用情况、内存使用情况、网络吞吐量、文件系统使用情况等信息,并提供本地基础查询界面和API接口,方便与其他第三方工具进行搭配使用 。cAdvisor默认将数据缓存在内存中,同时也提供不同的持久化存储后端支持,可将监控数据保存Google BigQuery、InfluxDB或Redis等数据库中 。
cAdvisor基于Go语言开发,利用CGroups获取容器的资源使用信息,目前已被集成在Kubernetes中的Kubelet组件里作为默认启动项 。

  1. (命令示例: docker run - v / var / run : /var/ run : rw - v / sys : /sys:ro -v/ var / lib / docker : /var/ lib / docker : ro - p8080 : 8080 - d -- name cadvisor google / cadvisor )
容器安全审计
1、Docker守护进程审计
在安全审计方面,对于运行Docker容器的宿主机而言,除需对主机Linux文件系统等进行审计外,还需对Docker守护进程的活动进行审计 。由于系统默认不会对Docker守护进程进行审计,需要通过主动添加审计规则或修改规则文件进行 。
  1. (命令示例: auditctl - w / usr / bin / docker - k docker 或修改/ etc / audit / audit . rules 文件)
2、Docker相关文件目录审计
除Docker守护进程之外,还需对与Docker的运行相关的文件和目录进行审计,同样需要通过命令行添加审计规则或修改规则配置文件,具体文件和目录如表4所示 。
需要审计的文件或目录备注/var/lib/docker包含有关容器的所有信息/etc/docker包含Docker守护进程和客户端TLS通信的密钥和证书docker.serviceDocker守护进程运行参数配置文件docker.socket守护进程运行socket/etc/default/docker支持Docker守护进程各种参数/etc/default/daemon.json支持Docker守护进程各种参数/usr/bin/docker-containerdDocker可用containerd生成容器/usr/bin/docker-runcDocker可用runC生成容器 表4:Docker相关文件和目录审计
Docker公司与美国互联网安全中心(CIS)联合制定了Docker最佳安全实践CIS Docker Benchmark,目前最新版本为1.2.0 。为了帮助Docker用户对其部署的容器环境进行安全检查,Docker官方提供了Docker Bench for Security安全配置检查脚本工具docker-bench-security,其检查依据便是CIS制定的Docker最佳安全实践 。
容器网络安全
容器间流量限制
由于Docker容器默认的网桥模式不会对网络流量进行控制和限制,为了防止潜在的网络DoS攻击风险,需要根据实际需求对网络流量进行相应的配置 。
1、完全禁止容器间通信
在特定的应用场景中,如果宿主机中的所有容器无需在三层或四层进行网络通信交互,可通过将Docker daemon的–icc参数设为false以禁止容器与容器间的通信 。
  1. (命令示例: dockerd -- icc = false )
2、容器间流量控制
在存在多租户的容器云环境中,可能存在单个容器占用大量宿主机物理网卡抢占其他容器带宽的情况 。为了保证容器之间的正常通信,同时避免异常流量造成网络DoS攻击等后果,需要对容器之间的通信流量进行一定的限制 。
由于Docker通过创建虚拟网卡对(eth0和veth*)将容器与虚拟网桥docker0连接,而容器之间的通信需要经由虚拟网卡对eth0和veth*通过网桥连接,因此,可采用Linux的流量控制模块traffic controller对容器网络进行流量限制 。
traffic controller的原理是建立数据包队列并制定发送规则,实现流量限制与调度的功能 。为了在一定程度上减轻容器间的DoS攻击的危害,可将traffic controller的dev设置为宿主机中与各容器连接的veth*虚拟网卡,以此进行宿主机上容器间流量限制 。
网桥模式下的网络访问控制
在默认的网桥连接模式中,连接在同一个网桥的两个容器可以进行直接相互访问 。因此,为了实现网络访问控制,可按需配置网络访问控制机制和策略 。
1、为容器创建不同的桥接网络
为了实现容器间的网络隔离,可将容器放在不同的桥接网络中 。当在Docker中使用docker network create命令创建新的桥接网络时,会在iptables中的DOCKER-ISOLATION新增DROP丢弃规则,阻断与其他网络之间的通信流量,实现容器网络之间隔离的目的 。
  1. (命令示例: docker network create -- subnet 102.102 . 0.0 / 24 test )
2、基于白名单策略的网络访问控制
为了保证容器间的网络安全,可默认禁止容器间的通信,然后按需设置网络访问控制规则 。
具体而言,在同一虚拟网络内,不同Docker容器之间的网络访问可通过iptables进行控制 。在将Docker daemon的–icc参数设为false后,iptables的FORWARD链策略为默认全部丢弃 。此时,可采用白名单策略实现网络访问控制,即根据实际需要在iptables中添加访问控制策略,以最小化策略减小攻击面 。


推荐阅读