強化指南 - 排程器配置

有關如何使 Kubernetes 排程器更安全的資訊。

Kubernetes 排程器控制平面的關鍵元件之一。

本文件涵蓋了如何提高排程器的安全態勢。

配置錯誤的排程器可能會帶來安全隱患。這樣的排程器可以針對特定節點,並驅逐共享該節點及其工作負載的應用程式。這可能有助於攻擊者發動 Yo-Yo 攻擊:一種針對易受攻擊的自動擴縮器的攻擊。

kube-scheduler 配置

排程器認證和授權命令列選項

設定認證配置時,應確保 kube-scheduler 的認證與 kube-api-server 的認證保持一致。如果任何請求缺少認證頭部,則應透過 kube-api-server 進行認證,從而使叢集中的所有認證保持一致

  • authentication-kubeconfig:確保提供正確的 kubeconfig,以便排程器可以從 API 伺服器檢索認證配置選項。此 kubeconfig 檔案應受到嚴格的檔案許可權保護。
  • authentication-tolerate-lookup-failure:將其設定為 false,以確保排程器**始終**從 API 伺服器查詢其認證配置。
  • authentication-skip-lookup:將其設定為 false,以確保排程器**始終**從 API 伺服器查詢其認證配置。
  • authorization-always-allow-paths:這些路徑應該響應適合匿名授權的資料。預設為 /healthz,/readyz,/livez
  • profiling:設定為 false 以停用 profiling 端點,這些端點提供除錯資訊,但不應在生產叢集上啟用,因為它們存在拒絕服務或資訊洩露的風險。--profiling 引數已棄用,現在可以透過 KubeScheduler DebuggingConfiguration 提供。透過將 enableProfiling 設定為 false,可以在 kube-scheduler 配置中停用 profiling。
  • requestheader-client-ca-file:避免傳遞此引數。

排程器網路命令列選項

  • bind-address:在大多數情況下,kube-scheduler 不需要外部可訪問。將繫結地址設定為 localhost 是一種安全做法。
  • permit-address-sharing:將其設定為 false 以停用透過 SO_REUSEADDR 進行的連線共享。SO_REUSEADDR 可能導致重用處於 TIME_WAIT 狀態的已終止連線。
  • permit-port-sharing:預設為 false。除非你確信自己瞭解其安全影響,否則請使用預設值。

排程器 TLS 命令列選項

  • tls-cipher-suites:始終提供首選密碼套件列表。這確保了永遠不會使用不安全的密碼套件進行加密。

自定義排程器的排程配置

當使用基於 Kubernetes 排程程式碼的自定義排程器時,叢集管理員需要小心使用使用 queueSortprefilterfilterpermit 擴充套件點的外掛。這些擴充套件點控制排程過程的各個階段,錯誤的配置可能會影響叢集中 kube-scheduler 的行為。

主要注意事項

  • 一次只能啟用一個使用 queueSort 擴充套件點的外掛。任何使用 queueSort 的外掛都應仔細審查。
  • 實現 prefilterfilter 擴充套件點的外掛可能會將所有節點標記為不可排程。這可能導致新 Pod 的排程停止。
  • 實現 permit 擴充套件點的外掛可以阻止或延遲 Pod 的繫結。此類外掛應由叢集管理員徹底審查。

當使用非預設外掛的外掛時,考慮按如下方式停用 queueSortfilterpermit 擴充套件點:

apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
  - schedulerName: my-scheduler
    plugins:
      # Disable specific plugins for different extension points
      # You can disable all plugins for an extension point using "*"
      queueSort:
        disabled:
        - name: "*"             # Disable all queueSort plugins
      # - name: "PrioritySort"  # Disable specific queueSort plugin
      filter:
        disabled:
        - name: "*"                 # Disable all filter plugins
      # - name: "NodeResourcesFit"  # Disable specific filter plugin
      permit:
        disabled:
        - name: "*"               # Disables all permit plugins
      # - name: "TaintToleration" # Disable specific permit plugin

這將建立一個名為 my-custom-scheduler 的排程器配置檔案。每當 Pod 的 .spec 中沒有 .spec.schedulerName 的值時,kube-scheduler 將使用其主配置和預設外掛為該 Pod 執行。如果你定義一個 .spec.schedulerName 設定為 my-custom-scheduler 的 Pod,kube-scheduler 將使用自定義配置執行;在該自定義配置中,queueSortfilterpermit 擴充套件點被停用。如果你使用此 KubeSchedulerConfiguration,並且不執行任何自定義排程器,然後你定義一個 .spec.schedulerName 設定為 nonexistent-scheduler(或叢集中不存在的任何其他排程器名稱)的 Pod,則不會為該 Pod 生成任何事件。

禁止為節點打標籤

叢集管理員應確保叢集使用者無法為節點打標籤。惡意行為者可以使用 nodeSelector 將工作負載排程到不應存在這些工作負載的節點上。

最後修改於 2024 年 2 月 9 日太平洋標準時間晚上 11:57:排程器配置的安全強化指南 (b0d8a8c027)