Istio 1.0 # 基础认证策略 # 设置终端用户认证

Istio 0.8版本增强了服务间双向认证,1.0版本增加了终端用户认证的功能,这样整个服务网格的认证策略就齐全了;目前只支持JWT Authentication,可以使用authentication policy进行配置;

公司的OAuth2 Server使用的是Cloudary Foundary的UAA,Cloudary Foundary的UAA Server完全按照规范来设计的,所以跟Istio的 JWT Authentication模块整合的时候,异常顺利;

部署httpbin

https://istio.io/zh/docs/tasks/traffic-management/ingress/

Issuer

http://uaa-server/uaa/.well-known/openid-configuration
查看jwksUri和issuer配置;

Authentication Policy

istioctl create -f jwt-example -n foo
apiVersion: "authentication.istio.io/v1alpha1"
kind: "Policy"
metadata:
  name: "jwt-example"
spec:
  targets:
  - name: httpbin
  origins:
  - jwt:
      issuer: "http://uaa-server/uaa/oauth/token"
      jwksUri: "http://uaa-server/uaa/token_keys"
  principalBinding: USE_ORIGIN

获取access_token

curl 'http://stage-uaa.suerlink.com/uaa/oauth/token' -i -X POST \
    -H 'Content-Type: application/x-www-form-urlencoded' \
    -H 'Accept: application/json' \
    -d 'client_id=admin&client_secret=adminsecret&grant_type=client_credentials&response_type=token'

测试

http://39.104.2.230/headers?access_token=xxxx

注意

Kubernetes Service端口命名的问题

Istio官方文档#安装#Istio 对 Pod 和服务的要求一节中,第一个要求是需要给端口正确命名,这个要求是流量管理和安全认证模块的功能的基础,协议部分应该是什么就是什么,如果不能正确命名,会导致各种各样的问题,而且目前Istio的日志输出信息相对不充足,导致问题难以排查。我遇到的问题如下:

apiVersion: v1
kind: Service
metadata:
  name: sms-micro
  namespace: fengxin58-common-stage
  labels:
    app: sms-micro
spec:
  ports:
  - name: http-sms-micro
    port: 30006
    targetPort: 30006
  selector:
    app: sms-micro

创建Service时,刚开始将上面port的名字命名的是https-sms-micro,导致jwt拦截不生效,服务上的接口直接可以不带着access_token访问;根据官方文档中Debugging Authorization的思路排查,当使用如下命令查看istio-proxy的listeners的时候,

istioctl proxy-config listeners  sms-micro-f455f64c4-dzqnk -n fengxin58-common-stage --port 30006 -o json

发现AuthenticationPolicy没有生效,查看Pilot的日志,发现这块相关的日志很不全,一个周末也没找出原因;
周一一上班,重新整理配置文件,发现了service端口命名的不规范,改了之后,发现奇迹般的生效了;
[查看源码,找到实际原因之后再次补充]

Istio Authentication Policy Jwt配置问题

OAuth2 Server是自己部署的,有些配置没有配置全,典型的遇到的问题是,虽然将uaa部署到了公网上,但是uaa server的issuer显示的是https://localhost:8080/uaa/oauth/token,配置authentication policy的时候,填写的jwt.issuer填写的是公网的地址,访问服务的接口的时候,一直Origin authentication failed.,查看Istio的日志和文档没有查出原因,最后无奈去找envoy的文档,JWT Authentication,第一段如下,

This HTTP filter can be used to verify JSON Web Token (JWT). It will verify its signature, audiences and issuer. It will also check its time restrictions, such as expiration and nbf (not before) time. If the JWT verification fails, its request will be rejected. If the JWT verification succeeds, its payload can be forwarded to the upstream for further authorization if desired.

这个filter会检查signature和audiences和issuer,于是修改了authentication policy的配置,将jwt.issuer的值改为http://uaa-server/uaa/.well-known/openid-configuration链接中显示的值,就好使了。

你可能感兴趣的:(Istio)