随着越来越多的组织将数据和工作负载转移到了云上,许多组织都开始依赖于容器来封装代码及其依赖的软件单元,以便在从一个计算环境迁移到另一个计算环境时,应用程序能够可靠地运行。克莱姆森大学遗传与生物化学系的云架构师Cole McKnight表示,容器化被誉为是一种以安全方式部署应用程序和服务的强大技术。

Docker和Singularity等容器引擎提供了一种方法来实现和分发给定应用程序的最佳实践安全策略,而不是依赖于单个的用户来配置安全安装,McKnight说。“容器编排平台,如Kubernetes、Mesos或Docker Swarm,都具有集成的安全机制来专门用于部署和执行容器,”McKnight说。“结果是可以得到一个易于配置的可用于开发和部署容器的生态系统。”

虽然这些技术抽象了交付安全应用程序和服务的传统复杂性,但一些开发团队将这种安全性的可能性也解释为了一种保证,McKnight说。问题是,容器实现不是万无一失的,团队在使用它们时所犯的错误依然可能会产生而不是解决安全问题。

1. 过分关注容器本身

“在实现安全容器时,最常见的错误是只关注容器本身,”McKnight说。维护映像安全性的最佳实践非常重要,他说,但开发人员通常只会将重点放在映像的安全性上,而不考虑执行环境。

“容器内的任何安全措施都无法保护它免受宿主的攻击,”McKnight说。“承载容器引擎的每台计算机必须在每一层上都受到保护,以防出现任何传统上可利用的漏洞。”

必须将容器引擎和容器编制平台(如果适用的话)配置为正确使用集成的容器安全机制,McKnight说。“因此,容器安全需要从主机的操作系统和网络开始,”他说。

2. 假设代码库是安全的

独立网络安全顾问Tony Asher表示,在部署容器时,一些组织会错误地将代码库包括进来,并认为它们是安全的。“这包括了开发套件中的库,”Asher说。“更重要的是,第三方库也经常会被直接引入以加速开发。”

安全性问题指的是这些应用程序代码库中可能存在漏洞,Asher说。“编译应用程序并将它们发布到生产容器中,可能会通过漏洞利用而引入严重的风险。”

为了解决这个问题,Asher建议公司在考虑导入第三方库时,将库限制在满足应用程序容器成功标准所需的范围内,扫描代码寻找漏洞,并应用安全审查流程。

组织还需要开发一个正式的安全体系结构审查流程。“这个流程应该包括检查符合风险标准的容器,由一组人来检查,”Asher说。这提供了问责制,有助于确保风险得到考虑。

3. 给予容器不必要的特权

风险投资公司ClearSky的管理合伙人Jay Leek说,给容器过多的特权是很常见的,而攻击者可以滥用这些特权来利用容器本不应该访问但确实可以访问的资源。“在这里应该应用最小特权原则,并且执行运行时行为监视,以便能够确保检测到任何非必要的应用程序特权的滥用。”Leek说。

一种常见的做法是在执行环境中使用特权来运行容器,McKnight说。“取决于主机的软件堆栈,这可能意味着不同的东西,”他说。“但是在宿主环境中给容器不必要的特权会导致问题的升级,不仅会导致容器被破坏,也可能会导致主机被破坏。”

正如容器内部的安全性无法保护它不受其主机的攻击一样,主机内部的安全性也无法保护其免受特权容器的利用。“容器的设计应该确保其运行方式不会在主机环境中为其提供不必要的特权。”McKnight说。

当需要特权时,应该以精细的粒度谨慎地给予特权,McKnight说。“最佳实践是避免在宿主环境中提供具有清除权限的容器。”

4. 过度暴露容器

同样,需要在执行时公开给公共网络的容器也需要以同样的心态进行设计。“应该只打开绝对必要的通道,而不是设计一个让容器暴露于潜在攻击的全面开放的策略。”McKnight说。

在实现容器本身时需要考虑很多问题。“容器是通过一系列命令构建的,这些命令会在映像规范中被定义,并在映像构建时以root权限运行,”McKnight说。“开发人员通常会在部署和执行容器时错误地保留这些权限。”

如果在运行时使用root权限运行容器内的进程,则该容器内的数据和软件将受到危害。为了解决这个问题,要在容器中运行的命令应该是由非root用户在没有权限的情况下运行的(如果可能的话),以避免容器中的任何权限提升。

在网络方面,也需要仔细考虑容器的数据和进程暴露给其他实体的方式。“容器的安全需要再一次从传统的操作系统和网络安全开始,”McKnight说。“必须检查容器与外部卷、网络和进程之间的任何交互。”

5. 未能正确地审查映像

在部署容器时,组织通常忽略的另一个因素是它们所基于的映像。“团队通常会犯这样的错误:在将另一方开发的映像集成到他们的解决方案之前,没有对其进行适当的审查。”McKnight说。

在从公共注册中心部署容器或将其用作基础映像之前,请对其进行扫描,以查找恶意软件和漏洞。此外,组织也应该让有经验的开发人员彻底检查映像,找出漏洞,McKnight说。

“假定推送到公共注册中心的映像是安全的,这是非常危险的,特别是在从这些映像构建额外的映像时。”McKnight说。

6. 不尊重不可变映像的原则

不可变的映像是不可以改变的,Asher指出。“这是Docker、Kubernetes和其它容器解决方案的原则,”他表示。“在internet上部署系统和数据时(internet是不受信任的媒体),需要创建一个能够确保完整性的流程。”

不可变的映像提供了一些好处,例如可预测、可销售以及提供了自动恢复能力。他们还提供了完整性,Asher说,这是安全的核心目的之一。

“当生产容器不遵循不可变的原则时,应用程序将可以连接到它们并进行更改,”Asher说。“这种行为引发了多重安全隐患。具体来说,它会破坏容器的完整性。”

最令人担忧的风险之一是恶意参与者会修改容器以包含恶意代码。这可能会对公司造成重大影响,Asher说。监视容器的完整性可以极大地降低这种风险。

“你需要改进和纠正部署管道,以防止生产容器发生变化,”Asher说。“确保在拥有质量保证的测试环境中进行更改,确保这些更改能够得到批准,然后部署新的不可变映像来替代旧的映像。”