加固指南 - 调度器配置
本文介绍如何提升调度器的安全态势。
一个配置不当的调度器可能带来安全隐患。 这样的调度器可以将目标设为特定节点,并驱逐正在共享节点及其资源的工作负载或应用。 攻击者可以借此实施 Yo-Yo 攻击:即针对易受攻击的自动扩缩器发起攻击。
kube-scheduler 配置
调度器身份认证与鉴权命令行选项
在设置身份认证配置时,应确保 kube-scheduler 的身份认证配置与 kube-apiserver 的身份认证配置保持一致。 如果任一请求缺少身份认证头, 则应通过 kube-apiserver 进行身份认证以保证集群内的所有身份认证一致。
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
以禁用性能分析端点。性能分析端点可用于调试, 但在生产环境中启用会带来拒绝服务(DoS)或信息泄露风险。--profiling
参数已被弃用,现在可通过 KubeScheduler DebuggingConfiguration 提供。在 kube-scheduler 配置中,将enableProfiling
设置为false
即可禁用性能分析。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 调度代码使用自定义调度器时,
集群管理员需谨慎使用 queueSort
、prefilter
、filter
和 permit
扩展点。
这些扩展点控制调度过程的不同阶段,配置错误可能会影响 kube-scheduler 在集群中的行为。
关键注意事项
- 同一时间只能启用一个使用
queueSort
扩展点的插件。任何使用queueSort
的插件都应经过严格审查。 - 实现
prefilter
或filter
扩展点的插件可能会将所有节点标记为不可调度。这可能导致新 Pod 无法被调度。 - 实现
permit
扩展点的插件可能会阻止或延迟 Pod 的绑定。此类插件应由集群管理员彻底审查。
如果你使用的是非默认插件,
考虑按以下方式禁用 queueSort
、filter
和 permit
扩展点:
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: my-scheduler
plugins:
# 禁用不同扩展点的特定插件
# 你可以使用 "*" 禁用某个扩展点下的所有插件
queueSort:
disabled:
- name: "*" # 禁用所有 queueSort 插件
# - name: "PrioritySort" # 禁用特定 queueSort 插件
filter:
disabled:
- name: "*" # 禁用所有 filter 插件
# - name: "NodeResourcesFit" # 禁用特定 filter 插件
permit:
disabled:
- name: "*" # 禁用所有 permit 插件
# - name: "TaintToleration" # 禁用特定 permit 插件
这会创建一个调度器配置文件 my-custom-scheduler
。每当 Pod 的 .spec
中未设置 .spec.schedulerName
时,
kube-scheduler 会使用主要配置和默认插件运行该 Pod。如果你定义的 Pod 将 .spec.schedulerName
设置为
my-custom-scheduler
,kube-scheduler 会运行但使用自定义配置;在该自定义配置中,
queueSort
、filter
和 permit
这几个扩展点被禁用。
如果你使用这个 KubeSchedulerConfiguration,但未运行任何自定义调度器,
然后你定义一个 Pod,其 .spec.schedulerName
设置为 nonexistent-scheduler
(或任何其他在你的集群中不存在的调度器名称),那么 Pod 将不会生成任何事件。
不允许为节点添加标签
集群管理员应确保集群用户无法为节点添加标签。
恶意行为者可能会使用 nodeSelector
将工作负载调度到那些本不应运行这些工作负载的节点上。
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.