共计 2028 个字符,预计需要花费 6 分钟才能阅读完成。
文本翻译自: https://raesene.github.io/blog/2023/03/18/lets-talk-about-ano…
本周有一些对于 Dero Cryptojacking operation 的文章,其中对于攻击者所施行的细节之一引起了我的留神。有人提到他们正在攻打容许匿名拜访 Kubernetes API 的集群。到底如何以及为什么能够匿名拜访 Kubernetes 是一个乏味的话题,波及几个不同的畛域,所以我想我会写一些对于它的内容。
匿名拜访如何工作?
集群是否能够进行匿名拜访由 kube-apiserver 组件的标记 --anonymous-auth
管制,其默认为true
,因而如果您在传递给服务器的参数列表中没有看到它,那么匿名拜访将被启用。
然而,仅凭此项设置并不能给攻击者提供拜访集群的很多权限,因为它只涵盖了申请在被解决之前通过的三个步骤之一(Authentication -> Authorization -> Admission Control)。正如 Kubernetes 管制拜访 的文档中所示,在身份认证后,申请还必须通过受权和准入管制(认证 -> 受权 -> 准入管制)。
受权和匿名拜访
因而下一步是申请须要匹配受权策略(通常是 RBAC,但也可能是其余策略)。当然,为了做到这一点,申请必须调配一个身份标识,这个时候 system:anonymous
和 system:unauthenticated
权限组就派上了用场。这些身份标识被调配给任何没有无效身份验证令牌的申请,并用于匹配受权政策。
您能够通过查看 Kubeadm 集群上的 system:public-info-viewer
clusterrolebinding
来理解相似的工作原理。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"
labels:
kubernetes.io/bootstrapping: rbac-defaults
name: system:public-info-viewer
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:public-info-viewer
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: system:authenticated
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: system:unauthenticated
匿名拜访有多常见
当初咱们晓得了匿名拜访是如何工作的,问题就变成了“这有多常见?”。答案是大多数次要发行版都会默认启用匿名拜访,并通常通过 system:public-info-viewer
clusterrole
提供一些对 /version
以及其余几个端点的拜访权限。
要理解这实用于多少集群,咱们能够应用 censys 或 shodan 来查找返回版本信息的集群。例如,这个 censys 查问 显示返回版本信息的主机超过一百万,因而咱们能够说这是一个相当常见的配置。
一个更重大的也更合乎 dero 文章中提出的要点是,这些集群中有多少容许攻击者在其中创立工作负载。尽管您无奈从 Censys 取得确切的信息,但它的确有一个显示集群的查问,容许匿名用户枚举集群中的 pod,在撰写本文时显示 302 个集群节点。我猜其中一些 / 大部分是蜜罐,但也可能有几个就是高风险的易受攻击的集群。
禁用匿名拜访
在非托管集群(例如 Rancher、Kubespray、Kubeadm)上,您能够通过将标记 --anonymous-auth=false
传递给 kube-apiserver
组件来禁用匿名拜访。在托管集群(例如 EKS、GKE、AKS)上,您不能这样做,然而您能够删除任何容许匿名用户执行操作的 RBAC 规定。例如,在 Kubeadm 集群上,您能够删除 system:public-info-viewer
clusterrolebinding
和system:public-info-viewer
clusterrole
,以无效阻止匿名用户从集群获取信息。
当然,如果您有任何依赖这些端点的应用程序(例如健康检查),它们就会中断,因而测试您对集群所做的任何更改十分重要。这里的一种抉择是查看您的审计日志,看看是否有任何匿名申请向 API 服务器收回。
论断
容许某种级别的匿名拜访是 Kubernetes 中的常见默认设置。这自身并不是一个很大的平安问题,但它的确意味着在许多配置中,阻止攻击者毁坏您的集群的惟一办法是 RBAC 规定,因而一个谬误可能会导致重大问题,尤其是当您的集群裸露在互联网上时。