Istio JWT 身份验证在没有令牌的情况下传递流量
Istio JWT authentication passes traffic without token
背景:
有一个类似的问题:Here 但它没有为我的问题提供解决方案。
我已经部署了一个按预期工作的应用程序到我的 Istio 集群。我想启用 JWT 身份验证,因此根据我的用例调整说明 Here。
入口网关:
我首先将以下策略应用于 istio-ingressgateway。这行得通,没有 JWT 令牌发送的任何流量都被阻止了。
kubectl apply -n istio-system -f mypolicy.yaml
apiVersion: authentication.istio.io/v1alpha1
kind: Policy
metadata:
name: core-api-policy
namespace: istio-system
spec:
targets:
- name: istio-ingressgateway
ports:
- number: 80
origins:
- jwt:
issuer: "https://cognito-idp.ap-northeast-1.amazonaws.com/ap-northeast-1_pa9vj7sbL"
jwksUri: "https://cognito-idp.ap-northeast-1.amazonaws.com/ap-northeast-1_pa9vj7sbL/.well-known/jwks.json"
principalBinding: USE_ORIGIN
一旦成功,我就删除了这个策略并为我的服务安装了一个新策略。
kubectl delete -n istio-system -f mypolicy.yaml
service/core-api-service:
编辑上述策略后,如下更改命名空间和目标,我将策略重新应用到正确的命名空间。
政策:
kubectl apply -n solarmori -f mypolicy.yaml
apiVersion: authentication.istio.io/v1alpha1
kind: Policy
metadata:
name: core-api-policy
namespace: solarmori
spec:
targets:
- name: core-api-service
ports:
- number: 80
origins:
- jwt:
issuer: "https://cognito-idp.ap-northeast-1.amazonaws.com/ap-northeast-1_pa9vj7sbL"
jwksUri: "https://cognito-idp.ap-northeast-1.amazonaws.com/ap-northeast-1_pa9vj7sbL/.well-known/jwks.json"
principalBinding: USE_ORIGIN
服务:
apiVersion: v1
kind: Service
metadata:
name: core-api-service
spec:
type: LoadBalancer
ports:
- port: 80
name: api-svc-port
targetPort: api-app-port
selector:
app: core-api-app
此操作的结果似乎并未改变流量处理过程中的任何内容。即使我没有提供 JWT,我仍然能够获得我的服务。
我检查了我的服务部署的 istio-proxy,并没有在日志中创建 local_jwks
,如 Here 所述。
[procyclinsur@P-428 istio]$ kubectl logs -n solarmori core-api-app-5dd9666777-qhf5v -c istio-proxy | grep local_jwks
[procyclinsur@P-428 istio]$
如果有人知道我哪里出错了,我将不胜感激任何帮助。
要使服务成为 Istio 服务网格的一部分,您需要满足官方 docs 中显示的一些要求。
在您的情况下,服务端口名称需要更新为:
<protocol>[-<suffix>]
与 <protocol>
为:
- grpc
- http
- http2
- https
- mongo
- mysql
- redis
- TCP
- tls
- udp
此时转发到服务的请求将通过服务网格;目前,请求由 Kubernetes 网络解决。
背景:
有一个类似的问题:Here 但它没有为我的问题提供解决方案。
我已经部署了一个按预期工作的应用程序到我的 Istio 集群。我想启用 JWT 身份验证,因此根据我的用例调整说明 Here。
入口网关:
我首先将以下策略应用于 istio-ingressgateway。这行得通,没有 JWT 令牌发送的任何流量都被阻止了。
kubectl apply -n istio-system -f mypolicy.yaml
apiVersion: authentication.istio.io/v1alpha1
kind: Policy
metadata:
name: core-api-policy
namespace: istio-system
spec:
targets:
- name: istio-ingressgateway
ports:
- number: 80
origins:
- jwt:
issuer: "https://cognito-idp.ap-northeast-1.amazonaws.com/ap-northeast-1_pa9vj7sbL"
jwksUri: "https://cognito-idp.ap-northeast-1.amazonaws.com/ap-northeast-1_pa9vj7sbL/.well-known/jwks.json"
principalBinding: USE_ORIGIN
一旦成功,我就删除了这个策略并为我的服务安装了一个新策略。
kubectl delete -n istio-system -f mypolicy.yaml
service/core-api-service:
编辑上述策略后,如下更改命名空间和目标,我将策略重新应用到正确的命名空间。
政策:
kubectl apply -n solarmori -f mypolicy.yaml
apiVersion: authentication.istio.io/v1alpha1
kind: Policy
metadata:
name: core-api-policy
namespace: solarmori
spec:
targets:
- name: core-api-service
ports:
- number: 80
origins:
- jwt:
issuer: "https://cognito-idp.ap-northeast-1.amazonaws.com/ap-northeast-1_pa9vj7sbL"
jwksUri: "https://cognito-idp.ap-northeast-1.amazonaws.com/ap-northeast-1_pa9vj7sbL/.well-known/jwks.json"
principalBinding: USE_ORIGIN
服务:
apiVersion: v1
kind: Service
metadata:
name: core-api-service
spec:
type: LoadBalancer
ports:
- port: 80
name: api-svc-port
targetPort: api-app-port
selector:
app: core-api-app
此操作的结果似乎并未改变流量处理过程中的任何内容。即使我没有提供 JWT,我仍然能够获得我的服务。
我检查了我的服务部署的 istio-proxy,并没有在日志中创建 local_jwks
,如 Here 所述。
[procyclinsur@P-428 istio]$ kubectl logs -n solarmori core-api-app-5dd9666777-qhf5v -c istio-proxy | grep local_jwks
[procyclinsur@P-428 istio]$
如果有人知道我哪里出错了,我将不胜感激任何帮助。
要使服务成为 Istio 服务网格的一部分,您需要满足官方 docs 中显示的一些要求。
在您的情况下,服务端口名称需要更新为:
<protocol>[-<suffix>]
与 <protocol>
为:
- grpc
- http
- http2
- https
- mongo
- mysql
- redis
- TCP
- tls
- udp
此时转发到服务的请求将通过服务网格;目前,请求由 Kubernetes 网络解决。