
2018年黑客入侵了特斯拉在亚马逊上的拉被Kubernetes容器集群 。由于该集群控制台未设置密码保护,黑客何保护黑客便得以在一个Kubernetes pod中获取到访问凭证 ,攻击然后据此访问其网络存储桶S3,集群通过S3获取到了一些敏感数据 ,并阻比如遥测技术 ,止黑并且还在特斯拉的拉被Kubernetes pod中进行挖矿。
黑客们潜入到了没有密码保护的黑客何保护Kubernetes管控台 。在一个Kubernetes pod里面,攻击盗取了Tesla的集群公有云环境的访问权限,而对应公有云环境中则存放着如telemetry的并阻敏感数据。云计算
除了裸露的止黑数据之外,RedLock还注意到此次攻击中一些更为复杂的拉被检测躲避手段。
首先 ,黑客何保护没有使用知名的攻击公共“矿池”。他们安装挖矿软件 ,并通过恶意脚本链接上未列出/半公共端点。其次,黑客通过CloudFlare隐藏了矿池服务器的真实IP地址,CloudFalre是一个免费的CDN服务 。通过该服务获得新的服务器租用IP地址。因此常见标准的基于IP或域的探测很难检测到此类恶意行为 。
挖矿软件监听的是非标准端口 ,基于端口的恶意检测也变得很困难。黑客们的挖矿软件保持“低调” ,没有造成CPU使用过高 ,资源的占用不易被发现 。
该事件只是Kubernetes漏洞利用的源码下载一个典型案例 。
近年来,以Kubernetes为代表的安全编排工具让企业实现了应用的自动化部署 ,给企业带来了巨大的业务收益。但是,和传统环境下一样,这些部署也很容易受到黑客和内鬼的攻击和利用,Kubernetes的安全也因此成为容器使用中重点保护对象 。
Kubernetes 是一个开源的容器编排平台,最初由 Google 设计并捐赠给 Cloud Native Computing Foundation (CNCF) 孵化 。Kubernetes 可以自动化地部署 、扩展和管理容器化应用程序 ,并提供了许多便捷的特性,如服务发现、负载均衡、自我修复等 。Kubernetes 的核心理念是将应用程序和基础设施分离,以便更快 、更安全 、免费模板更灵活地开发和部署云原生应用程序。
Kubernetes 的组件可以分为两大类:控制平面和数据平面。控制平面包括 Kubernetes API Server、etcd 存储 、控制器管理器 、调度器等 ,负责管理存储在 etcd 中的集群状态 、决策运行环境中的容器位置 、标记 、限制等。数据平面包括各种节点 ,包括容器运行时、kubelet 守护进程 、建站模板kube-proxy 代理服务器,负责维护容器的生命周期 、数据流量、负载均衡等 。
Kubernetes 提供了一种能够轻松创建和部署容器的方式 ,其灵活性和可扩展性使其成为一种非常流行的应用程序部署和管理平台。
虽然 Kubernetes 具有许多优点,但也有许多安全考虑因素必须被认真考虑 。以下是 Kubernetes 安全威胁的一些例子 :

一个被破坏的容器可以在多个 Pod 之间传播 ,导致 Kubernetes 集群的整体安全受到威胁 。除非良好配置 Kubernetes 中的用户和角色,否则攻击者可能具有比他们应有的更多的权限。
(2)网络问题由于 Kubernetes 的高度自动化性质 ,容易使权限分配分散并产生混乱。这种情况下,攻击者可以利用 Kubernetes 上的漏洞横向移动和扩展他们在集群中的访问级别。另外,安全的网络策略和在应用程序层面进行保护,包括服务发现和容器网络配置,保证应用程序和数据不被更容易受到攻击,也可能受到损害 。
(3) 控制面如果 Kubernetes API Server 面临攻击活动,则可以修改,添加或删除集群状态 ,从而危及整个集群的安全性。此外,一个被攻击的 Pod 可以进行许多可能对其他 Pod 或主机产生灾难性后果的活动 ,例如嗅探流量并尝试修改 Pod 以增加攻击面 。
(4) 镜像安全问题容器的镜像可以随时被替换 ,而没有办法验证该镜像的内容和完整性。因此,出现一个恶意镜像的情况下 ,整个特定容器中的数据和应用程序可以遭受严重威胁。
为了最大化您的 Kubernetes 集群的安全性,必须了解安全性相关的最佳做法和原则 。以下是几个基本的 Kubernetes 安全秘籍:
(1)配置 Kubernetes 对象的 RBAC
为保护 Kubernetes 集群,必须对在 Kubernetes 中运行的对象 、Pod 和状态对象进行身份验证和授权 。Kubernetes Role-Based Access Control(RBAC)为应用于 Kubernetes API 对象的最佳做法之一,以管理访问 Kubernetes API 对象的授权和权限 。
(2)使用安全的容器基础映像
可以通过使用最佳安全实践来加强容器的安全性。而选择合适的基础镜像是实现此目标的重要部分,例如,只使用来自可信源的映像 ,尽可能减少容器中的客户端库数量 。
(3)配置 Kubernetes 的网络和策略安全的网络和防护策略可以保护 Kubernetes 集群免受威胁。通过配置网络插件实现网络隔离,并设置 Pod 和服务之间的网络策略以提高安全性。


使用 Kubernetes 安全扫描器可以查找到容器映像中的潜在漏洞,确保每个大容器镜像都没有安全漏洞,需要及时修复 。
Minikube 是 Kubernetes 的一种轻量级实现,它可以在局域网内快速搭建一个 Kubernetes 集群用于测试、开发和学习。
(1)Minikube 的安装步骤:安装虚拟机软件:Minikube 需要在虚拟机中运行 ,建议使用 VirtualBox 或者 HyperKit。VirtualBox 是跨平台的免费软件 ,而 HyperKit 是 macOS 中提供的轻量级虚拟化解决方案。
安装 kubectl :kubectl 是 Kubernetes 的命令行工具,用于管理 Kubernetes 集群 。可以通过以下命令安装:
复制curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl chmod +x ./kubectl sudo mv ./kubectl /usr/local/bin/kubectl1.2.3.在 macOS 上安装 kubectl 的命令如下 :
复制brew install kubectl1.安装 Minikube:可以通过以下命令安装 Minikube :
复制curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube1.2.在 macOS 上安装 Minikube 的命令如下:
复制brew install minikube1.启动 Minikube 集群:
复制minikube start1.运行示例应用:
复制kubectl run hello-minikube --image=k8s.gcr.io/echoserver:1.4 --port=8080 kubectl expose deployment hello-minikube --type=NodePort minikube service hello-minikube1.2.3.以上就是安装和使用 Minikube 的详细步骤了 。
Kubernetes RBAC(Role-Based Access Control)是基于角色的访问控制,它定义了一组角色 、角色绑定和集群角色绑定,用于限制 Kubernetes 集群中用户、服务账号的权限范围。
(1)Kubernetes RBAC 的配置步骤:创建角色 :
复制apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: test-role rules: - apiGroups: [""] # "" 代表 core API 组 resources: ["pods", "pods/log", "services"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]1.2.3.4.5.6.7.8.这里创建了一个名为 test-role 的角色,它拥有对 Kubernetes 集群中的 pods、services 资源的访问权限。
创建服务账号 :
复制apiVersion: v1 kind: ServiceAccount metadata: name: test-account namespace: test-namespace1.2.3.4.5.这里创建了一个名为 test-account 的服务账号,它将被绑定在后面创建的角色上。
创建角色绑定:
复制apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: test-role-binding namespace: test-namespace roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: test-role subjects: - kind: ServiceAccount name: test-account namespace: test-namespace1.2.3.4.5.6.7.8.9.10.11.12.13.这里创建了一个名为 test-role-binding 的角色绑定,它将 test-role 与 test-account 绑定在一起,以授予 test-account 对 pods 、services 资源的访问权限。
创建命名空间 :
复制apiVersion: v1 kind: Namespace metadata: name: test-namespace1.2.3.4.这里创建了一个名为 test-namespace 的命名空间,用于隔离上述角色和服务账号的作用范围 。
以上就是 Kubernetes RBAC 的配置步骤 ,通过创建角色、服务账号 、角色绑定和命名空间来定义用户、服务账号的权限作用范围。
网络策略是 Kubernetes 中用于定义网络访问控制策略的一种机制 ,它可以限制来自特定 IP 或标签的流量访问 Kubernetes 中的 Pod。
(1)网络策略的配置步骤 :在 Kubernetes 运行网络插件,如 Calico 或者 Cilium,使得网络策略功能可以正常使用。
创建网络策略:
复制apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: test-network-policy namespace: test-namespace spec: podSelector: matchLabels: app: test-app policyTypes: - Ingress ingress: - from: - ipBlock: cidr: 10.0.0.0/24 - namespaceSelector: matchLabels: name: test-namespace ports: - protocol: TCP port: 80801.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.这里创建了一个名为 test-network-policy 的网络策略,它定义了当访问属于 test-namespace 命名空间且包含 app=test-app 标签的 Pod 时,只允许来自 10.0.0.0/24 网段 IP 或 test-namespace 命名空间的 Pod 访问 Pod 的 TCP 8080 端口 。
以上就是网络策略的配置步骤了 ,通过配置网络策略可以控制 Pod 之间的网络通信。
在 Kubernetes 中 ,可以使用网络策略来控制 Pod 之间和 Pod 与集群中其他资源之间的网络流量。本文介绍如何配置网络策略 ,以限制 Kubernetes API 的访问流量。
创建一个命名空间 :
复制kubectl create namespace example1.创建一个 Label,该 Label 将用于标记要受网络策略保护的 Pod :
复制kubectl label namespace example name=example1.创建 Pod:
复制apiVersion: v1 kind: Pod metadata: name: example-pod namespace: example labels: app: example spec: containers: - name: example-container image: nginx1.2.3.4.5.6.7.8.9.10.11.创建一个网络策略:
复制apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: api-policy namespace: example spec: podSelector: matchLabels: app: example policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: app: kubernetes1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.上述策略将禁止任何与带有 label app=example 的 Pod 的入站流量 ,除非该流量始于带有 label app=kubernetes 的 Pod 。请注意,该规则仅限制流量 ,因此不影响容器的运行状态。
验证策略是否生效:
复制kubectl run busybox --image=busybox -n example -- sleep 3600 kubectl exec -it busybox -n example -- wget -q -O - http://example-pod kubectl exec -it busybox -n example -- wget -q -O - kubernetes.default.svc.cluster.local1.2.3.第一行使用 busybox 镜像创建一个名为 busybox 的 Pod ,并执行一个长时间休眠的命令 。第二行调用 wget 命令将通过 Pod example-pod 执行 HTTP GET 请求 。由于我们已经创建了一个网络策略,该请求将被阻止。第三行调用 wget 命令将访问 kubernetes.default.svc.cluster.local ,这是 Kubernetes API 的 DNS 名称 。由于我们已经在策略中选择了从 Kubernetes 组件 Pod 的流量 ,该请求将显示预期的结果 。
Kubernetes 网络插件是一个 K8s 集群中的必要组件之一,它的主要目的是负责实现容器的网络功能 ,例如为容器分配 IP、实现容器间通信 、提供网络隔离等 。不同的网络插件有不同的实现机制 ,不同的云平台和部署环境也有不同的网络要求,因此,使用哪种网络插件需要根据实际情况进行选择 。

常用的 Kubernetes 网络插件有以下几种 :
Flannel:Flannel 是一个简单而高效的容器网络解决方案,它使用了类似于 Overlay 网络的技术,为每个节点分配一个唯一的 IP 地址 ,并使用 VXLAN 或 UDP 封装来实现容器之间的通信 。Calico:Calico 是一个高性能的容器网络解决方案,可以实现高效的容器间网络通信和网络安全 。它使用了 BGP 协议来实现路由,并通过网络策略实现容器访问控制 。Cilium :Cilium 是一种基于 eBPF (Extended Berkeley Packet Filter) 技术的容器网络解决方案,可以提供高效、安全和可靠的容器间通信 。它可以实现网络隔离、网络策略和流量审计等功能 。在选择网络插件时 ,需要考虑以下几个方面 :
性能:不同的网络插件有不同的性能表现 ,需要根据实际应用场景进行选择。范围:一些网络插件只能为应用程序容器提供内部网络,而另一些则可以为外部服务提供网络服务 。安全性 :一些网络插件提供内置的安全功能来保护容器和云基础设施。易用性 :一些网络插件提供图形化界面和易用的 API,方便用户部署和管理。在 Kubernetes 中,Ingress 控制器是一种负责管理外部流量进入 K8s 集群的组件,它可以使用不同的负载均衡算法将外部流量路由到不同的后端服务。Ingress 控制器常常被用于实现 Web 应用程序等场景的负载均衡和流量控制 。
使用 Ingress 控制器时,需要设置一些安全规则来保护集群免受恶意攻击 。例如:
图片
Kubernetes 服务是一种允许容器之间互相通信的抽象机制,它可以为容器动态生成一个稳定的 IP 地址,并提供负载均衡等重要功能。
使用 Kubernetes 服务时 ,需要注意以下几个方面:

在 Kubernetes 中 ,“Pod”是最小的环境单元 ,是一个或多个容器的集合 。创建一个安全的 Pod 需要考虑以下几个方面:
(1)限制资源在 Kubernetes 中,可以利用 LimitRange 和在 PodLevel 中使用 resourceQuotas 实现资源的限制 ,并防止 Pod 超出其可用资源。通过设置资源限制,可以确保容器无法获得超过它应有的资源。
(2)使用安全上下文通过使用安全上下文,可以为某些容器设置用户 ID(UID)和组 ID(GID) 。这可以防止攻击者访问系统级别的文件或进程,并限制容器的能力 。
Kubernetes 还允许配置特权上下文机制,在容器中取消安全限制,但这应该谨慎使用 ,尽可能避免。
(3)启用 Kubernetes pod 安全策略Kubernetes Pod 安全策略(PodSecurityPolicy)可帮助管理员对 Pod 下的容器应用程序执行强制安全性措施 。PodSecurityPolicy 的使用可以防止容器从容器内部攻击宿主机,也可以防止容器之间的攻击。
(4)使用网络隔离使用 Kubernetes 的网络插件或者其他链路层隔离技术,可以增强 Pod 的网络隔离性和安全性 。通过流量隔离,可以限制容器访问其他容器或存储卷等敏感资源,减少网络攻击的发生 。
保护容器是保护 Kubernetes 集群的关键 。下面介绍几个将有助于提高容器安全性的 Kubernetes 容器安全实践:
(1) 选择适当的容器基础映像合理选择 Docker 容器镜像,标准镜像推荐使用官方的镜像仓库。也可以使用 Docker 的安全组件进行容器基础镜像验证。
(2)确保容器镜像代码病毒和漏洞扫描使用容器镜像扫描器 ,确保容器代码没有病毒和漏洞。扫描后把显示代码和漏洞进行修复 ,以致使用安全镜像。
(3)配置容器安全策略通过 Kubernetes 的容器安全策略 (PodSecurityPolicy) 配置容器安全策略 ,推荐使用 runtimeClass 策略 限制特权容器在 Pod 中的使用以及不安全容器的访问权限 。
(4)使用容器日志记录容器日志记录可以方便管理员为容器的活动作出诊断和调整。用标准输出优化容器日志并将其收集至安全中心或外部存储。
(5) 运行应用程序多个实例容器运行时保障应用程序的可用性并提供弹性 ,如果一个容器在发生故障的情况下,它不会影响应用程序的其余部分。运行多个实例时 ,确保使用负载均衡器 ,可使流量通过非常安全的通道路由,从而达到更好的安全保护 。
(6)配置网络安全Kubernetes 集群应该配置网络安全性保障 ,每个容器都应该拥有自己的 IP 和端口,网络策略可以配置 ,以限制容器间的流量 。
除容器安全外,还需要对 Kubernetes 工作节点的本身进行保护。特别是,要定期更新 操作系统的安全修补程序 、Kubernetes 组件等 。此外 ,Kubernetes 工作节点应配置安全接入,以限制不必要的访问并保护集群免受未经授权的访问和攻击。可以使用 Kubernetes 各种安全组件,监视和警报安全事件,以及采取必要的措施和修复,以确保 Kubernetes 集群是可靠且安全的。
使用 Kubernetes 安全扫描器可以自动扫描 Kubernetes 集群中的容器映像和资源配置,查找潜在的安全漏洞和风险。以下是一些常见的安全扫描器:

为了增强安全和故障排除能力,在 Kubernetes 中启用日志记录非常重要 。以下是一些常见的日志记录解决方案:

监视 Kubernetes 集群和应用程序的状态可以帮助您及时发现和解决问题,并提高可靠性和可用性。以下是一些常见的监视解决方案:

Kubernetes 提供了一种滚动升级的方式来升级您的集群。滚动升级指的是逐步升级集群中的每个节点 ,确保在进行升级时始终保持集群的可用性。使用滚动升级时,您可以通过控制升级的速度和范围,以确保每个节点都能够成功升级并保持集群的稳定性。参考以下步骤进行 Kubernetes 滚动升级:
使用 kubectl drain 命令从集群中排除一个节点 ,并将其生产负载移到其他节点上 。运行 kubectl upgrade 命令以将节点升级到新版本 。使用 kubectl uncordon 命令将节点重新加入集群 ,并让其重新承担生产负载。重复上述步骤 ,直到所有节点都成功升级为止。您可以使用 Kubernetes 的 Backup and Restore(Velero)插件执行自动备份和还原操作 ,以保护您的应用程序和数据 。Velero 可以备份 Kubernetes 应用程序和其依赖项(如存储、配置和密钥等)的状态,并在需要时将其还原到先前的状态。参考以下步骤使用 Velero 执行 Kubernetes 备份和恢复:
安装 Velero 插件并配置备份存储和密钥 。运行 velero backup create 命令以创建备份。运行 velero restore create 命令以将备份还原到当前的 Kubernetes 环境 。查看通过 velero backup get 命令获得的备份历史记录。持续漏洞管理和修复是保持 Kubernetes 安全的关键。以下是一些实践建议 :
使用自动化工具进行漏洞扫描和修复,并确保定期执行扫描操作 。及时升级 Kubernetes 版本和容器映像,以修复已知漏洞和安全问题。使用最小特权原则,仅授予容器和节点所需的权限和访问级别 。使用网络和安全策略来限制容器和节点之间的通信 ,并确保安全地与外部应用程序进行通信。Kubernetes API 对象是 Kubernetes 中的核心元素 ,因此确保安全使用它们非常重要。以下是一些关于安全使用 Kubernetes API 对象的最佳实践 :
实施访问控制,使用 RBAC 或其他访问控制工具来限制使用 API 对象的用户和服务账户的权限。配置 TLS 加密 ,Kubernetes API 使用 TLS 保护通信,因此确保启用和正确配置 TLS 加密以防止未经授权的访问和攻击 。限制公开访问 ,不要把 Kubernetes API 暴露在公共网络上 ,而是将其限制为安全的内部网络。审计和监控 Kubernetes API 的使用,以检测未经授权的访问和异常活动 。Kubernetes 安全审计策略可以帮助您跟踪和监视 Kubernetes 集群中的活动,并帮助您及时检测和响应安全漏洞和攻击 。以下是一些最佳实践:
跟踪重要的 Kubernetes API 对象和敏感操作(如创建、删除和修改操作)的访问和使用情况 。存储审计日志并定期分析它们,以查找异常活动和潜在的安全风险。建立警报和响应机制 ,以便在检测到安全事件时及时采取行动。定期检查和更新审计策略,以确保其有效性和适应性。