TLS Egress 监控和策略配置

前面的任务 使用通配符主机配置 Egress 流量 描述了如何为公共域 *.wikipedia.org 中的一组主机启用 Egress 流量,本文基于该任务,演示如何为 TLS Egress 配置 SNI 监控和策略。

开始之前

  • 按照安装指南中的说明安装 Istio。

  • 启动 sleep 示例,以获取发送请求的测试源。如果您启用了自动 sidecar 注入,运行以下命令部署示例应用程序:

Zip

  1. $ kubectl apply -f @samples/sleep/sleep.yaml@

否则,在使用以下命令部署 sleep 应用程序之前,手动注入 sidecar:

Zip

  1. $ kubectl apply -f <(istioctl kube-inject -f @samples/sleep/sleep.yaml@)

您可以使用任何安装了 curl 的 pod 作为测试源。

  • 为了发送请求,您需要创建 SOURCE_POD 环境变量来存储源 pod 的名称:
  1. $ export SOURCE_POD=$(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name})

必须 在你的集群上启用策略检查。请按照 启用策略检查中的步骤操作,以确保策略检查已启用 。

SNI 监控和访问策略

由于已将出口流量配置为流经 egress 网关,因此可以 安全地 对出口流量应用监控和访问策略检查。本节中,您将为流向 *.wikipedia.org 的出口流量定义日志条目和访问策略。

  • 创建日志记录配置:

Zip

  1. $ kubectl apply -f @samples/sleep/telemetry/sni-logging.yaml@
  1. $ kubectl exec -it $SOURCE_POD -c sleep -- sh -c 'curl -s https://en.wikipedia.org/wiki/Main_Page | grep -o "<title>.*</title>"; curl -s https://de.wikipedia.org/wiki/Wikipedia:Hauptseite | grep -o "<title>.*</title>"'
  2. <title>Wikipedia, the free encyclopedia</title>
  3. <title>Wikipedia Die freie Enzyklopädie</title>
  • 检查 Mixer 日志。如果 Istio 部署在 istio-system 命名空间中,打印日志的命令为:
  1. $ kubectl -n istio-system logs -l istio-mixer-type=telemetry -c mixer | grep 'egress-access'
  • 定义一个策略,该策略允许访问除 en.wikipedia.org 以外的所有 *.wikipedia.org 主机:

Zip

  1. $ kubectl apply -f @samples/sleep/policy/sni-wikipedia.yaml@
  1. $ kubectl exec -it $SOURCE_POD -c sleep -- sh -c 'curl -v https://en.wikipedia.org/wiki/Main_Page'
  2. ...
  3. curl: (35) Unknown SSL protocol error in connection to en.wikipedia.org:443
  4. command terminated with exit code 35

根据您定义的策略,对 en.wikipedia.org 的访问被禁止了。

  1. $ kubectl exec -it $SOURCE_POD -c sleep -- sh -c 'curl -s https://es.wikipedia.org/wiki/Wikipedia:Portada | grep -o "<title>.*</title>"; curl -s https://de.wikipedia.org/wiki/Wikipedia:Hauptseite | grep -o "<title>.*</title>"'
  2. <title>Wikipedia, la enciclopedia libre</title>
  3. <title>Wikipedia Die freie Enzyklopädie</title>

符合预期效果,除 en.wikipedia.org 外的 Wikipedia 站点均可被正常访问。

清除监控和策略检查

ZipZip

  1. $ kubectl delete -f @samples/sleep/telemetry/sni-logging.yaml@
  2. $ kubectl delete -f @samples/sleep/policy/sni-wikipedia.yaml@

监控 SNI 和源身份标识,并基于它们执行访问策略

由于您在 sidecar 代理和 egress 网关之间启用了双向 TLS,因此您可以监控访问外部服务的应用程序的 服务标识,并根据流量来源的身份标识执行访问策略。在 Kubernetes 上的 Istio 中,源身份标识基于 服务帐户。本小节中,您将在 sleep-ussleep-canada 服务账户下分别部署 sleep-ussleep-canada 两个容器。然后定义一个策略,该策略允许具有 sleep-us 标识的应用访问 English 和 Spanish 版本的 Wikipedia 站点,并允许具有 sleep-canada 身份标识的应用访问 English 和 French 版本的 Wikipedia 站点。

  • sleep-ussleep-canada 服务账户下分别部署 sleep-ussleep-canada 两个容器:

ZipZip

  1. $ sed 's/: sleep/: sleep-us/g' @samples/sleep/sleep.yaml@ | kubectl apply -f -
  2. $ sed 's/: sleep/: sleep-canada/g' @samples/sleep/sleep.yaml@ | kubectl apply -f -
  3. serviceaccount "sleep-us" created
  4. service "sleep-us" created
  5. deployment "sleep-us" created
  6. serviceaccount "sleep-canada" created
  7. service "sleep-canada" created
  8. deployment "sleep-canada" created
  • 创建日志记录配置:

Zip

  1. $ kubectl apply -f @samples/sleep/telemetry/sni-logging.yaml@
  • sleep-us 发送 HTTPS 请求至 English、German、Spanish 和 French 版本的 Wikipedia 站点:
  1. $ kubectl exec -it $(kubectl get pod -l app=sleep-us -o jsonpath='{.items[0].metadata.name}') -c sleep-us -- sh -c 'curl -s https://en.wikipedia.org/wiki/Main_Page | grep -o "<title>.*</title>"; curl -s https://de.wikipedia.org/wiki/Wikipedia:Hauptseite | grep -o "<title>.*</title>"; curl -s https://es.wikipedia.org/wiki/Wikipedia:Portada | grep -o "<title>.*</title>"; curl -s https://fr.wikipedia.org/wiki/Wikip%C3%A9dia:Accueil_principal | grep -o "<title>.*</title>"'
  2. <title>Wikipedia, the free encyclopedia</title>
  3. <title>Wikipedia Die freie Enzyklopädie</title>
  4. <title>Wikipedia, la enciclopedia libre</title>
  5. <title>Wikipédia, l'encyclopédie libre</title>
  • 检查 Mixer 日志。如果 Istio 部署在 istio-system 命名空间中,打印日志的命令为:
  1. $ kubectl -n istio-system logs -l istio-mixer-type=telemetry -c mixer | grep 'egress-access'
  2. {"level":"info","time":"2019-01-10T17:33:55.559093Z","instance":"egress-access.instance.istio-system","connectionEvent":"open","destinationApp":"","requestedServerName":"en.wikipedia.org","source":"istio-egressgateway-with-sni-proxy","sourceNamespace":"default","sourcePrincipal":"cluster.local/ns/default/sa/sleep-us","sourceWorkload":"istio-egressgateway-with-sni-proxy"}
  3. {"level":"info","time":"2019-01-10T17:33:56.166227Z","instance":"egress-access.instance.istio-system","connectionEvent":"open","destinationApp":"","requestedServerName":"de.wikipedia.org","source":"istio-egressgateway-with-sni-proxy","sourceNamespace":"default","sourcePrincipal":"cluster.local/ns/default/sa/sleep-us","sourceWorkload":"istio-egressgateway-with-sni-proxy"}
  4. {"level":"info","time":"2019-01-10T17:33:56.779842Z","instance":"egress-access.instance.istio-system","connectionEvent":"open","destinationApp":"","requestedServerName":"es.wikipedia.org","source":"istio-egressgateway-with-sni-proxy","sourceNamespace":"default","sourcePrincipal":"cluster.local/ns/default/sa/sleep-us","sourceWorkload":"istio-egressgateway-with-sni-proxy"}
  5. {"level":"info","time":"2019-01-10T17:33:57.413908Z","instance":"egress-access.instance.istio-system","connectionEvent":"open","destinationApp":"","requestedServerName":"fr.wikipedia.org","source":"istio-egressgateway-with-sni-proxy","sourceNamespace":"default","sourcePrincipal":"cluster.local/ns/default/sa/sleep-us","sourceWorkload":"istio-egressgateway-with-sni-proxy"}

注意 requestedServerName 属性,并且 sourcePrincipal 必须为 cluster.local/ns/default/sa/sleep-us

  • 定义一个策略,允许使用服务帐户 sleep-us 的应用程序访问 English 和 Spanish 版本的 Wikipedia,允许使用服务帐户 sleep-canada 的应用程序访问访问 English 和 French 版本的 Wikipedia。如果这些应用尝试访问其他语种版本的 Wikipedia,访问将被阻止。

Zip

  1. $ kubectl apply -f @samples/sleep/policy/sni-serviceaccount.yaml@
  • 再次从 sleep-us 发送 HTTPS 请求到 English、German、Spanish 和 French 版本的 Wikipedia:
  1. $ kubectl exec -it $(kubectl get pod -l app=sleep-us -o jsonpath='{.items[0].metadata.name}') -c sleep-us -- sh -c 'curl -s https://en.wikipedia.org/wiki/Main_Page | grep -o "<title>.*</title>"; curl -s https://de.wikipedia.org/wiki/Wikipedia:Hauptseite | grep -o "<title>.*</title>"; curl -s https://es.wikipedia.org/wiki/Wikipedia:Portada | grep -o "<title>.*</title>"; curl -s https://fr.wikipedia.org/wiki/Wikip%C3%A9dia:Accueil_principal | grep -o "<title>.*</title>";:'
  2. <title>Wikipedia, the free encyclopedia</title>
  3. <title>Wikipedia, la enciclopedia libre</title>

请注意,仅允许 sleep-us 服务帐户访问处于白名单中的 Wikipedia 站点,即 English 和 Spanish 版本的 Wikipedia。

Mixer 策略组件可能需要几分钟的时间才能完成新策略的同步。如果您想在不等待同步完成的情况下快速演示新策略,请 Mixer 策略 Pod 删除:

  1. $ kubectl delete pod -n istio-system -l istio-mixer-type=policy
  • 再次从 sleep-canada 发送 HTTPS 请求到 English、German、Spanish 和 French 站点:
  1. $ kubectl exec -it $(kubectl get pod -l app=sleep-canada -o jsonpath='{.items[0].metadata.name}') -c sleep-canada -- sh -c 'curl -s https://en.wikipedia.org/wiki/Main_Page | grep -o "<title>.*</title>"; curl -s https://de.wikipedia.org/wiki/Wikipedia:Hauptseite | grep -o "<title>.*</title>"; curl -s https://es.wikipedia.org/wiki/Wikipedia:Portada | grep -o "<title>.*</title>"; curl -s https://fr.wikipedia.org/wiki/Wikip%C3%A9dia:Accueil_principal | grep -o "<title>.*</title>";:'
  2. <title>Wikipedia, the free encyclopedia</title>
  3. <title>Wikipédia, l'encyclopédie libre</title>

请注意,只有 sleep-canada 服务帐户访问处于白名单中的 Wikipedia 站点,即 English 和 French 版本的 Wikipedia。

清理 SNI 及源标识的监控和策略检查

ZipZip

  1. $ kubectl delete service sleep-us sleep-canada
  2. $ kubectl delete deployment sleep-us sleep-canada
  3. $ kubectl delete serviceaccount sleep-us sleep-canada
  4. $ kubectl delete -f @samples/sleep/telemetry/sni-logging.yaml@
  5. $ kubectl delete -f @samples/sleep/policy/sni-serviceaccount.yaml@

清除

Zip

  1. $ kubectl delete -f @samples/sleep/sleep.yaml@

相关内容

Istio 中安全管控出口流量,第三部分

管控出口流量的备选方案比较,包括性能因素。

Istio 中的安全管控出口流量,第二部分

使用 Istio 的出口流量管控来阻止相关出口流量攻击。

Istio 中的安全管控出口流量,第一部分

涉及出口流量攻击和出口流量管控要求。

Egress gateway 性能测试

评估加入 Egress gateway 对性能造成的影响。

使用外部 MongoDB 服务

描述了一个基于 Istio 的 Bookinfo 示例的简单场景。

HTTP Egress 流量监控和访问策略

描述如何配置 Istio 进行 HTTP Egress 流量监控和访问策略。