Istio 中的 corsPolicy 允许来自 VirtualService 的 allowOrigin 不会阻止来自不同来源的 curl 请求

88次阅读
没有评论

问题描述

在 Istio 使用过程中,用户遇到了一个问题:无论如何设置 allowOrigins,都无法阻止来自不同来源的 curl 请求。用户期望根据设置的 allowOrigin 属性来限制请求的来源,但实际情况下请求仍然可以通过。这被用户认为是一个安全漏洞。用户使用的 Istio 版本是 1.2.2、1.2.10、1.4.0、1.5.1、1.5.2、1.5.3、1.5.4 和 1.6.0。

解决方案

首先,让我们来了解一下 Istio 中的 corsPolicyallowOrigins 的设置。corsPolicy 是用于配置跨域资源共享策略的选项,其中 allowOrigins 用于指定允许的请求来源。然而,在用户的情况下,设置 allowOrigins 并未按预期限制请求的来源。以下是解决这个问题的方法:

使用 match.uri.prefix 替代 match.uri.regex

在用户提供的配置中,我们可以看到 Istio 的 VirtualService 中的 http 部分配置了 match 条件,包括 uri 的正则匹配。由于正则匹配可能导致一些意外的行为,尝试将 match.uri.prefix 替代为 match.uri.regex 来改进匹配的精确度。

方案

  • match.uri.regex: /v1/test/.* 替换为 match.uri.prefix: /v1/test/
  • 这将确保只有以 /v1/test/ 开头的 URI 才会匹配这个条件

示例修改后的配置

http:
  - corsPolicy:
      allowHeaders:
      - Authorization
      - Content-Type
      allowMethods:
      - POST
      - GET
      - PUT
      - PATCH
      - DELETE
      allowOrigins:
      - exact: https://testthat.com
    match:
    - gateways:
      - api-gateway
      method:
        regex: GET|OPTIONS
      uri:
        prefix: /v1/test/
    route:
    - destination:
        host: service-test
        port:
          number: 8080
        subset: active
      weight: 100

Envoy 文档的参考

Question comment 中提到了 Envoy 的文档,这些文档可能对你理解和解决问题有所帮助。你可以在 Envoy 的官方文档中查找更多关于字符串匹配的内容:Envoy StringMatcher

版本信息

请确保你所使用的 Istio 版本是与你在提问中提到的版本一致。你可以使用以下命令获取版本信息:

  • istioctl version --remote
  • kubectl version
  • helm version

环境信息

确保你在一个稳定的、受支持的环境中使用 Istio。你提到使用的操作系统是 Ubuntu 18.04,这是一个常见的环境。你可以在 Istio 的官方文档中查找更多有关支持的环境信息。

总结

在 Istio 中配置跨域资源共享(CORS)策略需要注意匹配条件的设置,特别是在 URI 匹配方面。通过替代 match.uri.prefix 来替换复杂的正则表达式匹配,你可以更精确地控制请求来源。同时,你可以参考 Envoy 的文档以获得更深入的理解和解决方案。最后,请确保使用的 Istio 版本和环境是稳定且受支持的。

正文完