Istio Webhook 管理 [实验性]

以下信息描述了一个实验性功能,仅用于评估。

Istio 有两个 webhooks:validation 和 sidecar 注入器。默认情况下,这些 webhooks 自己管理自己的配置。从安全角度来看,不建议使用此默认行为,因为被侵入的 webhook 随后可能会进行提权攻击。

这个任务展示了如何使用新的 istioctl x post-install webhook 命令来安全的管理 webhooks 的配置。

开始

  • 配置 DNS 证书,并将 global.operatorManageWebhooks 设置为 true,以安装 Istio。
  1. $ cat <<EOF > ./istio.yaml
  2. apiVersion: install.istio.io/v1alpha2
  3. kind: IstioControlPlane
  4. spec:
  5. values:
  6. global:
  7. operatorManageWebhooks: true
  8. certificates:
  9. - secretName: dns.istio-galley-service-account
  10. dnsNames: [istio-galley.istio-system.svc, istio-galley.istio-system]
  11. - secretName: dns.istio-sidecar-injector-service-account
  12. dnsNames: [istio-sidecar-injector.istio-system.svc, istio-sidecar-injector.istio-system]
  13. EOF
  14. $ istioctl manifest apply -f ./istio.yaml
  • 安装 jq 以解析 JSON。

检查 webhook 证书

为了显示 Galley 和 sidecar 注入器的 webhook 证书的 DNS 名字,您需要用以下命令获取 Kubernetes 的 secret,解析它,解码它,并查看输出的文本:

  1. $ kubectl get secret dns.istio-galley-service-account -n istio-system -o json | jq -r '.data["cert-chain.pem"]' | base64 --decode | openssl x509 -in - -text -noout
  2. $ kubectl get secret dns.istio-sidecar-injector-service-account -n istio-system -o json | jq -r '.data["cert-chain.pem"]' | base64 --decode | openssl x509 -in - -text -noout

上述命令的输出会分别包含 Galley 和 sidecar 注入器的 DNS 名字:

  1. X509v3 Subject Alternative Name:
  2. DNS:istio-galley.istio-system.svc, DNS:istio-galley.istio-system
  1. X509v3 Subject Alternative Name:
  2. DNS:istio-sidecar-injector.istio-system.svc, DNS:istio-sidecar-injector.istio-system

启用 webhook 配置

  • 运行以下命令生成 MutatingWebhookConfigurationValidatingWebhookConfiguration 配置文件。
  1. $ istioctl manifest generate > istio.yaml
  • 打开 istio.yaml 配置文件,搜索 kind: MutatingWebhookConfiguration,将 sidecar 注入器的 MutatingWebhookConfiguration 部分另存为 sidecar-injector-webhook.yaml 文件。下面是示例 istio.yaml 中的 MutatingWebhookConfiguration
  1. apiVersion: admissionregistration.k8s.io/v1beta1
  2. kind: MutatingWebhookConfiguration
  3. metadata:
  4. name: istio-sidecar-injector
  5. labels:
  6. app: sidecarInjectorWebhook
  7. release: istio
  8. webhooks:
  9. - name: sidecar-injector.istio.io
  10. clientConfig:
  11. service:
  12. name: istio-sidecar-injector
  13. namespace: istio-system
  14. path: "/inject"
  15. caBundle: ""
  16. rules:
  17. - operations: [ "CREATE" ]
  18. apiGroups: [""]
  19. apiVersions: ["v1"]
  20. resources: ["pods"]
  21. failurePolicy: Fail
  22. namespaceSelector:
  23. matchLabels:
  24. istio-injection: enabled
  • 打开 istio.yaml 配置文件,搜索 kind: ValidatingWebhookConfiguration,将 Galley 的 ValidatingWebhookConfiguration 部分另存为 galley-webhook.yaml 文件。下面是示例 istio.yaml 中的 ValidatingWebhookConfiguration(为节省空间只摘抄了一部分)。
  1. apiVersion: admissionregistration.k8s.io/v1beta1
  2. kind: ValidatingWebhookConfiguration
  3. metadata:
  4. name: istio-galley
  5. labels:
  6. app: galley
  7. release: istio
  8. istio: galley
  9. webhooks:
  10. - name: pilot.validation.istio.io
  11. clientConfig:
  12. service:
  13. name: istio-galley
  14. namespace: istio-system
  15. path: "/admitpilot"
  16. caBundle: ""
  17. rules:
  18. - operations:
  19. - CREATE
  20. - UPDATE
  21. apiGroups:
  22. - config.istio.io
  23. ... SKIPPED
  24. failurePolicy: Fail
  25. sideEffects: None
  • 验证目前不存在 Galley 和 sidecar 注入器的 webhook 配置。下面两条命令的输出应该不包含 Galley 和 sidecar 注入器的任何配置。
  1. $ kubectl get mutatingwebhookconfiguration
  2. $ kubectl get validatingwebhookconfiguration

如果已经存在 Galley 和 sidecar 注入器的 webhook 配置(例如,上一次 Istio 部署所遗留的),使用下列命令删除它们。在运行这些命令之前,将命令中的 webhook 配置的名字换成您的集群中的 Galley 和 sidecar 注入器的实际 webhook 配置的名字。

  1. $ kubectl delete mutatingwebhookconfiguration SIDECAR-INJECTOR-WEBHOOK-CONFIGURATION-NAME
  2. $ kubectl delete validatingwebhookconfiguration GALLEY-WEBHOOK-CONFIGURATION-NAME
  • 使用 istioctl 启用 webhook 配置:
  1. $ istioctl experimental post-install webhook enable --webhook-secret dns.istio-galley-service-account \
  2. --namespace istio-system --validation-path galley-webhook.yaml \
  3. --injection-path sidecar-injector-webhook.yaml
  • 用以下命令验证 sidecar 注入器的 webhook 是否会将 sidecar 容器注入到示例 pod,以检查该 webhook 是否运行正常:
  1. $ kubectl create namespace test-injection
  2. $ kubectl label namespaces test-injection istio-injection=enabled
  3. $ kubectl run --generator=run-pod/v1 --image=nginx nginx-app --port=80 -n test-injection
  4. $ kubectl get pod -n test-injection

get pod 命令应该会显示如下输出。2/2 表示 webhook 将一个 sidecar 注入到了示例 pod 中:

  1. NAME READY STATUS RESTARTS AGE
  2. nginx-app 2/2 Running 0 10s
  • 检查用于验证的 webhook 是否运行正常:
  1. $ kubectl create namespace test-validation
  2. $ kubectl apply -n test-validation -f - <<EOF
  3. apiVersion: networking.istio.io/v1alpha3
  4. kind: Gateway
  5. metadata:
  6. name: invalid-gateway
  7. spec:
  8. selector:
  9. # DO NOT CHANGE THESE LABELS
  10. # The ingressgateway is defined in install/kubernetes/helm/istio/values.yaml
  11. # with these labels
  12. istio: ingressgateway
  13. EOF

创建网关的命令应该会显示如下输出。输出中的错误表示了验证 webhook 检查了网关的配置 YAML 文件:

  1. Error from server: error when creating "invalid-gateway.yaml": admission webhook "pilot.validation.istio.io" denied the request: configuration is invalid: gateway must have at least one server

显示 webhook 配置

  • 如果您将 sidecar 注入器的配置命名为 istio-sidecar-injector,将 Galley 的配置命名为 istio-galley-istio-system,使用下列命令来显示这两个 webhooks 的配置:
  1. $ istioctl experimental post-install webhook status --validation-config=istio-galley-istio-system --injection-config=istio-sidecar-injector
  • 如果您将 sidecar 注入器的配置命名为 istio-sidecar-injector,使用下列命令来显示它的配置:
  1. $ istioctl experimental post-install webhook status --validation=false --injection-config=istio-sidecar-injector
  • 如果您将 Galley 的配置命名为 istio-galley-istio-system,使用下列命令来显示它的配置:
  1. $ istioctl experimental post-install webhook status --injection=false --validation-config=istio-galley-istio-system

禁用 webhook 配置

  • 如果您将 sidecar 注入器的配置命名为 istio-sidecar-injector,将 Galley 的配置命名为 istio-galley-istio-system,使用下列命令来禁用这两个 webhooks 的配置:
  1. $ istioctl experimental post-install webhook disable --validation-config=istio-galley-istio-system --injection-config=istio-sidecar-injector
  • 如果您将 sidecar 注入器的配置命名为 istio-sidecar-injector,使用下列命令来禁用它:
  1. $ istioctl experimental post-install webhook disable --validation=false --injection-config=istio-sidecar-injector
  • 如果您将 Galley 的配置命名为 istio-galley-istio-system,使用下列命令来禁用它:
  1. $ istioctl experimental post-install webhook disable --injection=false --validation-config=istio-galley-istio-system

清理

您可以运行下列命令来删除本教程中创建的资源。

  1. $ kubectl delete ns test-injection test-validation
  2. $ kubectl delete -f galley-webhook.yaml
  3. $ kubectl delete -f sidecar-injector-webhook.yaml

相关内容

安全管理 Webhook

一种更安全管理 Istio webhook 的方法。

DNS 证书管理

在 Istio 中配置和管理 DNS 证书。

Istio v1beta1 授权策略概述

Istio v1beta1 授权策略的设计原则、基本概述及迁移操作。

用于隔离和边界保护的多网格部署

将需要隔离的环境部署到单独的网格中,并通过网格联邦启用网格间通信。

APP 身份和访问适配器

使用 Istio 实现零代码改动保护多云 Kubernetes 应用。

Istio 1.2.4 sidecar 镜像漏洞

由于错误的发布操作,出现了错误的 1.2.4 sidecar 镜像。