【问题标题】:How do you do GRPC authentication in an istio mTLS setup?你如何在 istio mTLS 设置中进行 GRPC 身份验证?
【发布时间】:2021-08-27 23:13:15
【问题描述】:

我有一堆 GRPC 微服务,它们使用自签名证书。我将身份验证信息添加到 GRPC 通道,然后用于识别端点并提供正确的服务。

现在我想迁移到 Istio mTLS。

在第一阶段,我让 Istio 绕过所有 GRPC 连接,并且我的服务现在可以正常工作。

在第二阶段,我想将 TLS 移交给 Istio,但我不知道如何将身份验证信息传递给 GRPC?

如何在 Istio mTLS 设置中处理身份验证?

GRPC 可以支持other authentication mechanisms 有没有人用它来将 Istio 身份验证信息注入 GRPC?关于您如何在设置中实现此功能的任何其他建议

我使用 go-lang 以防万一这对提供任何其他信息有用。

谢谢

【问题讨论】:

    标签: go grpc istio mtls


    【解决方案1】:

    我通过为我的请求生成 JWT 令牌解决了这个问题,并使用拦截器注入了令牌。灵感来自GRPC interceptor for authorization with jwt

    【讨论】:

      【解决方案2】:

      其中一种方法是使用grpc.WithInsecure(),这样您就不必向您的服务添加证书,因为您的 pod 中的istio-proxy 容器将通过 TLS 终止任何传入连接。

      客户端:

      conn, _ := grpc.Dial("localhost:50051", grpc.WithInsecure())
      

      服务器端:

      s := grpc.NewServer()
      lis, _ := net.Listen("tcp", "localhost:50051")
      
      // error handling omitted
      s.Serve(lis)
      

      如果您仍需要使用 TLS 进行本地部署等,您可以简单地使用配置选项来指定,例如:

      var conn *grpc.ClientConn
      var err error
      // error handling omitted do not copy paste
      
      if ( config.IstioEnabled ) {
          conn, err = grpc.Dial("localhost:50051", grpc.WithInsecure())
      
      } else {
          creds, _ := credentials.NewClientTLSFromFile(certFile, "")
          conn, err = grpc.Dial("localhost:50051", grpc.WithTransportCredentials(creds))
      
      }
      

      Reference.

      【讨论】:

      • 感谢您的快速回复。当我执行WithInsecure() 时,我失去了添加凭据的能力,我用它来识别端点(我使用WithPerRPCCredentials(),它将身份验证标头添加到请求中)。
      • 啊我明白了,这里有一篇文章可能有用:medium.com/utility-warehouse-technology/…
      • 链接撞到了付费墙
      猜你喜欢
      • 1970-01-01
      • 2019-02-01
      • 2018-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-09
      • 1970-01-01
      • 2015-07-20
      相关资源
      最近更新 更多