当前位置: 首页 > 科技观察

如何通过终端快速访问Kubernetes节点Shell的Root环境(无需SSH权限)

时间:2023-03-21 00:18:36 科技观察

概述本场景下,想通过kubectl登录K8S集群中的Node,是否可以?好的!本质上是利用容器(runC)的弱隔离(共享内核、Cgruop等实现进程隔离)实现的权限逃逸。如果你的公司使用一些商业容器平台(如:openshift、rancher)等,这个隐患可能在默认安装时通过PSPscc或policy预先屏蔽。但是如果是原生的Kubernetes,下面的方法往往是可行的。原理概述先说本质,本质上就是:容器(runC)弱隔离。对于虚拟机来说,虚拟机在内核(kernel)层面是隔离的。不同的虚拟机有不同的内核,所以安全性更高。很多,很难从虚拟机逃逸到它所在的物理机。?但是,容器(runC)是弱隔离的。一台机器上的所有容器共享同一个内核。之所以默认看不到对方,是通过cgroup、netnamespace等实现的进程级隔离。然后补充一下,你对容器的权限没有进一步的限制,我可以直接进入它所在的节点通过运行特权容器定位。具体步骤适用于K8S1.25之前的版本。步骤很简单,就是像上面说的那样创建一个特权容器,通过nsenter命令进入nodeshell。示例yaml如下:apiVersion:v1kind:Podmetadata:labels:run:nsenter-v0l86qname:nsenter-v0l86qnamespace:defaultspec:containers:-command:-nsenter---target-"1"---mount---uts---ipc---net---pid----bash--l图片:docker.io/library/alpineimagePullPolicy:始终名称:nsentersecurityContext:特权:真stdin:真stdinOnce:真tty:truehostNetwork:truehostPID:truerestartPolicy:Nevertolerations:-key:CriticalAddonsOnlyoperator:Exists-effect:NoExecuteoperator:Exists直接kubectlapply-fnode-shell.yaml进入节点shell。以上yaml,重点如下:进入nodeshell的命令:nsenter--target1--mount--uts--ipc--net--pid--bash-l,在Linux系统中,nsenter是一个用于进入另一个命名空间的命令行工具。比如nsenter-n-t1bash就是进入pid为1的进程所在的网络命名空间。以及进入节点shell的权限:?hostPID:true共享主机的pid?hostNetwork:true共享主机的网络?privileged:true:PSP权限策略是privileged,即完全无限制。进入nodeshell的pod后,效果如下:nodeshell-可以切换shellnodeshell-可以查看所有进程信息nodeshell-可以root权限执行systemctl实用程序-比较方便进入nodeshell这里推荐2个工具,可以更方便的进入nodeshell。krewnode-shell可以通过kubectl插件管理工具krew[1]安装node-shell,如下:#安装工具kubectlkrewinstallnode-shell#进入nodeshellkubectlnode-shellLensKubernetes图形化管理工具-镜头[2]也有相关的功能。具体使用方法如下:镜头-选择指定节点进入shell镜头-实际启动一个有权限的pod,可以执行root命令总结上面介绍了通过kubectl命令进入root权限的节点shell的方法,这很简单。事实上,在大多数情况下,它都适用于原生Kubernetes。该命令实际上在一定程度上利用了未加固的安全配置。最后,建议大家不仅要加固OS,还要按照安全最佳实践对Kubernetes进行加固。(一般情况下,至少PSP等策略不要设置成privileded,而是设置成Baseline或Restricted)注意安全!