ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Apache Pulsar Token 认证管理实战:基于 JWT 的密钥创建、Token 签发与 Broker/Proxy 配置

Apache Pulsar Token 认证管理实战:基于 JWT 的密钥创建、Token 签发与 Broker/Proxy 配置 消息队列后端流处理【免费下载链接】pulsarApache Pulsar - distributed pub-sub messaging system项目地址https://gitcode.com/gh_mirrors/pulsar28/pulsar点击查看免费下载导读本文是 Apache Pulsar 安全体系中Token 认证管理一端的完整技术指南与客户端使用手册security-token-client互为配套。你将掌握如何用bin/pulsar tokens命令创建对称/非对称密钥、签发带有效期TTL的 JWT Token、为 Token 对应的 role 授权以及如何分别在 Broker 与 Proxy 上开启AuthenticationProviderToken认证。文末的配置示例与命令均可直接复制到本地 Pulsar 环境运行。Token 认证概述Apache Pulsar 支持使用基于 JSON Web TokensRFC-7519的安全令牌对客户端进行认证。Token 用于标识一个 Pulsar 客户端并将其与某个principal主体或role角色关联随后该 role 会被授权执行某些操作例如向某个 topic 发布或订阅消费消息。在典型流程中管理员或某个自动化服务会向用户发放一段 token 字符串。一个已签名的 JWT 紧凑表示形式大致如下eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJKb2UifQ.ipevRNuRP6HflG8cFKnmUPtypruRC4fb1DWtoLL62SY应用在创建客户端实例时可以指定这个 token另一种做法是传入一个token supplier即一个在客户端库需要 token 时才返回 token 的函数便于从文件、密钥管理服务等自定义来源动态读取。务必使用 TLS 传输加密在网络上发送 token 等同于发送密码。强烈建议在与 Pulsar 服务通信时始终启用 TLS 加密参见 Transport Encryption using TLS。从源码结构看Token 认证在 Pulsar 中的实现分为三部分服务端验证由 AuthenticationProviderToken.java 承担客户端携带凭据由 AuthenticationToken.java 承担管理命令行由 TokensCliUtils.java 承担。Secret key 与 Public/Private keysJWT 支持两种不同类型的密钥来生成与校验 token对称密钥Symmetric只有一个Secret密钥既用于生成 token也用于校验 token。非对称密钥Asymmetric一对密钥。Private私钥用于生成 tokenPublic公钥用于校验 token。Secret key对称密钥使用对称密钥时管理员创建密钥用它来签发客户端 token同时把同一把密钥配置到 broker 上供 broker 校验客户端 token。创建 Secret key$ bin/pulsar tokens create-secret-key --output my-secret.key输出文件默认生成在 Pulsar 安装目录的根目录下也可以为输出文件指定绝对路径。生成 base64 编码的密钥$ bin/pulsar tokens create-secret-key --output /opt/my-secret.key --base64从实现看CommandCreateSecretKey 默认使用HS256签名算法可通过--signature-algorithm覆盖--base64通过 Encoders.BASE64 对密钥字节编码未指定--output时密钥会直接写到 stdout。密钥本身的生成最终落在 AuthTokenUtils.createSecretKeyKeys.secretKeyFor(signatureAlgorithm)。Public/Private keys非对称密钥使用非对称方式时需要创建一对密钥。创建密钥对$ bin/pulsar tokens create-key-pair --output-private-key my-private.key --output-public-key my-public.key输出文件默认生成在 Pulsar 安装目录的根目录下也可以为输出文件指定绝对路径。my-private.key必须存放在安全位置仅供管理员用来签发新 token。my-public.key需要分发给所有 Pulsar broker。该文件可以公开共享不存在安全风险。对应实现为 CommandCreateKeyPair默认签名算法为RS256私钥与公钥分别以 PKCS8 / X509 编码写入指定文件创建密钥对使用Keys.keyPairFor(algorithm)。AuthTokenUtils的decodePrivateKey/decodePublicKey分别用PKCS8EncodedKeySpec与X509EncodedKeySpec还原密钥见 AuthTokenUtils.java这也解释了为何文档在broker.conf中特别注明密钥文件必须是 DER 编码。生成 TokenToken 是与用户关联的凭据关联通过 principal 或 role 完成。对 JWT 而言该字段通常称为subject本质上是同一概念。生成的 token 必须带有subject字段。使用对称密钥签发$ bin/pulsar tokens create --secret-key file:///path/to/my-secret.key \ --subject test-user该命令会把 token 字符串打印到 stdout。同样也可以传入私钥签发$ bin/pulsar tokens create --private-key file:///path/to/my-private.key \ --subject test-user还可以为 token 指定预定义的 TTL有效期。到期后token 将自动失效$ bin/pulsar tokens create --secret-key file:///path/to/my-secret.key \ --subject test-user \ --expiry-time 1y关于命令行参数从 CommandCreateToken 可以确认以下细节--subject-s为必填项用于指定 token 关联的 subject/principal--expiry-time-e接受相对时间如1h、3d、10y分钟为m默认无过期时间底层通过RelativeTimeUtil.parseRelativeTimeInSeconds解析并换算成Date写入 JWT 的exp声明--secret-key-sk与--private-key-pk二者必须且只能提供其一两者都缺省或同时提供都会报错退出密钥参数既支持file://URL也支持data:内联形式读取逻辑见 AuthTokenUtils.readKeyFromUrl依次尝试data:/file:URL、本地文件路径、base64 字符串三种形式token 的最终生成由 AuthTokenUtils.createToken 完成Jwts.builder().setSubject(subject).signWith(signingKey)若设置了过期时间则追加setExpiration。pulsar tokens子命令还附带两个实用的运维命令show解码 token 的 header 与 payload支持参数传入、--stdin、--token-file或TOKEN环境变量四种方式validate用--secret-key或--public-key校验 token 并打印其 claims。授权token 本身不携带任何权限权限由授权引擎authorization engine决定。创建好 token 之后可以为该 token 的 role 授予执行某些操作的权限。例如$ bin/pulsar-admin namespaces grant-permission my-tenant/my-namespace \ --role test-user \ --actions produce,consume即允许test-user这个 role 在my-tenant/my-namespace命名空间下执行produce发布与consume消费操作。授权体系的详细说明可参考 security-authorization。开启 Token 认证Broker 配置要让 broker 认证客户端需要在broker.conf中做如下配置# 开启认证与授权 authenticationEnabledtrue authorizationEnabledtrue authenticationProvidersorg.apache.pulsar.broker.authentication.AuthenticationProviderToken # 使用对称密钥 tokenSecretKeyfile:///path/to/secret.key # 密钥也可以内联传入 # tokenSecretKeydata:base64,FLFyW0oLJ2Fi22KKCm21J18mbAdztfSHN/lAT5ucEKU # 使用非对称密钥与 tokenSecretKey 二选一 # tokenPublicKeyfile:///path/to/public.key # 可执行所有管理操作并可对任意 topic 发布/消费的角色 superUserRolesadmin # broker 自身的认证设置。用于 broker 连接其他 broker同集群或其他集群时 brokerClientAuthenticationPluginorg.apache.pulsar.client.impl.auth.AuthenticationToken brokerClientAuthenticationParameterstoken:eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0LXVzZXIifQ.9OHgE9ZUDeBTZs7nSMEFIuGNEX18FLR3qvy8mqxSxXw # 或者从文件读取 token # brokerClientAuthenticationParametersfile:///path/to/admin-token.txt对配置项逐一说明authenticationEnabled与authorizationEnabled开启认证与授权总开关conf/broker.conf中默认均为falseauthenticationProviders认证提供者类名列表逗号分隔。Token 认证使用org.apache.pulsar.broker.authentication.AuthenticationProviderTokentokenSecretKey/tokenPublicKey校验 token 用的密钥二者选其一。支持file:///...、data:;base64,...broker.conf 中的注释格式或data:base64,...等写法且密钥文件必须为 DER 编码见 conf/broker.confsuperUserRoles被当作超级用户处理的角色名可执行所有管理操作并发布/消费所有 topic见 conf/broker.confbrokerClientAuthenticationPlugin/brokerClientAuthenticationParametersbroker 作为客户端连接其他 broker 时使用的认证插件与参数见 conf/broker.conf。从源码看AuthenticationProviderToken.initialize 会按优先级读取tokenSecretKey或tokenPublicKey若同时配置了两个键则tokenSecretKey优先getValidationKey两者都没有配置时会抛出IOException: No secret key was provided for token authentication随后用该密钥构建Jwts.parserBuilder()供后续校验。此外还有几个进阶配置项值得了解参见 conf/broker.conftokenAuthClaimtoken 中用于解释为认证 role/principal 的 claim默认为sub对应源码 getTokenRoleClaimtokenAudienceClaim从 token 中取 audience 的 claim 名如aud不设置则不校验 audiencetokenAudience代表当前 broker 的 audience 值token 中tokenAudienceClaim对应字段需包含该值否则认证失败校验逻辑见 authenticateToken。服务端如何校验 token理解 broker 端的验证链路有助于排查认证问题。从源码结构看AuthenticationProviderToken.getToken 会根据连接类型提取 token二进制协议连接从authData.getCommandData()提取HTTP 请求按 RFC-6750 规范从Authorization头读取Bearer xxxxx前缀之后的部分常量定义见 AuthenticationProviderToken.java对于浏览器 JavaScript WebSocket 客户端还支持通过token查询参数透传见 HttpServletRequestWrapper。随后authenticateToken调用parser.parseClaimsJws(token)校验签名、过期时间与 audience并将 token 的subclaim或配置的tokenAuthClaim作为认证后的 role 返回若 token 过期会触发ExpiredJwtException并累加过期指标见 AuthenticationProviderToken.java。相关测试位于 AuthenticationProviderTokenTest.java其中testInvalidInitialize验证了未配置密钥时初始化会失败testSerializeSecretKey验证了用对称密钥签发并解析 JWT 的完整闭环。开启 Token 认证Proxy 配置要让 proxy 认证客户端需要在proxy.conf中做如下配置# 面向连接 proxy 的客户端 authenticationEnabledtrue authorizationEnabledtrue authenticationProvidersorg.apache.pulsar.broker.authentication.AuthenticationProviderToken tokenSecretKeyfile:///path/to/secret.key # proxy 连接 broker 时使用自己的 token brokerClientAuthenticationPluginorg.apache.pulsar.client.impl.auth.AuthenticationToken brokerClientAuthenticationParameterstoken:eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0LXVzZXIifQ.9OHgE9ZUDeBTZs7nSMEFIuGNEX18FLR3qvy8mqxSxXw # 或者从文件读取 token # brokerClientAuthenticationParametersfile:///path/to/proxy-token.txt其中前三项与 broker 端含义一致对应的 Token 认证配置段同样存在于 conf/proxy.conf 中包括tokenSecretKey、tokenPublicKey、tokenAuthClaim、tokenAudienceClaim、tokenAudience。需要特别注意的是proxy 在连接 broker 时会使用自己的 token这个密钥对对应的 role 必须配置到 broker 的proxyRoles中否则 proxy 会被 broker 拒绝。授权细节参见 security-authorization。proxy 与 broker 之间的认证相关配置brokerClientAuthenticationPlugin、brokerClientAuthenticationParameters、brokerClientTrustCertsFilePath等在 conf/proxy.conf 中位于 Client Authentication 配置段下。客户端侧插件解析 token 参数brokerClientAuthenticationParameters最终由客户端认证插件 AuthenticationToken.configure 解析其支持三种形式token:xxxxx去掉token:前缀后把剩余部分当作 tokenfile:///path/to/token.txt把 URI 转为文件路径读取文件内容会trim掉首尾空白见 SerializableURITokenSupplierJSON 字符串含token字段或裸 token 字符串。这解释了文档中brokerClientAuthenticationParameters为什么可以写成token:...或file:///...两种形式。对应的单元测试见 AuthenticationTokenTest.java。配套文档与后续步骤本指南聚焦于服务端与运维侧的 Token 认证管理。完成集群配置后客户端侧的接入方式请参考Client Authentication using tokensCLI 工具conf/client.conf中配置authPlugin/authParams以及 Java、Python、Go、C 客户端的 token 接入示例包括 token supplier 的用法Transport Encryption using TLS由于 token 等同于密码务必配合 TLS 传输加密使用Authorization 指南了解 role 与命名空间权限的完整授权模型包括proxyRoles等配置。按本文顺序实践即可得到一套可运行的 JWT Token 认证体系先create-secret-key或create-key-pair生成密钥再tokens create为每个用户签发带 subject和可选 TTL的 token用pulsar-admin namespaces grant-permission授予权限最后把密钥与AuthenticationProviderToken配置到 broker 与 proxy 上即可完成从签发、授权到校验的完整闭环。赞分享消息队列后端流处理【免费下载链接】pulsarApache Pulsar - distributed pub-sub messaging system项目地址https://gitcode.com/gh_mirrors/pulsar28/pulsar点击查看免费下载相关推荐Apache Pulsar Token 认证管理指南基于 JWT 的密钥创建、令牌签发与 Broker/Proxy 配置实战Apache Pulsar Token 认证管理指南基于 JWT 的密钥创建、令牌签发与 Broker/Proxy 配置实战 本文以 Apache Pulsa消息队列后端流处理Apache Pulsar JWT Token 认证管理密钥生成、Token 签发与 Broker/Proxy 配置详解Apache Pulsar JWT Token 认证管理密钥生成、Token 签发与 Broker/Proxy 配置详解 本文以 Pulsar 官方文档《To消息队列后端流处理Dante Cloud数据加密传输与存储加密的最佳实践指南Dante Cloud数据加密传输与存储加密的最佳实践指南 Dante Cloud作为国内首个支持阻塞式和响应式服务并行的企业级云原生微服务基座在数据安全方消息队列后端流处理上一篇RemoteDesktopManage告别繁琐用这款开源工具让Windows远程桌面管理效率提升300%下一篇突破上下文限制Mistral-7B-v0.3_rai_1.7.1_npu_4K实现4096序列长度的秘密创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表