Apache Pulsar 安全指南:基于JWT的客户端认证机制

Apache Pulsar 安全指南:基于JWT的客户端认证机制

pulsar Apache Pulsar - distributed pub-sub messaging system pulsar 项目地址: https://gitcode.com/gh_mirrors/pulsar28/pulsar

什么是JWT认证

JSON Web Token (JWT) 是一种开放标准(RFC 7519),用于在各方之间安全地传输信息。在Apache Pulsar中,JWT被用作客户端认证的安全令牌机制,允许系统验证客户端身份并授予相应的操作权限。

JWT认证的核心优势

  1. 无状态性:服务端不需要存储会话信息,所有必要信息都包含在令牌中
  2. 安全性:基于数字签名,防止篡改
  3. 灵活性:支持设置过期时间等自定义声明
  4. 跨语言支持:标准化的实现使得各种编程语言都能支持

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支持两种密钥机制:

  1. 对称密钥:使用单一密钥生成和验证令牌
  2. 非对称密钥:使用私钥生成令牌,公钥验证令牌

密钥生成与管理

生成对称密钥
$ 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

常见问题解决

  1. 令牌过期问题:确保生成令牌时设置了合理的过期时间
  2. 密钥不匹配:验证服务端和客户端使用的密钥是否一致
  3. 权限不足:检查是否为对应角色配置了正确的权限

通过以上配置,您可以在Apache Pulsar中建立完整的JWT认证体系,为分布式消息系统提供可靠的安全保障。

pulsar Apache Pulsar - distributed pub-sub messaging system pulsar 项目地址: https://gitcode.com/gh_mirrors/pulsar28/pulsar

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

解卿靓Fletcher

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

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

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

打赏作者

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

抵扣说明:

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

余额充值