客户端可以使用开源 Apache Kafka API 连接到 Managed Service for Apache Kafka 集群。所有连接都必须使用 TLS 加密;不支持明文通信。身份验证通过两种受支持的机制之一进行处理,每种机制具有不同的凭据类型:SASL 或 mTLS。
本文档介绍了如何使用 SASL 方法进行身份验证。客户端使用经过授权的 Identity and Access Management 主账号(例如服务账号)的凭据进行身份验证。Managed Service for Apache Kafka 会管理所有连接的服务器端代理证书。
准备工作
详细了解以下内容:
向服务账号授予 Managed Kafka 客户端角色
您必须向将用于连接到集群的服务账号授予包含集群的项目中的 roles/managedkafka.client IAM 角色。
受管 Kafka 客户端角色包含所有连接所需的 managedkafka.clusters.connect 权限。如需向服务账号授予 Managed Kafka Client 角色,请按以下步骤操作:
控制台
- 在 Google Cloud 控制台中,前往 IAM 页面。
前往 IAM - 检查项目是否设置为 Managed Service for Apache Kafka 客户端将要访问的使用方项目。
- 点击授予访问权限。
- 在新页面中,在添加主账号部分,输入您使用的服务账号的电子邮件地址。
- 对于分配角色,请选择 Managed Kafka client 角色。
- 点击保存。
gcloud CLI
-
在 Google Cloud 控制台中,激活 Cloud Shell。
Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。
-
运行
gcloud projects add-iam-policy-binding命令:gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:SERVICE_ACCOUNT_EMAIL \ --role roles/managedkafka.client
替换以下内容:
-
PROJECT_ID 是项目 ID。
-
SERVICE_ACCOUNT_EMAIL 是服务账号的电子邮件地址。
-
配置 Kafka 客户端以向 Google Cloud进行身份验证
您可以使用以下机制之一对 Kafka 客户端进行身份验证,以访问 Google Cloud :
OAUTHBEARER(推荐):此机制需要使用应用默认凭据 (ADC)。ADC 是身份验证库使用的一种策略,可根据应用环境自动查找凭据。如需详细了解 ADC 查找凭证的位置和顺序,请参阅应用默认凭证的工作原理。
SASL/PLAIN:此机制需要使用可从服务账号密钥 JSON 文件或访问令牌派生的用户名和密码。
一般来说,建议选择 OAUTHBEARER。不过,SASL/PLAIN 可能是更方便的测试机制。
OAuthBearer 身份验证
如需了解如何向开源 Kafka API 进行身份验证,请参阅 GitHub 上的文档。
SASL/PLAIN 身份验证
Managed Service for Apache Kafka 支持使用服务账号密钥 JSON 文件或访问令牌进行 SASL/PLAIN 身份验证。
服务账号密钥 JSON 文件
此方法适用于所有 Kafka 客户端。
下载您打算用于客户端的服务账号的服务账号密钥 JSON 文件。
使用 base64-encode 对服务账号文件进行编码,以用作身份验证字符串。假设文件名为
my_service_account_key.json。在 Linux 或 macOS 系统上,请使用
base64命令(通常默认安装),如下所示:base64 -w 0 < my_service_account_key.json > password.txt此命令将执行以下操作:
base64 < my_service_account_key.json:读取名为my_service_account_key.json的文件的内容。使用 base64 编码对文件内容进行编码。Base64 编码是一种将二进制数据(例如服务账号文件中的 JSON 数据)表示为 ASCII 文本的方式。这通常用于通过专为文本设计的渠道传输数据。
> password.txt:将base64命令的输出(服务账号文件的 base64 编码版本)重定向到名为password.txt的新文件中。
您可以使用密码文件的内容通过以下参数进行身份验证。
security.protocol=SASL_SSL sasl.mechanism=PLAIN sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \ username="SERVICE_ACCOUNT_EMAIL_ADDRESS" \ password="CONTENTS_OF_BASE64_ENCODED_PASSWORD_FILE";替换以下内容:
SERVICE_ACCOUNT_EMAIL_ADDRESS:您要用于身份验证的服务账号的电子邮件地址。CONTENTS_OF_BASE64_ENCODED_PASSWORD_FILE:您在上一步中获得的 base64 编码密码文件的内容。这必须是单行。
在对集群的入站连接进行身份验证时,Managed Service for Apache Kafka 会检查以下内容:
所提供的用户名与密码中使用的密钥所属的服务账号相符。
所提供的服务账号正文在集群上拥有
managedkafka.clusters.connect权限(包含在roles/managedkafka.clientIAM 角色中)。
访问令牌
获取您要用于身份验证的主账号的访问令牌。 例如,获取当前 gcloud CLI 主账号的访问令牌:
gcloud auth print-access-token您可以使用访问令牌通过以下参数进行身份验证。
security.protocol=SASL_SSL sasl.mechanism=PLAIN sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \ username="PRINCIPAL_EMAIL_ADDRESS" \ password="ACCESS_TOKEN_VALUE";替换以下内容:
PRINCIPAL_EMAIL_ADDRESS:您用于获取访问令牌的主账号的电子邮件地址。ACCESS_TOKEN_VALUE:您在上一步中获得的访问令牌值。
在对集群的入站连接进行身份验证时,Managed Service for Apache Kafka 会检查以下内容:
访问令牌有效且未过期。
所提供的用户名与访问令牌关联的主账号电子邮件地址一致。
访问令牌的主账号对集群具有
managedkafka.clusters.connect权限(包含在roles/managedkafka.clientIAM 角色中)。
Workload Identity Federation for GKE
Managed Service for Apache Kafka 支持使用 Workload Identity Federation for GKE 对开源 Apache Kafka API 进行身份验证。支持 SASL/PLAIN 和 SASL/OAUTHBEARER 身份验证。
如需将 Workload Identity Federation for GKE 与 Managed Service for Apache Kafka 搭配使用,您必须满足以下要求:
- 使用 GKE 版本
1.31.1-gke.1241000或更高版本。 使用
iam.gke.io/return-principal-id-as-email: "true"为 Kubernetes 服务账号添加注释。 例如:apiVersion: v1 kind: ServiceAccount metadata: name: kafka-service-account annotations: iam.gke.io/return-principal-id-as-email: "true"如果您使用本地身份验证服务器,请检查您是否还使用了 google-auth 软件包的
2.40.3或更高版本。
验证 GKE 主账号是否具有 managedkafka.clusters.connect 权限(包含在 roles/managedkafka.client IAM 角色中)。
Managed Service for Apache Kafka 不支持使用 Fleet 工作负载身份对开源 Apache Kafka API 进行身份验证。或者,您也可以将 Kubernetes 服务账号关联到 IAM 服务账号。
问题排查
如需了解如何排查 SASL 身份验证问题,请参阅身份验证错误。