DevOps 中的容器并不是一个新概念。 它们是虚拟沙箱,具有运行微服务(包括大型应用程序)所需的所有工具。
您可以将容器视为打包系统,它允许您(作为开发人员)从集中点存储运行应用程序所需的所有内容,例如运行时和二进制代码。
容器帮助开发人员将应用程序从一个环境移动到另一个环境(例如将应用程序从本地计算机传送到虚拟环境或将其从初始阶段移动到生产阶段),消除与开发人员和生产中的不同软件和配置设置相关的所有问题结尾。
斯塔斯塔的 容器技术报告显示,全球 50% 的组织已采用容器编排。 虽然这项技术因其优点而得到了越来越多的采用,但如果不加以控制,容器可能会打开网络安全攻击的大门。
CVE 详细信息,典型的安全漏洞数据源,记录了 62 个 Docker 定制漏洞 截至撰写本文时。 这是否需要最佳开发人员实践来解决这些陷阱并保护容器以实现成功的 DevOps 流程?
这篇文章打破了容器安全的概念,强调了一些挑战,并指导您在使用容器技术时采取最佳实践。
目录
什么是容器安全?
容器安全是一个持续的过程,它使用安全协议(工具和策略)来保护容器及其环境免受潜在威胁。
如果不加以控制,这些威胁可能会损害您的应用程序、其基础设施、运行时、系统库、操作系统和内核以及其他功能。
考虑到容器在瞬态(暂时)中可用,并且也用于动态部署和扩展,因此需要自动化安全性和软件开发生命周期 (SDLC) 的每个阶段。
另请阅读:Kubernetes Kops 初学者简介
容器安全面临哪些挑战?
虽然容器有很多好处(例如加快软件交付速度),但它们也不能免受挑战,主要是因为它们需要安全措施(它们缺乏自我安全能力)。
这是因为容器通过托管操作系统 (OS) 访问硬件。 这意味着单个容器可以有多个底层容器映像,从而引入更广泛的攻击面,从而带来一些挑战。
第一个是不正确的容器配置,开发人员忘记自定义和使用默认容器配置,这些配置存在一些缺陷,例如一些暴露的、不安全的端口可能不适合您的应用程序,泄露的凭据(例如密码和身份验证令牌)以及过度颁发权限容器运行时(以 root 身份运行时)。 当不被覆盖时,这些默认配置会提供攻击途径。
接下来是容器基础设施漏洞。 在这里,容器中内置的包(例如应用程序代码、库和配置)或主机操作系统上的包会引入漏洞。 敏感性可以在应用程序生命周期的任何阶段引入,例如,当外部依赖项构建到容器映像中时、开源库作为应用程序的一部分安装、来自第三方容器注册表和主机的容器基础映像时可通过网络和端点进行利用。
容器工作负载的可见性是容器面临的最大挑战之一。 这是由于容器的高度动态特性导致监控工具无法定位哪些容器正在运行并检查其网络行为。 提高可视性可以防止违规行为,并在发生任何情况时缩短事件响应时间。
此外,如果 CI/CD 管道的任何阶段(无论是应用程序代码还是容器工作负载基础设施)不安全,容器都会受到影响。 虽然开发人员需要在应用程序生命周期结束时解决安全问题,但在开发的每个步骤中对其进行管理可以保护您的应用程序免受此挫折。
哪些工具可以解决容器安全挑战?
您可以通过使用安全工具实施容器安全性和完整性来确保部署的企业解决方案的安全。 这些工具扫描漏洞并持续监控攻击、错误或任何问题。
无论您是在寻找 开源容器安全工具 或商业化类型,所有这些都将服务于相同的目的。 它们都是通过审核您的容器基础设施并针对常见漏洞和暴露(CVE)来运行的。
您可以尝试以下一些工具:Pingsafe Editors Choice、Datadog Cloud SIEM、Anchore、Sophos Cloud-Native Security、Bitdefender GravityZone、Sysdig secure、Aqua Security 和 RedHat Advanced Cluster Security for Kubernetes。
另请阅读:用于查找漏洞的 11 个容器安全扫描器
容器安全最佳实践
尽管容器安全性存在上述挑战,但您可以实施以下最佳约定,以在应用程序生命周期的所有阶段优化容器安全性。
保护您的图像
您使用容器映像来创建容器。 最轻微的配置错误或恶意操作都可能触发生产中的容器中的漏洞。 您可以通过以下方式应对:
- 使用可信的图像 – 当不从头开始创建图像时,您始终会选择使用来自可信来源的图像。 Docker Hub 等公共存储库有镜像,包括那些带有恶意软件和配置错误的镜像。
- 仅包含必要的组件 – 如果您的应用程序不需要某些组件,最好将其删除。 例如,UNIX 系统自然地呈现“awk”和“sed”二进制文件。
- 将您的应用程序包含在容器映像中 – 容器映像包含操作系统 (OS) 和正在运行的应用程序的子集。 对于放入容器中的每个工具和库来说,这都是一个潜在的威胁。 最好将应用程序包含在容器映像中来解决此问题。 这是通过具有所有必需依赖项的静态编译的二进制文件来完成的。
自动扫描漏洞和管理
对容器和主机进行定期漏洞扫描和管理有助于检测应用程序生命周期任何阶段的漏洞。
在这种情况下,您可以执行代码扫描来检测错误,并执行静态应用程序安全测试 (SAST) 来查找应用程序代码中的漏洞。 软件组成分析 (SCA) 可以提供对开源软件组件的可见性,生成软件物料清单,可以根据记录的开源漏洞进行交叉引用。
此外,映像扫描还会分析内容和容器映像构建过程的敏感性。 使用类似的工具 克莱尔,您可以扫描已知漏洞。 或者,采用动态应用程序安全测试 (DAST),它根据容器行为指出安全风险。 DAST 工具还可以执行主机扫描,您可以在其中检查容器主机组件(主机内核和操作系统)是否存在配置错误。
虽然上述措施是在容器生命周期的持续过程中采取的,但您可以拥抱“左移”理念。 这意味着从开发生命周期一开始就实施安全性。 如果您选择这种方法,一个好的工具是 特里维。
保护容器注册表的安全
容器注册表是存储和分发映像的有效集中方式。 通常,组织会将数千个图像存储在公共或私人注册表中。 有多种措施可以确保所有团队成员和协作者都使用无漏洞的映像。
首先,实施用户访问控制(针对私有注册表)确定谁可以发布和访问图像。 虽然这是一项基本的安全措施,但它可以防止未经授权的人员发布、修改或删除您的图像。
下一个措施是对图像进行签名,将每个图像与签名者联系起来,从而很难用图像替换受损的图像。 您可以使用 Docker 内容信任 将数字签名添加到从注册表发送和接收的数据的技术。 最后,请记住(连续)扫描图像有助于检测任何严重漏洞。
监控容器
您可以通过可观察性工具优化容器工作负载的可见性。 这些工具应该能够监视和测试所有组件中的漏洞,并为容器化环境启用实时事件时间记录。
可观察性工具通过审核容器堆栈所有组件的指标和日志并分析它们是否存在异常来检测威胁。 通过这种方法,您可以在发现错误配置后立即纠正。
要收集资源使用指标,请使用 cAdvisor 或 kube-state-metrics 等工具。 要监控容器的活动和集群的性能,请使用 Grafana 或 Prometheus 等工具。
如果要分析容器之间的网络流量,请使用 Wireshark 或 tcpdump。 如果您使用 (AKS) 等托管 Kubernetes 服务,请使用 Azure Monitor 来跟踪资源和安全威胁。
此外,Azure Log Analytics 可以收集和分析您的 AKS 资源。 如果您选择 Amazon EKS,Amazon CloudTrail 非常适合记录和观看; 使用亚马逊云观察。
实施网络安全
网络安全控制措施可以帮助防止未经授权的容器访问。 这里采用的标准是网络分段,它隔离容器,限制它们仅访问必要的服务。
如果您在 Kubernetes 上运行容器化应用程序,则可以使用 K8s 网络策略来配置集群中传入和传出的 Pod 流量。 反过来,这会根据标签限制特定 Pod 的流量。
可以为 Pod 通信增强传输层安全性 (TLS)。 您可以选择 TLS 或安全套接字层 (SSL) 技术来实现 API 服务器与其他组件之间的安全通信。 如果您还想限制进入集群的流量,负载均衡器是一个很好的解决方案。
如果您的集群具有微服务,您可以通过 Meshery 或 Linkerd 等服务网格工具确保流量安全。 最后,如果您使用云产品来托管集群,请保护您的网络。
如果使用 Azure Kubernetes 服务 (AKS),请使用网络安全组 (NSG) 进行流量管理。 如果您使用 Amazon Elastic Kubernetes Service (EKS),最适合的选择是 Amazon Virtual Private Cloud (VPC) 安全组。
减少表面攻击
最大限度地减少攻击面有两个好处: 提高服务速度并降低安全漏洞的可能性。
使用多阶段构建,您可以创建具有较小表面攻击并改进的启动时间和性能的轻量级映像。 有几种解决方案可以做到这一点。 如果您使用的是 Linux,则可以使用 Alpine Linux、BusyBox 或 Tiny Core Linux。
对于 Ubuntu,有 Ubuntu Minimal。 您还可以使用 Scratch(一种特殊的 Docker 镜像)——本质上是一个开放容器,从一开始就构建简约的镜像。
限制容器权限
这里采用的原则需要提供执行给定任务的最低权限。 当容器以 root 身份运行时,它们会授予用户各种操作权限,例如在操作系统上安装软件包或读写操作权限。
风险在于,如果受到威胁,攻击者可以利用容器运行时的权力升级。 既然如此,可行的解决办法有两种。 您可以在无根模式下运行容器,或将 LINUX 内核功能限制为容器工作负载所需的功能。
安全管理秘密
您的容器和 docker 配置文件应该没有秘密。 机密包括证书、密码、应用程序接口 (API) 密钥和令牌。 虽然这是最佳实践,但您经常会看到这些秘密被硬编码到构建过程或源代码映像中。
在这种情况下,即使容器已被删除,敏感数据也会进入容器并缓存在中间容器层中。 对于这种情况,最好的方法是部署一个秘密管理解决方案,例如 AWS 秘密管理器 和 避难所 存储和管理秘密凭证。
赋予您的团队权力
作为最后的安全措施,对您的团队进行最佳安全实践教育至关重要。 这意味着您的所有团队成员都可以识别并响应安全威胁。
实现这一点的一个好方法是将容器安全性添加到团队入职流程中。 提供实践培训、持续学习和定期安全评估,让您的 DevOps 团队了解最新的安全趋势,从而使他们与众不同。
最后的想法
容器安全是软件开发生命周期中至关重要的连续过程。 处理此查询的最佳方法是将安全性从应用程序代码整合到容器运行时、主机操作系统和底层网络基础设施。
您可以通过遵循涉及验证容器并仅使用来自可信来源的容器的战略计划来实现这一点。 进行容器加固,以确保其中仅包含必要的服务。 灌输可通过监控工具轻松实施的日志记录方法。 对网络进行分段,以便将容器与整个基础设施分开。
始终对您的图像进行签名,以验证通过您的服务输入和输出的数据。 此外,您应该定期进行扫描和渗透测试,以检查是否存在任何漏洞并立即采取纠正措施。 随着技术格局的发展,始终保持最新的安全实践。
接下来,了解如何实现安全自动化。