iT邦幫忙

2023 iThome 鐵人賽

DAY 8
0

Yes

  • 接下來終於要進入 K8s 的攻擊環節了,不過再進行前先來了解一下使用 K8s 的目的、架構以及一些基本操作。那因為這系列著重在安全議題上面,所以操作都已能夠架設出基本的環境為主,如果要學習開發、部署、維運 K8s 相關的話,就麻煩自行參考其他資源,因為我對這部分完全沒有著墨。 /images/emoticon/emoticon70.gif

  • Kubernetes(常簡稱為K8s)是用於自動部署、擴充和管理「容器化(containerized)應用程式」的開源系統,也就是說關於容器的負載平衡、自我異常的檢測這些事情都可以透過 K8s 幫忙管理。一個 K8s 的基本架構參考如下圖 :

https://ithelp.ithome.com.tw/upload/images/20230915/201483088v8gYPBpLg.png

  • 從圖上可以看到有兩個角色,一個是 Developer,透過向 API Server 傳送控制命令去做容器的部署以及服務的開放。另一個角色則是 Users,也就是一般使用者,可以透過開放的介面去存取服務。

  • 這邊先針對 K8s Master Node 的幾個元件做簡單的介紹 :

    • kube-apiserver : 提供 K8s API 介面,功能包含認證授權、叢集狀態變更等等,而之後常用 kubectl 指令背後也是透過 REST API 跟 kube-apiserver 做溝通去執行操作行為。
    • etcd : 分散式的 key-value 資料庫,儲存 K8s 的叢集狀態。裡面也會包含一些機敏性的資料。
  • 再來是 K8s Worker Node 的部分 :

    • kubelet : 負責每個節點的容器執行狀態,它按照 kube-apiserver 的指示來處理啟動,停止和維護應用程式容器
    • Pod : 超級重要/images/emoticon/emoticon12.gif,Kubernetes的基本排程單元,可以包含一個或多個容器,這樣可以保證它們一直位於主機上,並且可以共享資源。共享的資源包含了網路以及Volume。這邊只說明網路的部分,只要一個 Pod 內有個容器監聽了某個 port,則這個 Pod 的其他容器就可以存取到這個port。
  • 以上就是這次鐵人賽會碰到的 K8s 相關元件部分,當然針對開發維運還有很多其他的細節,這邊就不屬於這次的範圍了(而且我也沒研究)。

  • 那要如何架設出一個自己的 K8s 環境呢? 有很多不同的軟體可以達成,每個軟體的設計架構雖然都遵循上面講的元件,但實際運行的方式卻有很大的差異,我一開始學的時候也是一頭霧水。以下就參考 MiniKube, Kubeadm, Kind, K3S, how to get started on Kubernetes? 這邊文章來做說明。

  1. Minikube
    優點 : 好安裝、輕量
    缺點 : 架構太簡單
    https://ithelp.ithome.com.tw/upload/images/20230915/20148308N2FrNmNgYd.png

  2. Kubeadm
    優點 : 完整架構、可以使用 Docker 作為容器
    缺點 : 安裝複雜、耗費資源、只能有一個 Master Node
    https://ithelp.ithome.com.tw/upload/images/20230915/20148308bh7ZyvlzzJ.png

  • 以目前鐵人賽的資源來說還是 minikube 比較多,功能上來講也都還算齊全,除了最後有個補充汙染橫向移動手法無法呈現。所以我這邊最後還是挑選它作為這次比賽的使用平台。

  • 接下來先退回 Day01快照,然後來安裝minikube,資料參考 minikube 安裝方式

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 ;
sudo install minikube-linux-amd64 /usr/local/bin/minikube ;
rm minikube-linux-amd64 ;

#啟動 minikube
minikube start ;

#列出安裝的 addons
minikube addons list ;

# 操作 minikube 容器
minikube ssh ; 

#停止 minikube
minikube stop ; 

#刪除 minikube
minikube delete ; 
  • 然後要對 K8s 的 kube-apiserver 下達命令都是透過 kubectl 這隻程式來做的,而且最後套用一下 auto-completion 使用起來會更順手。安裝方式參考如下 :

  • Install and Set Up kubectl on Linux

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" ;
curl -LO "https://dl.k8s.io/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256" ;
echo "$(cat kubectl.sha256)  kubectl" | sha256sum --check ;
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl ;
chmod +x kubectl
mkdir -p ~/.local/bin
mv ./kubectl ~/.local/bin/kubectl
# and then append (or prepend) ~/.local/bin to $PATH ; 
# PATH=$PATH:~/.local/bin
kubectl get po -A ;
echo 'source <(kubectl completion bash)' >>~/.bashrc ;
source ~/.bashrc ;
  • 安裝完 kubectl 之後,執行它就會去抓取 ~/.kube/config 底下的資訊去相對應的位址傳送資料。這個檔案也包含了使用者憑證資訊,相當的重要。這邊也可以透過 openssl 命令去看一下這個憑證簽了甚麼東西,會看到 O = system:masters。這個以後會再講到,但目前只需知道看到 system + master 字樣 = 很大就對了。
openssl x509 -in [client.crt 檔案位置] -text -noout ;
  • 在建立第一個 pods 之前記得先建立一個 [Day 09 Minikube 架設] 快照方便之後期中考還原用。

  • 接下來就要建立第一個 pods (參考資料 : 在 Minikube 上跑起你的 Docker Containers - Pod & kubectl 常用指令)。K8s 下達操作命令統一都是透過 YAML 格式去做操作的,再透過 kubectl create 或是 kubectl apply 指令去做套用。

apiVersion: v1
kind: Pod
metadata:
  name: my-first-pod
  labels:
    app: shell-server
spec:
  containers:
  - name: my-shell
    image: aeifkz/my-ubuntu:v1.0    
    ports: 
    - containerPort: 30089
  - name: my-nginx
    image: nginx

執行方式 :

#新增 yaml 資源
kubectl create -f pod.yaml ;

#觀看 pod 資源
kubectl get pods ; 

#查看 pod 資源狀態
kubectl describe pods my-first-pod ; 

# 進到 pod 執行命令,如果 pod 內有多個容器
# 則需要 --container 去指定在哪個容器執行命令
kubectl exec -it pods/my-first-pod --container my-shell -- bash ; 

# 觀察一下開了那些 port 
netstat -tlupn ; 

# 依照 yaml 刪除資源
kubectl delete -f pod.yaml ; 
  • 今日總結 :
    • 本日回顧 :
      • 針對 K8s 的架構以及元件做個簡易說明,然後針對建立 pod 基本操作做個演示。那pod建立的部分至關重要,因為跟前面容器提到的一樣,特權限容器就會延伸出逃逸問題,所以如何建立出可以被逃逸的容器將會視後續介紹的第一個重點。
    • 次日預告 :
      • 今日只講了如何建立Pod,但這個Pod要怎麼開放給外部使用者作存取,以及從滲透測試的角度到底該如何攻打一個K8s的架構都會在下次做一個說明。

上一篇
Day08 - (攻擊) 容器逃逸手法 - docker.sock
下一篇
Day10 - 如何開放外部存取 K8s 服務
系列文
怕痛的我把 Docker、K8s 攻擊、防禦、偵測力點滿就對了63
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言