ALTS 认证

Go 中使用应用层传输安全性(ALTS)进行 gRPC 认证概述。

概述

应用层传输安全性(ALTS)是 Google 开发的一个相互认证和传输加密系统,用于保护 Google 基础设施内的 RPC 通信。ALTS 类似于相互 TLS,但它已经过设计和优化,以满足 Google 生产环境的需求。有关更多信息,请查看 ALTS 白皮书。

gRPC 中的 ALTS 具有以下特点:

  • 使用 ALTS 作为传输安全协议创建 gRPC 服务器和客户端。

  • ALTS 连接提供端到端的隐私和完整性保护。

  • 应用程序可以访问对等方信息,例如对等方服务帐户。

  • 支持客户端授权和服务器授权。

  • 启用 ALTS 所需的代码修改最小。

gRPC 用户可以通过少量代码配置应用程序使用 ALTS 作为传输安全协议。

请注意,ALTS 在 Compute EngineGoogle Kubernetes Engine(GKE) 上运行时完全可用。

使用 ALTS 传输安全协议的 gRPC 客户端

gRPC 客户端可以使用 ALTS 凭证连接到服务器,如下所示:

import (
  "google.golang.org/grpc"
  "google.golang.org/grpc/credentials/alts"
)

altsTC := alts.NewClientCreds(alts.DefaultClientOptions())
conn, err := grpc.NewClient(serverAddr, grpc.WithTransportCredentials(altsTC))

使用 ALTS 传输安全协议的 gRPC 服务器

gRPC 服务器可以使用 ALTS 凭证允许客户端连接,如下所示:

import (
  "google.golang.org/grpc"
  "google.golang.org/grpc/credentials/alts"
)

altsTC := alts.NewServerCreds(alts.DefaultServerOptions())
server := grpc.NewServer(grpc.Creds(altsTC))

服务器授权

gRPC 具有内置的服务器授权支持,使用 ALTS 的 gRPC 客户端可以在建立连接之前设置期望的服务器服务帐户。然后,在握手结束时,服务器授权确保服务器身份与客户端指定的服务帐户之一匹配。如果不匹配,则连接失败。

import (
  "google.golang.org/grpc"
  "google.golang.org/grpc/credentials/alts"
)

clientOpts := alts.DefaultClientOptions()
clientOpts.TargetServiceAccounts = []string{expectedServerSA}
altsTC := alts.NewClientCreds(clientOpts)
conn, err := grpc.NewClient(serverAddr, grpc.WithTransportCredentials(altsTC))

客户端授权

成功连接后,对等方信息(例如客户端的服务帐户)将存储在 AltsContext 中。gRPC 提供了一个实用程序库,用于客户端授权检查。假设服务器知道期望的客户端身份(例如 foo@iam.gserviceaccount.com),它可以运行以下示例代码来授权传入的 RPC。

import (
  "google.golang.org/grpc"
  "google.golang.org/grpc/credentials/alts"
)

err := alts.ClientAuthorizationCheck(ctx, []string{"foo@iam.gserviceaccount.com"})