虽然容器技术出现已经超过了十年时间,但由于其应用的轻量性、快捷性和灵活性,使得容器应用的流行程度一直保持了快速的增长趋势,并逐渐成为云原生环境中部署业务应用和工作负载的不二选择。在容器应用快速普及的发展背景下,要确保容器应用的安全性也将是一项充满挑战的工作,不仅需要全面实施并维护保护容器和底层基础设施的安全控制措施,保护容器化的应用程序,同时还需要保护整个DevOps生命周期中使用的各个组件堆栈。
容器应用安全的主要挑战
据CNCF(云原生计算基金会)最新的调查数据显示,目前有96%的企业组织正在使用或计划使用容器技术,确保容器应用安全对于保护现代企业数字化转型的安全开展至关重要。安全研究人员发现,容器技术在应用中的安全挑战主要包括以下方面:
01
容器环境对外暴露
在大多数时候,创建容器是为了使应用部署更加方便。但是没有访问控制措施的容器也会给不法分子可乘之机。此外,容器技术应用部署依赖 Linux 内核的 namespaces 和 cgroups 等特性,从攻击者的角度看,可以利用内核系统漏洞从多个维度发起针对性的逃逸和越权攻击。
02
开源代码随意使用
开源代码虽然使用方便,但会带来许多安全威胁。大多数的开源代码缺少秘密信息(secrets)验证这一环节,这可能会暴露企业的机密信息。比如说,一些开源代码中会含有代码贡献者的IP信息,因此当这些代码运行时,会出现针对该IP地址的远程过程调用(RPC),一旦攻击者监控到这些未授权的RPC,就能够模仿成被调用的对象来访问容器中的应用或数据。
03
交付周期变短
在容器开发模式中,很多开发人员被迫加快行动,以提供更大的价值,这导致团队常常忽略安全性检测以便如期交付。为了提升应用的交付速度而降低安全性完全是个误区。实际上,从长远来看,在整个应用开发生命周期的早期阶段实施安全可以节省更多的开发时间和成本。
04
安全职责不明确
企业应用上云后的安全需要遵循责任共担模型,在企业应用架构云原生的转型过程中,需要企业应用管理者和安全运维人员理解容器应用安全的责任边界。这个过程中也需要云服务商输出更全面的容器安全最佳实践并提升安全能力的易用性,降低使用门槛。
05
缺少应用侧的防护
容器技术改变了传统业务应用的部署模式,应用自身的生命周期被大幅缩短,一个容器应用的生命周期通常是分钟级;同时,随着存储网络和异构资源利用率等基础设施能力上的提升,容器应用的部署密度也越来越高。在此背景下,传统的安全防护策略和监控措施已经无法适应容器技术安全应用的需求。
容器安全的6点建议
为了应对上述容器化应用进程中的安全挑战,本文收集整理了6种有用的最佳实践。
01
编写干净的代码
为了保护容器应用中的数据安全,企业应避免将隐私信息硬编码到软件代码或存储库的配置文件中。企业可以使用Git Secrets或其他类似的工具,防止将密码及其他敏感信息提交到Git存储库。另外,建议企业使用像Amazon CodeGuru Reviewer这样的工具来检查编写的代码,提前发现任何潜在的漏洞。越早检测和缓解漏洞,对保障容器的应用安全越有利。
02
容器镜像加固
对容器镜像进行加固有助于限制潜在的安全风险并减少漏洞。为了简化这个过程,企业可以使用面向容器操作系统的加固版镜像,但切勿盲目相信这些预加固的镜像。企业要确保不断地扫描它们,以查找其中可能潜入的安全漏洞。通过使用加固版镜像构建管道,企业可以创建供一个标准化的基础镜像环境,提升容器应用的安全性。
03
确保镜像安全
为了确保镜像安全,企业组织要确保仅从可信来源提取镜像,并将它们存储在企业的私有存储库中。通过私有存储库,企业可以为容器的访问管理提供必要的安全控制措施。要确保只给需要访问权限的人进行授权,同时不要以root用户的身份运行镜像,这种做法过于宽松,可能会让不法分子有机会注入恶意代码。
04
在整个管道中测试容器
企业应该在整个开发管道中进行安全性测试,而不是把测试留到最后环节。第一种测试方法是容器镜像扫描,这有助于识别软件漏洞。接下来,使用静态应用程序安全测试(SAST)工具来分析源代码或编译好的代码,以帮助发现安全缺陷。最后,动态应用程序安全测试(DAST)工具从外部自动扫描Web应用程序,寻找安全漏洞,比如SQL注入、命令注入或不安全的服务器配置。DAST通常在应用程序部署到试运行环境之后完成。
05
确保容器环境的可观察性
安全运营团队需要了解全局,以便尽早缓解威胁,这就是合作至关重要的原因。由于容器是短暂的,会快速创建和销毁,因此很难监控和跟踪变化,特别是在复杂系统中。为了帮助安全运营团队监控容器运行的安全态势,需要采用那些可以提供全面可见性又不干扰容器运行工作的创新安全工具。正确的安全工具可以让企业足以深入了解适当监控和测量容器运行状况所需的指标和日志。
06
确保访问安全
加强对容器的访问管理极其重要,除了应遵循最小权限理念,还应该采取零信任方法,即从不信任并始终验证请求访问的任何设备、应用程序或用户。使用基础设施即代码(IaC)是确保应用程序容器在部署时安全的好方法。记得在部署之前采取必要的安全处理流程,比如扫描IaC模板,以防配置被其他团队更改。