问题描述
在 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 中的 corsPolicy
和 allowOrigins
的设置。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 版本和环境是稳定且受支持的。