我有一个示例应用程序(web-app、后端-1、后端-2)部署在minikube上,所有这些应用程序都是在JWT策略下部署的,它们都有正确的目的地规则、Istio sidecar和MTLS,以确保东西通信的安全。
apiVersion: authentication.istio.io/v1alpha1
kind: Policy
metadata:
name: oidc
spec:
targets:
- name: web-app
- name: backend-1
- name: backend-2
peers:
- mtls: {}
origins:
- jwt:
issuer: "http://myurl/auth/realms/test"
jwksUri: "http://myurl/auth/realms/test/protocol/openid-connect/certs"
principalBinding: USE_ORIGIN当我运行以下命令时,当从后端请求数据时,我会收到401个未经授权的响应,这是因为$TOKEN在http请求期间没有被转发到后端-1和后端-2报头。
$> curl http://minikubeip/api "Authorization: Bearer $TOKEN"有没有一种方法可以使用本地kubernetes/istio将http头转发到后端-1和后端-2?我是否被迫对应用程序代码进行更改以完成这一任务?
编辑:,这是我应用oidc策略后遇到的错误。当我卷曲web应用程序时,我得到了
{“错误”:[{“代码”:“APP_ERROR_CODE”,“消息”:“401未经授权”}
请注意,当我使用相同的auth令牌卷曲后端-1或后端-2时,我会得到适当的数据。此外,目前没有其他目的地规则/策略应用于这些服务,策略强制执行正在进行,我的istio版本为1.1.15。这是我所适用的政策:
apiVersion: authentication.istio.io/v1alpha1
kind: Policy
metadata:
name: default
namespace: default
spec:
# peers:
# - mtls: {}
origins:
- jwt:
issuer: "http://10.148.199.140:8080/auth/realms/test"
jwksUri: "http://10.148.199.140:8080/auth/realms/test/protocol/openid-connect/certs"
principalBinding: USE_ORIGIN发布于 2019-11-30 18:08:07
令牌是否应该在没有任何其他更改的情况下传播到后端-1和后端-2?
是的,策略应该同时将令牌转移到后端-1和后端-2。
有一个github问题,用户和您一样有相同的问题。
以下是一些信息:
JWT由特使过滤器进行验证,因此您必须检查特使日志。有关代码,请参见身份验证 filter检索过滤器要使用的JWKS (它被内联到特使配置中),您可以在pilot/pkg/security中找到它的代码
这也是堆栈过流的另一个问题
如获接纳的答案是:
该问题通过两个选项得到解决: 1.将服务名称和端口替换为外部服务器ip和外部端口(用于发行者和jwksUri) 2.禁用mTLS及其策略的使用(已知问题:https://github.com/istio/istio/issues/10062)。
从istio文档
对于每个服务,Istio应用最窄的匹配策略。顺序是:服务特定的>命名空间范围的>网格范围的。如果多个特定于服务的策略匹配一个服务,Istio将随机选择其中的一个。运算符在配置策略时必须避免此类冲突。 为了对网格范围和命名空间范围的策略执行唯一性,Istio每个网格只接受一个身份验证策略,每个命名空间只接受一个身份验证策略。Istio还要求具有特定名称默认值的网格范围和命名空间范围的策略。 如果服务没有匹配策略,则将禁用传输身份验证和源身份验证。
发布于 2020-11-26 10:37:58
Istio支持头传播。可能在创建这个线程时不支持。
您可以通过使用forwardOriginalToken:true在JWTRules或使用JWTRules中的outputPayloadToHeader转发有效的JWT有效负载来转发原始报头。
参考资料:ISTIO JWTRule文档
https://stackoverflow.com/questions/59057270
复制相似问题