近日,Kubernetes 被爆出严重安全漏洞,该漏洞 CVE-2018-1002105(又名
Kubernetes
特权升级漏洞,)被确认为严重性
9.8 分(满分 10 分)。具体来说,恶意用户可以使用 Kubernetes API
服务器连接到后端服务器以发送任意请求,并通过 API 服务器的 TLS
凭证进行身份验证。这一安全漏洞的严重性更在于它可以远程执行,攻击并不复杂,不需要用户交互或特殊权限。

时间: 2019-01-28阅读: 446标签: 安全

←←←←←←←←←←←← 快!点关注

更糟糕的是,在 Kubernetes
的默认配置中,允许所有用户(经过身份验证和未经身份验证的用户)执行允许此升级的发现
API 调用。也就是说,任何了解这个漏洞的人都可以掌控你的 Kubernetes
集群

上个月,全球最受欢迎的容器编排引擎Kubernetes,被爆出首个严重的安全漏洞,使得整个Kubernetes生态发生震荡。该漏洞(CVE-2018-1002105)使***者能够通过Kubernetes
API服务器破坏集群,允许他们运行代码来执行一些恶意活动,比如安装恶意软件等。

2018年12月,Kubernetes生态系统因发现世界上最受欢迎的Dockers协调器Kubernetes的第一个主要安全漏洞而动摇。该漏洞(CVE-2018-1002105)使攻击者能够通过Kubernetes
API服务器破坏集群,允许他们运行代码来执行恶意软件等恶意活动。

最后的痛苦之处在于,对于用户而言,没有简单的方法来检测此漏洞是否已被使用。由于未经授权的请求是通过已建立的连接进行的,因此它们不会出现在
Kubernetes API 服务器审核日志或服务器日志中。请求确实会出现在 kubelet
或聚合的API服务器日志中,但是却无法与正确通过 Kubernetes API
服务器授权和代理的请求区分开来。

今年年初,由于Kubernetes控制台中的配置错误,特斯拉被一个恶意挖掘加密货币的软件所感染。***者利用了特定Kubernetes控制台没有密码保护的这一漏洞,访问其中一个包含特斯拉大型AWS环境访问凭据的pod。

今年早些时候,特斯拉Tesla
遭遇了由Kubernetes控制台错误配置引起的复杂的加密货币挖掘恶意软件感染。攻击者利用了特定Kubernetes控制台没有密码保护的事实,允许他们访问其中一个包含特斯拉大型AWS环境访问凭据的pod。

现在,Kubernetes 已经发布了修补版本 v1.10.11、v1.11.5、v1.12.3 和
v1.13.0-rc.1。如果仍在使用 Kubernetes v1.0.x 至 Kubernetes v1.9.x
版本,请即刻停止使用并升级到修补版本。

随着越来越多的企业开始使用容器以及容器编排引擎,他们需要采取必要的措施来保护计算机基础架构中的这一关键部分。为了帮助您完成这项工作,本文将为您介绍9项Kubernetes安全最佳实践。

随着组织加速采用容器和容器协调器,他们需要采取必要措施来保护计算基础架构中的这一关键部分。为了帮助完成这项工作,请根据客户意见查看这九项Kubernetes安全最佳实践,您应遵循以帮助保护您的基础架构。

如果由于某种原因无法进行升级,也必须暂停使用聚合的 API
服务器,并从不应具有对 kubelet API 的完全访问权限的用户中删除 pod
exec/attach/portforward
权限(不过也有用户认为这种解决方法的糟糕程度和这个漏洞问题本身不相上下了)。

01 升级到最新版本

每个季度更新都会添加新的安全功能 – 而不仅仅是错误修复 –
为了充分利用它们,我们建议您运行最新的稳定版本。最好的办法是使用最新版本运行最新版本,特别是考虑到CVE-2018-1002105的发现。升级和支持可能会越来越难以落后,因此计划每季度至少升级一次。使用托管的Kubernetes提供程序可以非常轻松地进行升级。

(文/开源中国)    

每一季度的更新都会添加新的安全相关功能,而不仅仅是修复bug,为了充分利用这些安全特性,我们建议您始终保持运行最新的稳定版本。

控制谁可以访问Kubernetes
API以及他们对基于角色的访问控制的权限。默认情况下,RBBA通常在Kubernetes
1.6及更高版本中启用(稍后对于某些托管提供商),但如果您从那时起进行了升级并且未更改配置,则需要仔细检查您的设置。由于Kubernetes授权控制器的组合方式,您必须同时启用RBAC并禁用传统的基于属性的访问控制。

02 启用基于角色的访问控制(RBAC)

一旦实施了RBAC,您仍然需要有效地使用它。通常应避免使用群集范围的权限,以支持特定于命名空间的权限。避免给予任何群集管理员权限,即使是为了调试

控制谁可以访问Kubernetes
API以及他们对基于角色的访问控制(RBAC)的权限。默认情况下,RBAC通常在Kubernetes
1.6及更高版本中启用,但如果您从那时起进行了升级并且没有更改配置,则需要仔细检查您的设置。由于Kubernetes授权控制器的组合方式,您必须同时启用RBAC并禁用传统的基于属性的访问控制(ABAC)

  • 仅在需要的情况下根据具体情况授予访问权限更安全。

启用RBAC之后,您还需要有效地使用它。为了特定命名空间的许可,您通常需要避免集群范围的权限。即便是为了调试,也应避免给予任何集群管理员权限,而是仅在需要的情况下根据具体情况授予访问权限,以提高安全性。

您可以使用kubectl get clusterrolebindingkubectl get rolebinding -all-namespaces来探索集群角色和角色。快速检查谁被授予特殊的“集群管理员”角色;
在这个例子中,它只是“主人”组:

您可以使用kubectl get clusterrolebinding或kubectl get rolebinding
-all-namespaces来探索集群角色和角色。同时,快速检查谁被授予了特殊的“cluster-admin”角色,在这个例子中,它是“master”组:如果您的应用程序需要访问Kubernetes
API,请单独创建服务帐户,并为每个使用站点提供所需的最小权限集。这优于为命名空间的默认帐户授予过宽的权限

图片 1image.png

大多数应用程序根本不需要访问API,
对于这一情况,可以将automountServiceAccountToken设置为“false”。

如果您的应用程序需要访问Kubernetes
API,请单独创建服务帐户,并为每个使用站点提供所需的最小权限集。这比为命名空间的默认帐户授予过宽的权限要好。

03 使用命名空间建立安全边界

大多数应用程序根本不需要访问API;
对于这些,可以将automountServiceAccountToken设置为“false”。

创建单独的命名空间是组件之间重要的第一层隔离。当不同类型的工作负载部署在不同的命名空间中时,我们发现应用安全控制(如网络策略)要容易得多。

创建单独的命名空间是组件之间重要的第一级隔离。当不同类型的工作负载部署在不同的命名空间中时,我们发现应用安全控制要容易得多。

您的团队有在高效地使用命名空间吗?检查一下那些非默认命名空间,即可确认了:

您的团队是否有效地使用名称空间?通过检查任何非默认命名空间来立即查找:

04 将敏感工作负载彼此分开

图片 2image.png

为了将潜在的破坏影响力限制在最小值,最好在一组专用计算机上运行敏感工作负载。此方法降低了通过共享容器运行时或主机的安全性较低的应用程序访问敏感应用程序的风险。例如,受损节点的kubelet凭证通常只有在安装到该节点上安排的pod中时才能访问机密内容,如果重要机密被安排到整个集群中的许多节点上,则***者将有更多机会窃取它们。

为了限制折衷的潜在影响,最好在一组专用计算机上运行敏感工作负载。此方法降低了通过共享容器运行时或主机的安全性较低的应用程序访问敏感应用程序的风险。例如,受损节点的kubelet凭证通常只有在安装到该节点上安排的pod中时才能访问机密内容

如果重要机密被安排到整个集群中的许多节点上,则攻击者将有更多机会窃取它们。

您可以使用节点池和Kubernetes命名空间,污点,容差和其他控件来实现此分离。

敏感元数据(例如kubelet管理员凭据)有时会被盗或被滥用以升级群集中的权限。例如,最近的Shopify错误赏金披露详细说明了用户如何通过将微服务混淆为云提供商的元数据服务泄漏信息来升级权限。GKE的元数据隐藏功能会更改群集部署机制以避免此暴露,我们建议使用它直到将其替换为永久解决方案。在其他环境中可能需要类似的对策。

网络策略允许您控制进出容器化应用程序的网络访问。要使用它们,您需要确保拥有支持此资源的网络提供程序;
对于一些托管的Kubernetes提供商,例如Google Kubernetes
Engine,您需要选择加入。(如果您的群集已经存在,在GKE中启用网络策略将需要进行简短的滚动升级。)一旦到位,请从一些基本开始默认网络策略,例如默认阻止来自其他命名空间的流量。

如果您在Google容器引擎中运行,则可以检查群集是否在启用了策略支持的情况下运行

您可以使用节点池(在云或本地)和Kubernetes命名空间、污点(taints)、容差(tolerations)和其他控件来实现此分离。05
安全的云元数据访问

Pod安全策略设置允许在群集中运行工作负载的默认值。考虑定义策略并启用Pod安全策略许可控制器

说明因云提供商或部署模型而异。首先,您可以要求部署删除NET_RAW功能以抵御某些类型的网络欺骗攻击。

您可以按照以下三个步骤来改进节点上的安全状态:

确保主机安全且配置正确。一种方法是根据CIS基准检查您的配置;
许多产品都有自动清洗器,可以自动评估这些标准的符合性。控制对敏感端口的网络访问。确保您的网络阻止访问kubelet使用的端口,包括10250和10255.考虑限制对可信网络以外的Kubernetes
API服务器的访问。恶意用户滥用对这些端口的访问权限,以便在未配置为需要在kubelet
API服务器上进行身份验证和授权的群集中运行加密货币挖掘者。最小化对Kubernetes节点的管理访问。通常应限制对群集中节点的访问

  • 通常可以在不直接访问节点的情况下处理调试和其他任务。

敏感元数据(例如kubelet管理员凭据)有时会被盗或被滥用来升级集群中的权限。最近Shopify的赏金细节泄露bug就是一例。这说明了用户能够通过将微服务混淆为云提供商的元数据服务泄露信息来升级权限。GKE的元数据隐藏功能可以更改群集部署机制以避免此暴露,我们建议您在找到另一个永久的替代解决方案之前,一直使用这一功能。在其他环境中可能也需要类似的对策。

确保您已启用审核日志并监视它们是否存在异常或不需要的API调用,尤其是任何授权失败

这些日志条目将显示状态消息“禁止”。授权失败可能意味着攻击者试图滥用被盗的凭据。托管Kubernetes提供程序可在其云控制台中访问此数据,并允许您设置授权失败警报。

欢迎大家加入粉丝群:963944895,群内免费分享Spring框架、Mybatis框架SpringBoot框架、SpringMVC框架、SpringCloud微服务、Dubbo框架、Redis缓存、RabbitMq消息、JVM调优、Tomcat容器、MySQL数据库教学视频及架构学习思维导图

秃顶程序员的不易,看到这里,点了关注吧!点关注,不迷路,持续更新!!!

06 创建和定义集群网络策略

网络策略允许您控制进出容器化应用程序的网络访问。要使用它们,您需要确保拥有支持此资源的网络提供程序,对于一些托管的Kubernetes提供商,例如Google
Kubernetes
Engine(GKE),您需要选择加入。(如果您的集群已存在,则在GKE中启用网络策略需要进行简短的滚动升级。)一旦到位,请从一些基本的默认网络策略开始,例如默认阻止来自其他命名空间的流量。

如果您在GKE中运行,则可以检查集群是否在启用了策略支持的情况下运行:07
运行集群范围的Pod安全策略

Pod安全策略设置了允许在集群中运行工作负载的默认值。考虑定义策略并启用Pod安全策略许可控制器,说明因云提供商或部署模型而异。首先,您可以要求部署放弃NET_RAW功能以抵御某些类型的网络欺骗***。

08 加强节点安全

您可以按照以下三个步骤来改进节点上的安全状态:

1、确保主机安全且配置正确。其中一种方法是根据CIS基准来检查您的配置,许多产品都有自动检查功能,可以自动评估配置是否与这些标准一致

2、控制对敏感端口的网络访问。确保您的网络阻止访问kubelet使用的端口,包括10250和10255。此外,还需限制对可信网络以外的Kubernetes
API服务器的访问。因为恶意用户很有可能会滥用对这些端口的访问权限,以便在未配置并需要在kubelet
API服务器上进行身份验证和授权的集群中运行加密货币挖掘程序。

3、最小化对Kubernetes节点的管理访问。通常应该限制对集群中节点的访问,因为调试和执行其他任务可以在不直接访问节点的情况下进行。

09 启用审核日志(Audit Logging)

请确保您已经启用审核日志,并监视他们是否存在异常或不需要的API调用,尤其是任何失败授权——这些日志条目将显示状态“Forbidden”。授权失败可能意味着***者试图滥用被盗凭据。托管Kubernetes提供程序(包括GKE)可在其云控制台中访问此数据,并允许您设置授权失败警报。

遵循上文的9项建议,您可以获得更安全的Kubernetes集群。请记住,即便您已经完全按照以上步骤安全地配置了您的Kubernetes集群,您依然需要将安全性构建到容器配置的其他方面及其运行时操作中。当您提高技术堆栈的安全性时,需要寻找能够为容器部署提供中心治理点的工具,并为容器和云原生应用程序提供持续监控和保护。