|
本文档采用自动化机器翻译技术翻译。 尽管我们力求提供准确的译文,但不对翻译内容的完整性、准确性或可靠性作出任何保证。 若出现任何内容不一致情况,请以原始 英文 版本为准,且原始英文版本为权威文本。 |
|
这是尚未发布的文档。 Admission Controller 1.34-dev. |
安全强化 Admission Controller webhooks
SUSE Security Admission Controller 堆栈使用 webhook 在 Kubernetes 集群中强制执行策略。
每个 PolicyServer 实例都暴露一个 webhook,Kubernetes API 服务器调用它来验证和修改资源。此外,kubewarden-controller 还暴露 webhook 来验证和修改 Admission Controller 项目提供的自定义资源。
为了减少攻击面,您应该限制对这些 webhook 的访问,仅限于有效调用者:
-
Kubernetes API 服务器
-
审计扫描器 组件。
您可以独立或一起使用网络策略和身份验证来安全强化 webhook 以抵御攻击。
使用网络策略阻止外部流量
webhook 仅期望接受来自 Kubernetes API 服务器和审计扫描器组件的请求。但是,默认情况下,webhook 可以接受来自任何来源的流量。如果您使用支持网络策略的容器网络接口 (CNI),可以创建一个策略,阻止不来自 API 服务器的流量。
Kubernetes 中内置的 NetworkPolicy 资源无法阻止或允许来自集群主机的流量。此外,kube-apiserver 进程始终在主机网络上运行。因此,您必须使用所用 CNI 的高级网络策略资源。以下是 Calico 和 Cilium 的示例。有关详细信息,请参阅您的 CNI 文档。
Calico
在 crd.projectcalico.org/v1 API 组中使用 NetworkPolicy 资源,定义如下所示的网络策略:
apiVersion: crd.projectcalico.org/v1
kind: NetworkPolicy
metadata:
name: allow-k8s-and-audit-scanner
namespace: kubewarden
spec:
selector: 'app.kubernetes.io/component in {"kubewarden-controller", "policy-server"}'
types:
- Ingress
ingress:
- action: Allow
protocol: TCP
source:
nets:
- 192.168.42.0/24
destination:
selector: 'app.kubernetes.io/component in {"kubewarden-controller", "policy-server"}'
- action: Allow
protocol: TCP
source:
namespaceSelector: 'kubernetes.io/metadata.name == "kubewarden"'
destination:
selector: 'app.kubernetes.io/component in {"kubewarden-controller", "policy-server"}'
|
此网络策略使用在 Admission Controller 1.23.0 中引入的标签选择器。如果您使用的是旧版本,请更新策略中的标签以匹配您的部署。 更具体地说,写下
选择器为:
|
Cilium
在 cilium.io/v2 API 组中使用 CiliumNetworkPolicy 资源,定义如下所示的网络策略:
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: allow-k8s-and-audit-scanner
namespace: kubewarden
spec:
endpointSelector:
matchExpressions:
- key: app.kubernetes.io/component
operator: In
values:
- policy-server
- controller
ingress:
- fromEntities:
- host
- remote-node
- fromEndpoints:
- matchLabels:
k8s:io.kubernetes.pod.namespace: kubewarden
|
此网络策略使用在 Admission Controller 1.23.0 中引入的标签选择器。如果您使用的是旧版本,请更新策略中的标签以匹配您的部署。 更具体地说,写下
表达式为:
|
要求 Kubernetes API 服务器对 webhook 进行身份验证。
|
请参阅 webhook mTLS how-to,以获取有关配置 K3s 的 Kubernetes API 服务器以对 webhook 进行身份验证的逐步指南。 |
Admission Controller 堆栈暴露的 webhook 应仅接受来自 Kubernetes API 服务器或审计扫描器组件的请求。默认情况下,这些 webhook 不要求客户端进行身份验证。它们接受任何请求。
您可以配置 webhook 以要求凭据,以便只有 API 服务器和审计扫描器进程可以访问它们。有关更多信息,请参阅 Kubernetes 文档。
-
配置 API 服务器以向 webhook 提供客户端证书,指向一个
AdmissionConfiguration文件以配置ValidatingAdmissionWebhook和MutatingAdmissionWebhook插件:创建一个名为
admission.yaml的文件,包含以下内容:apiVersion: apiserver.config.k8s.io/v1 kind: AdmissionConfiguration plugins: - name: ValidatingAdmissionWebhook configuration: apiVersion: apiserver.config.k8s.io/v1 kind: WebhookAdmissionConfiguration kubeConfigFile: "/etc/k8s/admission/kubeconfig" - name: MutatingAdmissionWebhook configuration: apiVersion: apiserver.config.k8s.io/v1 kind: WebhookAdmissionConfiguration kubeConfigFile: "/etc/k8s/admission/kubeconfig"这是用于配置其他插件(如
PodSecurity)的相同配置文件。如果您的发行版或设置使用其他准入插件,您还应配置这些插件。 -
创建准入插件所引用的
kubeconfig文件。Admission Controller 仅支持客户端证书认证,因此生成一个 TLS 密钥对,并将 kubeconfig 设置为使用客户端证书和客户端密钥或客户端证书数据和客户端密钥数据。例如:
apiVersion: v1 kind: Config users: - name: '*.kubewarden.svc' user: client-certificate: /path/to/client/cert client-key: /path/to/client/key -
使用标志
--admission-control-config-file启动kube-apiserver二进制文件,指向您的AdmissionConfiguration文件。执行此操作的方法因发行版而异,并且并非所有发行版都支持,例如在托管的 Kubernetes 提供商中。请查阅您的 Kubernetes 发行版的文档。 -
将颁发 API 服务器客户端证书的根 CA 的证书提供给 Admission Controller 堆栈。
将其内容放入
kubewarden命名空间下的一个ConfigMap中,使用名为client-ca.crt的密钥。假设根 CA 可在
/etc/k8s/admission/certs/rootCA.crt处访问,使用以下命令创建ConfigMap:kubectl create configmap -n kubewarden api-server-mtls \ --from-file=client-ca.crt=/etc/k8s/admission/certs/rootCA.crt -
最后,在安装
kubewarden-controllerHelm 图表时,请确保启用以下值:-
将
mTLS.enable设置为true。 -
将
mTLS.configMapName设置为之前创建的ConfigMap的名称。ConfigMap的名称是api-server-mtls,因此安装kubewarden-controller的 Helm 命令是:helm install --wait -n kubewarden kubewarden-controller kubewarden/kubewarden-controller \ --set mTLS.enable=true \ --set mTLS.configMapName=api-server-mtlsAdmission Controller 控制器为审计扫描器组件创建一个客户端证书。当需要时,控制器会自动轮换证书。
-