Hi Jun,

I have updated the KIP. Would you mind taking another look?

Thanks,

Mayuresh

On Fri, Feb 17, 2017 at 4:42 PM, Mayuresh Gharat <gharatmayures...@gmail.com
> wrote:

> Hi Jun,
>
> Sure sounds good to me.
>
> Thanks,
>
> Mayuresh
>
> On Fri, Feb 17, 2017 at 1:54 PM, Jun Rao <j...@confluent.io> wrote:
>
>> Hi, Mani,
>>
>> Good point on using PrincipalBuilder for SASL. It seems that
>> PrincipalBuilder already has access to Authenticator. So, we could just
>> enable that in SaslChannelBuilder. We probably could do that in a separate
>> KIP?
>>
>> Hi, Mayuresh,
>>
>> If you don't think there is a concrete use case for using
>> PrincipalBuilder in
>> kafka-acls.sh, perhaps we could do the simpler approach for now?
>>
>> Thanks,
>>
>> Jun
>>
>>
>>
>> On Fri, Feb 17, 2017 at 12:23 PM, Mayuresh Gharat <
>> gharatmayures...@gmail.com> wrote:
>>
>> > @Manikumar,
>> >
>> > Can you give an example how you are planning to use PrincipalBuilder?
>> >
>> > @Jun
>> > Yes, that is right. To give a brief overview, we just extract the cert
>> and
>> > hand it over to a third party library for creating a Principal. So we
>> > cannot create a Principal from just a string.
>> > The main motive behind adding the PrincipalBuilder for kafk-acls.sh was
>> > that someone else (who can generate a Principal from map of propertie,
>> > <String, String> for example) can use it.
>> > As I said, Linkedin is fine with not making any changes to Kafka-acls.sh
>> > for now. But we thought that it would be a good improvement to the tool
>> and
>> > it makes it more flexible and usable.
>> >
>> > Let us know your thoughts, if you would like us to make kafka-acls.sh
>> more
>> > flexible and usable and not limited to Authorizer coming out of the box.
>> >
>> > Thanks,
>> >
>> > Mayuresh
>> >
>> >
>> > On Thu, Feb 16, 2017 at 10:18 PM, Manikumar <manikumar.re...@gmail.com>
>> > wrote:
>> >
>> > > Hi Jun,
>> > >
>> > > yes, we can just customize rules to send full principal name.  I was
>> > > just thinking to
>> > > use PrinciplaBuilder interface for implementing SASL rules also. So
>> that
>> > > the interface
>> > > will be consistent across protocols.
>> > >
>> > > Thanks
>> > >
>> > > On Fri, Feb 17, 2017 at 1:07 AM, Jun Rao <j...@confluent.io> wrote:
>> > >
>> > > > Hi, Radai, Mayuresh,
>> > > >
>> > > > Thanks for the explanation. Good point on a pluggable authorizer can
>> > > > customize how acls are added. However, earlier, Mayuresh was saying
>> > that
>> > > in
>> > > > LinkedIn's customized authorizer, it's not possible to create a
>> > principal
>> > > > from string. If that's the case, will adding the principal builder
>> in
>> > > > kafka-acl.sh help? If the principal can be constructed from a
>> string,
>> > > > wouldn't it be simpler to just let kafka-acl.sh do authorization
>> based
>> > on
>> > > > that string name and not be aware of the principal builder? If you
>> > still
>> > > > think there is a need, perhaps you can add a more concrete use case
>> > that
>> > > > can't be done otherwise?
>> > > >
>> > > >
>> > > > Hi, Mani,
>> > > >
>> > > > For SASL, if the authorizer needs the full kerberos principal name,
>> > > > currently, the user can just customize "sasl.kerberos.principal.to.
>> > > > local.rules"
>> > > > to return the full principal name as the name for authorization,
>> right?
>> > > >
>> > > > Thanks,
>> > > >
>> > > > Jun
>> > > >
>> > > > On Wed, Feb 15, 2017 at 10:25 AM, Mayuresh Gharat <
>> > > > gharatmayures...@gmail.com> wrote:
>> > > >
>> > > > > @Jun thanks for the comments.Please see the replies inline.
>> > > > >
>> > > > > Currently kafka-acl.sh just creates an ACL path in ZK with the
>> > > principal
>> > > > > name string.
>> > > > > ----> Yes, the kafka-acl.sh calls the addAcl() on the inbuilt
>> > > > > SimpleAclAuthorizer which in turn creates an ACL in ZK with the
>> > > Principal
>> > > > > name string. This is because we supply the SimpleAclAuthorizer as
>> a
>> > > > > commandline argument in the Kafka-acls.sh command.
>> > > > >
>> > > > > The authorizer module in the broker reads the principal name
>> > > > > string from the acl path in ZK and creates the expected
>> > KafkaPrincipal
>> > > > for
>> > > > > matching. As you can see, the expected principal is created on the
>> > > broker
>> > > > > side, not by the kafka-acl.sh tool.
>> > > > > ----> This is considering the fact that the user is using the
>> > > > > SimpleAclAuthorizer on the broker side and not his own custom
>> > > Authorizer.
>> > > > > The SimpleAclAuthorizer will take the Principal it gets from the
>> > > Session
>> > > > > class . Currently the Principal is KafkaPrincipal. This
>> > KafkaPrincipal
>> > > is
>> > > > > generated from the name of the actual channel Principal, in
>> > > SocketServer
>> > > > > class when processing completed receives.
>> > > > > With this KIP, this will no longer be the case as the Session
>> class
>> > > will
>> > > > > store a java.security.Principal instead of specific
>> KafkaPrincipal.
>> > So
>> > > > the
>> > > > > SimpleAclAuthorizer will construct the KafkaPrincipal from the
>> > channel
>> > > > > Principal it gets from the Session class.
>> > > > > User might not want to use the SimpleAclAuthorizer but use his/her
>> > own
>> > > > > custom Authorizer.
>> > > > >
>> > > > > The broker already has the ability to
>> > > > > configure PrincipalBuilder. That's why I am not sure if there is a
>> > need
>> > > > for
>> > > > > kafka-acl.sh to customize PrincipalBuilder.
>> > > > > ----> This is exactly the reason why we want to propose a
>> > > > PrincipalBuilder
>> > > > > in kafka-acls.sh so that the Principal generated by the
>> > > PrincipalBuilder
>> > > > on
>> > > > > broker is consistent with that generated while creating ACLs using
>> > the
>> > > > > kafka-acls.sh command line tool.
>> > > > >
>> > > > >
>> > > > > *To summarize the above discussions :*
>> > > > > What if we only make the following changes: pass the java
>> principal
>> > in
>> > > > > session and in
>> > > > > SimpleAuthorizer, construct KafkaPrincipal from java principal
>> name.
>> > > Will
>> > > > > that work for LinkedIn?
>> > > > > ------> Yes, this works for Linkedin as we are not using the
>> > > > kafka-acls.sh
>> > > > > tool to create/update/add ACLs, for now.
>> > > > >
>> > > > > Do you think there is a use case for a customized authorizer and
>> > > > kafka-acl
>> > > > > at the
>> > > > > same time? If not, it's better not to complicate the kafka-acl
>> api.
>> > > > > -----> At Linkedin, we don't use this tool for now. So we are fine
>> > with
>> > > > the
>> > > > > minimal change for now.
>> > > > >
>> > > > > Initially, our change was minimal, just getting the Kafka to
>> preserve
>> > > the
>> > > > > channel principal. Since there was a discussion how kafka-acls.sh
>> > would
>> > > > > work with this change, on the ticket, we designed a detailed
>> solution
>> > > to
>> > > > > make this tool generally usable with all sorts of combinations of
>> > > > > Authorizers and PrincipalBuilders and give more flexibility to the
>> > end
>> > > > > users.
>> > > > > Without the changes proposed for kafka-acls.sh in this KIP, it
>> cannot
>> > > be
>> > > > > used with a custom Authorizer/PrinipalBuilder but will only work
>> with
>> > > > > SimpleAclAuthorizer.
>> > > > >
>> > > > > Although, I would actually like it to work for general scenario,
>> I am
>> > > > fine
>> > > > > with separating it under a separate KIP and limit the scope of
>> this
>> > > KIP.
>> > > > > I will update the KIP accordingly and put this under rejected
>> > > > alternatives
>> > > > > and create a new KIP for the Kafka-acls.sh changes.
>> > > > >
>> > > > > @Manikumar
>> > > > > Since we are limiting the scope of this KIP by not making any
>> changes
>> > > to
>> > > > > kafka-acls.sh, I will cover your concern in a separate KIP that I
>> > will
>> > > > put
>> > > > > up for kafka-acls.sh. Does that work?
>> > > > >
>> > > > > Thanks,
>> > > > >
>> > > > > Mayuresh
>> > > > >
>> > > > >
>> > > > > On Wed, Feb 15, 2017 at 9:18 AM, radai <
>> radai.rosenbl...@gmail.com>
>> > > > wrote:
>> > > > >
>> > > > > > @jun:
>> > > > > > "Currently kafka-acl.sh just creates an ACL path in ZK with the
>> > > > principal
>> > > > > > name string" - yes, but not directly. all it actually does it
>> > spin-up
>> > > > the
>> > > > > > Authorizer and call Authorizer.addAcl() on it.
>> > > > > > the vanilla Authorizer goes to ZK.
>> > > > > > but generally speaking, users can plug in their own Authorizers
>> > (that
>> > > > can
>> > > > > > store/load ACLs to/from wherever).
>> > > > > >
>> > > > > > it would be nice if users who customize Authorizers (and
>> > > > > PrincipalBuilders)
>> > > > > > did not immediately lose the ability to use kafka-acl.sh with
>> their
>> > > new
>> > > > > > Authorizers.
>> > > > > >
>> > > > > > On Wed, Feb 15, 2017 at 5:50 AM, Manikumar <
>> > > manikumar.re...@gmail.com>
>> > > > > > wrote:
>> > > > > >
>> > > > > > > Sorry, I am late to this discussion.
>> > > > > > >
>> > > > > > > PrincipalBuilder is only used for SSL Protocol.
>> > > > > > > For SASL, we use "sasl.kerberos.principal.to.local.rules"
>> config
>> > > to
>> > > > > map
>> > > > > > > SASL principal names to short names. To make it consistent,
>> > > > > > > Do we also need to pass the SASL full principal name to
>> > authorizer
>> > > ?
>> > > > > > > We may need to use PrincipalBuilder for mapping SASL names.
>> > > > > > >
>> > > > > > > Related JIRA is here:
>> > > > > > > https://issues.apache.org/jira/browse/KAFKA-2854
>> > > > > > >
>> > > > > > >
>> > > > > > > On Wed, Feb 15, 2017 at 7:47 AM, Jun Rao <j...@confluent.io>
>> > wrote:
>> > > > > > >
>> > > > > > > > Hi, Radai,
>> > > > > > > >
>> > > > > > > > Currently kafka-acl.sh just creates an ACL path in ZK with
>> the
>> > > > > > principal
>> > > > > > > > name string. The authorizer module in the broker reads the
>> > > > principal
>> > > > > > name
>> > > > > > > > string from the acl path in ZK and creates the expected
>> > > > > KafkaPrincipal
>> > > > > > > for
>> > > > > > > > matching. As you can see, the expected principal is created
>> on
>> > > the
>> > > > > > broker
>> > > > > > > > side, not by the kafka-acl.sh tool. The broker already has
>> the
>> > > > > ability
>> > > > > > to
>> > > > > > > > configure PrincipalBuilder. That's why I am not sure if
>> there
>> > is
>> > > a
>> > > > > need
>> > > > > > > for
>> > > > > > > > kafka-acl.sh to customize PrincipalBuilder.
>> > > > > > > >
>> > > > > > > > Thanks,
>> > > > > > > >
>> > > > > > > > Jun
>> > > > > > > >
>> > > > > > > >
>> > > > > > > > On Mon, Feb 13, 2017 at 7:01 PM, radai <
>> > > radai.rosenbl...@gmail.com
>> > > > >
>> > > > > > > wrote:
>> > > > > > > >
>> > > > > > > > > if i understand correctly, kafka-acls.sh spins up an
>> instance
>> > > of
>> > > > > (the
>> > > > > > > > > custom, in our case) Authorizer, and calls things like
>> > > > > addAcls(acls:
>> > > > > > > > > Set[Acl], resource: Resource) on it, which are defined in
>> the
>> > > > > > > interface,
>> > > > > > > > > hence expected to be "extensible".
>> > > > > > > > >
>> > > > > > > > > (side note: if Authorizer and PrincipalBuilder are
>> defined as
>> > > > > > > extensible
>> > > > > > > > > interfaces, why doesnt class Acl, which is in the
>> signature
>> > for
>> > > > > > > > Authorizer
>> > > > > > > > > calls, use java.security.Principal?)
>> > > > > > > > >
>> > > > > > > > > we would like to be able to use the standard kafka-acl
>> > command
>> > > > line
>> > > > > > for
>> > > > > > > > > defining ACLs even when replacing the vanilla Authorizer
>> and
>> > > > > > > > > PrincipalBuilder (even though we have a management UI for
>> > these
>> > > > > > > > operations
>> > > > > > > > > within linkedin) - simply because thats the correct thing
>> to
>> > do
>> > > > > from
>> > > > > > an
>> > > > > > > > > extensibility point of view.
>> > > > > > > > >
>> > > > > > > > > On Mon, Feb 13, 2017 at 1:39 PM, Jun Rao <
>> j...@confluent.io>
>> > > > wrote:
>> > > > > > > > >
>> > > > > > > > > > Hi, Mayuresh,
>> > > > > > > > > >
>> > > > > > > > > > I seems to me that there are two common use cases of
>> > > > authorizer.
>> > > > > > (1)
>> > > > > > > > Use
>> > > > > > > > > > the default SimpleAuthorizer and the kafka-acl to do
>> > > > > authorization.
>> > > > > > > (2)
>> > > > > > > > > Use
>> > > > > > > > > > a customized authorizer and an external tool for
>> > > authorization.
>> > > > > Do
>> > > > > > > you
>> > > > > > > > > > think there is a use case for a customized authorizer
>> and
>> > > > > kafka-acl
>> > > > > > > at
>> > > > > > > > > the
>> > > > > > > > > > same time? If not, it's better not to complicate the
>> > > kafka-acl
>> > > > > api.
>> > > > > > > > > >
>> > > > > > > > > > Thanks,
>> > > > > > > > > >
>> > > > > > > > > > Jun
>> > > > > > > > > >
>> > > > > > > > > >
>> > > > > > > > > >
>> > > > > > > > > > On Mon, Feb 13, 2017 at 10:35 AM, Mayuresh Gharat <
>> > > > > > > > > > gharatmayures...@gmail.com> wrote:
>> > > > > > > > > >
>> > > > > > > > > > > Hi Jun,
>> > > > > > > > > > >
>> > > > > > > > > > > Thanks for the review and comments. Please find the
>> > replies
>> > > > > > inline
>> > > > > > > :
>> > > > > > > > > > >
>> > > > > > > > > > > This is so that in the future, we can extend to types
>> > like
>> > > > > group.
>> > > > > > > > > > > ---> Yep, I did think the same. But since the
>> > SocketServer
>> > > > was
>> > > > > > > always
>> > > > > > > > > > > creating User type, it wasn't actually used. If we go
>> > ahead
>> > > > > with
>> > > > > > > > > changes
>> > > > > > > > > > in
>> > > > > > > > > > > this KIP, we will give this power of creating
>> different
>> > > > > Principal
>> > > > > > > > types
>> > > > > > > > > > to
>> > > > > > > > > > > the PrincipalBuilder (which users can define there
>> own).
>> > In
>> > > > > that
>> > > > > > > way
>> > > > > > > > > > Kafka
>> > > > > > > > > > > will not have to deal with handling this. So the
>> > Principal
>> > > > > > building
>> > > > > > > > and
>> > > > > > > > > > > Authorization will be opaque to Kafka which seems
>> like an
>> > > > > > expected
>> > > > > > > > > > > behavior.
>> > > > > > > > > > >
>> > > > > > > > > > >
>> > > > > > > > > > > Hmm, normally, the configurations you specify for
>> > plug-ins
>> > > > > refer
>> > > > > > to
>> > > > > > > > > those
>> > > > > > > > > > > needed to construct the plug-in object. So, it's kind
>> of
>> > > > weird
>> > > > > to
>> > > > > > > use
>> > > > > > > > > > that
>> > > > > > > > > > > to call a method. For example, why can't
>> > > > > > > > principalBuilderService.rest.
>> > > > > > > > > > url
>> > > > > > > > > > > be passed in through the configure() method and the
>> > > > > > implementation
>> > > > > > > > can
>> > > > > > > > > > use
>> > > > > > > > > > > that to build principal. This way, there is only a
>> single
>> > > > > method
>> > > > > > to
>> > > > > > > > > > compute
>> > > > > > > > > > > the principal in a consistent way in the broker and in
>> > the
>> > > > > > > kafka-acl
>> > > > > > > > > > tool.
>> > > > > > > > > > > ----> We can do that as well. But since the rest url
>> is
>> > not
>> > > > > > related
>> > > > > > > > to
>> > > > > > > > > > the
>> > > > > > > > > > > Principal, it seems out of place to me to pass it
>> every
>> > > time
>> > > > we
>> > > > > > > have
>> > > > > > > > to
>> > > > > > > > > > > create a Principal. I should replace
>> "principalConfigs"
>> > > with
>> > > > > > > > > > > "principalProperties".
>> > > > > > > > > > > I was trying to differentiate the configs/properties
>> that
>> > > are
>> > > > > > used
>> > > > > > > to
>> > > > > > > > > > > create the PrincipalBuilder class and the
>> > > > Principal/Principals
>> > > > > > > > itself.
>> > > > > > > > > > >
>> > > > > > > > > > >
>> > > > > > > > > > > For LinkedIn's use case, do you actually use the
>> > kafka-acl
>> > > > > tool?
>> > > > > > My
>> > > > > > > > > > > understanding is that LinkedIn does authorization
>> through
>> > > an
>> > > > > > > external
>> > > > > > > > > > tool.
>> > > > > > > > > > > ----> For Linkedin's use case we don't actually use
>> the
>> > > > > kafka-acl
>> > > > > > > > tool
>> > > > > > > > > > > right now. As per the discussion that we had on
>> > > > > > > > > > > https://issues.apache.org/jira/browse/KAFKA-4454, we
>> > > thought
>> > > > > > that
>> > > > > > > it
>> > > > > > > > > > would
>> > > > > > > > > > > be good to make kafka-acl tool changes, to make it
>> > flexible
>> > > > and
>> > > > > > we
>> > > > > > > > > might
>> > > > > > > > > > be
>> > > > > > > > > > > even able to use it in future.
>> > > > > > > > > > >
>> > > > > > > > > > > It seems it's simpler if kafka-acl doesn't to need to
>> > > > > understand
>> > > > > > > the
>> > > > > > > > > > > principal builder. The tool does authorization based
>> on a
>> > > > > string
>> > > > > > > > name,
>> > > > > > > > > > > which is expected to match the principal name. So, I
>> am
>> > > > > wondering
>> > > > > > > why
>> > > > > > > > > the
>> > > > > > > > > > > tool needs to know the principal builder.
>> > > > > > > > > > > ----> If we don't make this change, I am not sure how
>> > > > > clients/end
>> > > > > > > > users
>> > > > > > > > > > > will be able to use this tool if they have there own
>> > > > Authorizer
>> > > > > > > that
>> > > > > > > > > does
>> > > > > > > > > > > Authorization based on Principal, that has more
>> > information
>> > > > > apart
>> > > > > > > > from
>> > > > > > > > > > name
>> > > > > > > > > > > and type.
>> > > > > > > > > > >
>> > > > > > > > > > > What if we only make the following changes: pass the
>> java
>> > > > > > principal
>> > > > > > > > in
>> > > > > > > > > > > session and in
>> > > > > > > > > > > SimpleAuthorizer, construct KafkaPrincipal from java
>> > > > principal
>> > > > > > > name.
>> > > > > > > > > Will
>> > > > > > > > > > > that work for LinkedIn?
>> > > > > > > > > > > ----> This can work for Linkedin but as explained
>> above,
>> > it
>> > > > > does
>> > > > > > > not
>> > > > > > > > > seem
>> > > > > > > > > > > like a complete design from open source point of view.
>> > > > > > > > > > >
>> > > > > > > > > > > Thanks,
>> > > > > > > > > > >
>> > > > > > > > > > > Mayuresh
>> > > > > > > > > > >
>> > > > > > > > > > >
>> > > > > > > > > > > On Thu, Feb 9, 2017 at 11:29 AM, Jun Rao <
>> > j...@confluent.io
>> > > >
>> > > > > > wrote:
>> > > > > > > > > > >
>> > > > > > > > > > > > Hi, Mayuresh,
>> > > > > > > > > > > >
>> > > > > > > > > > > > Thanks for the reply. A few more comments below.
>> > > > > > > > > > > >
>> > > > > > > > > > > > On Wed, Feb 8, 2017 at 9:14 PM, Mayuresh Gharat <
>> > > > > > > > > > > > gharatmayures...@gmail.com>
>> > > > > > > > > > > > wrote:
>> > > > > > > > > > > >
>> > > > > > > > > > > > > Hi Jun,
>> > > > > > > > > > > > >
>> > > > > > > > > > > > > Thanks for the review. Please find the responses
>> > > inline.
>> > > > > > > > > > > > >
>> > > > > > > > > > > > > 1. It seems the problem that you are trying to
>> > address
>> > > is
>> > > > > > that
>> > > > > > > > java
>> > > > > > > > > > > > > principal returned from KafkaChannel may have
>> > > additional
>> > > > > > fields
>> > > > > > > > > than
>> > > > > > > > > > > name
>> > > > > > > > > > > > > that are needed during authorization. Have you
>> > > > considered a
>> > > > > > > > > > customized
>> > > > > > > > > > > > > PrincipleBuilder that extracts all needed fields
>> from
>> > > > java
>> > > > > > > > > principal
>> > > > > > > > > > > and
>> > > > > > > > > > > > > squeezes them as a json in the name of the
>> returned
>> > > > > > principal?
>> > > > > > > > > Then,
>> > > > > > > > > > > the
>> > > > > > > > > > > > > authorizer can just parse the json and extract
>> needed
>> > > > > fields.
>> > > > > > > > > > > > > ---> Yes we had thought about this. We use a third
>> > > party
>> > > > > > > library
>> > > > > > > > > that
>> > > > > > > > > > > > takes
>> > > > > > > > > > > > > in the passed in cert and creates the Principal.
>> This
>> > > > > > Principal
>> > > > > > > > is
>> > > > > > > > > > then
>> > > > > > > > > > > > > used by the library to make the decision
>> (ALLOW/DENY)
>> > > > when
>> > > > > we
>> > > > > > > > call
>> > > > > > > > > it
>> > > > > > > > > > > in
>> > > > > > > > > > > > > the Authorizer. It does not have an API to create
>> the
>> > > > > > Principal
>> > > > > > > > > from
>> > > > > > > > > > a
>> > > > > > > > > > > > > String. If it did support, still we would have to
>> be
>> > > > aware
>> > > > > of
>> > > > > > > the
>> > > > > > > > > > > > internal
>> > > > > > > > > > > > > details of the library, like the field values it
>> > > creates
>> > > > > from
>> > > > > > > the
>> > > > > > > > > > > certs,
>> > > > > > > > > > > > > defaults and so on.
>> > > > > > > > > > > > >
>> > > > > > > > > > > > > 2. Could you explain how the default authorizer
>> works
>> > > > now?
>> > > > > > > > > Currently,
>> > > > > > > > > > > the
>> > > > > > > > > > > > > code just compares the two principal objects. Are
>> we
>> > > > > > converting
>> > > > > > > > the
>> > > > > > > > > > > java
>> > > > > > > > > > > > > principal to a KafkaPrincipal there?
>> > > > > > > > > > > > > ---> The SimpleAclAuthorizer currently expects
>> that,
>> > > the
>> > > > > > > > Principal
>> > > > > > > > > it
>> > > > > > > > > > > > > fetches from the Session object is an instance of
>> > > > > > > KafkaPrincipal.
>> > > > > > > > > It
>> > > > > > > > > > > then
>> > > > > > > > > > > > > uses it compare with the KafkaPrincipal extracted
>> > from
>> > > > the
>> > > > > > > stored
>> > > > > > > > > > ACLs.
>> > > > > > > > > > > > In
>> > > > > > > > > > > > > this case, we can construct the KafkaPrincipal
>> object
>> > > on
>> > > > > the
>> > > > > > > fly
>> > > > > > > > by
>> > > > > > > > > > > using
>> > > > > > > > > > > > > the name of the Principal as follows :
>> > > > > > > > > > > > >
>> > > > > > > > > > > > > *val principal = session.principal*
>> > > > > > > > > > > > > *val kafkaPrincipal = new
>> > > KafkaPrincipal(KafkaPrincipal.
>> > > > > > > > USER_TYPE,
>> > > > > > > > > > > > > principal.getName)*
>> > > > > > > > > > > > > I was also planning to get rid of the
>> principalType
>> > > field
>> > > > > in
>> > > > > > > > > > > > > KafkaPrincipal as
>> > > > > > > > > > > > > it is always set to *"*User*"* in the SocketServer
>> > > > > currently.
>> > > > > > > > After
>> > > > > > > > > > > this
>> > > > > > > > > > > > > KIP, it will no longer be used in SocketServer.
>> But
>> > to
>> > > > > > maintain
>> > > > > > > > > > > backwards
>> > > > > > > > > > > > > compatibility of kafka-acls.sh, I preserved it.
>> > > > > > > > > > > > >
>> > > > > > > > > > > > >
>> > > > > > > > > > > > >
>> > > > > > > > > > > > This is so that in the future, we can extend to
>> types
>> > > like
>> > > > > > group.
>> > > > > > > > > > > >
>> > > > > > > > > > > >
>> > > > > > > > > > > > > 3. Do we need to add the following method in
>> > > > > > PrincipalBuilder?
>> > > > > > > > The
>> > > > > > > > > > > > configs
>> > > > > > > > > > > > > are already passed in through configure() and an
>> > > > > > implementation
>> > > > > > > > can
>> > > > > > > > > > > cache
>> > > > > > > > > > > > > it and use it in buildPrincipal(). It's also not
>> > clear
>> > > to
>> > > > > me
>> > > > > > > > where
>> > > > > > > > > we
>> > > > > > > > > > > > call
>> > > > > > > > > > > > > the new and the old method, and whether both will
>> be
>> > > > called
>> > > > > > or
>> > > > > > > > one
>> > > > > > > > > of
>> > > > > > > > > > > > them
>> > > > > > > > > > > > > will be called.
>> > > > > > > > > > > > > Principal buildPrincipal(Map<String, ?>
>> > > > principalConfigs);
>> > > > > > > > > > > > > ---> My thought was that the configure() method
>> will
>> > be
>> > > > > used
>> > > > > > to
>> > > > > > > > > build
>> > > > > > > > > > > the
>> > > > > > > > > > > > > PrincipalBuilder class object itself. It follows
>> the
>> > > same
>> > > > > way
>> > > > > > > as
>> > > > > > > > > > > > Authorizer
>> > > > > > > > > > > > > gets configured. The buildPrincipal(Map<String, ?>
>> > > > > > > > > principalConfigs)
>> > > > > > > > > > > will
>> > > > > > > > > > > > > be used to build individual principals.
>> > > > > > > > > > > > > Let me give an example, with the kafka-acls.sh :
>> > > > > > > > > > > > >
>> > > > > > > > > > > > >    - bin/kafka-acls.sh --principalBuilder
>> > > > > > > > > > > > >    userDefinedPackage.kafka.
>> > security.PrincipalBuilder
>> > > > > > > > > > > > > --principalBuilder-properties
>> > > > > > > > > > > > >    principalBuilderService.rest.url=URL
>> > --authorizer
>> > > > > > > > > > > > >    kafka.security.auth.SimpleAclAuthorizer
>> > > > > > > > --authorizer-properties
>> > > > > > > > > > > > >    zookeeper.connect=localhost:2181 --add
>> > > > > --allow-principal
>> > > > > > > > > name=bob
>> > > > > > > > > > > > >    type=USER_PRINCIPAL --allow-principal
>> > > > > > > name=ALPHA-GAMMA-SERVICE
>> > > > > > > > > > > > >    type=SERVICE_PRINCIPAL --allow-hosts
>> Host1,Host2
>> > > > > > > --operations
>> > > > > > > > > > > > Read,Write
>> > > > > > > > > > > > >    --topic Test-topic
>> > > > > > > > > > > > >       1. *userDefinedPackage.kafka.
>> > > > > > security.PrincipalBuilder*
>> > > > > > > is
>> > > > > > > > > the
>> > > > > > > > > > > > user
>> > > > > > > > > > > > >       defined PrincipalBuilder class.
>> > > > > > > > > > > > >       2. *principalBuilderService.rest.url=URL*
>> can
>> > > be a
>> > > > > > > remote
>> > > > > > > > > > > service
>> > > > > > > > > > > > >       that provides you an HTTP endpoint which
>> takes
>> > > in a
>> > > > > set
>> > > > > > > of
>> > > > > > > > > > > > > parameters and
>> > > > > > > > > > > > >       provides you with the Principal.
>> > > > > > > > > > > > >       3. *name=bob type=USER_PRINCIPAL* can be
>> used
>> > by
>> > > > > > > > > > PrincipalBuilder
>> > > > > > > > > > > > to
>> > > > > > > > > > > > >       create UserPrincipal with name as bob
>> > > > > > > > > > > > >       4. *name=ALPHA-GAMMA-SERVICE
>> > > type=SERVICE_PRINCIPAL
>> > > > > > *can
>> > > > > > > be
>> > > > > > > > > > used
>> > > > > > > > > > > by
>> > > > > > > > > > > > >       PrincipalBuilder to create a
>> ServicePrincipal
>> > > with
>> > > > > name
>> > > > > > > as
>> > > > > > > > > > > > >       ALPHA-GAMMA-SERVICE.
>> > > > > > > > > > > > >    - This seems more flexible and intuitive to me
>> > from
>> > > > end
>> > > > > > > user's
>> > > > > > > > > > > > >    perspective.
>> > > > > > > > > > > > >
>> > > > > > > > > > > > >
>> > > > > > > > > > > > Hmm, normally, the configurations you specify for
>> > > plug-ins
>> > > > > > refer
>> > > > > > > to
>> > > > > > > > > > those
>> > > > > > > > > > > > needed to construct the plug-in object. So, it's
>> kind
>> > of
>> > > > > weird
>> > > > > > to
>> > > > > > > > use
>> > > > > > > > > > > that
>> > > > > > > > > > > > to call a method. For example, why can't
>> > > > > > > > > principalBuilderService.rest.
>> > > > > > > > > > > url
>> > > > > > > > > > > > be passed in through the configure() method and the
>> > > > > > > implementation
>> > > > > > > > > can
>> > > > > > > > > > > use
>> > > > > > > > > > > > that to build principal. This way, there is only a
>> > single
>> > > > > > method
>> > > > > > > to
>> > > > > > > > > > > compute
>> > > > > > > > > > > > the principal in a consistent way in the broker and
>> in
>> > > the
>> > > > > > > > kafka-acl
>> > > > > > > > > > > tool.
>> > > > > > > > > > > >
>> > > > > > > > > > > > For LinkedIn's use case, do you actually use the
>> > > kafka-acl
>> > > > > > tool?
>> > > > > > > My
>> > > > > > > > > > > > understanding is that LinkedIn does authorization
>> > through
>> > > > an
>> > > > > > > > external
>> > > > > > > > > > > tool.
>> > > > > > > > > > > > It seems it's simpler if kafka-acl doesn't to need
>> to
>> > > > > > understand
>> > > > > > > > the
>> > > > > > > > > > > > principal builder. The tool does authorization based
>> > on a
>> > > > > > string
>> > > > > > > > > name,
>> > > > > > > > > > > > which is expected to match the principal name. So,
>> I am
>> > > > > > wondering
>> > > > > > > > why
>> > > > > > > > > > the
>> > > > > > > > > > > > tool needs to know the principal builder. What if we
>> > only
>> > > > > make
>> > > > > > > the
>> > > > > > > > > > > > following changes: pass the java principal in
>> session
>> > and
>> > > > in
>> > > > > > > > > > > > SimpleAuthorizer, construct KafkaPrincipal from java
>> > > > > principal
>> > > > > > > > name.
>> > > > > > > > > > Will
>> > > > > > > > > > > > that work for LinkedIn?
>> > > > > > > > > > > >
>> > > > > > > > > > > >
>> > > > > > > > > > > >
>> > > > > > > > > > > > > Principal buildPrincipal(Map<String, ?>
>> > > principalConfigs)
>> > > > > > will
>> > > > > > > be
>> > > > > > > > > > > called
>> > > > > > > > > > > > > from the commandline client kafka-acls.sh while
>> the
>> > > other
>> > > > > API
>> > > > > > > can
>> > > > > > > > > be
>> > > > > > > > > > > > called
>> > > > > > > > > > > > > at runtime when Kafka receives a client request
>> over
>> > > > > request
>> > > > > > > > > channel.
>> > > > > > > > > > > > >
>> > > > > > > > > > > > > 4. The KIP has "If users use there custom
>> > > > PrincipalBuilder,
>> > > > > > > they
>> > > > > > > > > will
>> > > > > > > > > > > > have
>> > > > > > > > > > > > > to implement there custom Authorizer as the out of
>> > box
>> > > > > > > Authorizer
>> > > > > > > > > > that
>> > > > > > > > > > > > > Kafka provides uses KafkaPrincipal." This is not
>> > ideal
>> > > > for
>> > > > > > > > existing
>> > > > > > > > > > > > users.
>> > > > > > > > > > > > > Could we avoid that?
>> > > > > > > > > > > > > ---> Yes, this is possible to avoid if we do
>> point 2.
>> > > > > > > > > > > > >
>> > > > > > > > > > > > >
>> > > > > > > > > > > > > Thanks,
>> > > > > > > > > > > > >
>> > > > > > > > > > > > > Mayuresh
>> > > > > > > > > > > > >
>> > > > > > > > > > > > > On Wed, Feb 8, 2017 at 3:31 PM, Jun Rao <
>> > > > j...@confluent.io>
>> > > > > > > > wrote:
>> > > > > > > > > > > > >
>> > > > > > > > > > > > > > Hi, Mayuresh,
>> > > > > > > > > > > > > >
>> > > > > > > > > > > > > > Thanks for the KIP. A few comments below.
>> > > > > > > > > > > > > >
>> > > > > > > > > > > > > > 1. It seems the problem that you are trying to
>> > > address
>> > > > is
>> > > > > > > that
>> > > > > > > > > java
>> > > > > > > > > > > > > > principal returned from KafkaChannel may have
>> > > > additional
>> > > > > > > fields
>> > > > > > > > > > than
>> > > > > > > > > > > > name
>> > > > > > > > > > > > > > that are needed during authorization. Have you
>> > > > > considered a
>> > > > > > > > > > > customized
>> > > > > > > > > > > > > > PrincipleBuilder that extracts all needed fields
>> > from
>> > > > > java
>> > > > > > > > > > principal
>> > > > > > > > > > > > and
>> > > > > > > > > > > > > > squeezes them as a json in the name of the
>> returned
>> > > > > > > principal?
>> > > > > > > > > > Then,
>> > > > > > > > > > > > the
>> > > > > > > > > > > > > > authorizer can just parse the json and extract
>> > needed
>> > > > > > fields.
>> > > > > > > > > > > > > >
>> > > > > > > > > > > > > > 2. Could you explain how the default authorizer
>> > works
>> > > > > now?
>> > > > > > > > > > Currently,
>> > > > > > > > > > > > the
>> > > > > > > > > > > > > > code just compares the two principal objects.
>> Are
>> > we
>> > > > > > > converting
>> > > > > > > > > the
>> > > > > > > > > > > > java
>> > > > > > > > > > > > > > principal to a KafkaPrincipal there?
>> > > > > > > > > > > > > >
>> > > > > > > > > > > > > > 3. Do we need to add the following method in
>> > > > > > > PrincipalBuilder?
>> > > > > > > > > The
>> > > > > > > > > > > > > configs
>> > > > > > > > > > > > > > are already passed in through configure() and an
>> > > > > > > implementation
>> > > > > > > > > can
>> > > > > > > > > > > > cache
>> > > > > > > > > > > > > > it and use it in buildPrincipal(). It's also not
>> > > clear
>> > > > to
>> > > > > > me
>> > > > > > > > > where
>> > > > > > > > > > we
>> > > > > > > > > > > > > call
>> > > > > > > > > > > > > > the new and the old method, and whether both
>> will
>> > be
>> > > > > called
>> > > > > > > or
>> > > > > > > > > one
>> > > > > > > > > > of
>> > > > > > > > > > > > > them
>> > > > > > > > > > > > > > will be called.
>> > > > > > > > > > > > > > Principal buildPrincipal(Map<String, ?>
>> > > > > principalConfigs);
>> > > > > > > > > > > > > >
>> > > > > > > > > > > > > > 4. The KIP has "If users use there custom
>> > > > > PrincipalBuilder,
>> > > > > > > > they
>> > > > > > > > > > will
>> > > > > > > > > > > > > have
>> > > > > > > > > > > > > > to implement there custom Authorizer as the out
>> of
>> > > box
>> > > > > > > > Authorizer
>> > > > > > > > > > > that
>> > > > > > > > > > > > > > Kafka provides uses KafkaPrincipal." This is not
>> > > ideal
>> > > > > for
>> > > > > > > > > existing
>> > > > > > > > > > > > > users.
>> > > > > > > > > > > > > > Could we avoid that?
>> > > > > > > > > > > > > >
>> > > > > > > > > > > > > > Thanks,
>> > > > > > > > > > > > > >
>> > > > > > > > > > > > > > Jun
>> > > > > > > > > > > > > >
>> > > > > > > > > > > > > >
>> > > > > > > > > > > > > > On Fri, Feb 3, 2017 at 11:25 AM, Mayuresh
>> Gharat <
>> > > > > > > > > > > > > > gharatmayures...@gmail.com
>> > > > > > > > > > > > > > > wrote:
>> > > > > > > > > > > > > >
>> > > > > > > > > > > > > > > Hi All,
>> > > > > > > > > > > > > > >
>> > > > > > > > > > > > > > > It seems that there is no further concern with
>> > the
>> > > > > > KIP-111.
>> > > > > > > > At
>> > > > > > > > > > this
>> > > > > > > > > > > > > point
>> > > > > > > > > > > > > > > we would like to start the voting process. The
>> > KIP
>> > > > can
>> > > > > be
>> > > > > > > > found
>> > > > > > > > > > at
>> > > > > > > > > > > > > > > https://cwiki.apache.org/
>> > confluence/pages/viewpage
>> > > .
>> > > > > > > > > > > > > > action?pageId=67638388
>> > > > > > > > > > > > > > >
>> > > > > > > > > > > > > > > Thanks,
>> > > > > > > > > > > > > > >
>> > > > > > > > > > > > > > > Mayuresh
>> > > > > > > > > > > > > > >
>> > > > > > > > > > > > > >
>> > > > > > > > > > > > >
>> > > > > > > > > > > > > Thanks,
>> > > > > > > > > > > > >
>> > > > > > > > > > > > > --
>> > > > > > > > > > > > > -Regards,
>> > > > > > > > > > > > > Mayuresh R. Gharat
>> > > > > > > > > > > > > (862) 250-7125
>> > > > > > > > > > > > >
>> > > > > > > > > > > >
>> > > > > > > > > > > > Thanks,
>> > > > > > > > > > > >
>> > > > > > > > > > > > Jun
>> > > > > > > > > > > >
>> > > > > > > > > > >
>> > > > > > > > > > >
>> > > > > > > > > > >
>> > > > > > > > > > > --
>> > > > > > > > > > > -Regards,
>> > > > > > > > > > > Mayuresh R. Gharat
>> > > > > > > > > > > (862) 250-7125
>> > > > > > > > > > >
>> > > > > > > > > >
>> > > > > > > > >
>> > > > > > > >
>> > > > > > >
>> > > > > >
>> > > > >
>> > > > >
>> > > > >
>> > > > > --
>> > > > > -Regards,
>> > > > > Mayuresh R. Gharat
>> > > > > (862) 250-7125
>> > > > >
>> > > >
>> > >
>> >
>> >
>> >
>> > --
>> > -Regards,
>> > Mayuresh R. Gharat
>> > (862) 250-7125
>> >
>>
>
>
>
> --
> -Regards,
> Mayuresh R. Gharat
> (862) 250-7125
>



-- 
-Regards,
Mayuresh R. Gharat
(862) 250-7125

Reply via email to