Kubernetes通常被称为“K8s”,是一种非常流行的开源容器编排系统,可以自动部署、扩展和管理容器化工作负载。作为一款功能强大的工具,Kubernetes可以提供容器自修复、自动扩展和服务发现功能,目前已受到企业用户的广泛欢迎。但是,与任何创新技术的应用一样,必须要充分考虑和解决其中固有的安全风险。

总体来说,Kubernetes安全性包括三个主要部分:集群安全、节点安全和应用程序安全,其中 :

  • 集群安全包括通过启用认证、授权和加密来保护控制平面组件,如API服务器、etcd和Kubernetes控制器管理程序(Kubernetes controller manager);
  • 节点安全主要是指正确配置网络和保护Kubernetes运行时环境,包括删除不必要的用户帐户和确保应用访问的合规性;
  • 应用程序安全意味着要对pod进行保护,在Kubernetes中,pod是用于运行应用程序的容器。保护这些应用程序的前提是保护pod。Kubernetes提供了多个安全特性来帮助保护应用程序。这些特性可用于限制资源访问、实施网络策略,并支持容器之间的安全通信。

为了帮助企业组织更安全的应用Kubernetes系统,OWASP基金会日前列举出Kubernetes的十大安全风险,并提供了缓解这些风险的建议。

不安全的工作负载配置

Kubernetes manifest包含大量的配置,这些配置会影响相关工作负载的可靠性、安全性和可扩展性。这些配置应该不断地进行审计和纠正,以防止错误配置。特别是对一些高影响的manifest配置,因为它们更有可能被错误配置。虽然许多安全配置通常是在manifest本身的securityContext中设置的,但这些配置信息需要在其他地方也可以被检测到,包括在运行时和代码中都能够检测到它们,这样才能防止错误配置。

安全团队还可以使用Open Policy Agent之类的工具作为策略引擎来检测各种常见的Kubernetes错误配置。此外,使用Kubernetes的CIS基准也是发现错误配置的一个有效方法。不过,持续监控和纠正任何潜在的错误配置,以确保Kubernetes工作负载的安全性和可靠性同样是至关重要的。

供应链安全漏洞

在供应链开发生命周期的各个阶段,容器会以多种形式存在,且每种形式都有其独特的安全挑战。这是因为单个容器可能依赖于数百个外部第三方组件,将会降低每个阶段的信任级别。在实际应用中,最常见的供应链安全漏洞如下: 

  • 映像(Image)完整性——容器映像由很多层组成,每层都可能带来安全风险。由于容器映像广泛使用第三方包,因此在可信环境中运行它们可能是危险的。为了缓解这种情况,在每个阶段使用in-toto验证软件以确保映像完整性是很重要的。此外,通过密钥对使用图像进行签名和验证,可以快速检测到对工件的篡改,这是构建安全供应链的重要步骤;
  • 映像组合——容器映像包含很多层,每层都有不同的安全影响。正确构造的容器映像可以减少攻击面并提高部署效率。因此,使用最小的OS包和依赖项来创建容器映像以减少攻击面非常重要,可以考虑使用其他基本映像(如Distroless或Scratch)来改善安全态势并缩小映像尺寸。此外,Docker Slim等工具也可用于优化映像占用空间;
  • 已知的软件漏洞——由于容器映像中大量使用第三方包,安全漏洞非常普遍。映像漏洞扫描对于枚举容器映像中的已知安全问题至关重要。诸如Clair和trivy之类的开源工具会静态分析容器映像,以查找诸如CVE之类的已知漏洞,因此应该在开发周期中尽可能早地使用这些工具。

过度授权的RBAC

如果配置正确,RBAC(基于角色的访问控制)有助于防止未经授权的访问和保护敏感数据。但如果RBAC未经正确配置,就可能会导致过度授权的情况,允许用户访问他们不应访问的资源或执行违规的操作。这可能会造成严重的安全风险,包括数据泄露、丢失和受损。

为了防止这种风险,持续分析RBAC配置并实施最小特权原则(PoLP)是至关重要的。这可以通过减少终端用户对集群的直接访问、避免在集群外部使用服务帐户令牌以及审计第三方组件中的RBAC来实现。此外,强烈推荐部署集中式策略来检测和阻止危险的RBAC权限,使用RoleBindings将权限范围限制到特定的名称空间,并遵循官方规定的RBAC最佳实践。

安全策略未执行

安全策略执行主要指安全规则和条例的实施,以确保符合组织策略。在Kubernetes应用中,策略执行指的是确保Kubernetes集群遵守组织设置的安全策略。这些策略可能与访问控制、资源分配、网络安全或Kubernetes集群的任何其他方面有关。

策略执行对于确保Kubernetes集群的安全性和遵从性至关重要。如果安全策略未被执行可能导致安全漏洞、数据丢失和其他潜在风险。此外,安全策略执行有助于维护Kubernetes集群的完整性和稳定性,确保资源得到有效和高效的分配。

确保在Kubernetes中有效执行安全策略是至关重要的,其中包括:

  • 定义与组织目标和法规需求相一致的策略;
  • 使用kubernetes本地资源或策略控制器实现策略;
  • 定期审查和更新策略,以确保其保持相关性和有效性;
  • 监控违反策略的行为并及时予以纠正;
  • 教育用户Kubernetes策略及其重要性。

不充分的日志记录

日志记录是任何运行应用程序的系统的基本组件。Kubernetes的日志记录也不例外。这些日志可以帮助识别系统问题,并为系统性能优化、安全漏洞修复和数据丢失取证提供有价值的分析。各种来源(包括应用程序代码、Kubernetes组件和系统级进程)都可以生成Kubernetes日志。

为了安全的应用Kubernetes系统,企业组织需要对其运行态势进行充分的日志记录: 

  • 使用集中式日志系统——集中式日志系统收集并存储所有Kubernetes组件和应用程序的日志,并将其保存在一个位置,这使得识别和响应系统问题会变得更加容易;
  • 使用标准化的日志格式——标准化的日志格式使搜索和分析来自多个源的日志变得更加容易。Kubernetes有多种标准的日志格式,包括JSON和syslog。安全团队需要选择其日志系统支持的格式,并配置其Kubernetes组件和应用程序以使用该格式;
  • 维护完整的日志——记录所有内容可以确保完整地了解系统行为。但是,记录所有内容也会生成大量数据。要管理这些数据,可以考虑设置日志轮换和保留策略;
  • 使用标签和注释——标签和注释是Kubernetes的一个强大功能,可以为日志提供额外的上下文。通过标签和注释,运维人员可以根据特定的条件对日志进行过滤和搜索;
  • 监控Kubernetes日志——定期监控日志可以快速识别系统出现的问题并及时响应。有许多不同的工具可用于监视Kubernetes日志,包括Grafana和Kibana等;
  • 日志审计——在Kubernetes中进行日志审计使团队能够跟踪对Kubernetes API服务器和其他Kubernetes组件的更改,帮助识别未经授权的系统更改,并确保符合安全策略。为了在Kubernetes中设置审计,需要配置Kubernetes API服务器来记录审计事件,并发送到集中的日志记录系统进行分析。

受损的身份验证

受损的身份验证是一个严重的安全威胁,将允许攻击者绕过身份验证并获得对应用程序或系统的未经授权的访问。在Kubernetes中,由于以下几个因素,可能会引发受损的身份验证:

  • 如果攻击者可以获得用户的凭据,他们可以绕过身份验证并获得对Kubernetes集群的未经授权的访问;
  • Kubernetes支持多种身份验证机制,包括X.509证书、静态令牌和OAuth令牌。错误配置的身份验证规则可能会使Kubernetes集群容易受到攻击;
  • Kubernetes使用多种通信通道,包括Kubernetes API服务器、kubelet和etcd。如果这些通信通道不安全,攻击者可以拦截和操纵流量以绕过身份验证。

在Kubernetes中,可以实施一些积极的安全措施来防止身份验证被破坏,包括: 

  • 用户必须使用不容易被猜测的强密码或身份验证令牌;
  • Kubernetes组件之间的通信通道必须使用SSL/TLS加密;
  • Kubernetes中使用的认证机制必须正确配置,以防止未经授权的访问;
  • 需要基于用户角色对Kubernetes资源的访问进行限制。

网络未分段

当Kubernetes网络中没有附加控制时,任何工作负载都可以与另一个工作负载通信。攻击者可以利用这种默认行为,利用正在运行的工作负载探测内部网络、移动到其他容器,甚至调用私有API。网络分段是将一个网络划分为多个更小的子网络,每个子网络相互隔离。网络分段使得攻击者难以在网络中横向移动并获得对敏感资源的访问。

组织可以使用多种技术在Kubernetes集群中实现网络分段,以阻止横向移动,并仍然允许有效的流量正常路由。Kubernetes支持网络策略,可以使用网络策略控制哪些pod可以相互通信,哪些pod与集群的其他部分隔离。还有许多第三方工具也可以在Kubernetes集群中实现网络分割。最流行的有Calico、 Weave Net和Cilium等,这些工具提供高级的网络分段功能,如加密、防火墙和入侵检测。

配置错误的集群组件

Kubernetes集群由etcd、kubelet、kube-apiserver等不同组件组成,所有组件都是高度可配置的,这意味着当Kubernetes的核心组件出现配置错误时,就可能会发生集群泄露。在Kubernetes控制计划中,需要对各个组件进行配置错误检查,包括:

  • 检查配置是否设置为拒绝匿名身份验证。此外,在与Kubelets通信时,应该始终执行授权检查;
  • 要检查正在使用的API服务器的互联网可访问性,并使Kubernetes API远离任何公共网络;
  • 执行CIS基准扫描和审计也可以帮助安全团队消除组件错误配置,可以使用诸如EKS、GKE或AKS之类的托管服务帮助实现安全配置,并限制组件配置的某些选项。

脆弱的第三方组件

由于Kubernetes集群运行大量第三方软件,安全团队将需要构建多层策略来防护易受攻击的组件。一些最佳实践如下: 

  • 跟踪CVE数据库。管理Kubernetes中已知和新漏洞的一个关键因素是跟踪CVE数据库、安全披露和社区更新的最新信息。安全团队可以使用这些情报构建可操作的计划,以实现定期的补丁管理流程;
  • 实现持续扫描。使用OPA Gatekeeper等工具可以帮助编写自定义规则,以发现Kubernetes集群中任何易受攻击的组件。然后,安全团队可以跟踪并记录这些发现,以改进其安全流程和策略;
  • 最小化第三方依赖关系。在Kubernetes应用部署之前,必须彻底审计第三方软件是否存在过度授权的RBAC、低级别的内核访问和漏洞披露记录等信息。

Secret(机密)管理

“secret”是Kubernetes中的一个对象,它包含密码、证书和API密钥等敏感数据。Secret存储机密数据,集群中的其他用户和进程应该无法访问这些数据。Kubernetes Secret密存储在etcd中,这是Kubernetes用来存储所有集群数据的分布式键值存储。虽然Secret在Kubernetes生态系统中是一个非常有用的功能,但需要谨慎处理。管理Kubernetes Secret可以分为以下步骤:

  • 在静止状态下部署加密——潜在的攻击者可以通过访问etcd数据库获得对集群状态的相当大的可见性,该数据库包含通过Kubernetes API访问的任何信息。Kubernetes提供静态加密。静态加密保护etcd中的secret资源,确保这些secret的内容对访问etcd备份的各方保持隐藏;
  • 解决安全错误配置,例如漏洞、映像安全性和策略执行——还应该锁定RBAC配置,并且所有服务帐户和最终用户访问都应该限制为最低权限,特别是在访问secret时。审计集群中安装的第三方插件和软件的RBAC配置也是必要的,以确保对Kubernetes secret的访问不会被不必要地授予;
  • 确保日志记录和审计到位——这有助于检测恶意或异常行为,包括对secret的访问。Kubernetes集群围绕活动产生有用的指标,可以利用这些指标来检测此类行为。因此,建议启用和配置Kubernetes审计记录,并将其集中存储。