在DevOps中的容器安全的9个最佳实践

在devops中,容器并不是一个新概念。它们是带有运行微服务和大型应用程序所需工具的虚拟沙盒。

你可以将容器视为包装系统,使你(作为开发者)可以将运行应用程序所需的一切存储在一个集中点,例如运行时和二进制代码。

容器帮助开发者将应用程序从一个环境移动到另一个环境(比如从本地机器移到虚拟环境,或者从初始阶段移动到生产阶段),消除了开发者和生产环境中不同软件和配置设置所带来的所有问题。

statista的容器技术报告显示,全球有50%的组织已经采用了容器编排。尽管这项技术因其优势而增加了采用率,但如果不加以控制,容器可能会为网络安全攻击打开一扇门。

cve details,作为典型的安全漏洞数据源,截至目前为止已经记录了62个针对docker的漏洞。这难道不需要最佳的开发者实践来解决这些问题,保护容器以实现成功的devops流程吗?

本文将详细介绍容器安全概念,重点介绍一些挑战,并指导您在使用容器技术时应采取的最佳实践。

什么是容器安全?

容器安全是一个持续的过程,使用安全协议(工具和策略)来保护容器及其环境免受潜在威胁。

如果不加以控制,这些威胁可能会对您的应用程序、基础设施、运行时间、系统库、操作系统和内核等功能造成损害。

考虑到容器在短暂时间内可用,并且还用于动态部署和扩展,因此在软件开发生命周期(sdlc)的每个阶段都需要自动化的安全措施。

还要阅读: 初学者的kubernetes kops介绍

容器安全中的挑战是什么?

尽管容器在其下面具有许多奖励(如加快软件交付速度),但它们并不免疫于挑战,主要是因为它们需要安全措施(它们缺乏自我安全能力)。

这是因为容器通过托管的操作系统(os)访问硬件。这意味着单个容器可以有多个底层容器映像,引入了更广泛的攻击面,带来了一些挑战。

第一个挑战是不正确的容器配置,开发者忘记自定义和使用默认的容器配置,这些配置存在一些问题,例如一些暴露的、不安全的端口可能不适合您的应用程序,泄露的凭据,如密码和身份验证令牌,以及过度授予容器运行时的权限(当以root用户运行时)。如果不进行覆盖,这些默认配置提供了攻击的途径。

下面是容器基础设施漏洞。在这里,构建到容器中的软件包(如应用代码、库和配置)或主机操作系统上的软件包会引入漏洞。容器应用程序生命周期的任何阶段都可能引入漏洞,例如,当外部依赖项构建到容器镜像中时,开源库作为应用程序的一部分安装,来自第三方容器注册表和通过网络和端点可利用的主机的基础镜像。

对容器工作负载的可见性是容器的最大挑战之一。这是由于容器具有高度动态的特性,使得监控工具无法定位哪些容器正在运行并检查它们的网络行为。改善可见性可以防止漏洞,并在发生任何问题时提高事件响应时间。

此外,容器如果处于ci/cd流水线的任何阶段不安全,都会有漏洞,无论是应用程序代码还是容器工作负载基础架构。虽然开发人员通常会在应用程序生命周期的最后阶段解决安全问题,但在开发的每个步骤中进行管理可以保护应用程序免受此类挫折。

哪些工具可以解决容器安全方面的挑战?

通过使用安全工具来实施容器安全和完整性,您可以确保部署的企业解决方案是安全的。这些工具会扫描漏洞并不断监控它们以防止攻击、漏洞或任何问题。

无论您是在寻找开源容器安全工具还是商业化类型的工具,它们都会有相同的目的。它们都通过对您的容器基础设施进行审计并针对常见的漏洞和曝光(cve)运行。

以下是一些您可以尝试的工具:pingsafe编辑之选、datadog云siem、anchore、sophos云原生安全、bitdefender gravityzone、sysdig secure、aqua security和redhat kubernetes高级群集安全。

还可以阅读:11个容器安全扫描工具来查找漏洞

容器安全的最佳实践

尽管存在上述容器安全方面的挑战,以下是您可以在应用程序生命周期的所有阶段中实施以优化容器安全的最佳惯例。

保护您的镜像

您使用容器镜像来创建容器。最小的配置错误或恶意操作都可能在生成的容器中引发漏洞。您可以通过以下方式解决这个问题:

  • 使用可信图像 – 当不是从头开始创建图像时,您应该始终选择使用来自可信源的图像。像docker hub这样的公共存储库中包含了包括连接标签为“恶意软件”和配置错误的图像。
  • 仅包含必要的组件 – 如果应用程序不需要某些组件,最好将它们删除。例如,unix系统自然提供了“awk”和“sed”二进制文件。
  • 将应用程序包含在容器镜像中 – 容器镜像包含操作系统(os)和正在运行的应用程序的子集。对于每个拉入容器的工具和库,都存在潜在威胁。最好将应用程序包含在容器镜像中以解决此问题。这通过具有所有所需依赖项的静态编译二进制文件来实现。

自动化漏洞扫描和管理

定期对容器和主机进行漏洞扫描和管理有助于在应用程序生命周期的任何阶段检测漏洞。

在这种情况下,您可以执行代码扫描以检测错误,并进行静态应用程序安全性测试(sast)以查找应用程序代码中的漏洞。软件组成分析(sca)可以提供对生成软件材料清单的开源软件组件的可见性,该清单可以与记录的开源漏洞进行交叉引用。

此外,图像扫描分析容器图像的内容和构建过程,以查找易受攻击的漏洞。使用像clair这样的工具,您可以扫描已知漏洞。或者,使用基于容器行为指出安全风险的动态应用程序安全性测试(dast)。dast工具还可以执行主机扫描,其中您检查容器主机组件(主机内核和操作系统)是否存在配置错误。

虽然上述措施是在容器生命周期的进行过程中采用的,但您可以采用“向左转移”(shift left)的理念。这意味着从开发生命周期的开始实施安全性。如果选择这种方法,一种很好的工具是trivy。

保护容器注册表

容器注册表是一种高效的集中存储和分发图像的方式。通常,组织将在公共或私有注册表中存储数千个图像。有几项措施可确保所有团队成员和合作者使用无漏洞的图像。

首先,实施用户访问控制(对于私有注册表)可以确定谁可以发布和访问图像。虽然这是一项基本的安全措施,但它可以防止未经授权的人发布、修改或删除您的图像。

下一项措施是对图像进行签名,将每个图像与签名者相关联,这样很难将图像替换为受损图像。您可以使用docker content trust技术为从注册表发送和接收的数据添加数字签名。最后,记住扫描您的图像(持续)有助于检测任何重要的漏洞。

监控容器

通过可观察性工具,您可以优化对容器工作负载的可见性。这些工具应该能够监视和测试所有组件中的漏洞,并为容器化环境启用实时日志记录。

可观察性工具通过审计容器堆栈中所有组件的指标和日志,并分析它们以检测威胁。通过这种方法,您可以在发现时立即纠正配置错误。

使用cadvisor或kube-state-metrics等工具来收集资源使用情况指标。要监视容器的活动和集群性能,请使用grafana或prometheus等工具。

如果您想分析容器之间的网络流量,请使用wireshark或tcpdump。如果您使用托管的kubernetes服务(如aks),请使用azure monitor来跟踪资源和安全威胁。

此外,azure log analytics可以收集和分析您的aks资源。如果您选择amazon eks,则适合进行日志记录和监视的是amazon cloudtrail;可使用amazon cloudwatch。

实施网络安全

网络安全控制措施可以帮助防止未经授权的容器访问。这里采用的标准是网络分割,将容器隔离,仅限其访问必要的服务。

如果您在kubernetes上运行容器化应用程序,可以使用k8s网络策略在集群中配置入站和出站pod流量。这反过来会基于标签限制流量访问特定的pod。

可以增强pod之间的通信的传输层安全(tls)。您可以选择tls或安全套接字层(ssl)技术,以实现api服务器和其他组件之间的安全通信。如果您还想限制流量进入集群,负载均衡器是一个很好的解决方案。

如果您的集群中有微服务,您可以通过meshery或linkerd等服务网格工具来确保安全流量。最后,如果您使用云提供商来托管您的集群,请保护您的网络安全。

如果您使用azure kubernetes service(aks),请使用网络安全组(nsg)进行流量管理。如果您使用amazon elastic kubernetes service(eks),最适合的选择将是amazon虚拟私有云(vpc)安全组。

减少表面攻击

减少攻击表面具有两个好处:增加服务速度和降低安全漏洞的潜在风险。

使用多阶段构建,您可以创建具有较小攻击表面的轻量级镜像,并提高启动时间和性能。有几种解决方案可供选择。如果您使用linux,可以使用alpine linux、busybox或tiny core linux。

对于ubuntu,有ubuntu minimal可用。您还可以使用scratch,这是一个特殊的docker镜像-从头开始构建最小化的镜像。

限制容器权限

这里采用的原则是为执行特定任务提供最低限度的权限。当容器以root身份运行时,它们授予用户各种操作权限,如安装软件包或在操作系统上具有读写操作权限。

风险在于攻击者如果入侵,可以利用提升容器运行时的权限。在这种情况下,有两种可行的解决方案。您可以在无根模式下运行容器,或者限制linux内核的能力仅限于容器工作负载所需的能力。

安全管理密钥

您的容器和docker配置文件应该不包含任何机密信息。机密信息包括证书、密码、应用程序接口(api)密钥和令牌。尽管这是最佳实践,但您经常会看到这些机密信息被硬编码到构建过程或源代码镜像中。

在这种情况下,即使容器被删除,敏感数据也会进入容器并缓存在中间容器层中。对于这种情况,最好的方法是部署一个机密管理解决方案,如aws secrets manager和vault,用于存储和管理机密凭据。

赋予团队更多权力

作为最后的安全措施,教育团队有关最佳安全实践是至关重要的。这意味着您的所有团队成员都能够识别和应对安全威胁。

一种有效的方法是将容器安全添加到团队的入职流程中。提供实践培训、持续学习和定期安全评估,通过为devops团队提供最新的安全趋势,使其与众不同。

最后的思考

容器安全是软件开发生命周期的一个重要持续过程。解决这个问题的最佳方法是从应用程序代码到容器运行时、主机操作系统和底层网络基础设施中,都加入安全性。

您可以通过遵循一个战略计划来实现这一点,该计划涉及验证容器并仅使用来自可信源的容器。进行容器硬化以确保它们只包含必要的服务。建立易于通过监控工具实施的日志记录方法。将网络进行分割,使容器与整体基础设施分开。

始终为您的映像签名,以验证通过您的服务的数据输入和输出。此外,您还应定期进行扫描和渗透测试,以检查是否存在任何漏洞,并立即采取纠正措施。随着技术环境的变化,始终及时了解最新的安全实践。

接下来,请查看如何自动化安全。

类似文章