DevOps
CICD
K8s
Docker
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中:
Pod
中的任何容器,所有process都已 User ID=1000運行Pod
的任何容器內的所有process指定 primary group ID為3000。指定runAsGroup時, User ID 1000和 Group ID 3000也將擁有所有創建的檔案。(若省略此參數,K8s default的primary group ID是root(0))接著我們看看這個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
的範例。
回到這題。這題有兩個重點:
system_time
。那我們就需要用到securityContext
的幫助啦~
$ 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
You can find me on