Kubernetes Pod安全性準(zhǔn)入

2022-05-23 09:57 更新

Pod 安全性準(zhǔn)入

FEATURE STATE: Kubernetes v1.23 [beta]

Kubernetes Pod 安全性標(biāo)準(zhǔn)(Security Standards) 為 Pod 定義不同的隔離級(jí)別。這些標(biāo)準(zhǔn)能夠讓你以一種清晰、一致的方式定義如何限制 Pod 行為。

作為一項(xiàng) Beta 功能特性,Kubernetes 提供一種內(nèi)置的 Pod 安全性 準(zhǔn)入控制器, 作為 PodSecurityPolicies 特性的后繼演化版本。Pod 安全性限制是在 Pod 被創(chuàng)建時(shí)在 名字空間層面實(shí)施的。

Note:
PodSecurityPolicy API 已經(jīng)被廢棄,會(huì)在 Kubernetes v1.25 發(fā)行版中 移除。

啟用 PodSecurity 準(zhǔn)入插件 

在 v1.23 中,?PodSecurity ?特性門控 是一項(xiàng) Beta 功能特性,默認(rèn)被啟用。

在 v1.22 中,?PodSecurity ?特性門控 是一項(xiàng) Alpha 功能特性,必須在 ?kube-apiserver? 上啟用才能使用內(nèi)置的準(zhǔn)入插件。

--feature-gates="...,PodSecurity=true"

替代方案:安裝 PodSecurity 準(zhǔn)入 Webhook 

對(duì)于無(wú)法應(yīng)用內(nèi)置 ?PodSecurity ?準(zhǔn)入插件的環(huán)境,無(wú)論是因?yàn)榧喊姹镜陀?nbsp;v1.22, 或者 ?PodSecurity ?特性無(wú)法被啟用,都可以使用 Beta 版本的 驗(yàn)證性準(zhǔn)入 Webhook。 來(lái)使用 ?PodSecurity ?準(zhǔn)入邏輯。

在 https://git.k8s.io/pod-security-admission/webhook 上可以找到一個(gè)預(yù)先構(gòu)建的容器鏡像、證書生成腳本以及一些示例性質(zhì)的清單。

git clone git@github.com:kubernetes/pod-security-admission.git
cd pod-security-admission/webhook
make certs
kubectl apply -k .
Note:
所生成的證書合法期限為 2 年。在證書過(guò)期之前, 需要重新生成證書或者去掉 Webhook 以使用內(nèi)置的準(zhǔn)入查件。

Pod 安全性級(jí)別 

Pod 安全性準(zhǔn)入插件對(duì) Pod 的安全性上下文 有一定的要求,并且依據(jù) Pod 安全性標(biāo)準(zhǔn) 所定義的三個(gè)級(jí)別(?privileged?、?baseline ?和 ?restricted?)對(duì)其他字段也有要求。

為名字空間設(shè)置 Pod 安全性準(zhǔn)入控制標(biāo)簽

一旦特性被啟用或者安裝了 Webhook,你可以配置名字空間以定義每個(gè)名字空間中 Pod 安全性準(zhǔn)入控制模式。 Kubernetes 定義了一組標(biāo)簽, 你可以設(shè)置這些標(biāo)簽來(lái)定義某個(gè)名字空間上要使用的預(yù)定義的 Pod 安全性標(biāo)準(zhǔn)級(jí)別。 你所選擇的標(biāo)簽定義了檢測(cè)到潛在違例時(shí),控制面 要采取什么樣的動(dòng)作。

模式 描述
enforce 策略違例會(huì)導(dǎo)致 Pod 被拒絕
audit 策略違例會(huì)觸發(fā)審計(jì)日志中記錄新事件時(shí)添加審計(jì)注解;但是 Pod 仍是被接受的。
warn 策略違例會(huì)觸發(fā)用戶可見的警告信息,但是 Pod 仍是被接受的。

名字空間可以配置任何一種或者所有模式,或者甚至為不同的模式設(shè)置不同的級(jí)別。

對(duì)于每種模式,決定所使用策略的標(biāo)簽有兩個(gè):

# 針對(duì)模式的級(jí)別標(biāo)簽用來(lái)標(biāo)示針對(duì)該模式所應(yīng)用的策略級(jí)別
#
# MODE 必須是 `enforce`、`audit` 或 `warn` 之一
# LEVEL 必須是 `privileged`、baseline` 或 `restricted` 之一
pod-security.kubernetes.io/<MODE>: <LEVEL>

# 可選:針對(duì)每個(gè)模式版本的版本標(biāo)簽可以將策略鎖定到
# 給定 Kubernetes 小版本號(hào)所附帶的版本(例如 v1.24)
#
# MODE 必須是 `enforce`、`audit` 或 `warn` 之一
# VERSION 必須是一個(gè)合法的 Kubernetes 小版本號(hào)或者 `latest`
pod-security.kubernetes.io/<MODE>-version: <VERSION>

負(fù)載資源和 Pod 模板 

Pod 通常是通過(guò)創(chuàng)建 Deployment 或 Job 這類工作負(fù)載對(duì)象 來(lái)間接創(chuàng)建的。工作負(fù)載對(duì)象為工作負(fù)載資源定義一個(gè) Pod 模板 和一個(gè)對(duì)應(yīng)的 負(fù)責(zé)基于該模板來(lái)創(chuàng)建 Pod 的控制器。 為了盡早地捕獲違例狀況,?audit ?和 ?warn ?模式都應(yīng)用到負(fù)載資源。 不過(guò),?enforce ?模式并 不 應(yīng)用到工作負(fù)載資源,僅應(yīng)用到所生成的 Pod 對(duì)象上。

豁免 

你可以為 Pod 安全性的實(shí)施設(shè)置 豁免(Exemptions) 規(guī)則, 從而允許創(chuàng)建一些本來(lái)會(huì)被與給定名字空間相關(guān)的策略所禁止的 Pod。 豁免規(guī)則可以在準(zhǔn)入控制器配置 中靜態(tài)配置。

豁免規(guī)則可以顯式枚舉。滿足豁免標(biāo)準(zhǔn)的請(qǐng)求會(huì)被準(zhǔn)入控制器 忽略 (所有 ?enforce?、?audit ?和 ?warn ?行為都會(huì)被略過(guò))。 豁免的維度包括:

  • ?Username?: 來(lái)自用戶名已被豁免的、已認(rèn)證的(或偽裝的)的用戶的請(qǐng)求會(huì)被忽略。
  • ?RuntimeClassName?: 指定了已豁免的運(yùn)行時(shí)類名稱的 Pod 和負(fù)載資源會(huì)被忽略。
  • ?Namespace?: 位于被豁免的名字空間中的 Pod 和負(fù)載資源 會(huì)被忽略。

Caution:
大多數(shù) Pod 是作為對(duì)工作負(fù)載資源的響應(yīng), 由控制器所創(chuàng)建的,這意味著為某最終用戶提供豁免時(shí),只會(huì)當(dāng)該用戶直接創(chuàng)建 Pod 時(shí)對(duì)其實(shí)施安全策略的豁免。用戶創(chuàng)建工作負(fù)載資源時(shí)不會(huì)被豁免。 控制器服務(wù)賬號(hào)(例如:?system:serviceaccount:kube-system:replicaset-controller?) 通常不應(yīng)該被豁免,因?yàn)榛砻膺@類服務(wù)賬號(hào)隱含著對(duì)所有能夠創(chuàng)建對(duì)應(yīng)工作負(fù)載資源的用戶豁免。

策略檢查時(shí)會(huì)對(duì)以下 Pod 字段的更新操作予以豁免,這意味著如果 Pod 更新請(qǐng)求僅改變這些字段時(shí),即使 Pod 違反了當(dāng)前的策略級(jí)別,請(qǐng)求也不會(huì)被拒絕。

  • 除了對(duì) seccomp 或 AppArmor 注解之外的所有 meatadata 更新操作:
    • ?seccomp.security.alpha.kubernetes.io/pod? (已棄用)
    • ?container.seccomp.security.alpha.kubernetes.io/* ?(已棄用)
    • ?container.apparmor.security.beta.kubernetes.io/*?
  • 對(duì) ?.spec.activeDeadlineSeconds? 的合法更新
  • 對(duì) ?.spec.tolerations? 的合法更新


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)