Jason

Do you anticipate any backward compatibility issues with existing custom 
implementation of the authorization interface/plugins?

Thanks

Bosco


On 8/25/17, 3:22 PM, "Jason Gustafson" <ja...@confluent.io> wrote:

    No problem. I'll add a note to the KIP to emphasize that we will use the
    same object built by the KafkaPrincipalBuilder in the Session object passed
    to the authorizer.
    
    -Jason
    
    On Fri, Aug 25, 2017 at 3:17 PM, Mayuresh Gharat <gharatmayures...@gmail.com
    > wrote:
    
    > Perfect.
    > As long as there is a way we can access the originally created Principal 
in
    > the Authorizer, it would solve the KIP-111 issue.
    >
    > This is really helpful, thanks again.
    >
    > Thanks,
    >
    > Mayuresh
    >
    > On Fri, Aug 25, 2017 at 3:13 PM, Jason Gustafson <ja...@confluent.io>
    > wrote:
    >
    > > Hi Mayuresh,
    > >
    > > To clarify, the intention is to use the KafkaPrincipal object built by
    > the
    > > KafkaPrincipalBuilder inside the Session. So we would remove the logic 
to
    > > construct a new KafkaPrincipal using only the name from the Principal.
    > Then
    > > it should be possible to pass the `AuthzPrincipal` to the underlying
    > > library through the `Extended_Plugged_In_Class` as you've suggested
    > above.
    > > Is that reasonable for this use case?
    > >
    > > Thanks,
    > > Jason
    > >
    > >
    > > On Fri, Aug 25, 2017 at 2:44 PM, Mayuresh Gharat <
    > > gharatmayures...@gmail.com
    > > > wrote:
    > >
    > > > Hi Jason,
    > > >
    > > > Thanks for the replies.
    > > >
    > > > I think it would be better to discuss with an example that we were
    > trying
    > > > to address with KIP-111 and see if the current mentioned solution 
would
    > > > address it.
    > > >
    > > > Let's consider a third party library called authz_lib that is provided
    > by
    > > > some Security team at  some company.
    > > >
    > > >    - When we call authz_lib.createPrincipal(X509_cert), it would
    > return
    > > an
    > > >    AuthzPrincipal that implements Java.Security.Principal.
    > > >
    > > >
    > > >    - The authz_lib also provides an checkAccess(....) call that takes
    > in
    > > 3
    > > >    parameters :
    > > >       - authz_principal
    > > >       - operation type ("Read", "Write"...)
    > > >       - resource (for simplicity lets consider it as a TopicName)
    > > >
    > > >
    > > >    - The AuthzPrincipal looks like this :
    > > >
    > > > class AuthzPrincipal implements java.security.Principal
    > > > {
    > > > String name;
    > > > String field1;
    > > > Object field2;
    > > > Object field3;
    > > > .....//Some third party logic......
    > > > }
    > > >
    > > >
    > > >    - In PrincipalBuilder.buildPrincipal() would return AuthzPrincipal
    > as
    > > >    follows :
    > > >
    > > > public Principal buildPrincipal(...)
    > > > {
    > > > ......
    > > > X509Certificate x509Cert = session.getCert(..);
    > > > return authz_lib.createPrincipal(x509Cert);
    > > > }
    > > >
    > > >
    > > >    - The custom Authorizer (lets call it CustomAuthzAuthorizer), we
    > would
    > > >    use the checkAccess() function provided by the authz_lib as follows
    > :
    > > >
    > > > public class CustomAuthzAuthorizer implements Authorizer
    > > > {
    > > > .........
    > > > public boolean authorize(.....)
    > > > {
    > > >            AuthzPrincipal authz_principal = (AuthzPrincipal)
    > > > session.getPrincipal();
    > > > return authz_lib.checkAccess(authz_principal, "Read", "topicX");
    > > > }
    > > > ..........
    > > > }
    > > >
    > > >
    > > >    - The issue with current implementation is that in
    > > >    processCompletedReceives() in SocketServer we create a
    > KafkaPrincipal
    > > >    that just extracts the name from AuthzPrincipal as follows :
    > > >
    > > >     session = RequestChannel.Session(new
    > > > KafkaPrincipal(KafkaPrincipal.USER_TYPE,
    > > > *openOrClosingChannel.principal.getName*),
    > > > openOrClosingChannel.socketAddress)
    > > >
    > > > So the "AuthzPrincipal authz_principal = (AuthzPrincipal)
    > > > session.getPrincipal()" call in the CustomAuthzAuthorizer would error
    > > > out because we are trying to cast a KafkaPrincipal to AuthzPrincipal.
    > > >
    > > >
    > > >
    > > > In your reply when you said that :
    > > >
    > > > The KIP says that a user can have a class that extends KafkaPrincipal.
    > > > Would this extended class be used when constructing the Session object
    > > > in the SocketServer instead of constructing a new KafkaPrincipal?
    > > >
    > > > Yes, that's correct. We want to allow the authorizer to be able to
    > > leverage
    > > > > additional information from the authentication layer.
    > > >
    > > >
    > > > Would it make sense to make this extended class pluggable and when
    > > > constructing the Session object in SocketServer check if a plugin is
    > > > defined and use it and if not use the default KafkaPrincipal something
    > > like
    > > > :
    > > >
    > > > if (getConfig("principal.pluggedIn.class").isDefined())
    > > > //"principal.pluggedIn.class"
    > > > is just an example name for the config
    > > > {
    > > > session = RequestChannel.Session(*Extended_Plugged_In_Class*,
    > > > openOrClosingChannel.socketAddress)
    > > > }
    > > > else
    > > > {
    > > > session = RequestChannel.Session(new KafkaPrincipal(KafkaPrincipal.
    > > > USER_TYPE,
    > > > *openOrClosingChannel.principal.getName*),
    > > > openOrClosingChannel.socketAddress)
    > > > }
    > > >
    > > > This would solve the issue above as follows :
    > > >
    > > > We can have something like :
    > > > public class Extended_Plugged_In_Class extends KafkaPrincipal
    > > > {
    > > > AuthzPrincipal authzPrincipal;
    > > >
    > > > public Extended_Plugged_In_Class(....., AuthzPrincipal principal)
    > > > {
    > > > super(...);
    > > > authzPrincipal = principal;
    > > >
    > > > }
    > > >
    > > > ......
    > > >
    > > > public AuthzPrincipal getAuthzPrincipal()
    > > > {
    > > > return authzPrincipal;
    > > > }
    > > > }
    > > >
    > > > In the CustomAuthzAuthorizer we could do something like :
    > > >
    > > > public class CustomAuthzAuthorizer implements Authorizer
    > > > {
    > > > .........
    > > > public boolean authorize(.....)
    > > > {
    > > > Extended_Plugged_In_Class  extended_Kafka_Principal =
    > > > (Extended_Plugged_In_Class)
    > > > session.getPrincipal();
    > > >            AuthzPrincipal authz_principal =
    > > > extended_Kafka_Principal.getAuthzPrincipal();
    > > > return authz_lib.checkAccess(authz_principal, "Read", "topicX");
    > > > }
    > > > ..........
    > > > }
    > > >
    > > >
    > > > Thanks,
    > > >
    > > > Mayuresh
    > > >
    > > > On Fri, Aug 25, 2017 at 11:53 AM, Jason Gustafson <ja...@confluent.io>
    > > > wrote:
    > > >
    > > > > Hey Mayuresh,
    > > > >
    > > > > Thanks for the comments.
    > > > >
    > > > >    - The KIP says that a user can have a class that extends
    > > > KafkaPrincipal.
    > > > > >    Would this extended class be used when constructing the Session
    > > > object
    > > > > > in
    > > > > >    the SocketServer instead of constructing a new KafkaPrincipal?
    > > > >
    > > > >
    > > > > Yes, that's correct. We want to allow the authorizer to be able to
    > > > leverage
    > > > > additional information from the authentication layer.
    > > > >
    > > > >     - The KIP says "A principal is always identifiable by a 
principal
    > > > type
    > > > > >    and a name. Nothing else should ever be required." This might
    > not
    > > be
    > > > > > true
    > > > > >    always, right? For example, we might have a custom third party
    > ACL
    > > > > > library
    > > > > >    that creates a custom Principal from the passed in cert (this 
is
    > > > done
    > > > > in
    > > > > >    PrincipalBuilder/KafkaPrincipalBuilder) and the custom
    > Authorizer
    > > > > might
    > > > > >    use this third party library to authorize using this custom
    > > > Principal
    > > > > >    object. The developer who is implementing the Kafka Authorizer
    > > > should
    > > > > >    not be caring about what the custom Principal would look like
    > and
    > > > its
    > > > > >    details, since it will just pass it to the third party library
    > in
    > > > > Kafka
    > > > > >    Authorizer's authorize() call.
    > > > >
    > > > >
    > > > > I'm not sure I understand this. Are you saying that the authorizer
    > and
    > > > > principal builder are implemented by separate individuals? If the
    > > > > authorizer doesn't understand how to identify the principal, then it
    > > > > wouldn't work, right? Maybe I'm missing something?
    > > > >
    > > > > Let me explain how I see this. The simple ACL authorizer that Kafka
    > > ships
    > > > > with understands user principals as consisting of a type and a name.
    > > Any
    > > > > principal builder that follows this assumption will work with the
    > > > > SimpleAclAuthorizer. In some cases, the principal builder may 
provide
    > > > > additional metadata in a KafkaPrincipal extension such as user 
groups
    > > or
    > > > > roles. This information is not needed to identify the user 
principal,
    > > so
    > > > > the builder is still compatible with the SimpleAclAuthorizer. It
    > would
    > > > also
    > > > > be compatible with a RoleBasedAuthorizer which understood how to use
    > > the
    > > > > role metadata provided by the KafkaPrincipal extension. Basically
    > what
    > > we
    > > > > would have is a user principal which is related to one or more role
    > > > > principals through the KafkaPrincipal extension. Both user and role
    > > > > principals are identifiable with a type and a name, so the ACL
    > command
    > > > tool
    > > > > can then be used (perhaps with a custom authorizer) to define
    > > permissions
    > > > > in either case.
    > > > >
    > > > > On the other hand, if a user principal is identified by more than
    > just
    > > > its
    > > > > name, then it is not compatible with the SimpleAclAuthorizer. This
    > > > doesn't
    > > > > necessarily rule out this use case. As long as the authorizer and 
the
    > > > > principal builder both agree on how user principals are identified,
    > > then
    > > > > they can still be used together. But I am explicitly leaving out
    > > support
    > > > in
    > > > > the ACL command tool for this use case in this KIP. This is mostly
    > > about
    > > > > clarifying what is compatible with the authorization system that
    > Kafka
    > > > > ships with. Of course we can always reconsider it in the future.
    > > > >
    > > > > Thanks,
    > > > > Jason
    > > > >
    > > > > On Fri, Aug 25, 2017 at 10:48 AM, Mayuresh Gharat <
    > > > > gharatmayures...@gmail.com> wrote:
    > > > >
    > > > > > Hi Jason,
    > > > > >
    > > > > > Thanks a lot for the KIP and sorry for the delayed response.
    > > > > >
    > > > > > I had a few questions :
    > > > > >
    > > > > >
    > > > > >    - The KIP says that a user can have a class that extends
    > > > > KafkaPrincipal.
    > > > > >    Would this extended class be used when constructing the Session
    > > > object
    > > > > > in
    > > > > >    the SocketServer instead of constructing a new KafkaPrincipal?
    > > > > >
    > > > > >
    > > > > >    - The KIP says "A principal is always identifiable by a
    > principal
    > > > type
    > > > > >    and a name. Nothing else should ever be required." This might
    > not
    > > be
    > > > > > true
    > > > > >    always, right? For example, we might have a custom third party
    > ACL
    > > > > > library
    > > > > >    that creates a custom Principal from the passed in cert (this 
is
    > > > done
    > > > > in
    > > > > >    PrincipalBuilder/KafkaPrincipalBuilder) and the custom
    > Authorizer
    > > > > might
    > > > > >    use this third party library to authorize using this custom
    > > > Principal
    > > > > >    object. The developer who is implementing the Kafka Authorizer
    > > > should
    > > > > >    not be caring about what the custom Principal would look like
    > and
    > > > its
    > > > > >    details, since it will just pass it to the third party library
    > in
    > > > > Kafka
    > > > > >    Authorizer's authorize() call.
    > > > > >
    > > > > >
    > > > > > Thanks,
    > > > > >
    > > > > > Mayuresh
    > > > > >
    > > > > >
    > > > > > On Thu, Aug 24, 2017 at 10:21 AM, Mayuresh Gharat <
    > > > > > gharatmayures...@gmail.com> wrote:
    > > > > >
    > > > > > > Sure.
    > > > > > >
    > > > > > > Thanks,
    > > > > > >
    > > > > > > Mayuresh
    > > > > > >
    > > > > > > On Wed, Aug 23, 2017 at 5:07 PM, Jun Rao <j...@confluent.io>
    > wrote:
    > > > > > >
    > > > > > >> Hi, Mayuresh,
    > > > > > >>
    > > > > > >> Since this KIP covers the requirement in KIP-111, could you
    > review
    > > > it
    > > > > > too?
    > > > > > >>
    > > > > > >> Thanks,
    > > > > > >>
    > > > > > >> Jun
    > > > > > >>
    > > > > > >>
    > > > > > >> On Tue, Aug 22, 2017 at 3:04 PM, Jason Gustafson <
    > > > ja...@confluent.io>
    > > > > > >> wrote:
    > > > > > >>
    > > > > > >>> Bump. I'll open a vote in a few days if there are no comments.
    > > > > > >>>
    > > > > > >>> Thanks,
    > > > > > >>> Jason
    > > > > > >>>
    > > > > > >>> On Sat, Aug 19, 2017 at 12:28 AM, Ismael Juma <
    > ism...@juma.me.uk
    > > >
    > > > > > wrote:
    > > > > > >>>
    > > > > > >>> > Thanks for the KIP Jason. It seems reasonable and cleans up
    > > some
    > > > > > >>> > inconsistencies in that area. It would be great to get some
    > > > > feedback
    > > > > > >>> from
    > > > > > >>> > Mayuresh and others who worked on KIP-111.
    > > > > > >>> >
    > > > > > >>> > Ismael
    > > > > > >>> >
    > > > > > >>> > On Thu, Aug 17, 2017 at 1:21 AM, Jason Gustafson <
    > > > > ja...@confluent.io
    > > > > > >
    > > > > > >>> > wrote:
    > > > > > >>> >
    > > > > > >>> > > Hi All,
    > > > > > >>> > >
    > > > > > >>> > > I've added a new KIP to improve and extend the principal
    > > > building
    > > > > > API
    > > > > > >>> > that
    > > > > > >>> > > Kafka exposes:
    > > > > > >>> > > https://cwiki.apache.org/confluence/display/KAFKA/KIP-
    > > > > > >>> > > 189%3A+Improve+principal+builder+interface+and+add+
    > > > > > support+for+SASL
    > > > > > >>> > > .
    > > > > > >>> > >
    > > > > > >>> > > As always, feedback is appreciated.
    > > > > > >>> > >
    > > > > > >>> > > Thanks,
    > > > > > >>> > > Jason
    > > > > > >>> > >
    > > > > > >>> >
    > > > > > >>>
    > > > > > >>
    > > > > > >>
    > > > > > >
    > > > > > >
    > > > > > > --
    > > > > > > -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