当前位置:   article > 正文

Kubernetes使用流量管理平台Istio(四)_两个envoy互信实现tls通信

两个envoy互信实现tls通信

基于Istio的认证

Istio通过客户端和服务器端Policy Enforcement Points(PEPS)建立服务到服务的通信通道,PEPS在istio架构中的实现是envoy。

Peer authentication:

  • 用于服务到服务的认证,一验证进行连接的客户端。

istio提供双向TLS作为传输认证的全栈解决方案,无需更改服务代码就可以启用它。这个解决方案为:

  • 为每个服务提供强大的身份,表示其角色,以实现跨集群和云的互操作性。
  • 保护服务到服务的通信
  • 提供密钥管理系统,以自动进行密钥和证书的生成,分发和轮换

Request authentication

  • 用于最终用户认证,以验证附加到请求的凭据
  • istio使用JSON Web Token(JWT)验证启用请求级认证,并使用自定义认证实现或任务OpenID Connect的认证实现来简化开发人员体验。

Istio认证架构

  • 未设置模式的网格范围的peer认证策略默认使用PERMISSIVE模式。
  • 发送请求的客户端服务负责遵循必要的认证机制
  • RequestAuthentication: 应用程序负责获取jwt凭证并将其附加到请求
  • PeerAuthentication:
    • istio会自动将两个PEPS之间的所有流量升级为双向TLS
    • 如果认证策略禁用了双向TLS模式,则istio将继续在PEPS之间使用纯文本
    • 要覆盖此行为,destination rules显示禁用双向TLS模式
      在这里插入图片描述

双向TLS认证

当一个工作负载使用双向TLS认证向另一个工作负载发送请求时,该请求的处理方式如下:

  • istio将出站流量从客户端重新路由到客户端的本地sidecar envoy
  • 客户端envoy与服务器端envoy开始双向TLS握手。在握手期间,客户端envoy还做了安全命名检查,以验证服务器证书中显示的服务账户是否被授权运行目标服务
  • 客户端envoy和服务器端envoy建立了一个双向的TLS连接,istio将流量从客户端envoy转发到服务器端envoy
  • 授权后,服务器端envoy通过本地TCP连接将流量转发到服务器服务

宽容模式

允许服务同时接受纯文本流量和双向TLS流量,这个功能极大地提升了双向TLS的入门体验。

安全命名

服务器身份被编码在证书里,但服务名称通过服务发现或DNS被检索,安全命名信息将服务器身份映射到服务名称,身份a到服务名称b的映射表示“授权a运行服务b”。

认证策略

认证策略是对服务收到的请求生效的;
要在双向TLS中指定客户端认证策略,需要在DetinationRule中设置TLSSetting.

自定义双向认证

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: db-mtls
spec:
  host: mydbserver.prod.svc.cluster.local
  trafficPolicy:
    tls:
      mode: MUTUAL
      clientCertificate: /etc/certs/clientcert.pem
      privateKey: /etc/certs/private.pem
      caCertificates: /etc/certs/cacerts.pem
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

单向认证,不去校验客户端

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: tls-foo
spec:
  host: "*.foo.com"
  trafficPolicy:
    tls:
      mode: SIMPLE
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

使用默认istio双向认证

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: ratings-istio-mtls
spec:
  host: ratings.prod.svc.cluster.local
  trafficPolicy:
    tls:
      mode: ISTIO_MUTUAL
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

PeerAuthentication

严格tls认证,不支持明文

apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: "default"
  namespace: "istio-system"
spec:
  mtls:
    mode: STRICT
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

标签app=httpbin不开启认证

apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: "overwrite-example"
  namespace: "foo"
spec:
  selector:
    matchLabels:
      app: httpbin
  mtls:
    mode: DISABLE
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

RequestAuthentication

RequestAuthentication认证策略指定验证JSON Web Token(JWT)所需的值。这些值包括:

  • token在请求中的位置
  • 请求的issuer
  • 公共JSON Web Key Set(JWKS)
    istio会根据request认证策略中的规则检查提供的令牌(如果已提供),并拒绝令牌无效的请求。当请求不带有令牌时,默认情况下将接受它们。
apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
  name: "jwt-example"
  namespace: istio-system
spec:
  selector:
    matchLabels:
      istio: ingressgateway
  jwtRules:
  - issuer: "testing@secure.istio.io"
    jwksUri: "https://raw.githubusercontent.com/istio/istio/release-1.12/security/tools/jwt/samples/jwks.json"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

拒绝没有token的请求

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: "frontend-ingress"
  namespace: istio-system
spec:
  selector:
    matchLabels:
      istio: ingressgateway
  action: DENY
  rules:
  - from:
    - source:
        notRequestPrincipals: ["*"]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/915739
推荐阅读
相关标签
  

闽ICP备14008679号