TLS 认证概述

Pulsar supports authenticating clients using security tokens that are based on JSON Web Tokens (RFC-7519).

您可以使用 tokens 来标识 Pulsar 客户端,以及关联上被授予相应操作权限(例如: 发布到某个 Topic 或从某个 Topic 消费)的 “principal” 或 “role” 上。

通常用户需要从管理员(或某些自动化服务)处获得 token 字符串。

The compact representation of a signed JWT is a string that looks like as the following:

  1. eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJKb2UifQ.ipevRNuRP6HflG8cFKnmUPtypruRC4fb1DWtoLL62SY

应用程序在创建客户端实例时传入 token。 An alternative is to pass a “token supplier” (a function that returns the token when the client library needs one).

始终使用 TLS 传输加密

发送 Token 等同于在网络上发送密码。 在连接 Pulsar 服务的整个过程中,最好始终使用 TLS 加密。 有关详细信息,请参阅 使用 TLS 传输加密

命令行工具

命令行工具 pulsar-admin, pulsar-perf pulsar-client 使用 conf/client. onf 配置文件在 Pulsar 安装中。

You need to add the following parameters to that file to use the token authentication with CLI tools of Pulsar:

  1. webServiceUrl=http://broker.example.com:8080/
  2. brokerServiceUrl=pulsar://broker.example.com:6650/
  3. authPlugin=org.apache.pulsar.client.impl.auth.AuthenticationToken
  4. authParams=token:eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJKb2UifQ.ipevRNuRP6HflG8cFKnmUPtypruRC4fb1DWtoLL62SY

Token 字符串也可以从文件中读取,例如:

  1. authParams=file:///path/to/token/file

Pulsar 客户端

您可以使用 tokens 对以下 Pulsar 客户端进行身份认证。

Java

Python

Go

C++

C#

  1. PulsarClient client = PulsarClient.builder() .serviceUrl("pulsar://broker.example.com:6650/") .authentication( AuthenticationFactory.token("eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJKb2UifQ.ipevRNuRP6HflG8cFKnmUPtypruRC4fb1DWtoLL62SY")) .build();

同样,你也可以传入一个 Supplier

  1. PulsarClient client = PulsarClient.builder() .serviceUrl("pulsar://broker.example.com:6650/") .authentication( AuthenticationFactory.token(() -> { // Read token from custom source return readToken(); })) .build();
  1. from pulsar import Client, AuthenticationTokenclient = Client('pulsar://broker.example.com:6650/' authentication=AuthenticationToken('eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJKb2UifQ.ipevRNuRP6HflG8cFKnmUPtypruRC4fb1DWtoLL62SY'))

或者,您也可以通过 Supplier

  1. def read_token(): with open('/path/to/token.txt') as tf: return tf.read().strip()client = Client('pulsar://broker.example.com:6650/' authentication=AuthenticationToken(read_token))
  1. client, err := NewClient(ClientOptions{ URL: "pulsar://localhost:6650", Authentication: NewAuthenticationToken("eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJKb2UifQ.ipevRNuRP6HflG8cFKnmUPtypruRC4fb1DWtoLL62SY"),})

同样,你也可以传入一个 Supplier

  1. client, err := NewClient(ClientOptions{ URL: "pulsar://localhost:6650", Authentication: NewAuthenticationTokenSupplier(func () string { // Read token from custom source return readToken() }),})
  1. #include <pulsar/Client.h>pulsar::ClientConfiguration config;config.setAuth(pulsar::AuthToken::createWithToken("eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJKb2UifQ.ipevRNuRP6HflG8cFKnmUPtypruRC4fb1DWtoLL62SY"));pulsar::Client client("pulsar://broker.example.com:6650/", config);
  1. var client = PulsarClient.Builder() .AuthenticateUsingToken("eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJKb2UifQ.ipevRNuRP6HflG8cFKnmUPtypruRC4fb1DWtoLL62SY") .Build();

启用 Token 认证

如何在 Pulsar 集群中启用 Token 认证,您可以参考下面的指南。

JWT 支持两种不同的 keys ,都可以生成和验证 tokens:

  • 对称:
    • 使用单个 Secret key 来生成和验证 tokens。
  • 非对称:包含由私钥和公钥组成的一对密钥。
    • 使用 Private key 生成 tokens。
    • 使用 Public key 验证 tokens。

使用 Secret key

当使用 secret key 时,由管理员创建这个 secret key 并使用该密钥生成客户端 tokens。 还需要为 brokers 配置这个密钥,以便验证客户端。

默认在 Pulsar 安装目录的根目录生成输出文件。 您也可以使用下面的命令为输出文件指定绝对路径。

  1. $ bin/pulsar tokens create-secret-key --output my-secret.key

输入下面的命令可以生成 base64 编码的密钥。

  1. $ bin/pulsar tokens create-secret-key --output /opt/my-secret.key --base64

使用秘钥对

使用 Public 和 Private 密钥方式,您需要创建一对密钥。 Pulsar 支持 Java JWT 库( 这里)支持的所有算法。

默认在 Pulsar 安装目录的根目录生成输出文件。 您也可以使用下面的命令为输出文件指定绝对路径。

  1. $ bin/pulsar tokens create-key-pair --output-private-key my-private.key --output-public-key my-public.key
  • 保存 my-private.key 到一个安全的位置,只有管理员能使用 my-private.key 来生成新的 tokens。
  • my-public.key 需要分发给所有 Pulsar brokers。 您可以公开共享此文件,不用担心安全问题。

生成 tokens

A token is the credential associated with a user. 连接是通过 “principal” 或 “role” 完成的。 对于 JWT tokens,这个字段通常被称为 subject,尽管它们是完全相同的概念。

接下来,您需要使用这个命令来要求生成的具有一个 subject 字段的 token。

  1. $ bin/pulsar tokens create --secret-key file:///path/to/my-secret.key \
  2. --subject test-user

命令将在 stdout 上打印出 token 字符串。

类似地,您可以通过下面的命令使用 “private” key 来创建一个 token。

  1. $ bin/pulsar tokens create --private-key file:///path/to/my-private.key \
  2. --subject test-user

最后,您可以通过以下命令来创建一个带有预定义的 TTL token。 Token 会自动过期失效。

  1. $ bin/pulsar tokens create --secret-key file:///path/to/my-secret.key \
  2. --subject test-user \
  3. --expiry-time 1y

Authorization

Token 本身没有关联任何权限。 授权引擎确定 token 是否有权限。 一旦创建 token,就可以授予该 Token 执行某些操作的权限。 The following is an example.

  1. $ bin/pulsar-admin namespaces grant-permission my-tenant/my-namespace \
  2. --role test-user \
  3. --actions produce,consume

在 Brokers 上启用 token 认证

要让 brokers 能对客户端进行身份认证,请在 broker.conf 中添加以下参数:

  1. # Configuration to enable authentication and authorization
  2. authenticationEnabled=true
  3. authorizationEnabled=true
  4. authenticationProviders=org.apache.pulsar.broker.authentication.AuthenticationProviderToken
  5. # If using secret key
  6. tokenSecretKey=file:///path/to/secret.key
  7. # The key can also be passed inline:
  8. # tokenSecretKey=data:;base64,FLFyW0oLJ2Fi22KKCm21J18mbAdztfSHN/lAT5ucEKU=
  9. # If using public/private
  10. # tokenPublicKey=file:///path/to/public.key

在 Proxies 上启用 token 认证

要让 proxies 能对客户端进行身份认证,请在 proxy.conf 中添加以下参数:

Proxy 连接 brokers 使用的是自己的 token。 你需要在 broker 的 代理角色 中配置此密钥对的角色标记。 有关详细信息,请参阅 授权指南

  1. # For clients connecting to the proxy
  2. authenticationEnabled=true
  3. authorizationEnabled=true
  4. authenticationProviders=org.apache.pulsar.broker.authentication.AuthenticationProviderToken
  5. tokenSecretKey=file:///path/to/secret.key
  6. # For the proxy to connect to brokers
  7. brokerClientAuthenticationPlugin=org.apache.pulsar.client.impl.auth.AuthenticationToken
  8. brokerClientAuthenticationParameters=token:eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0LXVzZXIifQ.9OHgE9ZUDeBTZs7nSMEFIuGNEX18FLR3qvy8mqxSxXw
  9. # Or, alternatively, read token from file
  10. # brokerClientAuthenticationParameters=file:///path/to/proxy-token.txt