iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 16
0
DevOps

從題目中學習k8s系列 第 16

【從題目中學習k8s】-【Day16】第八題 - Security Context for a Pod


title: 【從題目中學習k8s】-【Day16】第八題 - Security Context for a Pod
description: 以無比的恆毅力堅持30天鍊成鐵人--連續30天,一天發表一篇IT技術文章

【從題目中學習k8s】-【Day16】第八題 - Security Context for a Pod

tags: DevOps CICD K8s Docker

Question

Create a new Pod called super-user-pod with image busybox:1.28. Allow the pod to be able to set system_time

The container should sleep for 4800 seconds

Pod: super-user-pod
Container Image: busybox:1.28
SYS_TIME capabilities for the conatiner?


概念

這題考的是 Pod的安全策略,雖然Pod是受到 kubernetes 經過檢查確認合法才得以部署的,但是由於這些服務都會直接面向User,若這些容器內本身的權限過高且遭受到攻擊,就會衍生出其他的安全性問題。SecurityContext就是用來解決這類問題的,它定義了Pod或容器的特權和訪問控制設置。SecurityContext包括:

  • Discretionary Access Control
    訪問目標(如檔案)的權限基於User ID(UID)和 Group ID(GID)。

  • Security Enhanced Linux (SELinux)
    為目標分配安全標籤

  • Running as privileged or unprivileged
    以特權或非特權運行

  • Linux Capabilities
    為某些process提供特權,但不是root的所有特權

  • AppArmor
    使用程式配置文件來限制個別程式的功能。

  • Seccomp
    過濾及篩選process的system call

  • AllowPrivilegeEscalation
    控制process是否可以比其parent process獲得更多的特權。

  • readOnlyRootFilesystem
    將容器的root file system mount 為 Read-Only。

Kubernetes 內也可以透過 SecurityContext 對每個 Container 去進行相關的權限設定。要為Pod指定安全設置,需在Pod YAML中加入securityContext參數。

範例Pod YAML如下:

$ cat security-context.yaml 

apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo
spec:
  securityContext:
    runAsUser: 1000
    runAsGroup: 3000
    fsGroup: 2000
  volumes:
  - name: sec-ctx-vol
    emptyDir: {}
  containers:
  - name: sec-ctx-demo
    image: busybox
    command: [ "sh", "-c", "sleep 1h" ]
    volumeMounts:
    - name: sec-ctx-vol
      mountPath: /data/demo
    securityContext:
      allowPrivilegeEscalation: false

在此YAML中:

  • runAsUser: 1000
    對於Pod中的任何容器,所有process都已 User ID=1000運行
  • runAsGroup: 3000
    Pod的任何容器內的所有process指定 primary group ID為3000。指定runAsGroup時, User ID 1000和 Group ID 3000也將擁有所有創建的檔案。(若省略此參數,K8s default的primary group ID是root(0))
  • fsGroup: 2000
    容器的所有process也是supplementary Group ID 2000的一部分。Volume /data/demo 及該Vloume中所有檔案的擁有者均為 Group ID 2000。

接著我們看看這個Pod

## 首先創建此Pod
$ kubeclt apply -f security-context.yaml

## 進入容器內
$ kubectl exec -it security-context-demo -- sh

列出所有running process

結果顯示processes以 UID 1000運行,也就是我們設定runAsUser的值

接著進入 /data

結果顯示 /data/demo 目錄為Group ID 2000,也就是我們設定fsGroup的值

接著進入 /demo,隨便創建一個檔案

創建的檔案 testfile 為Group ID 2000,同樣是我們設定fsGroup的值

查看目前uid和gid及所屬分組及用戶名資訊

可以看到gid為3000,與runAsGroup欄位相同。若省略了runAsGroup,則gid則為0 (root)

到目前為止是簡單的Pod應用SecurityContext的範例。

回到這題。這題有兩個重點:

  • 此container創建後要sleep 4800秒
  • 允許pod設定system_time

那我們就需要用到securityContext的幫助啦~


Answer

$ kubectl run super-user-pod --image=busybox:1.28 --restart=Never --dry-run=client -o yaml > q8.yaml

$ vim q8.yaml

apiVersion: v1
kind: Pod
metadata: 
    name: super-user-pod
spec: 
    containers:
    - image: busybox:1.28
      name: super-user-pod
      ## 加上securityContext參數
      securityContext:
        capabilities:
        ## 允許設定SYS_TIME
          add: ["SYS_TIME"]
      ## container sleep 4800
      command: ["sleep"]
      args: ["4800"]
    restartPolicy: Never

$ kubectl apply -f q8.yaml

結論

這題筆者認為算是比較難一點的題目,剛看到題目可能不知道從何下手。但是有了概念後,以後看到有關使用權限或安全的問題,都要想到SecurityContext哦~ 好啦,今天就到這囉~ 謝謝大家~

參考資料

11個保護你 Kubernetes 集群的技巧與觀念(下)
Configure a Security Context for a Pod or Container

Thank you!

You can find me on

  • george4908090@gmail.com

上一篇
【從題目中學習k8s】-【Day15】第七題 - Volume
下一篇
【從題目中學習k8s】-【Day17】第九題 - PV&PVC
系列文
從題目中學習k8s31

尚未有邦友留言

立即登入留言