跳至主要内容

加固 Rancher Webhook

Rancher Webhook 是 Rancher 中的重要元件,在強制執行 Rancher 及其工作負載的安全要求方面發揮作用。為了減少其攻擊面,對它的存取應僅限於唯一有效的呼叫者:Kubernetes API 伺服器。可以透過獨立或結合使用網路政策和身份驗證來加固 webhook 以抵禦攻擊。

使用網路政策阻止外部流量​

webhook 預期僅接受來自 Kubernetes API 伺服器的請求。但是,預設情況下,webhook 可以接受來自任何來源的流量。如果您使用支援網路政策的 CNI,則可以建立一個政策來阻止不是源自 API 伺服器的流量。

Kubernetes 中的內建 NetworkPolicy 資源無法阻止或允許來自叢集主機的流量,並且 kube-apiserver 程序始終在主機網路上執行。因此,您必須使用正在使用的 CNI 的進階網路政策資源。以下是 Calico 和 Cilium 的範例。有關更多詳細資訊,請參閱您的 CNI 文件。

Calico​

使用 crd.projectcalico.org/v1 API 群組中的 NetworkPolicy 資源。使用選擇器 app == 'rancher-webhook' 為 webhook 建立規則,並將控制平面主機的 CIDR 設定為入站來源:

apiVersion: crd.projectcalico.org/v1
kind: NetworkPolicy
metadata:
name: allow-k8s
namespace: cattle-system
spec:
selector: app == 'rancher-webhook'
types:
- Ingress
ingress:
- action: Allow
protocol: TCP
source:
nets:
- 192.168.42.0/24 # CIDR of the control plane host. May list more than 1 if the hosts are in different subnets.
destination:
selector:
app == 'rancher-webhook'

Cilium​

使用 cilium.io/v2 API 群組中的 CiliumNetworkPolicy 資源。將 host 和 remote-node 鍵新增到 fromEntities 入站規則。這會阻止叢集內和外部流量,同時允許來自主機的流量。

apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: allow-k8s
namespace: cattle-system
spec:
endpointSelector:
matchLabels:
app: rancher-webhook
ingress:
- fromEntities:
- host
- remote-node

要求 Kubernetes API 伺服器向 Webhook 進行身份驗證​

webhook 應僅接受來自 Kubernetes API 伺服器的請求。預設情況下,webhook 不要求客戶端進行身份驗證。它將接受任何請求。您可以配置 webhook 要求憑證,以便只有 API 伺服器可以存取它。更多資訊可以在 Kubernetes 文件中找到。

  1. 配置 API 伺服器向 webhook 提供客戶端憑證,指向 AdmissionConfiguration 檔案以配置 ValidatingAdmissionWebhook 和 MutatingAdmissionWebhook 外掛:

    # /etc/rancher/admission/admission.yaml
    apiVersion: apiserver.config.k8s.io/v1
    kind: AdmissionConfiguration
    plugins:
    - name: ValidatingAdmissionWebhook
    configuration:
    apiVersion: apiserver.config.k8s.io/v1
    kind: WebhookAdmissionConfiguration
    kubeConfigFile: "/etc/rancher/admission/kubeconfig"
    - name: MutatingAdmissionWebhook
    configuration:
    apiVersion: apiserver.config.k8s.io/v1
    kind: WebhookAdmissionConfiguration
    kubeConfigFile: "/etc/rancher/admission/kubeconfig"

    這也是配置其他准入外掛(例如 PodSecurity)的同一個配置檔案。如果您的發行版或設定使用其他准入外掛,也請配置這些外掛。例如,將 RKE2 的 PodSecurity 配置新增到此檔案。

  2. 建立准入外掛引用的 kubeconfig 檔案。Rancher Webhook 僅支援客戶端憑證身份驗證,因此生成 TLS 金鑰對,並將 kubeconfig 設定為使用 client-certificate 和 client-key 或 client-certificate-data 和 client-key-data。例如:

    # /etc/rancher/admission/kubeconfig
    apiVersion: v1
    kind: Config
    users:
    - name: 'rancher-webhook.cattle-system.svc'
    user:
    client-certificate: /path/to/client/cert
    client-key: /path/to/client/key
  3. 使用指向您的 AdmissionConfiguration 檔案的標誌 --admission-control-config-file 啟動 kube-apiserver 二進制檔案。執行此操作的方式因發行版而異,並且並非普遍支援,例如在託管的 Kubernetes 提供者中。請參閱您的 Kubernetes 發行版的文件。

    對於 RKE2,可以使用這樣的配置檔案啟動 rke2-server:

    # /etc/rancher/rke2/config.yaml
    kube-apiserver-arg:
    - admission-control-config-file=/etc/rancher/admission/admission.yaml
    kube-apiserver-extra-mount:
    - /etc/rancher/admission:/etc/rancher/admission:ro
    危險

    某些發行版預設設定此標誌。如果您的發行版提供自己的 AdmissionConfiguration,則必須將其包含在自訂准入控制配置檔案中。例如,RKE2 在 /etc/rancher/rke2/rke2-pss.yaml 安裝 AdmissionConfiguration 檔案,該檔案配置 PodSecurity 准入外掛。在 config.yaml 中設定 admission-control-config-file 將覆蓋此重要的安全設定。要包含兩個外掛,請參閱預設 Pod 安全標準文件並將適當的外掛配置複製到您的 admission.yaml。

  4. 如果您使用 Rancher 使用現有節點佈建叢集,請在佈建之前在節點上建立這些檔案。

    如果您使用 Rancher 在新節點上佈建叢集,請允許佈建完成,然後使用提供的 SSH 金鑰和 IP 位址連線到節點,並將 RKE2 配置檔案放置在 /etc/rancher/rke2/config.yaml.d/ 目錄中。

  5. 在使用這些憑證配置叢集後,配置 Rancher 叢集代理以在 webhook 中啟用身份驗證。建立一個包含這些 chart 值的檔案:

    # values.yaml
    auth:
    clientCA: <base64-encoded certificate authority that signed the kube-apiserver's client certificates>
    allowedCNs:
    - <list of Common Names identifying the kube-apiserver's client certificates.>
    - <if not provided, any cert signed by the given CA will be accepted.>
  6. 在佈建的叢集的 cattle-system namespace 中使用這些值建立一個 configmap:

    kubectl --namespace cattle-system create configmap rancher-config --from-file=rancher-webhook=values.yaml

    webhook 將使用這些值重新啟動。