最佳实践:青藤云安全发布国内首个 K8S ATT&CK 攻防矩阵
Kubernetes 是开源历史上最受欢迎的容器编排系统,也是发展最快的项目之一,已成为许多公司计算堆栈中的重要组成部分。根据权威调查报告显示,77%受访者表示组织正在使用 K8S 集群,83.3%使用 Docker 的受访者也使用 K8S。
容器的灵活性和可扩展性鼓励许多开发人员将工作负载转移到 Kubernetes。尽管 Kubernetes 具有许多优势,但它也带来了新的安全挑战。因此了解容器化环境(尤其是 Kubernetes)中存在的各种安全风险至关重要。
要了解如何保护 Kubernetes 环境,就要了解其相关的攻击面。从 Windows 和 Linux 开始,MITRE ATT&CK 中那些战术和技术知识库,帮助企业更加深入去了解其环境中的攻击状况,并确保他们对各种风险有足够的检测和缓解措施。
针对 Kubernetes 的安全攻防,虽然攻击技术与针对 Linux 或 Windows 的攻击技术不同,但战术实际上是相似的,我们基于目前在 ATT&CK 领域的研究,创建一个类似 ATT&CK 的矩阵——Kubernetes 攻击矩阵(如图 1 所示),将它们作为一个框架,描述跨越 Kubernetes 基础设施和应用的关键攻击战术和技术。
图 1:Kubernetes 攻防矩阵
一、初始访问
初始访问战术包括所有用于获得资源访问权限的攻击技术。在容器化环境中,这些技术可以实现对集群的初始访问。这种访问可以直接通过集群管理工具来实现,也可以通过获得对部署在集群上的恶意软件或脆弱资源的访问来实现。
1.云账户访问凭证泄漏
用户将项目代码上传到 Github 等第三方代码托管平台,或者个人办公 PC 被黑等都可能导致云账号访问凭证发生泄漏,如果泄漏的凭证被恶意利用,可能会导致用户上层的资源(如 ECS)被攻击者控制,进而导致 K8S 集群被接管。
2.运行恶意镜像
在集群中运行一个不安全的镜像可能会破坏整个集群的安全。进入私有镜像仓库的攻击者可以在镜像仓库中植入不安全的镜像。而这些不安全的镜像极有可能被用户拉取出来运行。此外,用户也可能经常使用公有仓库(如 Docker Hub)中不受信任的恶意镜像。基于不受信任的根镜像来构建新镜像也会导致类似的结果。
3.Kubeconfig/token 泄漏
kubeconfig 文件中包含了关于 Kubernetes 集群的详细信息,包括集群的位置和相关凭证。如果集群以云服务的形式托管(如 AKS 或 GKE),该文件会通过云命令下载到客户端。如果攻击者获得该文件的访问权,那么他们就可以通过被攻击的客户端来访问集群。
4.应用漏洞
在集群中运行一个面向互联网的易受攻击的应用程序,攻击者就可以据此实现对集群的初始访问。例如那些运行有 RCE 漏洞的应用程序的容器就很有可能被利用。如果服务账户被挂载到容器(Kubernetes 中的默认行为)上,攻击者就能够使用这个服务账户凭证向 API 服务器发送请求。
二、执行
执行是指攻击者用来在集群内运行其代码的技术。
1.在容器中执行命令
拥有权限的攻击者可以使用 exec 命令("kubectl exec")在集群的容器中运行恶意命令。在这种方法中,攻击者可以使用合法的镜像,如操作系统镜像(如 Ubuntu)作为后门容器,并通过使用"kubectl exec"远程运行其恶意代码。
2.创建新的容器或 pod 执行命令
攻击者可能试图通过部署一个新的容器在集群中运行他们的代码。如果攻击者有权限在集群中部署 pod 或 controller(如 DaemonSet / ReplicaSet / Deployment),就可以创建一个新的资源来运行其代码。
3.容器内应用漏洞利用
在集群中部署的应用程序,如果存在远程代码执行漏洞,攻击者就可以在集群中运行代码。如果服务账户被挂载到容器中(Kubernetes 中的默认行为),攻击者将能够使用该服务账户凭证向 API 服务器发送请求。
4.在容器内运行的 SSH 服务
运行在容器内的 SSH 服务可能被攻击者利用。如果攻击者通过暴力破解或者其他方法(如钓鱼)获得了容器的有效凭证,他们就可以通过 SSH 获得对容器的远程访问。
三、持久化
持久化战术是指攻击者用来保持对集群持久访问的技术,以防他们最初的立足点丢失。
1.后门容器
攻击者在集群的容器中运行他们的恶意代码。通过使用 Kubernetes 控制器,如 DaemonSets 或 Deployments,攻击者可以确保在集群中的一个或所有节点上运行确定数量的容器。
2.挂载宿主机敏感目录的容器
攻击者在运行新的容器时,使用-v 参数,将宿主机的一些敏感目录或文件,例如/root/.ssh/,/etc,/var/spool/cron/,/var/run/docker.sock,/proc/sys/kernel/core_pattern,/var/log 等挂载到容器内部目录,进而写入 ssh key 或者 crond 命令等,来获取宿主机权限,最终达到持久化的目的。
3.Kubernetes CronJob
Kubernetes CronJob 是基于调度的 Job 执行,类似于 Linux 的 cron,我们可以利用 k8S CronJob 产生一个 pod,然后在里面运行给定的命令,进而实现持久化。
4.特权容器
用 docker--privileged 可以启动 docker 的特权模式,这种模式允许我们以其宿主机具有(几乎)所有能力来运行容器,包括一些内核特性和设备访问,这种模式下运行容器会让 docker 拥有宿主机的访问权限,并带有一些不确定的安全风险。
5.Webshell
如果容器内运行的 Web 服务存在一些远程命令执行(RCE)漏洞或文件上传漏洞,攻击者可能利用该类漏洞写入 WebShell,由于主机环境和容器环境的差异性,一些主机上的安全软件可能无法查杀此类 WebShell ,所以攻击者也会利用此类方法进行权限维持。
四、权限提升
权限提升战术包括攻击者用来在环境中获得比他们目前拥有的更高权限的技术。在容器化环境中,这可能包括从容器中获得对节点的访问,在集群中获得更高权限,甚至获得对云资源的访问。
1.特权容器
特权容器是一个拥有主机所有能力的容器,它解除了普通容器的所有限制。实际上,这意味着特权容器几乎可以做主机上可操作的所有行为。攻击者如果获得了对特权容器的访问权,或者拥有创建新的特权容器的权限(例如,通过使用被攻击的 pod 的服务账户),就可以获得对主机资源的访问权。
2.创建高权限的 binding roles
基于角色的访问控制(RBAC)是 Kubernetes 的一个关键安全功能。RBAC 可以限制集群中各种身份操作的权限。Cluster-admin 是 Kubernetes 中一个内置的高权限角色。如果攻击者有权限在集群中创建绑定权限,那么就可以创建一个绑定到集群管理员 ClusterRole 或其他高权限的角色。
3.挂载宿主机敏感目录的容器
hostPath mount 可以被攻击者用来获取对底层主机的访问权,从而从容器逃逸到主机。
4.通过泄漏的配置信息访问其他资源
如果 Kubernetes 集群部署在云中,在某些情况下,攻击者可以利用他们对单个容器的访问,获得对集群外其他云资源的访问。例如,在 AKS 中,每个节点都包含服务凭证,存储在/etc/kubernetes/azure.json 中。AKS 使用这个服务主体来创建和管理集群运行所需的 Azure 资源。
默认情况下,该服务委托人在集群的资源组中有贡献者的权限。若攻击者获得了该服务委托人的文件访问权(例如通过 hostPath 挂载),就可以使用其凭证来访问或修改云资源。
五、防御绕过
防御绕过战术包括攻击者用来逃避检测和隐藏其活动的技术。
1.清除容器日志
攻击者可能会删除被攻击的容器上的应用程序或操作系统日志,以试图防止检测到他们的活动。
2.删除 Kubernetes 日志
Kubernetes 日志,记录集群中资源的状态变化和故障。事件包括容器的创建、镜像的拉取、或一个节点上的 pod 调度。Kubernetes 日志对于识别集群中发生的变化非常有用。因此,攻击者可能想删除这些事件(例如,通过使用"kubectl delete events-all"),以免检测到他们在集群中的活动。
3.创建与已有应用相似名称的恶意 Pod/container
由控制器(如 Deployment 或 DaemonSet)创建的 Pod 在其名称中具有随机后缀。攻击者可以利用这一事实,将他们的后门 pods 命名为由现有控制器创建的 pod 的名称。例如,攻击者可以创建一个名为 coredns-{随机后缀}的恶意 pod,看起来与 CoreDNS 部署有关。另外,攻击者可以在管理容器所在的 kube-system 命名空间中部署他们的容器。
4.通过代理隐藏访问 ip
K8S API Server 会记录请求 IP,攻击者可以使用代理服务器来隐藏他们源 IP。具体来说,攻击者经常使用匿名网络(如 TOR)进行活动。这可用于与应用程序本身或与 API 服务器进行通信。
六、凭证访问
凭证访问战术包括攻击者用来窃取凭证的一系列技术。在容器化环境中,这包括运行中的应用程序的凭证、身份、存储在集群中的秘钥或云凭证。
1.Kubernetes Secret
Kubernetes secret 也是 K8S 中的一个资源对象,主要用于保存轻量的敏感信息,比如数据库用户名和密码,令牌,认证密钥等。Secret 可以通过 pod 配置进行使用。有权限从 API 服务器中检索 Secret 的攻击者(例如,通过使用 pod 服务账户)就访问 Secret 中的敏感信息,其中可能包括各种服务的凭证。
2.云服务凭证
当集群部署在云中时,在某些情况下,攻击者可以利用他们对集群中的容器的访问来获得云的凭证。例如,在 AKS 中,每个节点都包含服务凭证。
3.访问容器服务账户
Service Account Tokens 是 pod 内部访问 K8S apiserver 的一种特殊的认证方式。攻击者可以通过获取 Service Account Tokens,进而访问 K8S apiserver。
4.配置文件中的应用凭证
开发人员在 Kubernetes 配置文件中存储敏感信息,例如 pod 配置中的环境变量。攻击者如果能够通过查询 API 服务器或访问开发者终端上的这些文件来访问这些配置,就可以窃取存储的敏感并加以利用,例如数据库,消息队列的账号密码等。
七、发现
发现战术是攻击者用来探索他们获得环境访问权限的技术。这种探索有助于攻击者进行横向移动并获得对额外资源的访问权限。
1.访问 Kubernetes API
Kubernetes API 是进入集群的网关。集群中的行动是通过向 RESTful API 发送各种请求来执行的。集群的状态,包括部署在其上的所有组件,可以由 API 服务器检索。攻击者可以发送 API 请求来探测集群,并获得关于集群中的容器、秘密和其他资源的信息。
2.访问 Kubelet API
Kubelet 是安装在每个节点上的 Kubernetes 代理。Kubelet 负责正确执行分配给该节点的 pod。如果 Kubelet 暴露了一个不需要认证的只读 API 服务(TCP 端口 10255),攻击者获得主机的网络访问权(例如,通过在被攻击的容器上运行代码)后就可以向 Kubelet API 发送 API 请求。具体来说,查询 https://[NODE IP]:10255/pods/可以检索节点上正在运行的 pod。https://[NODE IP]:10255/spec/可以检索节点本身的信息,例如 CPU 和内存消耗。
3.集群中的网络和服务
攻击者可以在 cluster 中发起内网扫描来发现不同 pod 所承载的服务,并通过其漏洞进行后续渗透。
4.访问 Kubernetes dashboard
Kubernetes dashboard 是一个基于 Web 的用户界面,用于监控和管理 Kubernetes 集群。通过仪表盘,用户可以使用其服务账户(kubernetes-dashboard)在集群中执行操作,其权限由该服务账户绑定或集群绑定决定。攻击者如果获得了对集群中容器的访问权,就可以使用其网络访问仪表盘的 pod。因此,攻击者可以使用仪表盘的身份检索集群中各种资源的信息。
5.查询 metadata API 服务
云提供商提供实例元数据服务,用于检索虚拟机的信息,如网络配置、磁盘和 SSH 公钥。该服务可通过一个不可路由的 IP 地址被虚拟机访问,该地址只能从虚拟机内部访问。攻击者获得容器访问权后,就可以查询元数据 API 服务,从而获得底层节点的信息。
八、横向移动
横向移动战术包括攻击者用来在受害者的环境中移动的技术。在容器化环境中,这包括从对一个容器的特定访问中获得对集群中各种资源的访问权限,从容器中获得对底层节点的访问权限,或获得对云环境的访问权限。
1.访问云资源
攻击者可能会从一个被攻击的容器转移到云环境中。
2.容器服务账户
攻击者获得对集群中容器的访问权后,就可能会使用挂载的服务账户令牌向 API 服务器发送请求,并获得对集群中其他资源的访问权限。
3.集群内网络和服务
默认状态之下,通过 Kubernetes 可以实现集群中 pod 之间的网络连接。攻击者获得对单个容器的访问权后,就可能会利用它来实现集群中另一个容器的网络访问权限。
4.访问 Tiller endpoint
Helm 是一个流行的 Kubernetes 软件包管理器,由 CNCF 维护。Tiller 在集群中暴露了内部 gRPC 端点,监听端口为 44134。默认情况下,这个端点不需要认证。攻击者可以在任何可以访问 Tiller 服务的容器上运行代码,并使用 Tiller 的服务账户在集群中执行操作,而该账户通常具有较高的权限。
九、危害
影响战术包括攻击者用来破坏、滥用或扰乱环境的正常行为的技术。
1.数据破坏
攻击者可能试图破坏集群中的数据和资源,包括删除部署、配置、存储和计算资源。
2.资源劫持
攻击者可能会滥用失陷的资源来运行任务。一个常见情况是攻击者使用失陷的资源来进行数字货币挖掘。攻击者如果能够访问集群中的容器或有权限创建新的容器,就可能利用失陷的资源来进行这种活动。
3.拒绝服务
攻击者可能试图进行拒绝服务攻击,让合法用户无法使用服务。在容器集群中,这包括损害容器本身、底层节点或 API 服务器的可用性。
4.加密勒索
恶意的攻击者可能会加密数据,进而勒索用户,索要匿名的数字货币。
了解容器化环境的攻击面是为这些环境建立安全解决方案的第一步。上面介绍的矩阵可以帮助企业确定其防御系统在应对针对 Kubernetes 的不同威胁方面存在的差距。
此外,为了确保应用的安全,系统管理员还应该按照该指南谨慎行事,及时打补丁、进行更新和升级,降低风险。NSA 和 CISA 还建议定期对 K8S 设置进行审查并进行漏洞扫描,确保考虑到了所有相关风险并及时应用了安全补丁。
如欲了解更多详细信息,请关注公众号「青藤技术服务」,查看《K8S 加固指南》中文版本报告全文。
评论