【51CTO.com快译】云原生应用程序与基础设施需要配合不同于以往的安全方法。而以下最佳实践无疑值得您关注。
在本系列文章的上半部分,我们探讨了云原生软件技术——特别是容器与微服务——所带来的实际挑战,以及传统安全工具无法满足实际需求的相关理由。在今天的下半部分中,我们将继续这一议题,聊聊两大阶段当中的实际解决思路。
保护容器构建与部署
构建与部署阶段的保护重点,在于将控制能力引入开发者工作流以及持续整合与部署管道,从而缓解容器启动后可能出现的安全问题。相关指导原则与最佳实践包括:
· 尽可能降低镜像体积。 容器镜像是一个轻量化可执行文件,用于打包应用程序代码以及运行所必需的关联面。缩小镜像体积能够有效降低攻击面。作为安全保护工作,我们应从为系统基础镜像“瘦身”开始,例如Alpine Linux能够有效降低镜像体积并提升管理能力。
· 扫描镜像以发现已知问题。 在进行镜像构建时,确保其中不存在已知漏洞无疑非常重要。您可以扫描镜像当中的各个文件系统层,并将结果与CVE数据库进行比较。如此一来,开发与安全团队即可保证用于启动容器的镜像不致包含已经被发现的漏洞。
· 数字签名镜像。 镜像构建完成后,其完整性应在部署前接受验证。我们可以利用惟一摘要标识符对部分镜像格式进行检测,从而把握其内容何时曾发生变化。利用私钥签名镜像实现加密保证,确保用于启动容器的任何镜像皆由可信方所创建。
· 加强并限制对主机操作系统的访问。 由于运行在同一主机上的容器共享同一操作系统,因此确保其仅接入与自身作用相关的功能集就非常重要。我们可以利用内核安全功能与模块(例如Seccomp、AppArmor以及SELinux)实现这一目标。
· 特定应用级细分策略。 微服务间的网络流量可进行细分,用以限制具体连接方式。但在实施层面,这要求我们根据标签及选择器等应用级属性进行配置,从而将IP地址等传统网络复杂性因素抽象出来。细分工作的难度在于必须预先定义通信限制策略,且保证其不会影响容器在环境内/跨环境情况下的通信能力。
· 保护容器所使用的敏感信息。 微服务间经常交换密码、令牌及密钥等敏感数据。如果将其存储在镜像或者环境变量中,则可能引发意外泄露风险。因此,Docker与Kubernetes等平台皆集成有敏感信息管理功能,确保其仅在必要时分配给正确的容器对象。
Docker、红帽以及CoreOS等领先容器平台与工具能够提供部分乃至全部上述提到的功能。选择这些方案能够帮助您快速实现构建与部署阶段的安全保障目标。
然而,构建与部署阶段的控制手段并不足以实现彻底安全。之所以无法在容器启动前解决所有安全问题,原因有三:第一,漏洞无法被完全消除,新的漏洞终将出现; 第二,声明容器元数据与网络细分策略并不能完全预测高度分布环境中的所有合法应用活动; 第三,运行时控件的使用非常复杂,经常出现配置错误,并导致应用程序遭受威胁。
运行时内容器保护
运行时阶段的安全保障包括发现并在必要时停止容器运行所需要的所有功能——可见性、检测、响应以及预防等等。安全人员需要对安全事件的根源进行调查、判断与确定,从而作出充分补救。以下为实现这一目标的几大重要前提:
· 对整体环境进行持续监控。 能够实时追踪全部运行中容器内的活动以提供“真相来源”,从而及时发现攻击及策略违规。我们可以选择市场上的多种不同容器相关数据监控框架,但请确保其符合您的容器规模与速度需求。
· 对分布式威胁指标进行关联。 容器的一大特性在于根据资源可用性分布于计算基础设施之上。由于应用程序内可能包含大量容器,因此违规指标可能同样分布于众多主机当中。因此,我们需要对其进行规模化快速关联,从而将对应指标与特定攻击联系起来。
· 分析容器与微服务行为。 微服务与容器可将应用程序拆分为执行特定功能且不可变的众多小型组件。如此一来,我们将能够更轻松地理解预期的正常行为模式。而与正常基准不符的行为则可能代表存在恶意活动。
· 利用机器学习强化威胁检测。 容器环境下生成的数据规模及生成速度往往超出常规检测技术的承载能力。自动化与机器学习类方案能够更高效地实现行为建模、模式识别与分类,从而提高判断准确度并减少误报状况。但请不要使用那些仅利用机器学习生成静态白名单的解决方案,其往往会带来严重的误报并令管理人员因疲劳而忽略掉真正的威胁。
· 拦截并阻止未授权容器引擎命令。指向容器引擎的命令用于创建、启动并终止容器以及运行于容器内的全部负载。这些命令的出现可能破坏容器环境,因此必须禁止一切未授权容器引擎命令。
· 自动响应与取证。 容器因生命周期较短而很少留下可用于事件响应及取证的信息。此外,云原生架构通常会利用新系统替换存在问题的系统,导致容器在取证调查时已然消失。自动化机制能够确保快速捕捉、分析并升级信息,从而减轻攻击与违规活动的影响。
基于容器与微服务技术的云原生体系正快速普及,并迫使安全人员重新考虑保护手段的实际成效。一套全面的云原生软件安全程序应面向整个应用程序生命周期,包含容器的构建、部署与运行阶段。希望今天的文章能够为大家在这方面带来一点启示。
【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】