在运行时保护容器,实现原生云应用程序和基础设施安全的方法
2017-10-31
原生云应用程序和基础设施需要完全不同的安全方法。请牢记下面这些最佳实践。
如今,大大小小的组织正在探索云原生软件技术的应用。“原生云(cloud-native)”是指将软件封装在被称为容器的标准化单元内的方法,将这些单元排列成彼此以接口连接的微服务器以形成应用程序,并确保运行的应用程序完全自动化,以实现更高的速度、灵活性和可扩展性。
因为这种方法从根本上改变了软件的构建、部署和运行,所以它也从根本上改变了保护软件的方式。原生云应用程序和基础设施为安全专业人员带来了几个新的挑战,他们将需要建立新的安全程序来支持组织使用原生云技术。
我们来看看这些挑战,然后我们将讨论安全小组应对这些挑战应采取的一些最佳实践。首先面临的挑战是:
· 传统的安全基础设施缺乏容器的可见性。大多数现有的基于主机和网络安全的工具无法监视或采集容器活动。这些工具被构建为保护单个操作系统或主机之间的流量,而不是在其上运行的应用程序,这导致对容器事件、系统交互和容器间流量的可见性的损失。
· 攻击面可能会迅速变化。原生云应用程序由很多被称为微服务的较小的组件组成,这些组件高度分布,必须单独审计和保护每个组件。由于这些应用程序被设计为由编排系统进行配置和扩展,因此它们的攻击面会不断变化,远远超过传统的整体式应用程序(monolithic application)。
· 分布式数据流需要持续监控。把容器和微服务设计为轻量级,并通过编程方式与彼此或外部云服务进行互连。这将在整个环境中产生大量快速移动的数据,以便不断监控攻击指标以及未经授权的数据访问或渗透。
· 检测、预防和响应必须自动化。容器产生的事件的速度和容量使当前的安全操作流程无法招架。容器的短暂的生命也使捕获、分析和确定事件的根本原因变得很困难。有效的威胁保护意味着将数据收集、过滤、关联和分析自动化,以便能够对新事件做出足够快的响应。
面对这些新挑战,安全专业人员需要建立新的安全计划,以支持其组织使用原生云技术。当然,你的安全程序应该解决原生云应用程序的整个生命周期,这可以分为两个不同的阶段:构建和部署阶段以及运行时阶段。这些阶段中的每一个阶段都有一组不同的安全因素,必须解决这些安全因素以形成一个全面的安全程序。
保护容器的构建和部署
构建和部署阶段的安全性把重点放在将控件应用于开发人员工作流程以及持续集成和部署管道(deployment pipeline),以减轻容器启动后可能出现的安全问题的风险。这些控件可以包含以下准则和最佳实践:
· 保持图像尽可能小。容器镜像是一个轻量级的可执行文件,它用于封装应用程序代码及其依赖项。将每个图像的大小限制在刚好够软件运行,这样就可以将从图像启动的每个容器的攻击面最小化。从最小的操作系统基础图像开始,如Alpine Linux可以减小图像尺寸,并使图像更容易管理。
· 扫描图像以了解已知问题。当构建图像时,应检查已知的漏洞和后门。可以扫描构成图像的每个文件系统层,并将结果与常规更新的通用漏洞和后门(Common Vulnerabilities and Exposures,CVE)数据库进行比较。然后,开发和安全团队可以在图像用于启动容器之前处理发现的漏洞。
· 数字签名图像。一旦构建了图像,就应该在部署前验证它们的完整性。有些图像格式使用被称为摘要的唯一标识符,它们可以用来检测图像内容何时发生变化。用私钥签名图像提供加密可以确保用于启动容器的每个图像都是由受信方创建的。
· 加强并限制对主机操作系统的访问。由于在主机上运行的容器共享相同的操作系统,因此确保它们以适当限制的一系列功能开始是非常重要的。这可以用内核安全功能和模块(如Seccomp,AppArmor和SELinux)来实现。
· 指定应用级分段策略。微服务之间的网络流量可以分段,以限制它们之间的连接方式。然而,这需要根据标签和选择器之类的应用程序级属性进行配置,从而抽象出处理IP地址之类的传统网络细节的复杂性。分段所提出的挑战是必须先定义限制通信的策略,而不影响作为容器的正常活动的一部分在环境内和跨环境中进行通信的能力。
· 保护容器所使用的秘密。互相以接口连接的微服务经常交换被称为秘密的密码、令牌和密钥等敏感数据。如果这些秘密存储在图像或环境变量中,可能会意外暴露。因此,Docker和Kubernetes等多个编排平台已经集成了秘密管理,确保秘密只在需要时才将其分配给使用它们的容器。
Docker、Red Hat和CoreOS等公司的几个领先的容器平台和工具提供了部分或全部功能。从这些选项之一着手是构建和部署阶段确保强健的安全性的最简单的方法。
然而,构建和部署阶段的控件仍然不足以确保全面的安全程序。在容器开始运行之前抢占所有安全事件是不可能的,原因如下。首先,不可能一劳永逸地消除所有漏洞,新的漏洞始终会被利用。其次,声明式容器元数据和网络分段策略不能完全预测高度分布式环境中的所有合法应用程序活动。最后,运行时控件使用起来很复杂,经常会配置错误,使应用程序容易受到威胁。
在运行时保护容器
运行时阶段的安全性包括发现和停止容器运行时发生的攻击和策略违规所需的所有功能,即可见性、检测、响应和预防。安全小组需要对安全事件的根本原因进行鉴别分类、调查和确认,以便对其进行充分的补救。以下是成功运行时阶段的安全性的关键方面:
· 为持续可见性测量整个环境。能够检测攻击和违反策略的行为都始于能够实时捕获运行容器的所有活动,以提供可操作的“事实上的来源(source of truth)”。存在各种用于捕获不同类型的容器的相关数据的仪器框架。选择可以处理容器的容积和速度的关键。
· 关联分布式威胁指标。把容器设计成按资源可用性分布在计算基础设施。鉴于应用程序可能包含数百或数千个容器,攻击的指标可能会扩散到大量的主机上,这使确定与作为主动威胁的一部分相关的那些主机变得更困难。需要大规模,快速的相关性来确定是哪些指标构成特定攻击的基础。
· 分析容器和微服务行为。微服务和容器可将应用程序分解为执行特定功能并被设计为不可变的最小组件。这种做法比传统应用程序环境更容易让人理解预期行为的正常模式。与这些行为基准的偏差可能反映了恶意活动,而这可以更准确地检测威胁。
· 用机器学习增强威胁检测。在容器环境中产生的数据量和速度使常规的检测技术应接不暇。自动化和机器学习可以实现更有效的行为建模、模式识别和分类,以更高的保真度和更少的误报检测威胁。要警惕那些仅仅用机器学习来生成用于警告异常的静态白名单的解决方案,这可能会导致严重的警报噪音和疲劳。
· 拦截和阻止未经授权的容器引擎命令。发给容器引擎的命令(例如Docker)用于创建、启动和终止容器以及运行启动中的容器内的命令。这些命令可以反映对容器的攻击企图,这意味着必须禁止任何未经授权的容器。
· 将响应和取证的动作自动化。容器的短暂生命意味着它们留给事件响应和取证的可用信息极少。此外,原生云架构往往将基础设施视为不可变,自动将受影响的系统替换为新的系统,这意味着容器在调查时可能会消失。自动化可以确保快速捕获、分析和升级信息,以减轻攻击和破坏的影响。
基于容器技术和微服务架构的原生云软件正在迅速地对应用程序和基础设施进行现代化。这种范式转移迫使安全专业人员重新考虑能有效保护其组织所需的计划。当容器被构建、部署和运行时,一个全面的原生云软件安全程序解决了整个应用程序生命周期。通过使用上述指南实施程序,组织可以为容器基础设施及运行在它上面的应用程序和服务构建稳固的基础。
Wei Lien Dang是StackRox的产品副总裁,StackRox是一家为容器提供适应性威胁防护的安全公司。此前,他曾担任CoreOS的产品负责人,并担任Amazon Web Services、Splunk和Bracket Computing的安全和云基础架构的高级产品管理角色。