Kubernetes 在集群級別應用Pod安全標準

2022-06-20 11:38 更新
Note
本教程僅適用于新集群。

Pod 安全準入(PSA)在 v1.23 及更高版本默認啟用, 因為它升級到測試版(beta)。 Pod 安全準入是在創(chuàng)建 Pod 時應用 Pod 安全標準的準入控制器。 本教程將向你展示如何在集群級別實施 ?baseline ?Pod 安全標準, 該標準將標準配置應用于集群中的所有名稱空間。

在開始之前

在你的工作站中安裝以下內(nèi)容:

正確選擇要應用的 Pod 安全標準

Pod 安全準入 允許你使用以下模式應用內(nèi)置的 Pod 安全標準: ?enforce?、?audit ?和 ?warn?。

要收集信息以便選擇最適合你的配置的 Pod 安全標準,請執(zhí)行以下操作:

  1. 創(chuàng)建一個沒有應用 Pod 安全標準的集群:
  2. kind create cluster --name psa-wo-cluster-pss --image kindest/node:v1.23.0
    

    輸出類似于:

    Creating cluster "psa-wo-cluster-pss" ...
    ? Ensuring node image (kindest/node:v1.23.0) 
    ? Preparing nodes   
    ? Writing configuration 
    ? Starting control-plane ?
    ? Installing CNI 
    ? Installing StorageClass 
    Set kubectl context to "kind-psa-wo-cluster-pss"
    You can now use your cluster with:
    
    kubectl cluster-info --context kind-psa-wo-cluster-pss
    
    Thanks for using kind! 
  3. 將 kubectl 上下文設置為新集群:
  4. kubectl cluster-info --context kind-psa-wo-cluster-pss
    

    輸出類似于:

    Kubernetes control plane is running at https://127.0.0.1:61350 
    CoreDNS is running at https://127.0.0.1:61350/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
    
    To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
  5. 獲取集群中的名字空間列表:
  6. kubectl get ns
    

    輸出類似于:

    NAME                 STATUS   AGE
    default              Active   9m30s
    kube-node-lease      Active   9m32s
    kube-public          Active   9m32s
    kube-system          Active   9m32s
    local-path-storage   Active   9m26s
  7. 使用 ?--dry-run=server? 來了解應用不同的 Pod 安全標準時會發(fā)生什么:
    • Privileged
    • kubectl label --dry-run=server --overwrite ns --all \                    
      pod-security.kubernetes.io/enforce=privileged

      輸出類似于:

      namespace/default labeled
      namespace/kube-node-lease labeled
      namespace/kube-public labeled
      namespace/kube-system labeled
      namespace/local-path-storage labeled
    • Baseline
    • kubectl label --dry-run=server --overwrite ns --all \
      pod-security.kubernetes.io/enforce=baseline

      輸出類似于:

      namespace/default labeled
      namespace/kube-node-lease labeled
      namespace/kube-public labeled
      Warning: existing pods in namespace "kube-system" violate the new PodSecurity enforce level "baseline:latest"
      Warning: etcd-psa-wo-cluster-pss-control-plane (and 3 other pods): host namespaces, hostPath volumes
      Warning: kindnet-vzj42: non-default capabilities, host namespaces, hostPath volumes
      Warning: kube-proxy-m6hwf: host namespaces, hostPath volumes, privileged
      namespace/kube-system labeled
      namespace/local-path-storage labeled
    • Restricted
    • kubectl label --dry-run=server --overwrite ns --all \
      pod-security.kubernetes.io/enforce=restricted

      輸出類似于:

      namespace/default labeled
      namespace/kube-node-lease labeled
      namespace/kube-public labeled
      Warning: existing pods in namespace "kube-system" violate the new PodSecurity enforce level "restricted:latest"
      Warning: coredns-7bb9c7b568-hsptc (and 1 other pod): unrestricted capabilities, runAsNonRoot != true, seccompProfile
      Warning: etcd-psa-wo-cluster-pss-control-plane (and 3 other pods): host namespaces, hostPath volumes, allowPrivilegeEscalation != false, unrestricted capabilities, restricted volume types, runAsNonRoot != true
      Warning: kindnet-vzj42: non-default capabilities, host namespaces, hostPath volumes, allowPrivilegeEscalation != false, unrestricted capabilities, restricted volume types, runAsNonRoot != true, seccompProfile
      Warning: kube-proxy-m6hwf: host namespaces, hostPath volumes, privileged, allowPrivilegeEscalation != false, unrestricted capabilities, restricted volume types, runAsNonRoot != true, seccompProfile
      namespace/kube-system labeled
      Warning: existing pods in namespace "local-path-storage" violate the new PodSecurity enforce level "restricted:latest"
      Warning: local-path-provisioner-d6d9f7ffc-lw9lh: allowPrivilegeEscalation != false, unrestricted capabilities, runAsNonRoot != true, seccompProfile
      namespace/local-path-storage labeled

從前面的輸出中,你會注意到應用 ?privileged ?Pod 安全標準不會顯示任何名字空間的警告。 然而,?baseline ?和 ?restricted ?標準都有警告,特別是在 ?kube-system? 名字空間中。

設置模式、版本和標準

在本節(jié)中,你將以下 Pod 安全標準應用于最新(?latest?)版本:

  • 在 ?enforce ?模式下的 ?baseline ?標準。
  • ?warn ?和 ?audit ?模式下的 ?restricted ?標準。

?baseline ?Pod 安全標準提供了一個方便的中間立場,能夠保持豁免列表簡短并防止已知的特權升級。

此外,為了防止 ?kube-system? 中的 Pod 失敗,你將免除該名字空間應用 Pod 安全標準。

在你自己的環(huán)境中實施 Pod 安全準入時,請考慮以下事項:

  1. 根據(jù)應用于集群的風險狀況,更嚴格的 Pod 安全標準(如 ?restricted?)可能是更好的選擇。
  2. 對 ?kube-system? 名字空間進行赦免會允許 Pod 在其中以 ?privileged ?模式運行。 對于實際使用,Kubernetes 項目強烈建議你應用嚴格的 RBAC 策略來限制對 ?kube-system? 的訪問, 遵循最小特權原則。
  3. 創(chuàng)建一個配置文件,Pod 安全準入控制器可以使用該文件來實現(xiàn)這些 Pod 安全標準:
  4. mkdir -p /tmp/pss
    cat <<EOF > /tmp/pss/cluster-level-pss.yaml 
    apiVersion: apiserver.config.k8s.io/v1
    kind: AdmissionConfiguration
    plugins:
    - name: PodSecurity
      configuration:
        apiVersion: pod-security.admission.config.k8s.io/v1beta1
        kind: PodSecurityConfiguration
        defaults:
          enforce: "baseline"
          enforce-version: "latest"
          audit: "restricted"
          audit-version: "latest"
          warn: "restricted"
          warn-version: "latest"
        exemptions:
          usernames: []
          runtimeClasses: []
          namespaces: [kube-system]
    EOF
  5. 在創(chuàng)建集群時配置 API 服務器使用此文件:
  6. cat <<EOF > /tmp/pss/cluster-config.yaml 
    kind: Cluster
    apiVersion: kind.x-k8s.io/v1alpha4
    nodes:
    - role: control-plane
      kubeadmConfigPatches:
      - |
        kind: ClusterConfiguration
        apiServer:
            extraArgs:
              admission-control-config-file: /etc/config/cluster-level-pss.yaml
            extraVolumes:
              - name: accf
                hostPath: /etc/config
                mountPath: /etc/config
                readOnly: false
                pathType: "DirectoryOrCreate"
      extraMounts:
      - hostPath: /tmp/pss
        containerPath: /etc/config
        # optional: if set, the mount is read-only.
        # default false
        readOnly: false
        # optional: if set, the mount needs SELinux relabeling.
        # default false
        selinuxRelabel: false
        # optional: set propagation mode (None, HostToContainer or Bidirectional)
        # see https://kubernetes.io/docs/concepts/storage/volumes/#mount-propagation
        # default None
        propagation: None
    EOF
    說明:
    如果你在 macOS 上使用 Docker Desktop 和 KinD, 你可以在菜單項 Preferences > Resources > File Sharing 下添加 ?/tmp? 作為共享目錄。
  7. 創(chuàng)建一個使用 Pod 安全準入的集群來應用這些 Pod 安全標準:
  8. kind create cluster --name psa-with-cluster-pss --image kindest/node:v1.23.0 --config /tmp/pss/cluster-config.yaml
    

    輸出類似于:

    Creating cluster "psa-with-cluster-pss" ...
     ? Ensuring node image (kindest/node:v1.23.0)  
     ? Preparing nodes   
     ? Writing configuration  
     ? Starting control-plane ? 
     ? Installing CNI  
     ? Installing StorageClass  
    Set kubectl context to "kind-psa-with-cluster-pss"
    You can now use your cluster with:
    
    kubectl cluster-info --context kind-psa-with-cluster-pss
    
    Have a question, bug, or feature request? Let us know! https://kind.sigs.k8s.io/#community 
  9. 將 kubectl 指向集群
  10. kubectl cluster-info --context kind-psa-with-cluster-pss
    

    輸出類似于:

    Kubernetes control plane is running at https://127.0.0.1:63855
    CoreDNS is running at https://127.0.0.1:63855/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
    
    To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
  11. 創(chuàng)建以下 Pod 規(guī)約作為在 default 名字空間中的一個最小配置:
  12. cat <<EOF > /tmp/pss/nginx-pod.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
    spec:
      containers:
        - image: nginx
          name: nginx
          ports:
            - containerPort: 80
    EOF
  13. 在集群中創(chuàng)建 Pod:
  14. kubectl apply -f /tmp/pss/nginx-pod.yaml
    

    輸出類似于:

    Warning: would violate PodSecurity "restricted:latest": allowPrivilegeEscalation != false (container "nginx" must set securityContext allowPrivilegeEscalation=false), unrestricted capabilities (container "nginx" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "nginx" must set securityContext.runAsNonRoot=true), seccompProfile (pod or container "nginx" must set securityContext seccompProfile.type to "RuntimeDefault" or "Localhost")
    pod/nginx created

清理

運行 ?kind delete cluster --name psa-with-cluster-pss? 和 ?kind delete cluster --name psa-wo-cluster-pss? 來刪除你創(chuàng)建的集群。


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號