Hi all, To simplify dynamic update of SASL configs in future (e.g add a new SASL mechanism with a new callback handler or Login), I have separated out the broker-side configs with a mechanism prefix in the property name (similar to listener prefix) instead of including all the classes together as a map. This will also make it easier to configure new Login classes when new mechanisms are introduced alongside other mechanisms on a single listener.
Please let me know if you have any concerns. Thank you, Rajini On Wed, Jan 17, 2018 at 6:54 AM, Rajini Sivaram <rajinisiva...@gmail.com> wrote: > Hi all, > > I have made some updates to this KIP to simplify addition of new SASL > mechanisms: > > 1. The Login interface has been made configurable as well (we have had > this interface for quite some time and it has been stable). > 2. The callback handler properties for client-side and server-side > have been separated out since we would never use the same classes for both. > > Any feedback or suggestions are welcome. > > Thank you, > > Rajini > > > On Mon, Apr 3, 2017 at 12:55 PM, Rajini Sivaram <rajinisiva...@gmail.com> > wrote: > >> If there are no other concerns or suggestions on this KIP, I will start >> vote later this week. >> >> Thank you... >> >> Regards, >> >> Rajini >> >> On Thu, Mar 30, 2017 at 9:42 PM, Rajini Sivaram <rajinisiva...@gmail.com> >> wrote: >> >>> I have made a minor change to the callback handler interface to pass in >>> the JAAS configuration entries in *configure,* to work with the >>> multiple listener configuration introduced in KIP-103. I have also renamed >>> the interface to AuthenticateCallbackHandler instead of AuthCallbackHandler >>> to avoid confusion with authorization. >>> >>> I have rebased and updated the PR (https://github.com/apache/kaf >>> ka/pull/2022) as well. Please let me know if there are any other >>> comments or suggestions to move this forward. >>> >>> Thank you... >>> >>> Regards, >>> >>> Rajini >>> >>> >>> On Thu, Dec 15, 2016 at 3:11 PM, Rajini Sivaram <rsiva...@pivotal.io> >>> wrote: >>> >>>> Ismael, >>>> >>>> The reason for choosing CallbackHandler interface as the configurable >>>> interface is flexibility. As you say, we could instead define a simpler >>>> PlainCredentialProvider and ScramCredentialProvider. But that would tie >>>> users to Kafka's SaslServer implementation for PLAIN and SCRAM. >>>> SaslServer/SaslClient implementations are already pluggable using >>>> standard >>>> Java security provider mechanism. Callback handlers are the >>>> configuration >>>> mechanism for SaslServer/SaslClient. By making the handlers >>>> configurable, >>>> SASL becomes fully configurable for mechanisms supported by Kafka as >>>> well >>>> as custom mechanisms. From the 'Scenarios' section in the KIP, a simpler >>>> PLAIN/SCRAM interface satisfies the first two, but configurable callback >>>> handlers enables all five. I agree that most users don't require this >>>> level >>>> of flexibility, but we have had discussions about custom mechanisms in >>>> the >>>> past for integration with existing authentication servers. So I think >>>> it is >>>> a feature worth supporting. >>>> >>>> On Thu, Dec 15, 2016 at 2:21 PM, Ismael Juma <ism...@juma.me.uk> wrote: >>>> >>>> > Thanks Rajini, your answers make sense to me. One more general point: >>>> we >>>> > are following the JAAS callback architecture and exposing that to the >>>> user >>>> > where the user has to write code like: >>>> > >>>> > @Override >>>> > public void handle(Callback[] callbacks) throws IOException, >>>> > UnsupportedCallbackException { >>>> > String username = null; >>>> > for (Callback callback: callbacks) { >>>> > if (callback instanceof NameCallback) >>>> > username = ((NameCallback) callback).getDefaultName(); >>>> > else if (callback instanceof PlainAuthenticateCallback) { >>>> > PlainAuthenticateCallback plainCallback = >>>> > (PlainAuthenticateCallback) callback; >>>> > boolean authenticated = authenticate(username, >>>> > plainCallback.password()); >>>> > plainCallback.authenticated(authenticated); >>>> > } else >>>> > throw new UnsupportedCallbackException(callback); >>>> > } >>>> > } >>>> > >>>> > protected boolean authenticate(String username, char[] password) >>>> throws >>>> > IOException { >>>> > if (username == null) >>>> > return false; >>>> > else { >>>> > String expectedPassword = >>>> > JaasUtils.jaasConfig(LoginType.SERVER.contextName(), "user_" + >>>> username, >>>> > PlainLoginModule.class.getName()); >>>> > return Arrays.equals(password, >>>> expectedPassword.toCharArray() >>>> > ); >>>> > } >>>> > } >>>> > >>>> > Since we need to create a new callback type for Plain, Scram and so >>>> on, is >>>> > it really worth it to do it this way? For example, in the code above, >>>> the >>>> > `authenticate` method could be the only thing the user has to >>>> implement and >>>> > we could do the necessary work to unwrap the data from the various >>>> > callbacks when interacting with the SASL API. More work for us, but a >>>> much >>>> > more pleasant API for users. What are the drawbacks? >>>> > >>>> > Ismael >>>> > >>>> > On Thu, Dec 15, 2016 at 1:06 AM, Rajini Sivaram <rsiva...@pivotal.io> >>>> > wrote: >>>> > >>>> > > Ismael, >>>> > > >>>> > > 1. At the moment AuthCallbackHandler is not a public interface, so >>>> I am >>>> > > assuming that it can be modified. Yes, agree that we should keep >>>> > non-public >>>> > > methods separate. Will do that as part of the implementation of >>>> this KIP. >>>> > > >>>> > > 2. Callback handlers do tend to depend on ordering, including those >>>> > > included in the JVM and these in Kafka. I have specified the >>>> ordering in >>>> > > the KIP. Will make sure they get included in documentation too. >>>> > > >>>> > > 3. Added a note to the KIP. Kafka needs access to the SCRAM >>>> credentials >>>> > to >>>> > > perform SCRAM authentication. For PLAIN, Kafka only needs to know >>>> if the >>>> > > password is valid for the user. We want to support external >>>> > authentication >>>> > > servers whose interface is to validate password, not retrieve it. >>>> > > >>>> > > 4. Added code of ScramCredential to the KIP. >>>> > > >>>> > > >>>> > > On Wed, Dec 14, 2016 at 3:54 PM, Ismael Juma <ism...@juma.me.uk> >>>> wrote: >>>> > > >>>> > > > Thanks Rajini, that helps. A few comments: >>>> > > > >>>> > > > 1. The `AuthCallbackHandler` interface already exists and we are >>>> making >>>> > > > breaking changes (removing a parameter from `configure` and adding >>>> > > > additional methods). Is the reasoning that it was not a public >>>> > interface >>>> > > > before? It would be good to clearly separate public versus >>>> non-public >>>> > > > interfaces in the security code (and we should tweak Gradle to >>>> publish >>>> > > > javadoc for the public ones). >>>> > > > >>>> > > > 2. It seems like there is an ordering when it comes to the >>>> invocation >>>> > of >>>> > > > callbacks. At least the current code assumes that `NameCallback` >>>> is >>>> > > called >>>> > > > first. If I am interpreting this correctly, we should specify that >>>> > > > ordering. >>>> > > > >>>> > > > 3. The approach taken by `ScramCredentialCallback` is different >>>> than >>>> > the >>>> > > > one taken by `PlainAuthenticateCallback`. The former lets the >>>> user pass >>>> > > the >>>> > > > credentials information while the latter passes the credentials >>>> and >>>> > lets >>>> > > > the user do the authentication. It would be good to explain the >>>> > > > inconsistency. >>>> > > > >>>> > > > 4. We reference `ScramCredential` in a few places, so it would be >>>> good >>>> > to >>>> > > > define that class too. >>>> > > > >>>> > > > Ismael >>>> > > > >>>> > > > On Wed, Dec 14, 2016 at 7:32 AM, Rajini Sivaram < >>>> > > > rajinisiva...@googlemail.com> wrote: >>>> > > > >>>> > > > > Have added sample callback handlers for PLAIN and SCRAM. >>>> > > > > >>>> > > > > On Tue, Dec 13, 2016 at 4:10 PM, Rajini Sivaram < >>>> > > > > rajinisiva...@googlemail.com> wrote: >>>> > > > > >>>> > > > > > Ismael, >>>> > > > > > >>>> > > > > > Thank you for the review. I will add an example. >>>> > > > > > >>>> > > > > > On Tue, Dec 13, 2016 at 1:07 PM, Ismael Juma < >>>> ism...@juma.me.uk> >>>> > > > wrote: >>>> > > > > > >>>> > > > > >> Hi Rajini, >>>> > > > > >> >>>> > > > > >> Thanks for the KIP. I think this is useful and users have >>>> asked >>>> > for >>>> > > > > >> something like that. I like that you have a scenarios >>>> section, do >>>> > > you >>>> > > > > >> think >>>> > > > > >> you could provide a rough sketch of what a callback handler >>>> would >>>> > > look >>>> > > > > >> like >>>> > > > > >> for the first 2 scenarios? They seem to be the common ones, >>>> so it >>>> > > > would >>>> > > > > >> help to see a concrete example. >>>> > > > > >> >>>> > > > > >> Ismael >>>> > > > > >> >>>> > > > > >> On Tue, Oct 11, 2016 at 7:28 AM, Rajini Sivaram < >>>> > > > > >> rajinisiva...@googlemail.com> wrote: >>>> > > > > >> >>>> > > > > >> > Hi all, >>>> > > > > >> > >>>> > > > > >> > I have just created KIP-86 make callback handlers in SASL >>>> > > > configurable >>>> > > > > >> so >>>> > > > > >> > that credential providers for SASL/PLAIN (and SASL/SCRAM >>>> when it >>>> > > is >>>> > > > > >> > implemented) can be used with custom credential callbacks: >>>> > > > > >> > >>>> > > > > >> > https://cwiki.apache.org/confluence/display/KAFKA/KIP- >>>> > > > > >> > 86%3A+Configurable+SASL+callback+handlers >>>> > > > > >> > >>>> > > > > >> > Comments and suggestions are welcome. >>>> > > > > >> > >>>> > > > > >> > Thank you... >>>> > > > > >> > >>>> > > > > >> > >>>> > > > > >> > Regards, >>>> > > > > >> > >>>> > > > > >> > Rajini >>>> > > > > >> > >>>> > > > > >> >>>> > > > > > >>>> > > > > > >>>> > > > > > >>>> > > > > > -- >>>> > > > > > Regards, >>>> > > > > > >>>> > > > > > Rajini >>>> > > > > > >>>> > > > > >>>> > > > > >>>> > > > > >>>> > > > > -- >>>> > > > > Regards, >>>> > > > > >>>> > > > > Rajini >>>> > > > > >>>> > > > >>>> > > >>>> > >>>> >>> >>> >> >