引言随着云计算的发展,以容器、微服务为代表的云原生技术受到广泛关注。其中,Docker和Kubernetes是企业容器运行时和容器编排的首选。然而,在应用容器和Kubernetes的过程中,大部分企业都遇到了不同程度的安全问题。如何保证容器的安全成为企业最关心的问题。应用容器带来新挑战在容器应用之前,云端的大部分应用系统都运行在虚拟机上,但虚拟机仍然存在额外的资源浪费和维护成本,启动速度慢。容器技术以其资源少、部署快、易迁移等优势开始受到企业的青睐。在典型的云原生环境中,通常包括主机、镜像、容器、容器编排平台、网络、微服务等对象。但由于目前大多数企业都采用容器技术来部署业务应用,下面将着重分析与容器相关的安全挑战。容器技术的风险作为一种操作系统虚拟化技术,容器共享操作系统内核,但没有做到完全隔离。如果虚拟化软件存在漏洞或主机受到攻击,将导致容器逃逸或资源隔离失败,影响单个容器或多个容器的一定安全。容器逃逸:攻击者利用虚拟化软件的漏洞,通过容器获取宿主机权限,可以攻击容器所在的宿主机,甚至是宿主机上的其他容器。近几年发现了多个相关漏洞,其中CVE-2019-5736是RunC的安全漏洞,会导致Docker18.09.2之前的版本允许恶意容器覆盖宿主机上的RunC二进制文件机,使攻击者能够以Root身份在主机上执行任意命令。资源隔离失败:攻击者只要攻破容器操作系统的内核,就可以访问宿主机上的文件系统或进入其他容器,导致容器隔离失败。如果宿主机的文件系统挂载到多个容器的目录下,容器可以访问同一个目录,会造成信息泄露或内容篡改等安全问题。不安全的镜像镜像是应用程序/服务运行所必需的操作系统和应用程序文件的集合,用于创建一个或多个容器。它们是密切相关的,镜像的安全性会影响到容器的安全性。根据图像的创建和使用方式,通常存在三个影响图像安全性的因素。现有镜像不安全:镜像通常是开发者基于现有镜像创建的。无论是攻击者上传的恶意图片,还是已有图片的安全漏洞,基于其创建的图片都是不安全的。使用有漏洞的软件:开发人员经常使用软件库中的代码或软件。如果它们存在漏洞或恶意代码,一旦制作成镜像,也会影响容器的安全。镜像篡改:容器镜像在存储和使用过程中可能被篡改,如被植入恶意程序、修改内容等。一旦使用恶意篡改的镜像创建容器,将影响容器和应用程序的安全。东西向攻击网络实现了容器之间、容器与外界之间、应用程序之间的通信。然而,在虚拟化的容器网络环境中,其网络安全风险比传统网络更为复杂和严峻。以Docker环境为例,支持Bridge、Overlay、Macvlan等网络。虽然实现方式不同,但都存在一个共同且普遍的问题:如果容器之间没有得到有效的隔离和控制,一旦攻击者控制了某个主机或某个容器,就可以作为跳板攻击同一主机或其他容器不同的主机,这就是常说的“东西向攻击”,甚至可能形成拒绝服务攻击。运行环境未加固。作为容器载体和编排管理软件,宿主机和容器编排平台等运行环境也是容器安全的重要因素之一。如上所述,宿主机上的容器并不是完全隔离的。如果宿主机没有加固,一旦攻击者发起提权攻击,就会控制宿主机上的其他容器。不安全的容器编排平台也是如此。某汽车制造企业深受其害。由于其公有云环境中的KubernetesMaster节点没有密码保护,攻击者在窃取访问权限后利用Kubernetes集群挖矿加密。货币。容器安全响应从LXC开始,容器利用了大多数构成容器安全基础的常见Linux安全技术。面对新的挑战,无论是传统的安全加固,还是新的镜像构成分析,镜像、容器技术、网络、主机等不同层面的安全措施,都将有助于提高容器安全性。Linux内核安全机制Linux通用的安全技术包括命名空间(Namespace)、控制组(Cgroups)、系统权限(Capability)、强制访问控制(MAC)系统和安全计算(Seccomp)。一个好的容器平台应该具备这几个能力,下面将重点介绍前三个能力。命名空间:容器本质上是由各种命名空间组成的,这些命名空间为容器提供了基本的隔离,让每个容器拥有独立的进程ID、网络堆栈、根目录、内存、用户名和主机名。图1容器是命名空间的组合控制组(Cgroups):控制组负责资源审计和限制,让每个容器公平共享宿主机资源,并设置限制,防止单个容器过度消耗资源而影响主机系统和其他容器运行,也防止拒绝服务攻击。图2控制组限制容器可以使用的资源系统权限(Capability):root用户拥有所有权限,以root身份运行容器是危险的;但是如果容器以非root身份在后台运行,就会因为权限不足而处处受限。系统权限机制可以提供细粒度的权限访问控制,控制容器运行所需的root用户权限。即使攻击者获得了root权限,也无法获得主机的更高权限,可以限制进一步的破坏。图3.系统权限控制容器权限安全ContainerLinux通用安全技术为容器提供了基本的隔离,但并没有做到100%的隔离。安全容器可以通过添加额外的隔离层来进一步提高容器安全性。是一种容器运行时技术,为容器应用程序提供完整的操作系统执行环境(通常为LinuxABI),将应用程序的执行与宿主操作系统隔离开来,防止应用程序直接访问宿主机资源,使其能够运行在容器中提供主机之间或容器之间的额外保护。gVisor和KataContainers是安全容器的两个代表性实现。KataContainers利用轻量级虚拟机通过使用硬件虚拟化为容器提供隔离。每个Container/Pod都运行在一个独立的虚拟机上。它们不然后从宿主机内核中获取所有相应的权限,这样KataContainers就可以像VM一样提供强隔离。图4KataContainers架构及原理镜像安全分析作为容器运行的基础,容器镜像安全在整个容器安全生态中占有重要地位。容器镜像由若干层镜像叠加而成,通过镜像仓库进行分发和更新。因此,镜像安全可以从三个方面来实现:镜像构建安全、仓库安全、镜像分发安全。镜像构建安全:构建镜像时,验证其依赖的镜像的完整性和来源,只安装必要的软件包,并使用适当的指令减少攻击面;并使用加密技术保护密码、令牌、密钥、用户机密信息等。镜像仓库安全:镜像仓库分为公共镜像仓库和私有镜像仓库。使用公共镜像仓库镜像时,请使用官方最新版本的镜像。下载的镜像必须进行漏洞扫描和评估,并定期更新。对于私有镜像仓库,一方面要维护仓库本身的安全,比如在使用时配置相应的安全证书;另一方面,在镜像过程中使用用户权限控制来保证交互过程的安全。镜像分发安全:在下载和上传镜像时,使用数字签名和HTTPS来保证容器镜像的完整性和机密性,抵御中间人攻击等威胁。微隔离网络的基本保护手段是隔离和访问控制。容器网络保护可以使用容器环境自身的安全机制,也可以使用第三方的微隔离产品。对于Kubernetes网络,其自身的安全策略对每个Pod的入口进行访问控制,这样可以隔离高风险的微服务,但无法控制Pod内部的容器间通信和离开Pod的出口流量。第三方微隔离产品可以比Kubernetes更详细地记录进出网络连接,深度检测网络中的威胁和攻击,检测数据泄露,实现七层微隔离和网络可视化。运行环境加固使用安全基线对容器主机和Kubernetes进行检查加固,进一步增加容器的安全性。CIS发布的Docker基线已经成为Linux主机配置和Docker主机加固的最佳实践。通过创建特权容器并将Docker主机安全配置与CIS基线进行比较,可以发现并加固实施安全问题。同样,CIS已经发布了Kubernetes基线,传统的漏洞扫描工具、独立的容器安全产品(如AquaSecurity和NeuVector)以及私人维护人员已经在GitHub上发布了脚本,可以实现自动化的Kubernetes安全检查。容器安全实践随着DevOps的兴起,软件开发人员和运维人员紧密合作,通过自动化流程完成软件的开发、测试、发布和维护。大量的重复性和手动工作。现在,针对容器安全风险,已经形成了多种安全控制措施。如何将它们集成到DevOps中,有效保护应用系统,是容器安全实践中需要考虑的首要问题。为此,我们秉持DevSecOps理念,提出容器生命周期安全防护方案。本方案使用容器安全管理系统,通过容器编排技术,在容器环境中部署安全的容器,并进行持续的检测分析,实现容器环境的安全。资源可视化管理、镜像风险管理、容器运行时安全管理、合规检测、微服务API风险管理,最终保障容器在构建、部署、运行全生命周期的安全。整体架构容器安全防护方案采用模块化分层设计。通过与容器运行环境对接,实时获取容器环境中的镜像、容器等对象信息,并利用各种安全能力进行监控分析。安全管理,最终将容器环境的安全情况以图形化的方式展示给用户。图5容器安全防护架构安全管理层:负责安全管理功能,包括容器环境的资产管理、策略管理、安全能力管理,通过安全能力适配将各种管理信息发送给各种安全能力,收集后集中处理对各种安全信息进行分析处理,将容器环境中的主机、容器、镜像、网络等对象的安全状态集中展示给用户。安全能力层:负责提供特定的安全能力,为容器环境提供安全防护。安全能力包括系统安全扫描、图像文件分析、恶意文件分析、入侵检测和微隔离。运行环境层:负责提供容器镜像、容器编排管理等功能,以及容器运行应用,与容器能力层交互,共同实现容器安全防护。容器全生命周期保护该方案根据容器安全保护架构,将各种安全能力与DevOps流水线相结合,从持续集成/持续部署、运行时提供安全保护,为容器的构建、部署、运行提供全生命周期保护。容器,最终实现应用系统的安全运行。图6容器生命周期保护构建安全在应用构建阶段,通过与CI/CD管道的集成,分析构建镜像时使用的命令和配置参数,还原镜像文件构建过程,掌握命令使用的敏感操作,并分析图像文件是否包含敏感信息,如密码、令牌、密钥和用户机密信息。同时分析镜像的软件构成,发现镜像文件中包含的恶意文件、病毒、木马,以及所使用的依赖库和组件中的安全漏洞,避免无病交付。安全分析镜像部署无风险后,提交镜像仓库。这个阶段会检查容器环境的镜像仓库配置,保证镜像仓库是加密连接的。通过与Kubernetes联动,在镜像仓库添加新镜像或使用镜像创建容器时,自动校验镜像签名或MD5值,确保镜像来源可信且未被篡改。一旦发现镜像来源不可信或被篡改,禁止使用本镜像创建容器。运行安全确认镜像安全后,进入容器运行阶段。本阶段利用系统安全扫描能力,基于Docker和KubernetesCIS基线检查宿主机和容器编排工具Kubernetes的合规性。检查范围包括主机安全配置、Docker守护进程配置、Docker守护进程配置文件、容器镜像及Build、容器运行安全、Docker安全操作等,确保容器运行环境的安全。同时采用微隔离将容器与网络隔离,通过入侵检测能力实时监控容器的运行状态。监控对象包括容器中的运行进程(如netlinksocket、perfevent、eBPF)和文件系统,以及宿主环境的提权和破坏容器隔离等行为。当发现容器运行异常时,通过访问控制机制来限制容器进一步的行为和通信。结论随着云原生应用的发展,企业通过微服务交付应用系统的比例越来越大。容器安全将不仅仅是容器本身和容器环境的安全,还会延伸到微服务安全和应用安全。企业在应用云原生技术的时候,应该将容器安全作为一个整体来考虑,这样才能将安全和云原生融合在一起,更好的保护应用系统。
