Docker 和 Kubernetes 等容器技术是现代 DevOps 流程的基础。容器安全涉及保护容器、它们运行的基础设施以及在构建、部署和运行时期间在其中运行的应用程序。另一个方面是在集群和编排器级别保护容器。
容器安全是一个挑战,因为传统的安全工具通常与容器化环境不兼容。此外,随着DevSecOps的出现,组织开始意识到将容器安全集成到整个开发生命周期中的重要性。企业容器安全必须包括专用的容器安全工具,并与组织现有的安全策略和流程保持一致。
为什么容器安全很重要?
随着世界各地的组织向容器化基础设施过渡,越来越多的关键工作负载在容器中运行,使它们成为攻击者的主要目标。受损的容器可能会威胁到业务连续性、客户数据丢失或被盗的风险,并可能使公司面临合规风险。
容器安全的一个基本问题是容器所基于的图像。每个容器都是从镜像创建的,镜像中的任何文件或软件组件都由从它创建的所有容器继承。如果图像包含软件漏洞或恶意文件,攻击者将能够破坏生成的容器。这使得使用来自可信来源的经过审查的图像变得至关重要,并在开发生命周期的所有阶段扫描图像以确保它们安全且未被篡改。
另一个关键问题是强化容器化环境。组织必须制定流程以确保环境的每个元素都具有安全、强化的配置。这包括:
- 容器镜像
- 容器运行时(如 Docker)
- 容器编排器(如 Kubernetes)
- 基础架构组件,例如云虚拟机 (VM)
- 网络和安全组
即使这个复杂链中的一个元素不安全——例如,如果容器镜像以 root 身份运行,或者 Kubernetes 集群没有正确实施RBAC授权——攻击者可以而且将会发现弱点,冒着破坏性破坏的风险。
8 大容器安全挑战
以下是主要的容器安全挑战:
- 容器特权——容器应该以非特权模式运行,不能访问其隔离环境之外的资源。然而,实际上,容器可以使用比所需更多的权限进行部署,从而使整个环境面临安全风险。
- 不安全的镜像——容器镜像是构建容器的基础。图像使您能够重用图像组件,而不是不断地从头开始构建新的容器。但是,镜像及其依赖项可能存在漏洞,当您使用不安全的镜像构建容器时,会给环境带来安全风险。
- 无限通信——容器必须进行通信才能实现其目标。您可以通过允许容器仅与最少数量的容器通信来最小化攻击面。但是,生产环境包含许多微服务和临时容器,因此很难实施遵守最小权限原则的网络或防火墙规则。
- 运行流氓或恶意进程的容器——容器在庞大环境中的平均寿命可能为数小时或数分钟,因此难以有效监控环境。容器的快速流失使得几乎不可能手动监控在任何给定时间运行的容器进程。它不提供识别恶意或不必要进程所需的可见性。
- 开源代码——开源代码会给环境带来安全威胁。例如,开源组件可能包含具有已知漏洞的依赖项,从而使组织面临威胁。
- 合规性——开发环境非常快速且不断发展。因此,实施合规性检查变得困难。因此,您无法准确评估合规状态并确保您遵守所有相关要求。
- 缺乏标准化——遗留安全标准包括组织难以将其应用于容器的过时方法。因此,许多人使用多种安全标准和越来越多的工具。然而,这些标准和工具增加了复杂性而不是提供安全覆盖。
- 缺乏专业知识——缺乏熟练的专家和容器工具的陡峭学习曲线可能导致容器环境配置不当。
容器安全工具和解决方案的类型
集装箱监控
容器监控解决方案有助于跟踪容器性能、收集事件数据并衡量容器共享资源的影响。您可以设置多种类型的监控实践,包括:
- 主动监控——涉及实施协议以帮助防止容器故障。
- 反应性监控——当容器无法提醒用户时,这些进程会引发事件。
- 自适应监控——这种类型持续评估容器的性能和新组件的影响。
这些工具可帮助组织防止大规模故障并确定个别事件的原因。容器监控工具还可以帮助优化资源分配和软件定义网络。
容器扫描工具
容器镜像扫描,或容器扫描,工具扫描容器及其组件以发现安全威胁。容器扫描工具逐层分析容器镜像以识别潜在的安全问题。它是 DevOps 团队常用来保护容器化工作流程的核心容器安全实践的核心容器安全实践。
容器化应用程序包括许多组件,例如开源依赖项、自定义代码、图像和 Dockerfile。扫描所有组件中的漏洞至关重要。大多数解决方案使用已知漏洞数据库来确保组织能够及时了解威胁形势的发展保持最新状态。
容器运行时安全
容器运行时安全性是指用于保护容器在投入生产后免受威胁和漏洞侵害的工具和流程。容器运行时安全策略通常会引入一个强大的自动化组件,由开发人员和安全团队处理容器配置和实时环境扫描以查找漏洞和配置漂移。
Kubernetes 安全
Kubernetes 是一个容器编排平台,可以通过最大限度地减少人为错误和以编程方式扩展安全配置来帮助减少容器安全问题。然而,众所周知,Kubernetes 非常复杂,可能会暴露于各种安全问题,从而形成一个高价值的攻击面,攻击者试图妥协。
在生产中使用 Kubernetes 的组织必须实施 Kubernetes安全措施。Kubernetes 安全性包括旨在保护 Kubernetes 平台及其编排的容器的各种技术、技术和策略。它有助于确保容器工作负载的安全。
容器安全的最佳实践
保护您的图像
镜像安全是容器安全的一个重要方面。容器是根据图像创建的,这些图像要么来自公共容器注册表,要么由组织内部开发。在任何一种情况下,这些图像都可能包含漏洞。扫描所有图像(无论其来源如何)并避免使用具有安全漏洞的图像至关重要。
扫描所有包裹
团队通常认为他们只需要扫描操作系统包。这是一种常见的误解,可能会使您的环境面临安全风险。您需要扫描容器中运行的所有内容,包括非操作系统包。
扫描是至关重要的,因为任何包都可能包含一个漏洞,可能允许威胁参与者破坏系统。您必须扫描所有包,包括开源、商业、非操作系统和操作系统包。
不要以 root 身份运行图像
将图像配置为使用“root”用户运行对开发人员来说很方便,但也会带来严重的安全风险。如果图像以 root 身份运行,则它们执行的任何代码也将在 root 用户下运行。这意味着攻击者者将拥有 root 访问权限,并可以在容器内运行恶意进程。原则上,内核隔离将阻止攻击者访问主机操作系统或环境的其他部分。但是,攻击者将能够通过本地网络利用容器可用的任何服务。
此外,具有 root 访问权限的攻击者可以尝试容器突破攻击,这可能是由多个 Linux 内核漏洞造成的。容器默认以 root 身份运行,因此确保所有开发过程以不使用 root 访问权限的方式配置图像至关重要。应该在运行时检测到有风险的配置,并且不应将使用 root 访问权限的流氓镜像部署到生产环境中。
使用薄的、短命的容器
容器被设计为短期的,应该只运行其工作负载所需的基本组件。这意味着容器可以比传统服务器更安全:运行时间短意味着容器更频繁地更新,更少的组件意味着攻击面有限。
然而,实际上,许多开发人员将容器视为服务器,一次运行它们数周,并添加文件和组件,直到容器镜像变得臃肿。另一种反模式是将一个容器用于多个工作负载。这种使用少量臃肿容器的趋势不利于安全性。为确保容器安全,将容器中的文件数量减少到绝对最小值,确保每个容器运行一个小的、特定的工作负载,并定期拆除容器以更新它们。
控制容器网络访问
控制容器发送的出口网络流量是一项关键的安全措施。您可以使用跟踪容器之间传输的流量的监控工具来实现它。这些工具会自动确定正确的容器网络表面,包括进程和端口之间的绑定。
监控工具可以帮助您以多种方式控制容器网络访问。它可以检测容器与网络上各种实体之间流动的数据流量。此外,这些工具可以检测异常以识别异常网络活动,如端口扫描或异常流量。
配置失败重启策略
重新启动标志使您能够定义希望每个容器如何在退出时重新启动或不重新启动。此过程需要正确配置,因为不断退出然后尝试重新启动的容器可能会导致主机上出现拒绝服务(DoS)。
如果忽略容器的退出状态并让它不断尝试重新启动,则无法确定退出的根本原因。您必须调查容器在退出时重新启动的尝试,但您不一定需要手动执行此操作。您可以配置 on-failure 容器重启策略来限制允许的重启尝试次数。