概述本场景下,想通过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-shell
