軟體安全性並非安全性軟體。我們關注驗證、Access Control、保密性、加密以及權限管理之類的主題。
streamingConnectionIdleTimeout
欄位指定在連線自動關閉之前,串流連線閒置的最長時間。設定閒置逾時可以防止 Denial of Service 攻擊及耗盡所有連線。將欄位值設定為 0
會停用閒置逾時。streamingConnectionIdleTimeout
欄位設定為 0
來停用串流連線逾時。
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
streamingConnectionIdleTimeout: 0
AlwaysAllow
模式下不會執行任何授權,因為這個模式允許所有要求。AlwaysAllow
做為授權模式之一。
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --authorization-mode=...,AlwaysAllow,...
...
--root-ca-file
旗標的情況下啟動,此時會指定根憑證授權單位 (CA) 檔案。所以,Kubernetes Controller Manager 不會將對應的根 CA 憑證發佈至 Pod。若沒有根 CA 憑證,Pod 就無法在建立連線之前驗證 API 伺服器的服務憑證。這樣的連線容易遭到 man-in-the-middle 攻擊。--root-ca-file
旗標的情況下啟動一個 Kubernetes Controller Manager。
...
kind: Pod
...
spec:
containers:
- command:
- kube-controller-manager
image: k8s.gcr.io/kube-controller-manager:v1.9.7
imagePullPolicy: IfNotPresent
...
...
kind: Pod
...
spec:
containers:
- command:
- kube-controller-manager
image: example.domain/kube-controller-manager:v1.9.7
imagePullPolicy: IfNotPresent
...
AlwaysAllow
模式或 Webhook
模式授權要求。如未指定授權模式,將預設為 AlwaysAllow
。Kubelet 在 AlwaysAllow
模式下不會執行任何授權檢查,因為這個模式允許所有要求。由於 Kubelet 是管理工作者機器工作負載的 Kubernetes 主要代理程式,所以攻擊者可使用未控制的要求來存取保護不足和安全性敏感的服務 API。AlwaysAllow
。
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
authorization:
mode: AlwaysAllow
clientCAFile
欄位,此欄位指定用於驗證用戶端憑證的 CA 組合。
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
--kubelet-client-certificate
旗標和 --kubelet-client-key
旗標指定用戶端憑證和對應私密金鑰,來啟用對 Kubelet 進行以憑證為基礎的驗證。
...
spec:
containers:
- command:
- kube-apiserver
- --audit-log-maxage=50
- --audit-log-maxbackup=20
- --audit-log-maxsize=200
image: gcr.io/google_containers/kube-apiserver-amd64:v1.6.0
...
--kubelet-certificate-authority
旗標驗證 Kubelet 的服務憑證。
...
spec:
containers:
- command:
- kube-apiserver
- --audit-log-maxage=50
- --audit-log-maxbackup=20
- --audit-log-maxsize=200
image: gcr.io/google_containers/kube-apiserver-amd64:v1.6.0
...
Node
授權是一種特殊用途的授權模式,專門用於授權 Kubelet 發出的 API 要求。這可確保 Kubelet 擁有正確操作所需的最少權限組。Node
授權模式。
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --authorization-mode=RBAC,Webhook
...
NodeRestriction
准入控制器。NodeRestriction
准入控制器會限制每個 Kubelet 修改其 Node 和 Pod 物件,也會拒絕存取敏感系統物件。如此一來,即可防止任何遭到入侵的節點在 Kubernetes 叢集的其他節點上獲得特權。Pod
定義在不啟用 NodeRestriction
准入控制器的情況下啟動 Kubernetes API 伺服器。
apiVersion: v1
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --enable-admission-plugins=PodSecurityPolicy
...
PodSecurityPolicy
准入控制器表示安全性控制較弱,除非有用於 Kubernetes 的替代原則強制執行工具,例如 K-Rail、Kyverno、OPA/Gatekeeper。PodSecurityPolicy
准入控制器會強制執行 Pod 安全性原則,這些原則指定叢集中許可的安全性相關 Pod 屬性。例如,您可以使用 PodSecurityPolicy
預設在每次建立 Pod
時禁用具有特權的容器並禁止提升特權。Pod
定義在不啟用 PodSecurityPolicy
准入控制器的情況下啟動 Kubernetes API 伺服器。
apiVersion: v1
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --enable-admission-plugins=NodeRestriction
...
RBAC
) 會根據組織內個別使用者的角色控制對電腦或網路資源的存取。RBAC 是最安全的授權模式。RBAC
授權模式。
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --authorization-mode=Node,Webhook
...
Pod
,這是因為沒有 securityContext
欄位。
apiVersion: v1
kind: Pod
...
spec:
containers:
- name: web
image: nginx
ports:
- name: web
containerPort: 80
protocol: TCP
SecurityContextDeny
准入控制器會阻止 Pod 設定某些 SecurityContext 欄位,這些欄位允許在 Kubernetes 叢集中提升特權。除非有用於 Kubernetes 的替代原則強制執行工具,例如適當的 Pod 安全性原則,否則應啟用 SecurityContextDeny
准入控制器。Pod
定義在不啟用 SecurityContextDeny
准入控制器的情況下啟動 Kubernetes API 伺服器。
apiVersion: v1
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --enable-admission-plugins=NodeRestriction
...
--service-account-private-key-file
標誌來指定權杖簽署金鑰。--service-account-private-key-file
旗標的情況下啟動一個 Kubernetes Controller Manager。
apiVersion: v1
kind: Pod
...
spec:
containers:
- command:
- kube-controller-manager
image: k8s.gcr.io/kube-controller-manager:v1.9.7
...
ServiceAccount
准入控制器會自動執行服務帳戶管理。ServiceAccount
准入控制器有幾項優點,包括透過自動化認證輪換來減輕存取權杖洩露問題,並消除將密鑰存留在儲存空間中的必要。ServiceAccount
准入控制器預設為啟用,但已被蓄意停用。Pod
定義會啟動 Kubernetes API 伺服器並停用 ServiceAccount
准入控制器。
apiVersion: v1
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --disable-admission-plugins=ServiceAccount,PodNodeSelector
...
NamespaceLifecycle
准入控制器使用兩種方式維護 Kubernetes 系統的完整性。第一種方式是防止在不存在的名稱空間或正在終止的名稱空間中建立物件。第二種方式是防止系統保留的命名空間 (其包含 Kubernetes 關鍵服務) 被刪除。NamespaceLifecycle
准入控制器預設為啟用,但啟動 Kubernetes API 伺服器的指令已利用 --disable-admission-plugin
旗標將其停用。NamespaceLifecycle
包含在 --disable-admission-plugins
旗標中,就會停用 NamespaceLifecycle
准入控制器。
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --disable-admission-plugins=...,NamespaceLifecycle,...
...
--peer-auto-tls
旗標設定為 true
。因此,etcd 執行個體會使用自行簽署憑證與對等端進行 TLS 連線。
...
spec:
containers:
- command:
...
- etcd
...
- --peer-auto-tls=true
...
root
動作而不提供完整 root
存取權。CAP_SYS_ADMIN
功能會將執行盡可能最大範圍的系統管理操作的權限授予 Pod。CAP_SYS_ADMIN
功能新增至 Pod 中的容器。
...
kind: Pod
...
spec:
containers:
...
securityContext:
capabilities:
add:
- CAP_SYS_ADMIN
- SYS_TIME
...
privileged
欄位允許容器與主機上執行的其他處理程序具有幾乎所有相同權限。這會擴大受攻擊面,違反以最小權限執行映像的原則。privileged: true
以特權模式執行。
...
kind: Pod
...
spec:
containers:
- name: ...
image: ...
securityContext:
privileged: true
...