Looks like a great scheme, but I'd like some more concrete details
about how you see this interacting with Pulsar.


A couple of questions:

How will the token be passed in HTTP? As a header?
What does the concrete payload look like?
How is the server configured to accept this? Is there a public/private
key? Where should the private key be stored? Is it PSK?
How do we block compromised tokens?

-Ivan

On Sun, Oct 28, 2018 at 2:48 AM, Matteo Merli <mme...@apache.org> wrote:
> https://github.com/apache/pulsar/wiki/PIP-25:-Token-based-authentication
>
> ------------------------------------------------------------------------
>
> ## Motivation
>
> Pulsar has a [pluggable authentication mechanism](
> http://pulsar.apache.org/docs/en/security-extending/#authentication)
> that currently supports 3 auth providers.
>
>  1. TLS certificates
>  2. [Athenz](http://www.athenz.io/)
>  3. [Basic access authentication](
> https://en.wikipedia.org/wiki/Basic_access_authentication)
>
> Each of them has few issues which could be summarized as:
>
>  1. TLS
>    * Requires to have multiple key files in both clients and brokers,
> making it
>      difficult to distribute the credentials.
>    * The tools to generate keys are hard to use (OpenSSL)
>    * It is hard to automate the creation of certificates
>    * Manage the Certificate authority certificate is even harder
>
>  2. Athenz
>    * Requires additional service to run
>    * Also targets authorization which we don't need since we have internal
> implementation
>      for that
>
>  3. Basic auth
>    * Very minimal password file based authentication, not really usable
> when there
>      are multiple clients/brokers
>
> To address these issues, this proposal plans to add a new auth provider
> that uses
> [JSON Web Tokens](https://jwt.io/introduction/)
>  ([RFC-7519](https://tools.ietf.org/html/rfc7519)).
>
>  The compact representation of a signed JWT is a string that has three
>  parts, each separated by a `.`:
>
> ```
>  
> eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJKb2UifQ.ipevRNuRP6HflG8cFKnmUPtypruRC4fb1DWtoLL62SY
> ```
>
> The 3 parts are:
>  1. **Header**: contains token infos such as the which algorithm is used for
>     the signature
>  2. **Payload**: Application specific information. Examples are: `subject`
>     (user identifier or principal), `expiration`, etc.. Any kind of info
>     can be attached when creating a token and used later during the
>     validation
>  3. **Signature**: Crypto signature that ensures authenticity of the
>     token
>
> The main properties of JSON Web Tokens are:
>   1. Tokens are created and signed with a secret key
>   2. The secret key can either be a single key or a pair of public/private
>      keys. If 2 keys are used, the private key is used to generate the
>      tokens and the public key can be distributed to all servers to
>      perform validation of such tokens.
>   3. Each server can validate a token without talking to any external
>      service
>   4. By adding information in the payload, the tokens can be scoped in
>      many ways. eg:
>        * Expire time
>        * Limited scope by including reference to some resource
>        * Restrict to some client IPs
>   5. Revocations are not directly supported, but rather need to be
>      implemented by maintaining a black-list of revoked tokens
>
> Note: the TCP connection between client and broker is still expected
> to be protected by TLS encryption. That is because the token shouldn't
> be sent in clear text over the wire.
>
> ## Changes
>
> ### Token generation
>
> We need to provide tools to allow an administrator to create the secret
> key and the tokens for the users.
>
> For example:
>
> ```shell
> pulsar tokens create --key $SECRET_KEY --subject new-user-id
> ```
>
> This will generate a new token and print it on console. This will be done
> by administrator (or some automated service) and the token will be passed
> to client.
>
> Similarly, administrator will be able to create the secret key to
> bootstrap the tokens generation:
>
> ```shell
> pulsar tokens create-secret-key
> ```
>
> ### Client Side
>
> From client library perspective, a new AuthenticationProvider will be
> added that will support taking token and pass that directly to broker
> on connection. Client plugin will not interpret the token in any form,
> rather just treat it as an opaque string.
>
> This will ensure that multiple tokens format can be used if required.
>
> Additionally the `AuthenticationProvider` will allow the application
> to pass a `Supplier<String>` to give the opportunity to fetch the
> token from some config or secret store.
>
> ### Broker side
>
> AuthenticationProvider in Broker will receive the token and validate
> that with the secret key.
>
> The secret key will be either provided in `broker.conf` or a special
> class implementing `Supplier<String>` will be specified to fetch the
> secret key from config or secret store.
>
>
> --
> Matteo Merli
> <mme...@apache.org>

Reply via email to