Kubernetes使用流量管理平台Istio(四)

基于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

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

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: tls-foo
spec:
  host: "*.foo.com"
  trafficPolicy:
    tls:
      mode: SIMPLE

使用默认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

PeerAuthentication

严格tls认证,不支持明文

apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: "default"
  namespace: "istio-system"
spec:
  mtls:
    mode: STRICT

标签app=httpbin不开启认证

apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: "overwrite-example"
  namespace: "foo"
spec:
  selector:
    matchLabels:
      app: httpbin
  mtls:
    mode: DISABLE

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"

拒绝没有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: ["*"]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

平凡似水的人生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值