btqszl 2020-04-16
云和容器技术的快速增长,容器编排系统成了发展最快的技术。尤其是谷歌Kubernetes项目成了容器编排事实上的业界标准。越来越多的企业和开发人员已经将自己的工作转移到了K8S上。尽管K8S具有很多优势,但是统一和集中化的管控也在安全方面带来了新的挑战。在容器云化的环境中(比如K8S)中也存在的各种安全风险,利用ATT&CK模型本文我们介绍K8S攻击威胁矩阵。
概述
系统化的研究安全和防控最常用的方法是使用MITRE ATT&CK框架。MITRE是美国政府资助的一家研究机构,该机构源于麻省大学专门研究包括军方高密的安全项目,受美国国家标准技术研究所(NIST)的资助,MITRE开展了大量的网络安全研究和实践。
2013年了MITR推出了ATT&CK模型,该模型根据观察实际数据来定义攻击行为并对其分类。ATT&CK模型通过结构化矩阵的形式将已知的攻击行为用威胁信息列表和可信自动化交换表达。从Windows和linux OS覆盖开始,ATT&CK的矩阵涵盖了网络攻击(策略)所涉及的各个阶段,并详细介绍了其中的每个已知方法(技术)。这些矩阵可以帮助企业了解其环境中的攻击面,并确保可以充分检测和缓解各种风险。
MITER ATT&CK框架策略包括:初始访问、执行、持久化、提权、防御绕过、访问凭据、发现、横向扩展、影响力等。
对于不同平台下,尽管攻击技术与针对不同平台(比如Linux和Windows)的攻击技术有所差异,但其根本策略实际上是相似的。
例如,将前四个策略(初始访问、执行、持久化、提权)中,如果将OS转换为容器对应为:
基于此,改造原始工具矩阵为容器云(K8S)版本ATT&CK的威胁攻击矩阵,其中包括与容器编排安全相关的主要技术。
如上图,矩阵包含上面列出的9种策略。其中个策略又包含多项技术,攻击者可以使用这些技术来实现不同的目标。下面我们对具体策略具体展开介绍。
1. 访问入口
访问入口策略包括获得的对资源访问权限的技术。在容器云虚拟化化环境中,这些技术可以对我们的访问重定向。可以对访问通过URL串行链接,也可以通过访问部署的恶意或被篡改的资源来实现。
(1) 使用云凭证
如果将K8S集群部署在公共云中(例如亚马逊AWS的EKS,谷歌GCP的GKE或微软Azure的AKS),则云凭据(密码,证书,token)泄露可能导致集群被接管。有权访问云帐户凭据的攻击者可以访问任意操纵整个集群。
(2) 注册表中恶意镜像
在群集中运行恶意的镜像可能会损坏群集。可访问私有注册表的攻击者可以在注册表中随意植入自己的非法代码或者木马等供用户拉取使用。此外,用户拉取来自公共注册表(例如Docker Hub)中未经验证的镜像,这些镜像可能是恶意镜像。
基于无限信任的基础镜像建设镜像也会导致类似的结果。
(3) Kubeconfig配置
kubconfigl也使用kubeconfig文件,其中包含有关Kubernetes集群的详细信息,包括它们的分区和凭据。如果群集托管为云服务(例如AKS或GKE),则该文件通过云命令下载到客户端。如果攻击者通过窃取的客户端配置文件,则可以使用该文件访问副本。
(4) 有漏洞的应用程序
在集群中运行有公开漏洞的应用程序可引起集群的访问权限。可能会触发远程代码执行突破(RCE)攻击容器。如果服务帐户安装在容器中(K8S的默认行为),则攻击者可以窃取服务帐户并对API服务器发送请求。
(5) 暴露的仪表板
Kubernetes仪表板是基于Web的用户界面,可用于监视和管理K8S集群。默认情况仪表板只能通过内网访问。如果图省事将仪表板暴露在外部,则可以允许进行身份验证和部署远程管理。
2. 执行攻击
执行攻击策略包括攻击者用来在最大化中运行其代码的技术。
(1) 容器执行
拥有权限的攻击者可以使用exec命令(" kubectl exec")在群集中的容器中运行恶意命令。通过这种方法,攻击者可以使用合法镜像(例如Ubuntu OS镜像)作为后门容器,并使用" kubectl exec"远程运行其恶意代码。
(2) 新建容器
攻击者可能尝试通过新建容器在集群中运行其代码。有权在群集中部署Pod或控制器的攻击者(例如DaemonSet\ReplicaSet\Deployment)则可以创建用于代码执行的新容器。
(3) 应用程序利用
部署在群集中并且易受到远程代码执行漏洞或最终允许执行代码的漏洞的应用程序使攻击者能够在群集中运行代码。如果将服务帐户安装到容器(K8S中的默认行为),则攻击者将能够使用此服务帐户凭据对API服务器发送请求。
(4) 在容器内运行的SSH
攻击者可能会使用在容器内运行的SSH服务。如果攻击者通过暴力破解或其他方法(例如网络钓鱼)获得了到容器的有效凭据,则可以通过SSH远程访问该容器。
3. 持久化
持久化策略由攻击者用来在失去最初访问点的情况下保持对群集的访问的技术。
(1) 后门容器
攻击者在集群的容器中运行恶意代码。通过使用诸如DaemonSet或Deployments之类的K8S控制器,攻击者可以确保在集群中的一个或者多个节点中运行容器。
(2) 可写的hostPath挂载
hostPath卷将目录或文件从主机装载到容器。有权在群集中创建新容器的攻击者可以创建一个具有可写hostPath卷的容器,并在基础主机上获得持久性。例如,可以通过在主机上创建cron作业来实现。
(3) K8S CronJob
Kubernetes Job可以用于运行为批处理作业执行有限任务的容器。Kubernetes Job是一个控制器,它创建一个或多个Pod,并确保指定数量的Pod终端。Kubernetes CronJob用于计划作业。攻击者可能使用Kubernetes CronJob来调度集群容器执行恶意代码。
4. 权限提升
权限提升策略由攻击者用来在环境中获取比其当前拥有的更高特权的技术组成。在容器化环境中,权限提升技术包括从容器访问节点,在集群中获得更高的特权,甚至获得对云资源的访问。
(1) 特权容器
特权容器是具有主机功能的容器,它可以消除常规容器的所有限制。特权容器可以执行几乎可以直接在主机上执行的所有操作。获得对特权容器的访问权或有权创建新的特权容器的攻击者(例如,通过使用窃取的pod服务帐户),攻击者可以访问主机的资源。
(2) Cluster-admin 绑定
基于角色的访问控制(RBAC)是Kubernetes中的关键安全功能。RBAC可以限制集群中各种身份的允许操作。Cluster-admin是Kubernetes中的内置高特权角色,有权在群集中创建绑定和群集绑定的攻击者可以创建到群集管理员ClusterRole或其他高特权角色的绑定。
(3) hostPath挂载
攻击者可以使用hostPath挂载来访问基础主机,从而从容器破坏主机。
(4) 访问云资源
如果将Kubernetes集群部署在云中,则在某些情况下,攻击者可以利用对单个容器的访问来访问集群外的其他云资源。例如,在AKS中,每个节点都包含服务principal凭证,该凭证存储在/etc/kubernetes/azure.json中。AKS使用该服务principal来创建和管理群集操作所需的Azure资源。
默认情况下,服务principal在群集的资源组中具有贡献者权限。有权访问此服务principal文件的攻击者(例如,通过hostPath挂载)可以使用其凭据来访问或修改云资源。
5. 防御绕过
防御绕过策略由攻击者用来避免检测并隐藏其活动的技术组成。
(1) 清除容器日志
攻击者可能会攻陷容器上的应用程序或系统日志,以防止检测到其活动。
(2) 删除Kubernetes事件
Kubernetes事件是一个Kubernetes对象,用于记录状态更改和集群中资源的故障。示例事件是在节点上创建容器,镜像拉取或Pod调度。
Kubernetes事件对于识别集群中发生的变化非常有用。因此,攻击者可能希望删除这些事件(例如,通过使用" kubectl delete events - all"),以防止其在群集中的活动被检测到。
(3) Pod/容器名混淆
由诸如Deploymen或DaemonSet之类的控制器创建的Pod在其名称中具有随机后缀。攻击者可以利用此事实,并为后门容器命名,因为它们是由现有控制器创建的。例如,攻击者可能创建一个名为coredns-{随机字串后缀}的恶意容器,该容器看上去与CoreDNS部署有关。
同样,攻击者可以将其容器部署在管理容器所在的kube系统名称空间。
(4) 从代理服务器连接
攻击者可能使用代理服务器来隐藏其原始IP。具体来说,攻击者经常使用匿名网络(例如TOR)进行活动。这可用于与应用程序本身或与API服务器进行通信。
6. 访问凭据
访问凭据策略由攻击者用来窃取凭据的技术组成。在容器化环境中,这些技术包括正在运行的应用程序的凭据,身份,群集中存储的密码或云凭据。
(1) 列出Kubernetes机密
Kubernetes机密是一个对象,它使用户可以存储和管理敏感信息,例如集群中的密码和连接字符串。可以通过pod配置中的引用来使用机密。有权从API服务器搜索机密的攻击者(例如,通过使用pod服务帐户)可以访问敏感信息,其中可能包括各种服务的凭据。
(2) 挂载服务principal
将群集部署在云中后,在某些情况下,攻击者可以利用对群集中容器的访问来获取云凭据。例如,在AKS中,每个节点都包含服务principal凭据。
(3) 访问容器服务帐户
服务帐户(SA)代表K8S中的应用程序身份。默认情况下,将SA安装到集群中每个已创建的Pod。使用SA,容器中的容器可以将请求发送到Kubernetes API服务器。可以访问Pod的攻击者可以访问SA令牌(/var/run/secrets/kubernetes.io/serviceaccount/token中),并根据SA权限在集群中执行操作。如果未启用RBAC,则SA在群集中具有无限权限。如果启用了RBAC,则其权限由与其关联的RoleBindings\ClusterRoleBindings确定。
(4) 配置文件中的应用程序凭据
开发人员将机密存储在Kubernetes配置文件中,例如pod配置中的环境变量。此类行为在Azure安全中心监视的群集中很常见。有权通过查询API服务器或访问开发人员终端上的那些机密文件的攻击者可以窃取并使用存储的机密。
7. 发现
发现策略由攻击者用来探测可以访问的环境的技术组成。这些技术有助于攻击者进行横向移动并获得更多资源。
(1) 访问Kubernetes API服务器
Kubernetes API服务器是群集的网关。通过向RESTful API发送各种请求来执行集群中的操作。API服务器可以检索群集的状态,其中包括部署在群集上的所有组件。攻击者可能会发送API请求来探测集群,并获取有关集群中的容器,机密和其他资源的信息。
(2) 访问Kubelet API
Kubelet是安装在每个节点上的Kubernetes代理。Kubelet负责正确执行分配给该节点的Pod。Kubelet公开了不需要身份验证的只读API服务(TCP端口10255)。具有网络访问主机权限的攻击者(例如,通过攻陷容器上运行代码)可以请求访问Kubelet API。
通过访问[NODE IP]:10255/pods /检索节点上正在运行的Pod。
通过访问[NODE IP]:10255/spec/检索有关节点本身的信息,例如CPU和内存消耗。
(3) 内网映射
攻击者可能尝试对群集网络探测以获取有关正在运行的应用程序的信息,包括扫描已知漏洞。默认情况下,在Kubernetes中对pod通讯没有任何限制。因此,获得单个容器访问权限的攻击者可能会使用它来探测网络。
(4) 访问Kubernetes仪表板
Kubernetes仪表板是基于Web的UI,用于监视和管理Kubernetes集群。仪表板允许用户使用其服务帐户(kubernetes-dashboard)在群集中执行操作,该权限由该服务帐户的绑定或群集绑定确定。获得对群集中容器的访问权限的攻击者可以使用其对仪表板容器的网络访问权限。因此,攻击者可能会使用仪表板的身份来检索有关群集中各种资源的信息。
(5) 实例元数据API
云提供者提供了实例元数据服务,用于检索有关虚拟机的信息,例如网络配置,磁盘和SSH公钥。VPS通过不可路由的IP地址访问此服务,该IP地址只能从VPS内部访问。获得容器访问权限的攻击者可以查询元数据API服务,以获取有关基础节点的信息。例如,在AWS中,以下请求将检索实例的所有元数据信息:
IP/latest/meta-data/
8. 横向扩展
横向扩展移动策略包括攻击者用来目标环境中扩展的技术。在容器化环境中,这包括从对一个容器的给定访问中获得对群集中各种资源的访问权,从容器中对基础节点的访问权或对云环境的访问权。
(1) 访问云资源
攻击者可能会从攻陷的容器扩展到云环境。
(2) 容器服务账户
获得对群集中容器的访问权限的攻击者可以使用已安装的服务帐户令牌请求访问API服务器,并获得对群集中其他资源的访问权限。
(3) 集群内部网络
Kubernetes的网络行为允许群集中Pod之间的流量作为默认行为。获得单个容器访问权限的攻击者可能会将其用于群集中另一个容器的网络可达性。
(4) 配置文件中的应用程序凭据
开发人员将机密存储在Kubernetes配置文件中,例如,作为pod配置中的环境变量。使用这些凭据,攻击者可能会访问群集内部和外部的其他资源。
(5) 可写卷安装到主机上
攻击者可能试图从受感染的容器中获取对基础主机的访问。
(7) 访问Kubernetes仪表板
有权访问Kubernetes仪表板的攻击者可以管理仪表板资源,还可以使用仪表板的内置"exec"功能在集群中的各个容器上运行其代码。
(8) 访问Tiller端点
Helm是由CNCF维护的K8S集群中受欢迎的软件包管理器。Tiller是Helm V2之前的的服务器端组件。
Tiller公开群集中的内部gRPC端点,侦听端口44134。默认情况下该端点不需要身份验证。攻击者可以使用Tiller的服务帐户(通常具有较高的特权),在Tiller的服务可访问的任何容器上运行代码,并在群集中执行操作。
9. 影响力
影响力策略包括攻击者用来破坏,滥用或破坏环境正常行为的技术。
(1) 数据删除和加密
攻击者可能试图破坏群集中的数据和资源。这包括删除部署,配置,存储和计算资源。或者将所有资源进行加密,然后勒索。
(2) 资源劫持
攻击者可能会利用已攻陷的资源来运行任务。一种常见的滥用方式是用来挖矿。有权访问群集中的容器或有权创建新容器的攻击者可以将它们用于此类活动。
(3) 拒绝服务
攻击者可能会尝试执行拒绝服务攻击,这会使合法用户无法使用该服务。在容器集群中,这包括尝试阻止容器本身,基础节点或API服务器的可用性。