Ismael Thank you for the response I've walked through changes for KAFKA-3866. I think it shall fix the case I mentioned.
As for server side, I've added a jira wish issue: https://issues.apache.org/jira/browse/KAFKA-4874 I'm working on project with high security restrictions, so I need to find an application layer solution for now. Thanks Pawel On 9 March 2017 at 09:53, Ismael Juma <ism...@juma.me.uk> wrote: > Hi Pawel, > > It is by design that authentication is only performed during connection > establishment in the broker. Kafka relies on long-lived connections, which > means that another mechanism is needed to handle users who have been > removed from the system. A typical approach is to remove all ACLs for that > user, so that all actions are disallowed for connections that are still > live. Authentication will fail for any new connection. Some people would > prefer to have a way to deal with this scenario via authentication alone, > so it may be worth filing a JIRA. > > Regarding the client-side questions, the ticket refreshes are for the case > where a client needs to re-establish a connection. There are a few > improvements in the following JIRA: > > https://issues.apache.org/jira/browse/KAFKA-3866 > > Maybe you can check if it solves the issue you identified? If not, feel > free to add a comment to that JIRA. > > Thanks, > Ismael > > On Thu, Mar 9, 2017 at 7:27 AM, Paweł Tomasik <p.toma...@o2.pl> wrote: > >> Hi >> I've found a security issue in the kafka SASL implementation. >> It seems that ticket refreshments are not necessary to keep >> client-broker connection up. >> >> Test scenario: >> Client sucessfully connects to the broker using SASL_SSL security >> protocol. Kerberos server is provided by Windows Server 2012 and >> Active Directory >> Client principal account is disabled on Active Directory >> When Ticket expires the connection is still up and running. (Although >> client side is no able to refresh it since account is blocked) >> >> The problem root-cause on client side is located here: >> >> org.apache.kafka.common.security.kerberos::KerberosLogin.java Lines >> 239-263 >> In my test scenario: >> - Relogin fails >> - Thread sleeps for hardocded 10 second delay >> - Next relogin attempt is taken but immediately skipped because >> hasSufficientTimeElapsed returns false (default value of >> minTimeBeforeRelogin is set to 60 seconds) >> - Next attempt is scheduled for next minute, but connection is not closed. >> Process repeats >> >> Application logs: >> 2017-03-06 12:06:30,709 INFO >> [org.apache.kafka.common.security.kerberos.KerberosLogin] >> (kafka-kerberos-refresh-thread) Initiating re-login for >> host/domain.com >> 2017-03-06 12:06:40,713 WARN >> [org.apache.kafka.common.security.kerberos.KerberosLogin] >> (kafka-kerberos-refresh-thread) Not attempting to re-login since the >> last re-login was attempted less than 60 seconds before. >> 2017-03-06 12:06:40,714 WARN >> [org.apache.kafka.common.security.kerberos.KerberosLogin] >> (kafka-kerberos-refresh-thread) No TGT found: will try again at Mon >> Mar 06 12:07:40 CET 2017 >> 2017-03-06 12:06:40,714 INFO >> [org.apache.kafka.common.security.kerberos.KerberosLogin] >> (kafka-kerberos-refresh-thread) TGT refresh sleeping until: Mon Mar 06 >> 12:07:40 CET 2017 >> >> 2017-03-06 12:07:40,714 INFO >> [org.apache.kafka.common.security.kerberos.KerberosLogin] >> (kafka-kerberos-refresh-thread) Initiating logout for host/domain.com >> 2017-03-06 12:07:40,715 INFO >> [org.apache.kafka.common.security.kerberos.KerberosLogin] >> (kafka-kerberos-refresh-thread) Initiating re-login for >> host/domain.com >> 2017-03-06 12:07:50,717 WARN >> [org.apache.kafka.common.security.kerberos.KerberosLogin] >> (kafka-kerberos-refresh-thread) Not attempting to re-login since the >> last re-login was attempted less than 60 seconds before. >> 2017-03-06 12:07:50,717 WARN >> [org.apache.kafka.common.security.kerberos.KerberosLogin] >> (kafka-kerberos-refresh-thread) No TGT found: will try again at Mon >> Mar 06 12:08:50 CET 2017 >> >> On the broker side the problem seems to be even more severe, as the it >> seems not to verify ticket expiration date. >> So once client provides a valid ticket, it is no longer challenged >> against its refreshments. >> It looks that authentication is performed only once at connection >> establish point by default Krb5LoginModule implementation. It is not >> challenged later. >> >> I'm new here, so forgive me if it is not a good place for such posts. >> >> >> Best regards >> Pawel >> -- Paweł Tomasik