青藤云安全

云原生正在统治世界:却成为了安全的梦魇?

2021-09-10

云原生的生命周期由四个连续的阶段组成,分别是开发、分发、部署和运行时,每个阶段都是对前一个阶段的拓展和延伸。云原生思想核心内涵是持续集成(Continuous Dntegration)、持续交付(Continuous Delivery)、持续部署(Continuous Deployment)、持续安全(Continuous Security)。本文,将重点介绍开发、分发、部署这三个阶段的安全建设,也就是如何实现安全左移。关于运行时安全,笔者将在下一期《全景图:云原生运行时阶段的安全实践》进行重点介绍。

图1:云原生的生命周期

下文将详细分析在开发、分发、部署阶段都面临哪些安全考验,以及相对应的安全工具、流程、检查。

>> 开发阶段 <<

“开发”阶段是云原生生命周期的第一个阶段,包括创建组件(例如基础架构即代码、应用程序和K8s清单等),用于部署和配置云原生应用。事实证明,这些组件是许多攻击向量的源头,经常被攻击者在运行时利用。(相关内容,将会在后文详细介绍)在这个阶段需要创建各种安全工具、流程和检查机制,进而缩小应用在运行时可能面临的攻击面。

1.开发阶段的安全检查

开发阶段的安全加固是应用部署前的一个关键动作。必须在软件开发早期就引入安全能力,这些安全能力建设通常是围绕安全风险和合规进行的。在早期阶段解决这些安全问题,可减少后期的重新处理,这确保不会因为重新处理延缓DevOps流程,也不会增加总体成本。

DevOps团队,一方面需要利用构建的安全工具,在应用部署前就能识别安全配置错误和漏洞;另一方面,这些工具需要无缝集成到DevOps团队现有和熟悉的工具中,以增强敏捷性和安全性。例如,这些工具需要在开发人员IDE中,可对Dockerfile以及k8s清单等进行扫描,并提供丰富的上下文相关的安全信息。这样,研发人员就可以根据这些信息在代码开发阶段就进行安全处理,采取这些措施可确保消除已知漏洞或高风险配置。

图2:开发阶段的安全检查

此外,各团队应部署专用的开发、测试和生产环境,以便开发人员能够独立地开发、测试和部署各个系统和应用并进行非功能性测试。

开发人员、运维人员和安全人员应针对关键业务级、高威胁类型、频繁变更或具有 bug 历史记录的代码和基础架构进行测试。测试可能涵盖了部署、操作系统、基础架构和数据库加固、应用程序测试(静态和动态源代码测试、容器配置)、集成或系统测试(应用和基础架构组件的验收及其交互)以及冒烟测试(部署后对实时系统进行检查)。测试编写者应可以访问开发和测试综合环境,以便他们能够快速地开发测试,同时缩短持续集成(CI)的反馈循环。同时,应该为测试编写者提供系统测试包,以便在本地运行,也可以在共享测试环境中运行。

2.代码审查

对工作负载或已部署了工作负载的基础架构进行细微变更,也可能会产生深远的安全问题。为了降低产生意外后果的风险,建议各团队先根据“四眼”原则进行代码审查。它的意思是必须要有至少两个人(包括作者)检查过代码,然后再将先前的变更整合到代码库中(例如,在git工作流中实现拉取请求)。

>> 分发阶段 <<

分发阶段的主要任务是使用镜像定义和规范来构建下一个阶段的组件,例如容器镜像、VM镜像等等。按照现代的持续集成和持续部署范式,分发阶段包括系统的应用测试,以识别软件中的bug和错误。但是,采用开源软件和可重复使用的软件包会导致将漏洞和恶意软件引入到容器镜像中。因此,有必要执行一些安全措施,例如扫描镜像,检查是否存在上述威胁,以及验证镜像的完整性,防止被篡改。下文将详细介绍安全最佳实践,帮助开发人员和运维人员识别并保护容器镜像免受威胁,并确保有适当的技术和工具可以保护整个CI/CD管道和基础架构的安全。

图3:分发阶段的安全检查

1.构建管道

持续集成(CI)应是独立的,并仅限于具有相似安全性或敏感性的项目使用。基础架构的构建若需要提升权限,则应在独立的专用CI服务器上运行,构建策略应在CI管道中以及编排工具的准入环节中执行。

在这个过程中,供应链工具可以收集构建管道的元数据并进行签名。后续阶段可以验证签名,以验证管道的必要阶段已经在运行。

总得来说,应确保CI/CD基础架构尽可能安全。例如,应优先考虑尽快安装安全的更新版本,并应通过使用硬件安全模块(HSM)或凭据管理器来保护加密密钥不被泄露。

2.镜像扫描

容器的镜像扫描,是保护容器应用的一个重要步骤。先在CI管道中进行扫描,然后再将镜像部署到生产中去。整个生命周期过程,需要确保开发人员、运维人员和安全专业人员详细了解所有已知漏洞以及诸如严重性、CVSS分数和是否具有缓解措施、修复程序之类的详细信息。

此外,还需将容器镜像的漏洞扫描与管道合规性规则相结合,可确保仅将安全的应用部署到生产环境中,从而减少了潜在的攻击面。扫描容器镜像还有助于识别来自开源镜像仓库的开源软件包或根镜像层中是否存在恶意软件。通过容器镜像的扫描,各团队可以了解是否存在漏洞或恶意软件,但并不能预防漏洞或恶意软件。

3.镜像加固

容器镜像是构建管道的一级输出。因此,容器镜像必须进行安全加固,加固时要考虑到缓解威胁,同时允许在运行时阶段进行一些即时配置,以便与生态系统的其他部分相适应。

关于安全保证目标,应评估以下问题:

● 执行环境是否应限于特定用户?

● 是否应该限制资源的访问?

● 是否应限制内核级的进程执行?

4.容器应用清单扫描

应用清单列出了部署容器化应用所需的配置。如NIST800-190等指南和建议推荐了应用容器安全的最佳实践和配置。因此,重要的是使用工具扫描CI/CD管道中的这些应用清单,找出可能导致不安全的配置。

5.容器应用清单加固

对于容器镜像,可以在构建阶段以及运行时阶段考虑并执行容器应用清单加固。

关于安全保证目标,应评估以下问题:运行时执行生态系统应遵守哪些最小约束?

6.安全测试

云原生应用需要遵循与传统应用相同质量测试标准,包括通过静态应用安全性测试(SAST)、lint扫描、依赖性分析和扫描、动态应用安全性测试(DAST)、应用工具以及开发人员可以在本地工作流程中全套测试基础设施。自动化测试结果应按照二重证据法(开发人员和工具)的要求进行映射,以向安全和合规团队提供实时安全保护。

一旦确定了安全bug(例如,错误的防火墙或路由规则),如果通过根本原因分析确定了该bug有可能再次出现,那么开发人员应编写自动测试以防止重现。在测试失败时,团队会收到反馈以对该bug进行修复,并且在下一次能够通过测试(假定bug已修复)。这样做可以防止将来变更代码时回退到最初的代码。

基础架构的单元测试是一种预防性控制,对已构建的基础架构进行安全测试是一种检测性控制,结合了安全保证、历史回归和非预期配置检测(公开的防火墙规则、IAM 特权策略、未认证的端点等)。

应有全面的测试套件来支持对基础架构和工作负载进行加固,这可以随着系统的成熟而逐步加固。在构建阶段应该进行测试,确认已经进行了加固,但也应在部署阶段时执行测试,进而评估整个生命周期中可能发生的任何变更或回归。

7.组件和镜像

①镜像仓库安全

开发人员,通常会从公共仓库中获取开源组件。因此,组织机构应在其管道中创建多个用于暂存的镜像仓库。只有经授权的开发人员才能访问公共镜像仓库并拉取根镜像,然后将其存储在内部镜像仓库中以供组织内部使用。另外,建议组织机构建立单独的私有镜像仓库,用于存储每个团队或每个小组的开发组件。最后,还应建立一个暂存或生产前的镜像仓库,以备生产阶段使用。这样就可以更严格地控制开源组件的来源和安全性,同时可以对CI/CD中的各个阶段进行不同类型的测试。

对于任何已使用的镜像仓库,必须通过专用的身份验证和权限模型来实现访问控制,对所有镜像仓库之间的连接,使用相互认证的TLS。

②签名、可信任及完整性

在构建阶段对镜像内容进行数字签名,并在使用前对签名数据进行验证,以防止镜像数据在构建阶段和运行时阶段之间被篡改,从而确保组件的完整性和来源。验证应从说明组件已经过审核和批准这一流程开始。可信验证还包括验证组件具有有效签名。在最简单的情况下,每个组件可以由一位签名者签名,以表明该组件经过了一个测试和验证过程。但是,在大多数情况下,软件供应链更为复杂,创建一个组件需要多个验证步骤,例如:

● 容器镜像签名——容器镜像清单的签名过程

● 配置签名——配置文件(即应用配置文件)的签名:在 GitOps 方法中最常见,其中可能包括一个验证和检查配置的过程

● 软件包签名——对组件软件包(如应用软件包)进行签名

③加密

容器镜像内容经过加密后,可确保内容从构建阶段到运行时阶段都可以保持机密性。如果在分发时遭到入侵,镜像仓库的内容仍可以保持机密,这有助于解决诸如保护商业秘密或其他机密材料之类的用例。

容器镜像加密的另一个常见用途是强制执行容器镜像授权。当镜像加密与密钥管理认证相结合时,可能会要求容器镜像只能在特定平台上运行。容器镜像授权对于合规(例如,区域限制或出口控制以及数字版权媒体管理)很有用。

>> 部署阶段 <<

“部署”阶段的主要任务是整合一系列运行前检查,确保要在运行时环境中部署的应用符合并遵守全组织机构范围内的安全性和合规性策略。

图4:部署阶段的安全检查

1.运行前部署检查

部署之前,组织机构应认真检查以下各项是否存在及其当前状态:

● 镜像签名和完整性

● 镜像运行时策略(例如,不存在恶意软件或严重漏洞)

● 容器运行时策略(例如,不存在多余的特权)

● 主机漏洞和合规性控制

● 工作负载、应用和网络安全策略

2.响应和调查

云原生安全解决方案应提供身份验证、授权、操作和失败的日志记录。开发人员应将此功能纳入计划和设计阶段。当进行调查并需要确定根本原因时,这些日志数据就提供了很好的证据。

数据是任何事件响应和缓解活动不可或缺的一个组成部分,为确定事件的根本原因提供了证据,并为要采取的任何缓解措施提供了分析素材。但是,容器环境的短暂特性要求使用更敏捷的工具集来捕获和分析数据。因此,需要将数据采集能力集成到事件响应计划和程序中,将为获取和处理证据提供方法,缩短溯源分析的时间,最大程度地降低入侵风险。

下一期内容,将重点介绍在运行时阶段,云原生安全挑战及解决方案。

为1000+大型客户,800万+台服务器
提供稳定高效的安全防护

预约演示 联系我们
电话咨询
售前业务咨询
400-800-0789转1
售后业务咨询
400-800-0789转2
复制成功
在线咨询
扫码咨询
扫码咨询
预约演示 下载资料