"Since smart card logins are not built into Kafka (or the JDK), you need a
developer to build the login module. So the developer implements
example.SmartcardLoginModule. In addition, the developer may also implement
callback handlers for the SASL client or server  and a login class to keep
this login refreshed. The callback handlers and login implementation
support all the mechanisms that the organisation supports - in this case
Kerberos and smart card."

In this case, the developer works for Example Inc (which develops
SmartCard authentication modules), while I work for Retailer and need
to use his module.
You assume that developer from Example Inc knows about all the
mechanisms that I have enabled in my Kafka cluster and he is capable
of developing a Login class and maybe a callback handler that supports
all of them. I think this is an unreasonable expectation.

I think that allowing plug in of Login method and single Callback
handler is not a good extensible solution for multiple mechanisms. We
should probably supply a Kafka-based LoginContext and CallbackHandler
that will be able to delegate to implementations of LoginModules and
Callback Handlers based on mechanism out of a list supplied by a user.
I agree it is more complex, but otherwise we are asking of too much
coordination from whoever implements CallbackHandlers and Login
methods.

Gwen

On Tue, Mar 8, 2016 at 3:35 PM, Rajini Sivaram
<rajinisiva...@googlemail.com> wrote:
> As an admin, you would configure login modules using standard JAAS
> configuration. So, if you are supporting Kerberos and smart card login
> modules within a single broker, in your jaas.conf you would specify:
>
> KafkaServer {
>
> com.ibm.security.auth.module.Krb5LoginModule required
> credsType=both
> useKeytab="file:/kafka/key.tab"
> principal="kafka/localh...@example.com";
>
>   example.SmartcardLoginModule required
>
>   cardNumber=123
>
> };
>
>
> Since smart card logins are not built into Kafka (or the JDK), you need a
> developer to build the login module. So the developer implements
> example.SmartcardLoginModule. In addition, the developer may also implement
> callback handlers for the SASL client or server  and a login class to keep
> this login refreshed. The callback handlers and login implementation
> support all the mechanisms that the organisation supports - in this case
> Kerberos and smart card.
>
> As an admin, if you are using mechanisms built into Kafka, you simply
> specify a JAAS config with the combination of mechanisms you want and you
> are done. If you are adding new mechanisms, it clearly can't be done
> without some additional code to implement that mechanism. The callback and
> login interfaces are configurable to ensure that (as a developer), you can
> build custom mechanisms without modifying Kafka. SASL was designed
> precisely to do this. But at the moment, Kafka restricts what type of
> authentication you can perform with SASL.
>
> Back to the questions:
> 1. *How does the proposed Login class interact with LoginContext and *
> *LoginModule.*
> Login class performs *LoginContext.login(). *This performs login for all
> the login modules of that context (this is standard Java function). Login
> is cached with a reference counter to keep it alive.
>
> 2. *Do we really need a pluggable Login class, when users **(administrators,
> not developers) are more likely to want to specify LoginModules?*
> Administrators specify *LoginModules. *Developers implement new mechanisms.
> The pluggable *Login* class enables the developer to implement new
> mechanisms without changing Kafka. If Kafka didn't have a default Kerberos
> implementation and a user wanted to use Kerberos, pluggability of *Login* 
> class
> enables the user to include Kerberos without changing Kafka. Not that we
> want another Kerberos, but Tao had a requirement to enable a custom
> mechanism with functionality similar to Kerberos (see KIP-44). Pluggable
> *Login* supports this use case without replacing the entire authentication
> mechanism in Kafka.
>
> *3. How will users get to specify multiple LoginModules?*
> Standard Java JAAS configuration - see example above.
>
>
> *4. It sounds like different LoginModules may need
> different CallbackHandlers. Since we only allow a single
> pluggableCallbackHandler class in the KIP-43 configuration, how will this
> be handled?*
> One LoginContext, one subject, one callback handler, multiple login
> modules. This is the Java model for login. And it works well because
> callback handlers tend to be fairly standard. Even if the smart card SASL
> callbacks needed to do something wildly different and you wanted a broker
> that combined this with Kerberos, you would implement a callback that
> looked like the code below.
>
>         private CallbackHandler handler;
>
>         public void configure(Map<String, ?> configs, Mode mode, Subject
> subject, String mechanism) {public void configure(Map<String, ?> configs,
> Mode mode, Subject subject, String mechanism) {
>
>             switch (mechanism) {
>
>                 case "GSSAPI" : handler = new GssapiCallbackHandler(); break
> ;
>
>                 case "SMARTCARD" : handler = new SmartcardCallbackHandler();
> break;
>
>             }
>
>         }
>
>
>         public void handle(Callback[] callbacks) throws IOException,
> UnsupportedCallbackException {
>
>             handler.handle(callbacks);
>
>         }
>
> But I don't see this as just an admin configuration. This is some code
> developed alongside a new mechanism. Yes, you can add a new configuration
> type in Kafka that maps mechanism to callback handler class to avoid the
> switch statement. But that doesn't remove the need for new code altogether
> since you still need to implement SmartcardCallbackHandler. Multiple
> conflicting callback handlers within one broker to support complete
> different behaviour is an edge case. Since the design supports
> full flexibility in terms of functionality and you have to write new code
> for new mechanisms anyway, this feels like the simplest solution.
>
>
>
> On Tue, Mar 8, 2016 at 8:23 PM, Gwen Shapira <g...@confluent.io> wrote:
>
>> I guess what is unclear to me is:
>>
>> 1. How does the proposed Login class interact with LoginContext and
>> LoginModule.
>> 2. Do we really need a pluggable Login class, when users
>> (administrators, not developers) are more likely to want to specify
>> LoginModules?
>> 3. How will users get to specify multiple LoginModules?
>> 4. It sounds like different LoginModules may need different
>> CallbackHandlers. Since we only allow a single pluggable
>> CallbackHandler class in the KIP-43 configuration, how will this be
>> handled?
>>
>> In other words, suppose I want my Kafka installation to support both
>> Kerberos and SmartCard mechanisms, can you tell me how to configure
>> Kafka? (as admin, not developer)?
>>
>> Gwen
>>
>>
>>
>> On Tue, Mar 8, 2016 at 11:46 AM, Rajini Sivaram
>> <rajinisiva...@googlemail.com> wrote:
>> > Gwen,
>> >
>> > I am not sure I understand your concern. Java login contexts support
>> > multiple login modules precisely to support this type of real-world
>> > scenario.
>> >
>> > From Javadoc of *javax.security.auth.login.LoginContext*:
>> >
>> > *In addition to supporting pluggable authentication, this class also
>> > supports the notion of stacked authentication. Applications may be
>> > configured to use more than one LoginModule. For example, one could
>> > configure both a Kerberos LoginModule and a smart card LoginModule under
>> an
>> > application. *
>> >
>> > * A typical caller instantiates a LoginContext with a name and a
>> > CallbackHandler. LoginContext uses the name as the index into a
>> > Configuration to determine which LoginModules should be used, and which
>> > ones must succeed in order for the overall authentication to succeed. The
>> > CallbackHandler is passed to the underlying LoginModules so they may
>> > communicate and interact with users (prompting for a username and
>> password
>> > via a graphical user interface, for example).*
>> >
>> > If it is good enough for Java, surely it must be good enough for Kafka.
>> We
>> > don't expect users to directly use existing classes when they want to
>> > support complex new mechanisms. Login is not a standard interface, and we
>> > want to make callback handlers configurable. So we do require users to
>> wrap
>> > their existing classes in our interface. And the interfaces make it
>> > possible to plugin any number of mechanisms. Am I missing something?
>> >
>> >
>> >
>> > On Tue, Mar 8, 2016 at 4:49 PM, Gwen Shapira <g...@confluent.io> wrote:
>> >
>> >> Yes, I understand that.
>> >>
>> >> However, because the current configuration only allows a single
>> >> callback and a single login module, I need to supply a class that
>> >> supports callbacks or logins for every single mechanism that I need to
>> >> support. I question whether this is applicable in real-world scenario
>> >> where a user may need to support mechanisms that were written by
>> >> different vendors and where a single class that implements all the
>> >> necessary modules or callsbacks is very unlikely to exist.
>> >>
>> >> I agree that supporting a list of classes and dynamically using the
>> >> correct callbacks and modules based on configuration is complex, but I
>> >> don't think this feature is useful enough without it.
>> >>
>> >> Gwen
>> >>
>> >> On Tue, Mar 8, 2016 at 2:40 AM, Rajini Sivaram
>> >> <rajinisiva...@googlemail.com> wrote:
>> >> > Gwen,
>> >> >
>> >> > Sorry if this is not clear in the KIP. The goal of the KIP is to
>> enable
>> >> new
>> >> > mechanisms to be added without any changes to Apache Kafka. The
>> >> > configuration proposed by the KIP is based on the configurability of
>> the
>> >> > Java SASL API and what it would take to add a new mechanism similar to
>> >> > Kerberos/PLAIN/Digest-MD5 and the requirements that Tao raised for
>> custom
>> >> > authentication.
>> >> >
>> >> > The PR includes a test for Digest-MD5 which is not included in Kafka,
>> but
>> >> > is tested using the configuration options that allow new mechanisms
>> to be
>> >> > added.
>> >> >
>> >> > If you want to add a more complex mechanism which requires integration
>> >> with
>> >> > some external authentication libraries for login or callback handlers,
>> >> you
>> >> > can do that by configuring your own callback handler and login
>> >> > implementation. The login class allows you to add additional threads
>> (for
>> >> > instance for token refresh), while the callback handler extends the
>> >> > standard Java CallbackHandler interface, enabling you to override any
>> of
>> >> > the default callbacks in Kafka to provide your own behaviour. If you
>> want
>> >> > to add your own login modules, SASL server or SASL client
>> implementation
>> >> > for a mechanism that is not supported in your JDK, you can do that by
>> >> > adding new Java security modules, using the built-in pluggability of
>> Java
>> >> > security.
>> >> >
>> >> > And finally, if you want to enable multiple mechanisms in your Kafka
>> >> > brokers, you can specify a callback handler class that either provides
>> >> the
>> >> > handlers for all the mechanisms (as the PR does for Kerberos and
>> PLAIN)
>> >> or
>> >> > a delegator that calls different callback handlers based on the
>> >> mechanism.
>> >> > And for login, you provide a single or a compound class that provides
>> any
>> >> > additional login logic for all the login modules that you have
>> specified
>> >> > for KafkaServer.
>> >> >
>> >> > Hope that helps.
>> >> >
>> >> >
>> >> > On Tue, Mar 8, 2016 at 1:17 AM, Gwen Shapira <g...@confluent.io>
>> wrote:
>> >> >
>> >> >> Can you explain the process for a adding a new mechanism based on
>> >> current
>> >> >> KIP?
>> >> >>
>> >> >> My thought is that if it requires modifying Apache Kafka code, it is
>> >> >> not pluggable enough.
>> >> >>
>> >> >> On Mon, Mar 7, 2016 at 4:04 PM, Rajini Sivaram
>> >> >> <rajinisiva...@googlemail.com> wrote:
>> >> >> > Gwen,
>> >> >> >
>> >> >> > In cases where you want completely different callbacks for
>> different
>> >> >> > mechanisms, I was thinking that the choice would be between a map
>> of
>> >> >> > classes (mechanism -> callbackHandler class) or a delegator class
>> that
>> >> >> > chooses the appropriate callback handler class based on mechanism.
>> I
>> >> >> chose
>> >> >> > the latter since it makes it easier to configure in Kafka. Since we
>> >> >> create
>> >> >> > a callback handler for each channel and configure it with the
>> >> >> > client-selected mechanism, it is straightforward to have one
>> wrapper
>> >> >> class
>> >> >> > that delegates to the right mechanism-specific class to handle
>> >> callbacks.
>> >> >> > In many cases, a single class may be sufficient (the PR uses a
>> single
>> >> >> > callback class for Kerberos and PLAIN). I do see your point about
>> the
>> >> >> > flexibility that multiple classes would provide, but since you need
>> >> to be
>> >> >> > able to associate the callback with a mechanism for this to be
>> >> useful, I
>> >> >> am
>> >> >> > not sure if just a list would add value.
>> >> >> >
>> >> >> > Login class is slightly different since the proposal is to use a
>> >> single
>> >> >> > login context with multiple login modules to handle multiple
>> >> mechanisms.
>> >> >> In
>> >> >> > this case, you want to perform login for all the mechanisms that
>> are
>> >> >> > enabled. And you want to call loginContext.login() only once.
>> Again,
>> >> you
>> >> >> > can delegate to multiple classes if you wish to add some complex
>> >> >> > mechanism-specific logic, but a single login class makes the
>> mapping
>> >> to a
>> >> >> > single login context and the login cache more obvious (the PR has a
>> >> test
>> >> >> > that includes Kerberos and PLAIN).
>> >> >> >
>> >> >> > Thoughts?
>> >> >> >
>> >> >> > On Mon, Mar 7, 2016 at 9:57 PM, Gwen Shapira <g...@confluent.io>
>> >> wrote:
>> >> >> >
>> >> >> >> Hi,
>> >> >> >>
>> >> >> >> Before I can vote on this KIP, I have two additional questions /
>> >> >> >> comments on the new configuration:
>> >> >> >>
>> >> >> >> 1. sasl.callback.handler.class - it looks like we want a single
>> class
>> >> >> >> that implements all mechanisms. I think this will make it
>> difficult
>> >> to
>> >> >> >> extend since the only way I can add a mechanism will be by
>> >> >> >> implementing every single existing mechanism (otherwise customers
>> >> will
>> >> >> >> need to choose between new and existing when selecting which
>> class to
>> >> >> >> use). If Microsoft releases a proprietary "AD Mechanism" and
>> Oracle
>> >> >> >> releases "OID mechanism", there will be no class that implements
>> >> both.
>> >> >> >> Can we make it a list of classes instead? I realize this
>> complicates
>> >> >> >> the code a bit (some kind of factory will be required to choose
>> the
>> >> >> >> right class to use), but important IMO.
>> >> >> >> 2. similar for sasl.login.class - if I have a class for Kerberos
>> >> (with
>> >> >> >> refresh thread) and a class for "plain", we need to be able to
>> load
>> >> >> >> both.
>> >> >> >>
>> >> >> >> Gwen
>> >> >> >>
>> >> >> >> On Wed, Mar 2, 2016 at 12:30 AM, Rajini Sivaram
>> >> >> >> <rajinisiva...@googlemail.com> wrote:
>> >> >> >> > Jun,
>> >> >> >> >
>> >> >> >> > Thanks, I have added a note to the KIP. I will add a comment in
>> the
>> >> >> >> > implementation and also add a unit test to ensure that conflicts
>> >> are
>> >> >> >> > avoided when version number is modified.
>> >> >> >> >
>> >> >> >> > On Tue, Mar 1, 2016 at 5:43 PM, Jun Rao <j...@confluent.io>
>> wrote:
>> >> >> >> >
>> >> >> >> >> Rajini,
>> >> >> >> >>
>> >> >> >> >> Thanks for the explanation. For 1, this implies that we have
>> to be
>> >> >> >> careful
>> >> >> >> >> with changing the 2-byte version in the future to avoid
>> conflict.
>> >> >> Could
>> >> >> >> you
>> >> >> >> >> document this in the KIP and also in the implementation?
>> >> >> >> >>
>> >> >> >> >> Jun
>> >> >> >> >>
>> >> >> >> >> On Tue, Mar 1, 2016 at 2:47 AM, Rajini Sivaram <
>> >> >> >> >> rajinisiva...@googlemail.com
>> >> >> >> >> > wrote:
>> >> >> >> >>
>> >> >> >> >> > Jun,
>> >> >> >> >> >
>> >> >> >> >> > Thank you for the review.
>> >> >> >> >> >
>> >> >> >> >> >
>> >> >> >> >> >    1. With GSSAPI, the first context establishment packet
>> starts
>> >> >> with
>> >> >> >> the
>> >> >> >> >> >    byte 0x60 (tag for APPLICATION-0) followed by a
>> >> variable-length
>> >> >> >> >> encoded
>> >> >> >> >> >    size, followed by various tags and contents. And the
>> packet
>> >> also
>> >> >> >> >> > contains a
>> >> >> >> >> >    checksum. This is completely different from the mechanism
>> >> packet
>> >> >> >> from
>> >> >> >> >> > Kafka
>> >> >> >> >> >    clients which start with a two-byte version set to zero
>> >> >> currently,
>> >> >> >> >> > followed
>> >> >> >> >> >    by just a String mechanism.
>> >> >> >> >> >    2. Agreed, I have removed the version from the server
>> >> response
>> >> >> in
>> >> >> >> the
>> >> >> >> >> >    KIP. Thanks.
>> >> >> >> >> >
>> >> >> >> >> >
>> >> >> >> >> > On Tue, Mar 1, 2016 at 2:33 AM, Jun Rao <j...@confluent.io>
>> >> wrote:
>> >> >> >> >> >
>> >> >> >> >> > > Rajini,
>> >> >> >> >> > >
>> >> >> >> >> > > Thanks for the updates. Just a couple of minor comments.
>> >> >> >> >> > >
>> >> >> >> >> > > 1. With the default GSSAPI, what's the first packet that
>> the
>> >> >> client
>> >> >> >> >> sends
>> >> >> >> >> > > to the server? Is that completely different from the packet
>> >> >> format
>> >> >> >> that
>> >> >> >> >> > we
>> >> >> >> >> > > will use for non-GSSAPI mechanisms?
>> >> >> >> >> > >
>> >> >> >> >> > > 2. In the server response, it doesn't seem that we need to
>> >> >> include
>> >> >> >> the
>> >> >> >> >> > > version since the client knows the version of the request
>> >> that it
>> >> >> >> >> sends.
>> >> >> >> >> > >
>> >> >> >> >> > > Jun
>> >> >> >> >> > >
>> >> >> >> >> > > On Mon, Feb 29, 2016 at 10:14 AM, Rajini Sivaram <
>> >> >> >> >> > > rajinisiva...@googlemail.com> wrote:
>> >> >> >> >> > >
>> >> >> >> >> > > > Harsha,
>> >> >> >> >> > > >
>> >> >> >> >> > > > Thank you for the review. I will wait another day to see
>> if
>> >> >> there
>> >> >> >> is
>> >> >> >> >> > more
>> >> >> >> >> > > > feedback and then start a voting thread.
>> >> >> >> >> > > >
>> >> >> >> >> > > > Rajini
>> >> >> >> >> > > >
>> >> >> >> >> > > > On Mon, Feb 29, 2016 at 2:51 PM, Harsha <ka...@harsha.io
>> >
>> >> >> wrote:
>> >> >> >> >> > > >
>> >> >> >> >> > > > > Rajini,
>> >> >> >> >> > > > >               Thanks for the changes to the KIP. It
>> looks
>> >> >> good
>> >> >> >> to
>> >> >> >> >> > me. I
>> >> >> >> >> > > > >               think we can move to voting.
>> >> >> >> >> > > > > Thanks,
>> >> >> >> >> > > > > Harsha
>> >> >> >> >> > > > >
>> >> >> >> >> > > > > On Mon, Feb 29, 2016, at 12:43 AM, Rajini Sivaram
>> wrote:
>> >> >> >> >> > > > > > I have added some more detail to the KIP based on the
>> >> >> >> discussion
>> >> >> >> >> in
>> >> >> >> >> > > the
>> >> >> >> >> > > > > > last KIP meeting to simplify support for multiple
>> >> >> mechanisms.
>> >> >> >> >> Have
>> >> >> >> >> > > also
>> >> >> >> >> > > > > > changed the property names to reflect this.
>> >> >> >> >> > > > > >
>> >> >> >> >> > > > > > Also updated the PR in
>> >> >> >> >> > > > https://issues.apache.org/jira/browse/KAFKA-3149
>> >> >> >> >> > > > > > to
>> >> >> >> >> > > > > > reflect the KIP.
>> >> >> >> >> > > > > >
>> >> >> >> >> > > > > > Any feedback is appreciated.
>> >> >> >> >> > > > > >
>> >> >> >> >> > > > > >
>> >> >> >> >> > > > > > On Tue, Feb 23, 2016 at 9:36 PM, Rajini Sivaram <
>> >> >> >> >> > > > > > rajinisiva...@googlemail.com> wrote:
>> >> >> >> >> > > > > >
>> >> >> >> >> > > > > > > I have updated the KIP based on the discussion in
>> the
>> >> KIP
>> >> >> >> >> meeting
>> >> >> >> >> > > > > today.
>> >> >> >> >> > > > > > >
>> >> >> >> >> > > > > > > Comments and feedback are welcome.
>> >> >> >> >> > > > > > >
>> >> >> >> >> > > > > > > On Wed, Feb 3, 2016 at 7:20 PM, Rajini Sivaram <
>> >> >> >> >> > > > > > > rajinisiva...@googlemail.com> wrote:
>> >> >> >> >> > > > > > >
>> >> >> >> >> > > > > > >> Hi Harsha,
>> >> >> >> >> > > > > > >>
>> >> >> >> >> > > > > > >> Thank you for the review. Can you clarify - I
>> think
>> >> you
>> >> >> are
>> >> >> >> >> > saying
>> >> >> >> >> > > > > that
>> >> >> >> >> > > > > > >> the client should send its mechanism over the
>> wire to
>> >> >> the
>> >> >> >> >> > server.
>> >> >> >> >> > > Is
>> >> >> >> >> > > > > that
>> >> >> >> >> > > > > > >> correct? The exchange is slightly different in the
>> >> KIP
>> >> >> >> (the PR
>> >> >> >> >> > > > > matches the
>> >> >> >> >> > > > > > >> KIP) from the one you described to enable
>> >> >> interoperability
>> >> >> >> >> with
>> >> >> >> >> > > > > 0.9.0.0.
>> >> >> >> >> > > > > > >>
>> >> >> >> >> > > > > > >>
>> >> >> >> >> > > > > > >> On Wed, Feb 3, 2016 at 1:56 PM, Harsha <
>> >> m...@harsha.io>
>> >> >> >> >> wrote:
>> >> >> >> >> > > > > > >>
>> >> >> >> >> > > > > > >>> Rajini,
>> >> >> >> >> > > > > > >>>            I looked at the PR you have. I think
>> its
>> >> >> better
>> >> >> >> >> with
>> >> >> >> >> > > > your
>> >> >> >> >> > > > > > >>>            earlier approach rather than extending
>> >> the
>> >> >> >> >> protocol.
>> >> >> >> >> > > > > > >>> What I was thinking initially is, Broker has a
>> >> config
>> >> >> >> option
>> >> >> >> >> of
>> >> >> >> >> > > say
>> >> >> >> >> > > > > > >>> sasl.mechanism = GSSAPI, PLAIN
>> >> >> >> >> > > > > > >>> and the client can have similar config of
>> >> >> >> >> sasl.mechanism=PLAIN.
>> >> >> >> >> > > > > Client
>> >> >> >> >> > > > > > >>> can send its sasl mechanism before the handshake
>> >> starts
>> >> >> >> and
>> >> >> >> >> if
>> >> >> >> >> > > the
>> >> >> >> >> > > > > > >>> broker accepts that particular mechanism than it
>> >> can go
>> >> >> >> ahead
>> >> >> >> >> > > with
>> >> >> >> >> > > > > > >>> handshake otherwise return a error saying that
>> the
>> >> >> >> mechanism
>> >> >> >> >> > not
>> >> >> >> >> > > > > > >>> allowed.
>> >> >> >> >> > > > > > >>>
>> >> >> >> >> > > > > > >>> Thanks,
>> >> >> >> >> > > > > > >>> Harsha
>> >> >> >> >> > > > > > >>>
>> >> >> >> >> > > > > > >>> On Wed, Feb 3, 2016, at 04:58 AM, Rajini Sivaram
>> >> wrote:
>> >> >> >> >> > > > > > >>> > A slightly different approach for supporting
>> >> >> different
>> >> >> >> SASL
>> >> >> >> >> > > > > mechanisms
>> >> >> >> >> > > > > > >>> > within a broker is to allow the same "*security
>> >> >> >> protocol*"
>> >> >> >> >> to
>> >> >> >> >> > > be
>> >> >> >> >> > > > > used
>> >> >> >> >> > > > > > >>> on
>> >> >> >> >> > > > > > >>> > different ports with different configuration
>> >> >> options. An
>> >> >> >> >> > > > advantage
>> >> >> >> >> > > > > of
>> >> >> >> >> > > > > > >>> > this
>> >> >> >> >> > > > > > >>> > approach is that it extends the
>> configurability of
>> >> >> not
>> >> >> >> just
>> >> >> >> >> > > SASL,
>> >> >> >> >> > > > > but
>> >> >> >> >> > > > > > >>> any
>> >> >> >> >> > > > > > >>> > protocol. For instance, it would enable the
>> use of
>> >> >> SSL
>> >> >> >> with
>> >> >> >> >> > > > mutual
>> >> >> >> >> > > > > > >>> client
>> >> >> >> >> > > > > > >>> > authentication on one port or different
>> >> certificate
>> >> >> >> chains
>> >> >> >> >> on
>> >> >> >> >> > > > > another.
>> >> >> >> >> > > > > > >>> > And
>> >> >> >> >> > > > > > >>> > it avoids the need for SASL mechanism
>> negotiation.
>> >> >> >> >> > > > > > >>> >
>> >> >> >> >> > > > > > >>> > Kafka would have the same "*security protocols"
>> >> >> >> *defined as
>> >> >> >> >> > > > today,
>> >> >> >> >> > > > > but
>> >> >> >> >> > > > > > >>> > with
>> >> >> >> >> > > > > > >>> > (a single) configurable SASL mechanism. To have
>> >> >> >> different
>> >> >> >> >> > > > > > >>> configurations
>> >> >> >> >> > > > > > >>> > of
>> >> >> >> >> > > > > > >>> > a protocol within a broker, users can define
>> new
>> >> >> >> protocol
>> >> >> >> >> > names
>> >> >> >> >> > > > > which
>> >> >> >> >> > > > > > >>> are
>> >> >> >> >> > > > > > >>> > configured versions of existing protocols,
>> perhaps
>> >> >> using
>> >> >> >> >> just
>> >> >> >> >> > > > > > >>> > configuration
>> >> >> >> >> > > > > > >>> > entries and no additional code.
>> >> >> >> >> > > > > > >>> >
>> >> >> >> >> > > > > > >>> > For example:
>> >> >> >> >> > > > > > >>> >
>> >> >> >> >> > > > > > >>> > A single mechanism broker would be configured
>> as:
>> >> >> >> >> > > > > > >>> >
>> >> >> >> >> > > > > > >>> > listeners=SASL_SSL://:9092
>> >> >> >> >> > > > > > >>> > sasl.mechanism=GSSAPI
>> >> >> >> >> > > > > > >>> > sasl.kerberos.class.name=kafka
>> >> >> >> >> > > > > > >>> > ...
>> >> >> >> >> > > > > > >>> >
>> >> >> >> >> > > > > > >>> >
>> >> >> >> >> > > > > > >>> > And a multi-mechanism broker would be
>> configured
>> >> as:
>> >> >> >> >> > > > > > >>> >
>> >> >> >> >> > > > > > >>> >
>> >> listeners=gssapi://:9092,plain://:9093,custom://:9094
>> >> >> >> >> > > > > > >>> > gssapi.security.protocol=SASL_SSL
>> >> >> >> >> > > > > > >>> > gssapi.sasl.mechanism=GSSAPI
>> >> >> >> >> > > > > > >>> > gssapi.sasl.kerberos.class.name=kafka
>> >> >> >> >> > > > > > >>> > ...
>> >> >> >> >> > > > > > >>> > plain.security.protocol=SASL_SSL
>> >> >> >> >> > > > > > >>> > plain.sasl.mechanism=PLAIN
>> >> >> >> >> > > > > > >>> > ..
>> >> >> >> >> > > > > > >>> > custom.security.protocol=SASL_PLAINTEXT
>> >> >> >> >> > > > > > >>> > custom.sasl.mechanism=CUSTOM
>> >> >> >> >> > > > > > >>> >
>> >> >> >> >> > >
>> >> custom.sasl.callback.handler.class=example.CustomCallbackHandler
>> >> >> >> >> > > > > > >>> >
>> >> >> >> >> > > > > > >>> >
>> >> >> >> >> > > > > > >>> >
>> >> >> >> >> > > > > > >>> > This is still a big change because it affects
>> the
>> >> >> >> currently
>> >> >> >> >> > > fixed
>> >> >> >> >> > > > > > >>> > enumeration of security protocol definitions,
>> but
>> >> one
>> >> >> >> that
>> >> >> >> >> is
>> >> >> >> >> > > > > perhaps
>> >> >> >> >> > > > > > >>> > more
>> >> >> >> >> > > > > > >>> > flexible than defining every new SASL mechanism
>> >> as a
>> >> >> new
>> >> >> >> >> > > security
>> >> >> >> >> > > > > > >>> > protocol.
>> >> >> >> >> > > > > > >>> >
>> >> >> >> >> > > > > > >>> > Thoughts?
>> >> >> >> >> > > > > > >>> >
>> >> >> >> >> > > > > > >>> >
>> >> >> >> >> > > > > > >>> > On Tue, Feb 2, 2016 at 12:20 PM, Rajini
>> Sivaram <
>> >> >> >> >> > > > > > >>> > rajinisiva...@googlemail.com> wrote:
>> >> >> >> >> > > > > > >>> >
>> >> >> >> >> > > > > > >>> > > As Ismael has said, we do not have a
>> >> requirement to
>> >> >> >> >> support
>> >> >> >> >> > > > > multiple
>> >> >> >> >> > > > > > >>> > > protocols in a broker. But I agree with Jun's
>> >> >> >> observation
>> >> >> >> >> > > that
>> >> >> >> >> > > > > some
>> >> >> >> >> > > > > > >>> > > companies might want to support a different
>> >> >> >> >> authentication
>> >> >> >> >> > > > > mechanism
>> >> >> >> >> > > > > > >>> for
>> >> >> >> >> > > > > > >>> > > internal users or partners. For instance, we
>> do
>> >> use
>> >> >> >> two
>> >> >> >> >> > > > different
>> >> >> >> >> > > > > > >>> > > authentication mechanisms, it just so happens
>> >> that
>> >> >> we
>> >> >> >> are
>> >> >> >> >> > > able
>> >> >> >> >> > > > > to use
>> >> >> >> >> > > > > > >>> > > certificate-based authentication for internal
>> >> >> users,
>> >> >> >> and
>> >> >> >> >> > > hence
>> >> >> >> >> > > > > don't
>> >> >> >> >> > > > > > >>> > > require multiple SASL mechanisms in a broker.
>> >> >> >> >> > > > > > >>> > >
>> >> >> >> >> > > > > > >>> > > As Tao has pointed out, mechanism negotiation
>> >> is a
>> >> >> >> common
>> >> >> >> >> > > usage
>> >> >> >> >> > > > > > >>> pattern.
>> >> >> >> >> > > > > > >>> > > Many existing protocols that support SASL do
>> >> >> already
>> >> >> >> use
>> >> >> >> >> > this
>> >> >> >> >> > > > > > >>> pattern. AMQP
>> >> >> >> >> > > > > > >>> > > (
>> >> >> >> >> > > > > > >>> > >
>> >> >> >> >> > > > > > >>>
>> >> >> >> >> > > > >
>> >> >> >> >> > > >
>> >> >> >> >> > >
>> >> >> >> >> >
>> >> >> >> >>
>> >> >> >>
>> >> >>
>> >>
>> http://docs.oasis-open.org/amqp/core/v1.0/os/amqp-core-security-v1.0-os.html#type-sasl-mechanisms
>> >> >> >> >> > > > > > >>> ),
>> >> >> >> >> > > > > > >>> > > which, as a messaging protocol maybe closer
>> to
>> >> >> Kafka
>> >> >> >> in
>> >> >> >> >> use
>> >> >> >> >> > > > cases
>> >> >> >> >> > > > > > >>> than
>> >> >> >> >> > > > > > >>> > > Zookeeper, is an example. Other examples
>> where
>> >> the
>> >> >> >> client
>> >> >> >> >> > > > > negotiates
>> >> >> >> >> > > > > > >>> or
>> >> >> >> >> > > > > > >>> > > sends SASL mechanism to server include ACAP
>> >> that is
>> >> >> >> used
>> >> >> >> >> as
>> >> >> >> >> > > an
>> >> >> >> >> > > > > > >>> example in
>> >> >> >> >> > > > > > >>> > > the SASL RFCs, POP3, LDAP, SMTP etc. This is
>> >> not to
>> >> >> >> say
>> >> >> >> >> > that
>> >> >> >> >> > > > > Kafka
>> >> >> >> >> > > > > > >>> > > shouldn't use a different type of mechanism
>> >> >> selection
>> >> >> >> >> that
>> >> >> >> >> > > fits
>> >> >> >> >> > > > > > >>> better with
>> >> >> >> >> > > > > > >>> > > the existing Kafka design. Just that
>> negotiation
>> >> >> is a
>> >> >> >> >> > common
>> >> >> >> >> > > > > pattern
>> >> >> >> >> > > > > > >>> and
>> >> >> >> >> > > > > > >>> > > since we typically turn on javax.net.debug to
>> >> debug
>> >> >> >> TLS
>> >> >> >> >> > > > > negotiation
>> >> >> >> >> > > > > > >>> issues,
>> >> >> >> >> > > > > > >>> > > having to use Kafka logging to debug SASL
>> >> >> negotiation
>> >> >> >> >> > issues
>> >> >> >> >> > > is
>> >> >> >> >> > > > > not
>> >> >> >> >> > > > > > >>> that
>> >> >> >> >> > > > > > >>> > > dissimilar.
>> >> >> >> >> > > > > > >>> > >
>> >> >> >> >> > > > > > >>> > >
>> >> >> >> >> > > > > > >>> > > On Tue, Feb 2, 2016 at 6:12 AM, tao xiao <
>> >> >> >> >> > > xiaotao...@gmail.com
>> >> >> >> >> > > > >
>> >> >> >> >> > > > > > >>> wrote:
>> >> >> >> >> > > > > > >>> > >
>> >> >> >> >> > > > > > >>> > >> I am the author of KIP-44. I hope my use
>> case
>> >> will
>> >> >> >> add
>> >> >> >> >> > some
>> >> >> >> >> > > > > values
>> >> >> >> >> > > > > > >>> to this
>> >> >> >> >> > > > > > >>> > >> discussion. The reason I raised KIP44 is
>> that I
>> >> >> want
>> >> >> >> to
>> >> >> >> >> be
>> >> >> >> >> > > > able
>> >> >> >> >> > > > > to
>> >> >> >> >> > > > > > >>> > >> implement a custom security protocol that
>> can
>> >> >> fulfill
>> >> >> >> >> the
>> >> >> >> >> > > need
>> >> >> >> >> > > > > of my
>> >> >> >> >> > > > > > >>> > >> company. As pointed out by Ismael KIP-43 now
>> >> >> >> supports a
>> >> >> >> >> > > > > pluggable
>> >> >> >> >> > > > > > >>> way to
>> >> >> >> >> > > > > > >>> > >> inject custom security provider to SASL I
>> think
>> >> >> it is
>> >> >> >> >> > enough
>> >> >> >> >> > > > to
>> >> >> >> >> > > > > > >>> cover the
>> >> >> >> >> > > > > > >>> > >> use case I have and address the concerns
>> >> raised in
>> >> >> >> >> KIP-44.
>> >> >> >> >> > > > > > >>> > >>
>> >> >> >> >> > > > > > >>> > >> For multiple security protocols support
>> >> >> >> simultaneously
>> >> >> >> >> it
>> >> >> >> >> > is
>> >> >> >> >> > > > not
>> >> >> >> >> > > > > > >>> needed in
>> >> >> >> >> > > > > > >>> > >> my use case and I don't foresee it is
>> needed in
>> >> >> the
>> >> >> >> >> future
>> >> >> >> >> > > but
>> >> >> >> >> > > > > as i
>> >> >> >> >> > > > > > >>> said
>> >> >> >> >> > > > > > >>> > >> this is my use case only there may be other
>> use
>> >> >> cases
>> >> >> >> >> that
>> >> >> >> >> > > > need
>> >> >> >> >> > > > > it.
>> >> >> >> >> > > > > > >>> But if
>> >> >> >> >> > > > > > >>> > >> we want to support it in the future I
>> prefer to
>> >> >> get
>> >> >> >> it
>> >> >> >> >> > right
>> >> >> >> >> > > > at
>> >> >> >> >> > > > > the
>> >> >> >> >> > > > > > >>> first
>> >> >> >> >> > > > > > >>> > >> place given the fact that security protocol
>> is
>> >> an
>> >> >> >> ENUM
>> >> >> >> >> and
>> >> >> >> >> > > if
>> >> >> >> >> > > > we
>> >> >> >> >> > > > > > >>> stick to
>> >> >> >> >> > > > > > >>> > >> that implementation it is very hard to
>> extend
>> >> in
>> >> >> the
>> >> >> >> >> > future
>> >> >> >> >> > > > > when we
>> >> >> >> >> > > > > > >>> decide
>> >> >> >> >> > > > > > >>> > >> multiple security protocols is needed.
>> >> >> >> >> > > > > > >>> > >>
>> >> >> >> >> > > > > > >>> > >> Protocol negotiation is a very common usage
>> >> >> pattern
>> >> >> >> in
>> >> >> >> >> > > > security
>> >> >> >> >> > > > > > >>> domain. As
>> >> >> >> >> > > > > > >>> > >> suggested in Java SASL doc
>> >> >> >> >> > > > > > >>> > >>
>> >> >> >> >> > > > > > >>> > >>
>> >> >> >> >> > > > > > >>>
>> >> >> >> >> > > > >
>> >> >> >> >> > > >
>> >> >> >> >> > >
>> >> >> >> >> >
>> >> >> >> >>
>> >> >> >>
>> >> >>
>> >>
>> http://docs.oracle.com/javase/7/docs/technotes/guides/security/sasl/sasl-refguide.html
>> >> >> >> >> > > > > > >>> > >> client
>> >> >> >> >> > > > > > >>> > >> first sends out a packet to server and
>> server
>> >> >> >> responds
>> >> >> >> >> > with
>> >> >> >> >> > > a
>> >> >> >> >> > > > > list
>> >> >> >> >> > > > > > >>> of
>> >> >> >> >> > > > > > >>> > >> mechanisms it supports. This is very
>> similar to
>> >> >> >> SSL/TLS
>> >> >> >> >> > > > > negotiation.
>> >> >> >> >> > > > > > >>> > >>
>> >> >> >> >> > > > > > >>> > >> On Tue, 2 Feb 2016 at 06:39 Ismael Juma <
>> >> >> >> >> > ism...@juma.me.uk>
>> >> >> >> >> > > > > wrote:
>> >> >> >> >> > > > > > >>> > >>
>> >> >> >> >> > > > > > >>> > >> > On Mon, Feb 1, 2016 at 7:04 PM, Gwen
>> Shapira
>> >> <
>> >> >> >> >> > > > > g...@confluent.io>
>> >> >> >> >> > > > > > >>> wrote:
>> >> >> >> >> > > > > > >>> > >> >
>> >> >> >> >> > > > > > >>> > >> > > Looking at "existing solutions", it
>> looks
>> >> like
>> >> >> >> >> > Zookeeper
>> >> >> >> >> > > > > allows
>> >> >> >> >> > > > > > >>> > >> plugging
>> >> >> >> >> > > > > > >>> > >> > in
>> >> >> >> >> > > > > > >>> > >> > > any SASL mechanism, but the server will
>> >> only
>> >> >> >> support
>> >> >> >> >> > one
>> >> >> >> >> > > > > > >>> mechanism at
>> >> >> >> >> > > > > > >>> > >> a
>> >> >> >> >> > > > > > >>> > >> > > time.
>> >> >> >> >> > > > > > >>> > >> > >
>> >> >> >> >> > > > > > >>> > >> >
>> >> >> >> >> > > > > > >>> > >> > This was the original proposal from
>> Rajini as
>> >> >> that
>> >> >> >> is
>> >> >> >> >> > > enough
>> >> >> >> >> > > > > for
>> >> >> >> >> > > > > > >>> their
>> >> >> >> >> > > > > > >>> > >> > needs.
>> >> >> >> >> > > > > > >>> > >> >
>> >> >> >> >> > > > > > >>> > >> >
>> >> >> >> >> > > > > > >>> > >> > > If this is good enough for our use-case
>> >> (do we
>> >> >> >> >> > actually
>> >> >> >> >> > > > > need to
>> >> >> >> >> > > > > > >>> > >> support
>> >> >> >> >> > > > > > >>> > >> > > multiple mechanisms at once?), it will
>> >> >> simplify
>> >> >> >> >> life a
>> >> >> >> >> > > lot
>> >> >> >> >> > > > > for
>> >> >> >> >> > > > > > >>> us (
>> >> >> >> >> > > > > > >>> > >> > >
>> >> >> >> >> > > > > > >>> > >>
>> >> >> >> >> > > > > > >>>
>> >> >> >> >> > > > >
>> >> >> >> >> > >
>> >> >> >> >>
>> >> >> >>
>> >> >>
>> >>
>> https://cwiki.apache.org/confluence/display/ZOOKEEPER/Zookeeper+and+SASL
>> >> >> >> >> > > > > > >>> > >> > )
>> >> >> >> >> > > > > > >>> > >> > >
>> >> >> >> >> > > > > > >>> > >> >
>> >> >> >> >> > > > > > >>> > >> > The current thinking is that it would be
>> >> useful
>> >> >> to
>> >> >> >> >> > support
>> >> >> >> >> > > > > > >>> multiple SASL
>> >> >> >> >> > > > > > >>> > >> > mechanisms simultaneously. In the KIP
>> >> meeting,
>> >> >> Jun
>> >> >> >> >> > > mentioned
>> >> >> >> >> > > > > that
>> >> >> >> >> > > > > > >>> > >> companies
>> >> >> >> >> > > > > > >>> > >> > sometimes support additional
>> authentication
>> >> >> >> mechanisms
>> >> >> >> >> > for
>> >> >> >> >> > > > > > >>> partners, for
>> >> >> >> >> > > > > > >>> > >> > example. It does make things more
>> complex, as
>> >> >> you
>> >> >> >> say,
>> >> >> >> >> > so
>> >> >> >> >> > > we
>> >> >> >> >> > > > > need
>> >> >> >> >> > > > > > >>> to be
>> >> >> >> >> > > > > > >>> > >> > sure the complexity is worth it.
>> >> >> >> >> > > > > > >>> > >> >
>> >> >> >> >> > > > > > >>> > >> > Two more points:
>> >> >> >> >> > > > > > >>> > >> >
>> >> >> >> >> > > > > > >>> > >> > 1. It has been suggested that custom
>> security
>> >> >> >> protocol
>> >> >> >> >> > > > > support is
>> >> >> >> >> > > > > > >>> > >> needed by
>> >> >> >> >> > > > > > >>> > >> > some (KIP-44). Rajini enhanced KIP-43 so
>> >> that a
>> >> >> >> SASL
>> >> >> >> >> > > > mechanism
>> >> >> >> >> > > > > > >>> with a
>> >> >> >> >> > > > > > >>> > >> > custom provider can be used for this
>> purpose
>> >> >> >> instead.
>> >> >> >> >> > > Given
>> >> >> >> >> > > > > this,
>> >> >> >> >> > > > > > >>> it
>> >> >> >> >> > > > > > >>> > >> seems
>> >> >> >> >> > > > > > >>> > >> > a bit inconsistent and restrictive not to
>> >> allow
>> >> >> >> >> multiple
>> >> >> >> >> > > > SASL
>> >> >> >> >> > > > > > >>> mechanisms
>> >> >> >> >> > > > > > >>> > >> > simultaneously (we do allow SSL and SASL
>> >> >> >> >> authentication
>> >> >> >> >> > > > > > >>> simultaneously,
>> >> >> >> >> > > > > > >>> > >> > after all).
>> >> >> >> >> > > > > > >>> > >> >
>> >> >> >> >> > > > > > >>> > >> > 2. The other option would be to support a
>> >> single
>> >> >> >> SASL
>> >> >> >> >> > > > > mechanism
>> >> >> >> >> > > > > > >>> > >> > simultaneously to start with and then
>> extend
>> >> >> this
>> >> >> >> to
>> >> >> >> >> > > > multiple
>> >> >> >> >> > > > > > >>> mechanisms
>> >> >> >> >> > > > > > >>> > >> > simultaneously later (if and when
>> needed). It
>> >> >> seems
>> >> >> >> >> like
>> >> >> >> >> > > it
>> >> >> >> >> > > > > would
>> >> >> >> >> > > > > > >>> be
>> >> >> >> >> > > > > > >>> > >> harder
>> >> >> >> >> > > > > > >>> > >> > to support the latter in the future if we
>> go
>> >> >> down
>> >> >> >> this
>> >> >> >> >> > > > route,
>> >> >> >> >> > > > > but
>> >> >> >> >> > > > > > >>> maybe
>> >> >> >> >> > > > > > >>> > >> > there are ways around this.
>> >> >> >> >> > > > > > >>> > >> >
>> >> >> >> >> > > > > > >>> > >> > Thoughts?
>> >> >> >> >> > > > > > >>> > >> >
>> >> >> >> >> > > > > > >>> > >> > Ismael
>> >> >> >> >> > > > > > >>> > >> >
>> >> >> >> >> > > > > > >>> > >>
>> >> >> >> >> > > > > > >>> > >
>> >> >> >> >> > > > > > >>> > >
>> >> >> >> >> > > > > > >>> > >
>> >> >> >> >> > > > > > >>> > > --
>> >> >> >> >> > > > > > >>> > > Regards,
>> >> >> >> >> > > > > > >>> > >
>> >> >> >> >> > > > > > >>> > > Rajini
>> >> >> >> >> > > > > > >>> > >
>> >> >> >> >> > > > > > >>> >
>> >> >> >> >> > > > > > >>> >
>> >> >> >> >> > > > > > >>> >
>> >> >> >> >> > > > > > >>> > --
>> >> >> >> >> > > > > > >>> > Regards,
>> >> >> >> >> > > > > > >>> >
>> >> >> >> >> > > > > > >>> > Rajini
>> >> >> >> >> > > > > > >>>
>> >> >> >> >> > > > > > >>
>> >> >> >> >> > > > > > >>
>> >> >> >> >> > > > > > >>
>> >> >> >> >> > > > > > >> --
>> >> >> >> >> > > > > > >> Regards,
>> >> >> >> >> > > > > > >>
>> >> >> >> >> > > > > > >> Rajini
>> >> >> >> >> > > > > > >>
>> >> >> >> >> > > > > > >
>> >> >> >> >> > > > > > >
>> >> >> >> >> > > > > > >
>> >> >> >> >> > > > > > > --
>> >> >> >> >> > > > > > > Regards,
>> >> >> >> >> > > > > > >
>> >> >> >> >> > > > > > > Rajini
>> >> >> >> >> > > > > > >
>> >> >> >> >> > > > > >
>> >> >> >> >> > > > > >
>> >> >> >> >> > > > > >
>> >> >> >> >> > > > > > --
>> >> >> >> >> > > > > > Regards,
>> >> >> >> >> > > > > >
>> >> >> >> >> > > > > > Rajini
>> >> >> >> >> > > > >
>> >> >> >> >> > > >
>> >> >> >> >> > > >
>> >> >> >> >> > > >
>> >> >> >> >> > > > --
>> >> >> >> >> > > > Regards,
>> >> >> >> >> > > >
>> >> >> >> >> > > > Rajini
>> >> >> >> >> > > >
>> >> >> >> >> > >
>> >> >> >> >> >
>> >> >> >> >> >
>> >> >> >> >> >
>> >> >> >> >> > --
>> >> >> >> >> > Regards,
>> >> >> >> >> >
>> >> >> >> >> > Rajini
>> >> >> >> >> >
>> >> >> >> >>
>> >> >> >> >
>> >> >> >> >
>> >> >> >> >
>> >> >> >> > --
>> >> >> >> > Regards,
>> >> >> >> >
>> >> >> >> > Rajini
>> >> >> >>
>> >> >> >
>> >> >> >
>> >> >> >
>> >> >> > --
>> >> >> > Regards,
>> >> >> >
>> >> >> > Rajini
>> >> >>
>> >> >
>> >> >
>> >> >
>> >> > --
>> >> > Regards,
>> >> >
>> >> > Rajini
>> >>
>> >
>> >
>> >
>> > --
>> > Regards,
>> >
>> > Rajini
>>
>
>
>
> --
> Regards,
>
> Rajini

Reply via email to