【问题标题】:How do I properly HTTPS secure an application when using Istio?使用 Istio 时如何正确地 HTTPS 保护应用程序?
【发布时间】:2021-04-26 10:00:06
【问题描述】:

我目前正在尝试了解 Kubernetes 应用程序与 Istio 组合的典型应用程序流程是什么样的。

因此,对于我的应用程序,我在 Kubernetes 集群中托管了一个 asp.net 应用程序,并在顶部添加了 Istio。这是我的网关和虚拟服务:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: appgateway
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
      hosts:
        - "*"
      tls:
        httpsRedirect: true
    - port:
        number: 443
        name: https
        protocol: HTTPS
      tls:
        mode: SIMPLE
        serverCertificate: /etc/istio/ingressgateway-certs/tls.crt
        privateKey: /etc/istio/ingressgateway-certs/tls.key
      hosts:
        - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: appvservice
spec:
  hosts:
    - "*"
  gateways:
    - appgateway
  tls:
    - match:
        - port: 443
          sniHosts:
            - "*"
      route:
        - destination:
            host: frontendservice.default.svc.cluster.local
            port:
              number: 443

这是我在阅读 Istio 文档后得出的结论。

请注意,我的frontendservice 是一个非常基本的 ClusterIP 服务路由到一个 Asp.Net 应用程序,它还提供标准的 80 / 443 端口。

我现在有几个问题:

  • 这是保护我的应用程序的正确方法吗?本质上,我想将端口 80 上的传入流量直接重定向到边缘启用 https 的 443。但是,当我尝试这个时,端口 80 上根本没有重定向。
  • 另外,我的 VirtualService 上的 tls 路由不起作用。我的 pod 上没有流量
  • 我还想知道,是否有必要手动将 HTTPs 添加到我的内部应用程序中,或者这是 Istios 内部 CA 功能的来源?

我想象它会这样工作:

  1. 请求进入。如果它在端口 80 上,则向客户端发送重定向以发送 https 请求。如果它在端口 443 上,则允许该请求。
  2. VirtualService 提供指令,说明在端口 443 上的请求应该发生什么,并将其转发给服务。
  3. 该服务现在将请求转发到我的应用的 443 端口。

提前致谢 - 我刚刚学习 Istio,我有点困惑为什么我看似正确的设置在这里不起作用。

【问题讨论】:

  • 嗨@nugetminer23,1.你的istio版本是什么? 2.用curl -v查看的响应码是什么? 3.您可以尝试将sniHosts 从通配符(*) 更改为*.domain 吗?如果我正确理解documentation,单独的通配符可能不起作用。 4.你也可以试试http虚拟服务而不是tls吗?
  • 嘿@Jakub - 我现在在 1.6.3。今天下班后会尝试一下您的其他建议!

标签: kubernetes istio


【解决方案1】:

您的网关终止 TLS 连接,但您的 VirtualService 配置为接受unterminated TLS connections with TLSRoute

比较example without TLS termination 和示例which terminates TLS。最有可能的是,“默认”设置是终止 TLS 连接并使用 HTTPRoute 配置 VirtualService。

【讨论】:

    【解决方案2】:

    我们也在使用类似的设置。

    • SSL 在入口网关上终止,但我们通过网关 CR 使用 mTLS 模式。
    • 服务正在侦听非 ssl 端口,但 sidecar 在它们之间使用 mTLS,因此任何没有 sidecar 的容器都无法与服务通信。
    • VirtualService 正在路由到非 SSL 服务端口。
    • Sidecar CR 拦截进出非 SSL 服务端口的流量。
    • PeerAuthentication 在 sidecar 之间设置 mTLS。

    【讨论】:

    • 谢谢,了解其他人如何设置它已经很有帮助!您是否设法设置了网关/虚拟服务配置?
    • 是的,我们的设置已经部署到生产环境中。
    猜你喜欢
    • 2019-07-24
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    相关资源
    最近更新 更多