Pod 安全策略
PodSecurityPolicy 類型的對象能夠控制,是否可以向 Pod 發送請求,該 Pod 能夠影響被應用到 Pod 和容器的 SecurityContext。 查看 Pod 安全策略建議 獲取更多信息。
什么是 Pod 安全策略?
Pod 安全策略 是集群級別的資源,它能夠控制 Pod 運行的行為,以及它具有訪問什么的能力。 PodSecurityPolicy對象定義了一組條件,指示 Pod 必須按系統所能接受的順序運行。 它們允許管理員控制如下方面:
| 控制面 | 字段名稱 |
|---|---|
| 已授權容器的運行 | privileged |
| 為容器添加默認的一組能力 | defaultAddCapabilities |
| 為容器去掉某些能力 | requiredDropCapabilities |
| 容器能夠請求添加某些能力 | allowedCapabilities |
| 控制卷類型的使用 | volumes |
| 主機網絡的使用 | hostNetwork |
| 主機端口的使用 | hostPorts |
| 主機 PID namespace 的使用 | hostPID |
| 主機 IPC namespace 的使用 | hostIPC |
| 主機路徑的使用 | allowedHostPaths |
| 容器的 SELinux 上下文 | seLinux |
| 用戶 ID | runAsUser |
| 配置允許的補充組 | supplementalGroups |
| 分配擁有 Pod 數據卷的 FSGroup | fsGroup |
| 必須使用一個只讀的 root 文件系統 | readOnlyRootFilesystem |
Pod 安全策略 由設置和策略組成,它們能夠控制 Pod 訪問的安全特征。這些設置分為如下三類:
- 基於布爾值控制:這種類型的字段默認為最嚴格限制的值。
- 基於被允許的值集合控制:這種類型的字段會與這組值進行對比,以確認值被允許。
- 基於策略控制:設置項通過一種策略提供的機制來生成該值,這種機制能夠確保指定的值落在被允許的這組值中。
RunAsUser
- MustRunAs - 必須配置一個
range。使用該范圍內的第一個值作為默認值。驗證是否不在配置的該范圍內。 - MustRunAsNonRoot - 要求提交的 Pod 具有非零
runAsUser值,或在鏡像中定義了USER環境變量。不提供默認值。 - RunAsAny - 沒有提供默認值。允許指定任何
runAsUser。
SELinux
- MustRunAs - 如果沒有使用預分配的值,必須配置
seLinuxOptions。默認使用seLinuxOptions。驗證seLinuxOptions。 - RunAsAny - 沒有提供默認值。允許任意指定的
seLinuxOptionsID。
SupplementalGroups
- MustRunAs - 至少需要指定一個范圍。默認使用第一個范圍的最小值。驗證所有范圍的值。
- RunAsAny - 沒有提供默認值。允許任意指定的
supplementalGroupsID。
FSGroup
- MustRunAs - 至少需要指定一個范圍。默認使用第一個范圍的最小值。驗證在第一個范圍內的第一個 ID。
- RunAsAny - 沒有提供默認值。允許任意指定的
fsGroupID。
控制卷
通過設置 PSP 卷字段,能夠控制具體卷類型的使用。當創建一個卷的時候,與該字段相關的已定義卷可以允許設置如下值:
- azureFile
- azureDisk
- flocker
- flexVolume
- hostPath
- emptyDir
- gcePersistentDisk
- awsElasticBlockStore
- gitRepo
- secret
- nfs
- iscsi
- glusterfs
- persistentVolumeClaim
- rbd
- cinder
- cephFS
- downwardAPI
- fc
- configMap
- vsphereVolume
- quobyte
- photonPersistentDisk
- projected
- portworxVolume
- scaleIO
- storageos
- * (allow all volumes)
對新的 PSP,推薦允許的卷的最小集合包括:configMap、downwardAPI、emptyDir、persistentVolumeClaim、secret 和 projected。
主機網絡
- HostPorts, 默認為
empty。HostPortRange列表通過min(包含) andmax(包含) 來定義,指定了被允許的主機端口。
允許的主機路徑
- AllowedHostPaths 是一個被允許的主機路徑前綴的白名單。空值表示所有的主機路徑都可以使用。
許可
包含 PodSecurityPolicy 的 許可控制,允許控制集群資源的創建和修改,基於這些資源在集群范圍內被許可的能力。
許可使用如下的方式為 Pod 創建最終的安全上下文:
- 檢索所有可用的 PSP。
- 生成在請求中沒有指定的安全上下文設置的字段值。
- 基於可用的策略,驗證最終的設置。
如果某個策略能夠匹配上,該 Pod 就被接受。如果請求與 PSP 不匹配,則 Pod 被拒絕。
Pod 必須基於 PSP 驗證每個字段。
創建 Pod 安全策略
下面是一個 Pod 安全策略的例子,所有字段的設置都被允許:
apiVersion: extensions/v1beta1 kind: PodSecurityPolicy metadata: name: permissive spec: seLinux: rule: RunAsAny supplementalGroups: rule: RunAsAny runAsUser: rule: RunAsAny fsGroup: rule: RunAsAny hostPorts: - min: 8000 max: 8080 volumes: - '*'
下載示例文件可以創建該策略,然后執行如下命令:
$ kubectl create -f ./psp.yaml
podsecuritypolicy "permissive" created
獲取 Pod 安全策略列表
獲取已存在策略列表,使用 kubectl get:
$ kubectl get psp
NAME PRIV CAPS SELINUX RUNASUSER FSGROUP SUPGROUP READONLYROOTFS VOLUMES
permissive false [] RunAsAny RunAsAny RunAsAny RunAsAny false [*] privileged true [] RunAsAny RunAsAny RunAsAny RunAsAny false [*] restricted false [] RunAsAny MustRunAsNonRoot RunAsAny RunAsAny false [emptyDir secret downwardAPI configMap persistentVolumeClaim projected]
修改 Pod 安全策略
通過交互方式修改策略,使用 kubectl edit:
$ kubectl edit psp permissive
該命令將打開一個默認文本編輯器,在這里能夠修改策略。
刪除 Pod 安全策略
一旦不再需要一個策略,很容易通過 kubectl 刪除它:
$ kubectl delete psp permissive
podsecuritypolicy "permissive" deleted
啟用 Pod 安全策略
為了能夠在集群中使用 Pod 安全策略,必須確保如下:
- 啟用 API 類型
extensions/v1beta1/podsecuritypolicy(僅對 1.6 之前的版本) - 啟用許可控制器
PodSecurityPolicy - 定義自己的策略
使用 RBAC
在 Kubernetes 1.5 或更新版本,可以使用 PodSecurityPolicy 來控制,對基於用戶角色和組的已授權容器的訪問。訪問不同的 PodSecurityPolicy 對象,可以基於認證來控制。基於 Deployment、ReplicaSet 等創建的 Pod,限制訪問 PodSecurityPolicy 對象,Controller Manager 必須基於安全 API 端口運行,並且不能夠具有超級用戶權限。
PodSecurityPolicy 認證使用所有可用的策略,包括創建 Pod 的用戶,Pod 上指定的服務賬戶(service acount)。當 Pod 基於 Deployment、ReplicaSet 創建時,它是創建 Pod 的 Controller Manager,所以如果基於非安全 API 端口運行,允許所有的 PodSecurityPolicy 對象,並且不能夠有效地實現細分權限。用戶訪問給定的 PSP 策略有效,僅當是直接部署 Pod 的情況。當直接部署 Pod 時,應用 PodSecurityPolicy 控制基於角色和組的已授權容器的訪問 。
