1.前言毫无疑问,容器是目前云计算中流行的主流技术之一。Docker通过将应用的运行环境和应用打包在一起,解决部署环境依赖等问题;它消除了编译、打包、部署和运维之间的差距,有助于提高应用开发和运维效率:简而言之,这与DevOps理念不谋而合,得到了很多公司的好评。当然,Docker容器在生命周期中存在很多安全隐患,比如容器本身的问题、容器镜像的问题、容器运行时暴露出来的问题等。因此,本文将探讨Docker容器生命周期的安全问题以及相应的改进方法。希望广大读者批评指正!2.Docker容器生命周期多个阶段的Docker容器生命周期安全问题都可能引入安全问题。本章将在不同的模块中分析这些安全问题。作为一个概览,我们先了解一下Docker容器整个生命周期的安全管控架构,如图1所示。图1.Docker容器生命周期安全管控架构这张图可以体现Docker的核心——“形象”Build,ShipandRun”(构建镜像、传输镜像和运行容器)操作;Docker的应用环境可以分为“非生产环境”和“生产环境”两大类。非生产环境与Dev(开发)强相关,而生产环境与Ops(运维)强相关。非生产环境的主要控制点是图像深度扫描。在生产环境做容器编排的时候,需要从非生产环境拉取Docker镜像运行,所以镜像运行控制也是一个主要的控制点。生产环境中的主要控制点是容器系统入侵检测与防护和容器网络入侵检测与防护。同时,合规基线问题应作为Docker容器生命周期各个阶段的重要控制点。下面从Docker容器安全的主要控制点出发,列举它们处理的一些安全问题。1.镜像深度扫描在进行镜像深度扫描时,需要注意的安全问题包括但不限于:镜像中的操作系统软件包和应用程序依赖包含已知的CVE漏洞。镜像应用目录嵌入webshel??l镜像敏感信息泄露镜像完整性校验问题Dockerfile中存在不安全的写法(Dockerfile是Docker镜像的构建脚本)2.镜像运行控制在进行镜像运行控制时,安全需要注意的问题包括但不限于:镜像完整性校验问题特权模式共享root权限内存配额不限CPU优先级不限存储空间配额不限启用容器时使用Host网络模式3.容器系统入侵检测和防护在进行容器系统入侵检测和防护时,您应该重要的安全问题包括但不限于:未隔离的文件系统调用易受攻击的系统内核函数拒绝服务攻击:容器之间的局域网攻击远程API接口安全Docker缺陷架构和安全机制aks微服务架构Web应用安全问题五、安全合规基线为了应对Docker安全问题,应注意的安全问题包括但不限于:内核级网络级6.Docker及其配套软件漏洞使用时Docker及其配套软件,应注意的安全问题包括但不限于:Docker自身漏洞K8S(Kubernetes)及其他编排应用自身漏洞镜像仓库自身漏洞漏洞说明:Docker及其配套软件漏洞影响深远对Docker容器的安全性有影响,因此它们作为控制点是独立的。“所使用的Docker及其配套软件的版本不受已知漏洞的影响”可以作为“安全合规基线”。三、浅谈Docker容器安全现状的改进方法面对Docker容器安全的挑战,我们可以“分而治之”,控制各个阶段的安全控制点。在实施控制时,还可以划分优先级,优先考虑比较重要的控制点,推迟考虑不太重要的控制点(例如“镜像操作控制”控制点,与用户使用Docker的方式有较大关系。用户的危险操作可以在安全产品中进行警告,但不一定要屏蔽。Docker容器安全产品应该重点防范用户不安全使用导致的安全问题)。下面结合行业实践经验,对“镜像深度扫描”、“容器系统入侵检测与防护”、“容器网络入侵检测与防护”、“安全合规基线”等管控方式进行梳理。1、“镜像深度扫描”控制方式在使用Docker镜像之前使用Docker镜像扫描器,有助于发现Docker镜像的安全问题。基于此,知名开源镜像仓库Harbor集成了镜像扫描器,如图2所示。图2.知名开源镜像仓库Harbor集成了镜像扫描器。现有的镜像扫描工具基本上都具备“扫描软件漏洞”的基本功能。一些开源项目或商业平台具有以下特殊功能:静态分析木马、病毒、恶意软件或其他恶意威胁静态发现主流编程语言中的代码安全问题(与开发流程紧密结合)检查Dockerfile检查凭证检查漏洞由于Docker镜像是Docker容器的模板,涉及的攻击面较大,一些安全隐患不容易被扫描器发现,所以目前的“Docker镜像扫描”方式仍然不能保证容器的安全性Docker镜像建议手动查看(可以结合“dockerinspect”、“dockerhistory”等命令查看部分镜像信息)。2、“容器系统入侵检测与防护”控制方式加强了Docker容器与内核层面的隔离,有助于加强“容器系统入侵检测与防护”。例如Docker社区开发的安全特性、Linux运行时解决方案、异常行为检测应用、“容器+全虚拟化”解决方案,如图3所示。图3.“容器系统入侵检测与防御”的控制方式Docker社区开发了Cgroup和NamespceforLinux的安全特性(Cgroup可用于限制CPU、内存、块设备I/O(详见参考“dockerrun”命令)参数);命名空间可用于隔离PID、挂载、网络、UTS、IPC、用户等内核资源;Cgroup相对完善了系统资源的隔离,但是Namespace的隔离并不完善(甚至不可能,因为这是共享内核造成的先天缺陷)。一些可供参考的Linux运行时解决方案如下:Capability:一个程序有什么能力;Selinux:定义了系统中每个用户、进程、应用程序、文件访问和转换的权限,然后使用安全策略来控制这些实体(即用户、进程、应用程序和文件)之间的交互。安全策略指定如何严格或松散地检查;写入某个目录文件、打开/读取/写入网络端口等);Secomp:应用沙箱机制,使用白名单和黑名单限制进程调用系统;grsecurity:linux内核补丁,增强内核安全性。容器环境异常行为检测的部分开源应用如下:cAdvisor:可以监控节点机器和容器上的资源,进行实时监控和性能数据收集,包括CPU使用率、内存使用率、网络吞吐量和文件系统使用率。“容器+全虚拟化”方案也是“容器系统入侵防御”的有效解决方案。运行在全虚拟化的环境中(比如在虚拟机中运行容器),这样即使容器被攻破,仍然有虚拟机的保护(目前一些对安全性要求高的应用场景采用这种方式)。3.“容器网络入侵检测与防护”管控方式Docker容器网络的安全问题可以分为“网络安全防护”和“微服务web应用安全”两大类,主要思路是“隔离”和“访问”control”两者都有帮助管理两者的安全问题。另外,现阶段一些成熟的安全技术仍然可以应用到Docker场景中。具体实施时,可根据Docker应用规模和实际网络部署情况进行管控。Docker网络本身具有具有“隔离”和“访问控制”功能的网络安全机制,但存在“粒度较大”和“安全威胁意识不足”等缺陷,如图4所示。图4.安全Docker网络自身机制为了弥补Docker网络的安全缺陷,一些商业端到端的Docker安全产品对网络集群进行了深度防御,其功能和特点包括:容器防火墙运行时的网络深度数据报文检测攻击行为、异常行为告警日志监控多编排平台支持网络流量可视化一些厂商在产品中引入了机器学习的方法,在实现容器防火墙时生成行为模式和容器感知的网络规则以上功能。Docker网络具有组网方案多样、容器生命周期长短不一、应用场景多样等特点。因此,应结合组网方案的特点制定管控方法。图5为笔者针对“类传统单体应用”和“微服务架构应用”整理出的入侵检测与防御思路。图5.Docker网络入侵检测与防护思路首先,我们来看一下“传统单体应用”Docker网络集群的入侵检测与防护思路。以图6所示的微服务集群为例进行介绍。这个集群只有Nginx、Tomcat和MySQL这3个容器。图6“传统单体应用”Docker网络集群入侵检测与防护思路主机实时修改Nginx容器中的配置文件,调整Tomcat容器中的应用文件,或者持久化MySQL容器中的数据.为了对这套Dockerweb应用进行入侵检测和防御,可以考虑以下九种方法:(1)Iptables隔离通过在主机端对Docker网络集群外部实施基于Iptables的隔离策略,可以限制攻击者访问“主机映射端口中的容器”,从而缩小攻击面。(2)部署软WAF通过在Docker网络集群的流量入口部署软WAF(形式可以是主机软件也可以是Docker容器),一些恶意流量可以在这里被拦截和发现。(3)部署RASP通过在Java和PHP服务器Docker容器内部部署RASP产品,可以作为最后一道防护环节和网络治理的补充点。(4)Webshel??l扫描通过宿主机端的Webshel??l扫描引擎扫描Docker容器中的“Web应用文件”(这些文件可以通过“dockercp”命令或“动态挂载”机制获取),有助于发现攻击或植入Webshel??l。(5)日志分析通过主机端ELK等日志分析从Docker容器中获取日志文件(这些日志文件也可以通过“dockercp”或“动态挂载”获取)。此外,单独运行Sidekick日志容器等做法有助于发现安全威胁。(6)识别中间人攻击是通过Docker网络集群内部的网络隔离来防止此类基于网络的攻击的有效方法,使得攻击者无法操纵或窃听主机和其他设备的网络流量集装箱;在这种情况下,OpenVPN(开放式虚拟专用网络)提供了一种通过TLS(传输层安全)加密实现虚拟专用网络(VPN)的方法。(7)识别和阻断异常流量,根据Docker网络集群内部的实际网络拓扑结构,通过“微分段”隔离网络(“微服务架构下,IP地址可能经常变化,但预先划分的网段不会经常变化),或者对指定网桥和网卡的流量进行DPI分析,有助于识别和阻断异常流量。(8)识别拒绝服务攻击通过读取主机端Docker容器对应的cgroup文件系统相关文件的实时内容(网络、CPU、内存、磁盘),进行拒绝服务攻击可以识别。(9)网络流量可视化“网络流量可视化”是现有“容器安全产品”的常见附加功能。该功能的实现可能依赖于“指定网桥和网卡流量的DPI分析”。下面我们来看一下《微服务架构应用》Docker网络集群的入侵检测与防护思路。“微服务架构应用”与“经典传统单体应用”的显着区别包括Docker容器数量多、网络拓扑结构复杂。在这种生产场景下,K8S等平台可以帮助用户编排大型容器。可以考虑的入侵检测和防护思路如下:(1)使用K8S原生的网络策略或其第三方网络插件K8S原生网络策略“NetworkPolicy”可以提供“IP地址/网络隔离”端口号级别。注意:K8S支持以“第三方网络插件”的形式选择网络方案,这会影响网络策略的选择。例如NetworkPolicy必须由实现了CNI接口(如Calico、Cilium、Kube-route、WeaveNet等)。(2)注意微服务架构的web应用接口的“鉴权认证”问题,开发者要注意对微服务架构的web应用进行鉴权认证,降低可与网络通信的容器恶意访问接口的风险。认证”方案可以包括:网关认证方式、服务自主认证方式和APIToken方式。(3)以“组件”的形式在微服务集群中部署Web安全应用为了增加Docker网络集群的安全能力,可以将Web安全应用部署在Docker集群中(对于“单体Web应用”仍然可以继续例如我们的网站安全狗可以用来保护部署在Docker容器中的Web应用,如图7所示),也可以考虑在容器中部署API网关容器(基于Nginx+Lua)和蜂巢集群。Jar容器或资产发现和漏洞扫描器。图7.网站安全狗可用于保护Docker容器(4)使用“ServiceMesh”技术ServiceMesh(服务网格)技术弥补了K8S在微服务通信方面的不足,有助于限制对应用层的访问。服务网格是一个基础设施层,其功能是处理服务之间的通信,其主要职责是负责请求的可靠传输。在实践中,服务网格通常被实现为轻量级网络代理,通常与应用程序一起部署,但对它们是透明的。以开源应用Istio为例,它通过提供对整个服务网格的行为洞察和运行控制来满足微服务应用的多样化需求。它统一了服务网络中的流量管理、策略实施、服务身份和安全性等关键功能。同时,Istio还可以集成现有的ACL、日志、监控、配额、审计等功能。未来ServiceMesh融合架构模型如图8所示。图8.未来ServiceMesh融合架构4.“安全合规基线”管控方式需要可执行的Docker安全基线清单。可维护,用于对生产中的基础设施执行安全检查和审计。以下安全合规检查工具有很好的借鉴意义:(1)docker-bench-security(匹配Docker官方和CIS推出的安全标准,如图9)。(2)Kube-bench(运行CISKubernetes基准测试,检查Kubernetes部署的安全级别)。(3)OpenPolicyAgent(将安全策略和最佳实践与特定运行时平台解耦)。图9.支持Docker-Bench-Security和官方白皮书4.总结经过多年的发展,Docker容器技术逐渐被接受并应用在DevOps和微服务中,未来潜力巨大。本文讨论了容器生命周期中的几个安全问题。不难发现,做好Docker容器安全管控,不能忽视镜像深度扫描、容器系统和容器网络的入侵检测与防护、安全合规问题等环节。面对以上环节,可以考虑借鉴和改造现有的网络安全技术。由于不同组织对Docker的应用层次和技术选择不同,具体的实现方式也会有所不同。不同组织应根据自身情况,分阶段、分层(容器引擎层、编排层、调度层)选择合适的解决方案,更好地保护Docker容器环境。【本文为专栏作家“李少鹏”原创文章,转载请通过安安牛(微信公众号id:gooann-sectv)获得授权】点此查看作者更多好文
