Apache Pulsar 安全指南:基于JWT的客户端认证机制
什么是JWT认证
JSON Web Token (JWT) 是一种开放标准(RFC 7519),用于在各方之间安全地传输信息。在Apache Pulsar中,JWT被用作客户端认证的安全令牌机制,允许系统验证客户端身份并授予相应的操作权限。
JWT认证的核心优势
- 无状态性:服务端不需要存储会话信息,所有必要信息都包含在令牌中
- 安全性:基于数字签名,防止篡改
- 灵活性:支持设置过期时间等自定义声明
- 跨语言支持:标准化的实现使得各种编程语言都能支持
JWT令牌结构解析
一个典型的JWT令牌由三部分组成,以点号分隔:
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJKb2UifQ.ipevRNuRP6HflG8cFKnmUPtypruRC4fb1DWtoLL62SY
- 头部(Header):包含令牌类型和签名算法
- 载荷(Payload):包含声明(claims),如主题(subject)、过期时间(exp)等
- 签名(Signature):用于验证消息在传递过程中未被篡改
安全最佳实践
必须使用TLS加密传输:JWT令牌相当于密码凭证,在传输过程中必须使用TLS加密,防止中间人攻击。
客户端配置指南
命令行工具配置
在conf/client.conf
文件中添加以下配置:
webServiceUrl=http://broker.example.com:8080/
brokerServiceUrl=pulsar://broker.example.com:6650/
authPlugin=org.apache.pulsar.client.impl.auth.AuthenticationToken
authParams=token:eyJhbGci...62SY
或从文件读取令牌:
authParams=file:///path/to/token/file
编程语言客户端实现
Java客户端
PulsarClient client = PulsarClient.builder()
.serviceUrl("pulsar://broker.example.com:6650/")
.authentication(
AuthenticationFactory.token("eyJhbGci...62SY"))
.build();
使用Supplier动态获取令牌:
PulsarClient client = PulsarClient.builder()
.serviceUrl("pulsar://broker.example.com:6650/")
.authentication(
AuthenticationFactory.token(() -> readToken()))
.build();
Python客户端
from pulsar import Client, AuthenticationToken
client = Client('pulsar://broker.example.com:6650/',
authentication=AuthenticationToken('eyJhbGci...62SY'))
服务端JWT认证配置
密钥类型选择
Pulsar支持两种密钥机制:
- 对称密钥:使用单一密钥生成和验证令牌
- 非对称密钥:使用私钥生成令牌,公钥验证令牌
密钥生成与管理
生成对称密钥
$ bin/pulsar tokens create-secret-key --output my-secret.key
生成Base64编码版本:
$ bin/pulsar tokens create-secret-key --output my-secret.key --base64
生成非对称密钥对
$ bin/pulsar tokens create-key-pair \
--output-private-key my-private.key \
--output-public-key my-public.key
my-private.key
:由管理员安全保管,用于生成令牌my-public.key
:分发给所有Broker,用于验证令牌
令牌生成命令
生成基础令牌:
$ bin/pulsar tokens create --secret-key file:///path/to/my-secret.key --subject test-user
设置过期时间:
$ bin/pulsar tokens create --secret-key file:///path/to/my-secret.key \
--subject test-user \
--expiry-time 1y
Broker端配置
在broker.conf
中启用JWT认证:
authenticationEnabled=true
authorizationEnabled=true
authenticationProviders=org.apache.pulsar.broker.authentication.AuthenticationProviderToken
# 对称密钥配置
tokenSecretKey=file:///path/to/secret.key
# 或非对称公钥配置
# tokenPublicKey=file:///path/to/public.key
# Broker间通信认证
brokerClientTlsEnabled=true
brokerClientAuthenticationPlugin=org.apache.pulsar.client.impl.auth.AuthenticationToken
brokerClientAuthenticationParameters={"token":"eyJhbGci...Xw"}
Proxy端配置
在proxy.conf
中配置:
authenticationEnabled=true
authorizationEnabled=true
authenticationProviders=org.apache.pulsar.broker.authentication.AuthenticationProviderToken
tokenSecretKey=file:///path/to/secret.key
# 代理到Broker的认证
brokerClientAuthenticationPlugin=org.apache.pulsar.client.impl.auth.AuthenticationToken
brokerClientAuthenticationParameters={"token":"eyJhbGci...Xw"}
# 转发授权凭证
forwardAuthorizationCredentials=true
授权配置示例
为特定角色授予权限:
$ bin/pulsar-admin namespaces grant-permission my-tenant/my-namespace \
--role test-user \
--actions produce,consume
常见问题解决
- 令牌过期问题:确保生成令牌时设置了合理的过期时间
- 密钥不匹配:验证服务端和客户端使用的密钥是否一致
- 权限不足:检查是否为对应角色配置了正确的权限
通过以上配置,您可以在Apache Pulsar中建立完整的JWT认证体系,为分布式消息系统提供可靠的安全保障。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考