I have created 2 branches in my repository to implement the Trie changes.
- https://github.com/Claudenw/kafka/compare/trunk...StandardAuthorizer_refactor refactors the authorizer code to make it easy to implement a different Authorizor data block that plugs into the StandardAuthorizor. - https://github.com/Claudenw/kafka/compare/StandardAuthorizer_refactor...KIP-1042_trie_simplification applies the Trie changes to the authorizer refactor. On Fri, Aug 2, 2024 at 10:07 AM Claude Warren, Jr <claude.war...@aiven.io> wrote: > Proposed Changes >> This KIP suggests to support *MATCH* resource pattern type when creating >> a new kafka acl. >> > > I do not think we need the MATCH support within the Authorizer as noted in > my earlier message. > > *Main changes include :* >> >> - Adding support for MATCH when creating new acl in above and below >> classes >> >> > Strike this ^. > >> >> - Updating Authorizer >> >> >> - AdminClient changes >> >> >> - Updating cli >> >> *Detailed changes also include * >> >> - Modification of the org.apache.kafka.server.authorizer.Authorizer >> class to update authorizeByResourceType method >> >> > Authorizer is an interface, while we can update the default > implementation the Trie changes have moved the StandardAuthorizer > implementation down into the StandardAuthorizerData class. I do not think > that there are any changes to this functionality required. What do you > think needs to be done? > > >> - Modification of the kafka.security.authorizer.AclAuthorizer class to >> >> >> - update authorizeByResourceType method and other methods >> >> >> - update matchingAcls (this is performance sensitive, as it impacts >> latency of every producer and consumer client to get authorization. Verify >> AuthorizerBenchmark) >> >> >> - Modification of the kafka.admin.AclCommand class to update multiple >> methods like getResourceFilter and objects for parsing arguments >> AclCommandOptions >> >> >> - Modification of the kafka.zk.ZkData class to update multiple >> objects like ZkAclStore >> >> > Let's not support ZK with this change. > >> >> - Modification of kafka.server.AuthHelper class to update authorize >> method >> >> >> - Modification of the org.apache.kafka.jmh.acl.AuthorizerBenchmark >> class to update multiple methods like setup and prepareAclCache >> >> >> - Modification of >> org.apache.kafka.jmh.acl.StandardAuthorizerUpdateBenchmark class to update >> prepareAcls method >> >> >> - Modification of >> org.apache.kafka.metadata.authorizer.StandardAuthorizerData class to >> update >> authorize method >> >> >> - Modification of org.apache.kafka.controller.AclControlManager class >> to update validateNewAcl method >> >> >> - Updating tests >> >> >> - Similar to prefixed, match ACLs will be stored under the ZK path: >> '/kafka-acl-extended/<pattern-type>' and change events to such ACLs will >> be >> stored under: '/kafka-acl-extended-changes'. where pattern type will be >> prefixed or match >> >> >> *Optimization* for existing LITERAL/PREFIX >> >> - Currently LITERAL lookups still go through the tree lookup, while >> they can be moved to *hash-lookup* >> >> >> - For PREFIX : with a Trie-based solution. Refactor matchingAcls >> method in AclAuthorizer.scala, to match LITERAL and PREFIXED acls. >> >> >> - Define the Trie structure >> >> >> - Populate the Trie with ACLs >> >> >> - Retrieve ACLs using the Trie >> >> With this optimization, we hope to have a drastic reduced latency in the >> matchingAcls method, and it's much more efficient. > > The entire Optimization section can be removed as the Trie based solution > solves the LITERLAL, PREFIX and wildcard lookup problems. > > > On Fri, Aug 2, 2024 at 9:55 AM Claude Warren, Jr <claude.war...@aiven.io> > wrote: > >> I do not think we need to add the additional MATCH and ALL into the >> Authorizer. Currently we have >> >> - Literal - matches exactly >> - Prefix - Will match patterns that are longer as long as the part >> specified matches exactly. >> >> The Trie proposal works well with just these two. The wildcard is >> introduced as a pivot point in the trie, so any wildcard is on a node in >> the trie by itself. Ignoring the DENY and wildcard processing for a >> moment, when searching we descend the trie looking for the best matching >> node (LITERAL or PREFIX) and then check if there are ACLs on that node that >> match the request. If not we move to the parent node and check there. We >> continue up the tree until we find a match or reach the root (NO MATCH). >> >> For wildcard processing we insert an extra step before each move up to >> the parent we check for a wildcard match. For the wildcard to match at >> this point it must be a PREFIX type. By requiring a PREFIX type we can >> allow "*" and "?" as valid characters in a LITERAL match. >> >> DENY processing is performed during descent of the and matches PREFIX >> when or LITERAL depending on whether or not there is an exact match. >> >> Claude >> >> On Mon, Jul 29, 2024 at 8:36 AM Claude Warren, Jr <claude.war...@aiven.io> >> wrote: >> >>> I have updated the KIP with results from the Trie implementation and >>> they are dramatic to say the least. For most searches they are at least an >>> order of magnitude faster and use less memory. The wildcard search is not >>> a regular expression but rather a file type wild card (*=1 or more >>> character, ?=1 character). >>> >>> Code is available on my personal branch [1]. It is not fully documented >>> and does not meet the checkstyle requirements yet. I also modified the jmh >>> tests to run the Trie tests and limit the test to the single case mentioned >>> in the KIP documentation. >>> >>> If there are no issues with this code, I will complete the documentation >>> and fix the checkstyle and then open a pull request. >>> >>> Claude >>> >>> [1] https://github.com/Claudenw/kafka/pull/new/KIP >>> -1042_Trie_Implementation >>> >>> On Mon, Jun 3, 2024 at 9:31 PM Muralidhar Basani >>> <muralidhar.bas...@aiven.io.invalid> wrote: >>> >>>> Hi, >>>> >>>> Just bumping this thread again. It seems no concerns have been raised so >>>> far. >>>> >>>> I'll request votes in 2 weeks. >>>> >>>> Thanks, >>>> Murali >>>> >>>> On Tue, May 28, 2024 at 1:24 PM Muralidhar Basani < >>>> muralidhar.bas...@aiven.io> wrote: >>>> >>>> > Hi all, >>>> > >>>> > Any other suggestions or objections to the proposal? >>>> > >>>> > Thanks, >>>> > Murali >>>> > >>>> > On Thu, May 23, 2024 at 10:18 AM Muralidhar Basani < >>>> > muralidhar.bas...@aiven.io> wrote: >>>> > >>>> >> Thanks Greg. >>>> >> I have updated KIP with details on optimisation of LITERAL too. >>>> >> >>>> >> Regarding limitations in performance by introducing MATCH is >>>> definitely a >>>> >> question. >>>> >> - By optimizing LITERAL and PREFIX we are gaining a few nano secs I >>>> >> think. (described in kip) >>>> >> - MATCH can be introduced only with a configuration. So by default, >>>> we >>>> >> can disable the MATCH check (ex : acls.pattern.match.enable=false), >>>> and if >>>> >> customer enables the config, only then add the lookup in the >>>> matchingAcls() >>>> >> - With the proposal already described in KIP for MATCH, we may not >>>> have >>>> >> any limitations., rather will be efficient. >>>> >> >>>> >> Maybe we are in good shape with these propositions >>>> >> >>>> >> Thanks, >>>> >> Murali >>>> >> >>>> >> >>>> >> >>>> >> On Tue, May 21, 2024 at 6:15 PM Greg Harris >>>> <greg.har...@aiven.io.invalid> >>>> >> wrote: >>>> >> >>>> >>> Hi Murali, >>>> >>> >>>> >>> I don't have a trie library in mind. I looked at the current >>>> >>> implementation of the StandardAuthorizer and found that we are >>>> already >>>> >>> benefiting from the prefix structure in the implementation [1]. The >>>> >>> current implementation appears to be a TreePSet [2]. >>>> >>> >>>> >>> Now, we've already made this tradeoff once with PREFIX: Prefixes are >>>> >>> less structured than literals, because with literals you can use a >>>> >>> hashing algorithm to jump directly to your relevant ACLs in O(1), >>>> but >>>> >>> with a prefix you either need to do multiple lookups, or some sort >>>> of >>>> >>> O(log(n)) lookup. And we determined that the ultimate limitation in >>>> >>> performance was worth it for the expressiveness. >>>> >>> We're making this tradeoff again with MATCH acls: wildcards are less >>>> >>> structured than prefixes or literals, because of the reasons I >>>> >>> mentioned earlier. We need to judge now if the ultimate limitation >>>> in >>>> >>> performance is worth it. >>>> >>> >>>> >>> I think your strategy for using the optimized layout for prefix and >>>> >>> literal matches is smart, because there does seem to be a gap in >>>> >>> performance possible. It makes me wonder why the optimized layout >>>> for >>>> >>> literals was not used when prefixes were added. Literal lookups >>>> still >>>> >>> go through the tree lookup, when they could be moved to a >>>> hash-lookup >>>> >>> instead. >>>> >>> That would allow users to "choose" for themselves on a convenience >>>> vs >>>> >>> performance scale: Smaller use-cases can add a single convenient >>>> >>> MATCH, and larger use-cases can add the multiple optimized PREFIXes. >>>> >>> >>>> >>> [1] >>>> >>> >>>> https://github.com/apache/kafka/blob/9fe3932e5c110443f7fa545fcf0b8f78574f2f73/metadata/src/main/java/org/apache/kafka/metadata/authorizer/StandardAuthorizerData.java#L319-L339 >>>> >>> [2] >>>> >>> >>>> https://github.com/apache/kafka/blob/9fe3932e5c110443f7fa545fcf0b8f78574f2f73/server-common/src/main/java/org/apache/kafka/server/immutable/pcollections/PCollectionsImmutableNavigableSet.java#L34 >>>> >>> >>>> >>> Thanks, >>>> >>> Greg >>>> >>> >>>> >>> On Tue, May 21, 2024 at 8:23 AM Muralidhar Basani >>>> >>> <muralidhar.bas...@aiven.io.invalid> wrote: >>>> >>> > >>>> >>> > @greg which library of trie you were thinking of ? There is one >>>> in the >>>> >>> > commons-collection I see. >>>> >>> > >>>> >>> > On Fri, May 17, 2024 at 3:55 PM Claude Warren <cla...@xenei.com> >>>> >>> wrote: >>>> >>> > >>>> >>> > > > >>>> >>> > > > This has implications for execution complexity: If we can't >>>> compute >>>> >>> > > > whether two patterns overlap, then we need to run both of >>>> them on >>>> >>> each >>>> >>> > > > piece of input to test if they both match. Under the current >>>> >>> > > > LITERAL/PREFIX system, we can optimize execution with a trie, >>>> but >>>> >>> that >>>> >>> > > > option wouldn't be available to us with MATCH. >>>> >>> > > > >>>> >>> > > >>>> >>> > > If we consider the case of an asterisk representing 1 or more >>>> >>> characters >>>> >>> > > then determining if 2 patterns overlap can be fairly simple and >>>> very >>>> >>> fast. >>>> >>> > > Let's call the text from the ACL the target, and the text from >>>> the >>>> >>> wildcard >>>> >>> > > matcher the candidate. >>>> >>> > > >>>> >>> > > When a wildcard pattern, excluding '*', is created: >>>> >>> > > >>>> >>> > > - the candidate text is broken into fragments separated by >>>> >>> characters >>>> >>> > > that are not Character.isLetterOrDigit() (See >>>> >>> > > >>>> >>> https://docs.oracle.com/javase/8/docs/api/java/lang/Character.html >>>> ). >>>> >>> > > - fragments that contain 1 character are ignored. >>>> >>> > > - fragments that contains 2 or more characters are scanned >>>> and >>>> >>> every >>>> >>> > > every pair of characters used to create a Hasher (See >>>> >>> > > >>>> >>> > > >>>> >>> >>>> https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/bloomfilter/Hasher.html >>>> >>> > > ) >>>> >>> > > that hasher is added to a Bloom filter associated with the >>>> >>> wildcard >>>> >>> > > pattern. >>>> >>> > > >>>> >>> > > When a target is being evaluated and matching wildcard entries >>>> are >>>> >>> to be >>>> >>> > > located. Split and create a bloom filter using entry and the >>>> same >>>> >>> strategy >>>> >>> > > as for the wildcard patterns above. These bloom filters will >>>> have >>>> >>> had more >>>> >>> > > pairs of characters added than for a matching wildcard pattern. >>>> >>> > > >>>> >>> > > Each filter contains the pattern for the unique pairs in the >>>> >>> fragments of >>>> >>> > > the original text: >>>> >>> > > >>>> >>> > > Now we can check the Bloom filters. >>>> >>> > > >>>> >>> > > To find potential matching patterns we can check to see if the >>>> Bloom >>>> >>> filter >>>> >>> > > for the pattern is contained within the bloom filter for the >>>> entry >>>> >>> text. >>>> >>> > > If so then we know that it is likely that the pairs of >>>> characters >>>> >>> specified >>>> >>> > > in the wild card (non-wildcard text) appear in the entry text. >>>> >>> > > >>>> >>> > > At this point we can evaluate the reduced number of patterns to >>>> see >>>> >>> which >>>> >>> > > ones actually match. >>>> >>> > > >>>> >>> > > Having reduced the candidates to the matching patterns we can >>>> then >>>> >>> use a >>>> >>> > > standard measure of similarity like the Levenshtein distance to >>>> >>> determine >>>> >>> > > which candidates require the fewest edits to evolve into the >>>> >>> target. The >>>> >>> > > one with the fewest edits is the most specific and should be >>>> applied. >>>> >>> > > >>>> >>> > > Now if you want to know which patterns overlap you have a >>>> similar >>>> >>> process. >>>> >>> > > >>>> >>> > > Each Bloom filter can calculate the estimated number of unique >>>> >>> fragments >>>> >>> > > that were added to it. If the filters are sorted by this >>>> >>> estimation, the >>>> >>> > > ones with the highest counts may contain the ones with the >>>> lowest >>>> >>> counts, >>>> >>> > > but a lower count can never contain a higher count. The >>>> calculation >>>> >>> to >>>> >>> > > perform the estimation can be skipped and the cardinality value >>>> of >>>> >>> each >>>> >>> > > Bloom filter can be used instead. You can then check the >>>> smaller >>>> >>> filters >>>> >>> > > against the larger ones and find where one candidate is >>>> contained >>>> >>> within >>>> >>> > > another. >>>> >>> > > >>>> >>> > > If you want to know if they intersect the BloomFilter from >>>> >>> > > commons-collections has an estimateIntersection as well as an >>>> >>> estimateUnion >>>> >>> > > method. Quick tests can be made between filters to see if >>>> there is >>>> >>> any >>>> >>> > > overlap before more complex analysis is performed. >>>> >>> > > >>>> >>> > > The solution here does not make the final comparisons easier, it >>>> >>> simply >>>> >>> > > reduces the search space to find the items that need to be >>>> compared. >>>> >>> > > >>>> >>> > > >>>> >>> > > On Mon, May 6, 2024 at 9:03 PM Greg Harris >>>> >>> <greg.har...@aiven.io.invalid> >>>> >>> > > wrote: >>>> >>> > > >>>> >>> > > > Hi Murali, >>>> >>> > > > >>>> >>> > > > Thanks for the KIP! >>>> >>> > > > >>>> >>> > > > I think I understand the motivation for this KIP in situations >>>> >>> where >>>> >>> > > > there are a "cross product" of topics for two or more >>>> variables X >>>> >>> and >>>> >>> > > > Y, and want to write ACLs for each of the variable axes. >>>> >>> > > > If you format your topics "X-Y-suffix", it's not easy to write >>>> >>> rules >>>> >>> > > > that apply to all "Y" topics, because you need to enumerate >>>> all of >>>> >>> the >>>> >>> > > > "X" values, and the problem persists even if you reorder the >>>> topic >>>> >>> > > > name. >>>> >>> > > > >>>> >>> > > > In my recent work on KIP-986 I found it necessary to introduce >>>> >>> > > > "namespaces" to group topics together, and I was going to >>>> replicate >>>> >>> > > > the ACL system to specify those namespaces. This change to >>>> the ACL >>>> >>> > > > system could increase the expressiveness and complexity of >>>> that >>>> >>> > > > feature, if it is ever implemented. >>>> >>> > > > One of the primitives I needed when specifying namespaces was >>>> the >>>> >>> > > > ability to tell when two namespaces overlapped (i.e. does >>>> there >>>> >>> exist >>>> >>> > > > any topic which is present in both namespaces). This is >>>> trivial to >>>> >>> do >>>> >>> > > > with the current PREFIX and LITERAL system, as we can find the >>>> >>> > > > maximum-length common prefix with just some length >>>> comparisons and >>>> >>> > > > equality checks. >>>> >>> > > > I considered specifying namespaces via regular expressions, >>>> and >>>> >>> found >>>> >>> > > > that it was computationally much more difficult. Computing the >>>> >>> > > > intersection of two regexes appears to be exponential in the >>>> >>> length of >>>> >>> > > > the regexes, leading me to avoid adding it. >>>> >>> > > > >>>> >>> > > > I understand that you're not suggesting full REGEX support, >>>> and >>>> >>> that >>>> >>> > > > "namespaces" don't need to support MATCH, but I think MATCH >>>> may run >>>> >>> > > > into related difficulties. Any MATCH can overlap with any >>>> other >>>> >>> MATCH >>>> >>> > > > or PREFIX if it includes a sufficient number of wildcards. For >>>> >>> > > > example: >>>> >>> > > > MATCH *-accounts-* has overlap with PREFIX nl as they can both >>>> >>> match >>>> >>> > > > "nl-accounts-localtopic", but that isn't sensitive to the >>>> contents >>>> >>> > > > "nl", it is true for any PREFIX. >>>> >>> > > > MATCH *-accounts-* has overlap with MATCH *localtopic, as >>>> they can >>>> >>> > > > both match "nl-accounts-localtopic", but that isn't actually >>>> >>> sensitive >>>> >>> > > > to the contents "localtopic", it's true for any MATCH which >>>> >>> includes a >>>> >>> > > > wildcard at the beginning. >>>> >>> > > > >>>> >>> > > > This has implications for execution complexity: If we can't >>>> compute >>>> >>> > > > whether two patterns overlap, then we need to run both of >>>> them on >>>> >>> each >>>> >>> > > > piece of input to test if they both match. Under the current >>>> >>> > > > LITERAL/PREFIX system, we can optimize execution with a trie, >>>> but >>>> >>> that >>>> >>> > > > option wouldn't be available to us with MATCH. >>>> >>> > > > >>>> >>> > > > The current system makes users evaluate a trade-off: >>>> >>> > > > 1. Optimize the number of ACLs by organizing topics according >>>> to >>>> >>> > > > prefixes (for example, "accounts-localtopic-nl" and PREFIX >>>> >>> "accounts", >>>> >>> > > > PREFIX "accounts-localtopic") >>>> >>> > > > 2. Use less-structured topic names, with a corresponding ACL >>>> scheme >>>> >>> > > > that has more individual rules. >>>> >>> > > > The system currently informs users of this tradeoff by making >>>> them >>>> >>> > > > write multiple ACLs, and making them think "there has got to >>>> be a >>>> >>> > > > better way!". Perhaps we can find a better way to surface >>>> this best >>>> >>> > > > practice, or better inform users about it. >>>> >>> > > > >>>> >>> > > > I understand that there are going to be situations more >>>> complex >>>> >>> than >>>> >>> > > > your example, where multiple individual rules will always be >>>> >>> necessary >>>> >>> > > > with only PREFIX evaluation. I think even in those >>>> situations, a >>>> >>> > > > number of efficient-to-evaluate rules is preferable to just >>>> one >>>> >>> > > > expensive-to-evaluate rule. >>>> >>> > > > >>>> >>> > > > One alternative that I thought of could be "PARAMETERIZED" >>>> ACLs >>>> >>> which >>>> >>> > > > are like PREFIXED, but allow some parameter substitution. For >>>> >>> example >>>> >>> > > > PARAMETERIZED "(nl|de|cz)-accounts-". I'm lifting regex syntax >>>> >>> here, >>>> >>> > > > but this isn't actually a regex, and wouldn't allow arbitrary >>>> >>> numbers >>>> >>> > > > of characters, or the * or + operators. >>>> >>> > > > In the background it could evaluate exactly like the 3 >>>> individual >>>> >>> > > > PREFIX rules, but be easier to evaluate on the backend, and >>>> support >>>> >>> > > > the intersection query I mentioned earlier. It could also >>>> support >>>> >>> > > > [a-zA-Z] notation in case the parameter values aren't known >>>> ahead >>>> >>> of >>>> >>> > > > time, but have a fixed length. >>>> >>> > > > >>>> >>> > > > Thanks, >>>> >>> > > > Greg >>>> >>> > > > >>>> >>> > > > On Mon, May 6, 2024 at 11:17 AM Claude Warren < >>>> cla...@xenei.com> >>>> >>> wrote: >>>> >>> > > > > >>>> >>> > > > > I have an idea for how to reduce the time for ACL lookups in >>>> >>> general >>>> >>> > > and >>>> >>> > > > > particularly where wildcards are involved using sequence >>>> >>> > > > > characterization techniques from bioinformatics. But I >>>> need a >>>> >>> set of >>>> >>> > > ACL >>>> >>> > > > > patterns and associated topics to test with. >>>> >>> > > > > >>>> >>> > > > > On Fri, May 3, 2024 at 2:45 PM Haruki Okada < >>>> ocadar...@gmail.com >>>> >>> > >>>> >>> > > wrote: >>>> >>> > > > > >>>> >>> > > > > > Hi, Murali. >>>> >>> > > > > > >>>> >>> > > > > > First, could you add the KIP-1042 to the index ( >>>> >>> > > > > > >>>> >>> > > > > > >>>> >>> > > > >>>> >>> > > >>>> >>> >>>> https://cwiki.apache.org/confluence/display/KAFKA/Kafka+Improvement+Proposals >>>> >>> > > > > > ) >>>> >>> > > > > > as well so that everyone can find it easily? >>>> >>> > > > > > >>>> >>> > > > > > I took a look at the KIP, then I have 2 questions: >>>> >>> > > > > > >>>> >>> > > > > > 1. Though the new MATCH resource pattern type may reduce >>>> the >>>> >>> effort >>>> >>> > > of >>>> >>> > > > > > adding ACLs in some cases, do you have any concrete use >>>> case >>>> >>> you are >>>> >>> > > in >>>> >>> > > > > > mind? (When prefixed ACL was introduced in KIP-290, there >>>> was a >>>> >>> > > > use-case >>>> >>> > > > > > that using it for implementing multi-tenancy) >>>> >>> > > > > > >>>> >>> > > > > > 2. As you may know, ACL lookup is in the hot-path which >>>> the >>>> >>> > > > performance is >>>> >>> > > > > > very important. ( >>>> >>> > > > > > >>>> >>> > > > > > >>>> >>> > > > >>>> >>> > > >>>> >>> >>>> https://github.com/apache/kafka/blob/240243b91d69c2b65b5e456065fdcce90c121b04/core/src/main/scala/kafka/security/authorizer/AclAuthorizer.scala#L539 >>>> >>> > > > > > ). >>>> >>> > > > > > Do you have ideas how do we update `matchingAcls` to >>>> support >>>> >>> > > > MATCH-type ACL >>>> >>> > > > > > without introducing performance issue? >>>> >>> > > > > > >>>> >>> > > > > > >>>> >>> > > > > > Thanks, >>>> >>> > > > > > >>>> >>> > > > > > 2024年5月3日(金) 19:51 Claude Warren, Jr < >>>> claude.war...@aiven.io >>>> >>> > > .invalid>: >>>> >>> > > > > > >>>> >>> > > > > > > As I wrote in [1], the ACL evaluation algorithm needs >>>> to be >>>> >>> > > specified >>>> >>> > > > > > with >>>> >>> > > > > > > respect to the specificity of the pattern so that we >>>> know >>>> >>> exactly >>>> >>> > > > which >>>> >>> > > > > > if >>>> >>> > > > > > > *-accounts-* takes precedence over nl-accounts-* or visa >>>> >>> versa. >>>> >>> > > > > > > >>>> >>> > > > > > > I think that we should spell out that precedence is >>>> >>> evaluated as >>>> >>> > > > follows: >>>> >>> > > > > > > >>>> >>> > > > > > > 1. Remove patterns that do not match >>>> >>> > > > > > > 2. More specific patterns take precedence over less >>>> specific >>>> >>> > > patterns >>>> >>> > > > > > > 3. for patterns of the same precedence DENY overrides >>>> ALLOW >>>> >>> > > > > > > >>>> >>> > > > > > > Determining specificity: >>>> >>> > > > > > > >>>> >>> > > > > > > Specificity is based on the Levenshtein distance >>>> between the >>>> >>> > > pattern >>>> >>> > > > and >>>> >>> > > > > > > the text being evaluated. The lower the distance the >>>> more >>>> >>> specific >>>> >>> > > > the >>>> >>> > > > > > > rule. >>>> >>> > > > > > > Using the topic name: nl-accounts-localtopic we can >>>> evaluate >>>> >>> the >>>> >>> > > > > > > Levenshtein distance for various patterns. >>>> >>> > > > > > > nl-accounts-localtopic = 0 >>>> >>> > > > > > > *-accounts-localtopic = 2 >>>> >>> > > > > > > nl-accounts-local* = 5 >>>> >>> > > > > > > *-accounts-local* = 7 >>>> >>> > > > > > > nl-accounts-* = 10 >>>> >>> > > > > > > *-accounts-* = 12 >>>> >>> > > > > > > >>>> >>> > > > > > > In the special case of matching principles User matches >>>> are >>>> >>> more >>>> >>> > > > specific >>>> >>> > > > > > > than Group matches. >>>> >>> > > > > > > >>>> >>> > > > > > > I don't know if this should be added to KIP-1042 or >>>> >>> presented as a >>>> >>> > > > new >>>> >>> > > > > > KIP. >>>> >>> > > > > > > >>>> >>> > > > > > > Claude >>>> >>> > > > > > > >>>> >>> > > > > > > [1] >>>> >>> > > >>>> https://lists.apache.org/thread/0l88tkbxq3ol9rnx0ljnmswj5y6pho1f >>>> >>> > > > > > > < >>>> >>> > > > > > > >>>> >>> > > > > > >>>> >>> > > > >>>> >>> > > >>>> >>> >>>> https://cwiki.apache.org/confluence/display/KAFKA/KIP-1042%3A+Support+for+wildcard+when+creating+new+acls >>>> >>> > > > > > > > >>>> >>> > > > > > > >>>> >>> > > > > > > On Fri, May 3, 2024 at 12:18 PM Claude Warren < >>>> >>> cla...@xenei.com> >>>> >>> > > > wrote: >>>> >>> > > > > > > >>>> >>> > > > > > > > Took me awhile to find it but the link to the KIP is >>>> >>> > > > > > > > >>>> >>> > > > > > > > >>>> >>> > > > > > > >>>> >>> > > > > > >>>> >>> > > > >>>> >>> > > >>>> >>> >>>> https://cwiki.apache.org/confluence/display/KAFKA/KIP-1042%3A+Support+for+wildcard+when+creating+new+acls >>>> >>> > > > > > > > >>>> >>> > > > > > > > On Fri, May 3, 2024 at 10:13 AM Murali Basani < >>>> >>> > > > murali.bas...@gmail.com >>>> >>> > > > > > > >>>> >>> > > > > > > > wrote: >>>> >>> > > > > > > > >>>> >>> > > > > > > > > Hello, >>>> >>> > > > > > > > > >>>> >>> > > > > > > > > I'd like to propose a suggestion to our resource >>>> >>> patterns in >>>> >>> > > > Kafka >>>> >>> > > > > > > ACLs. >>>> >>> > > > > > > > > >>>> >>> > > > > > > > > Currently, when adding new ACLs in Kafka, we have >>>> two >>>> >>> types of >>>> >>> > > > > > resource >>>> >>> > > > > > > > > patterns for topics: >>>> >>> > > > > > > > > >>>> >>> > > > > > > > > - LITERAL >>>> >>> > > > > > > > > - PREFIXED >>>> >>> > > > > > > > > >>>> >>> > > > > > > > > However, when it comes to listing or removing ACLs, >>>> we >>>> >>> have a >>>> >>> > > > couple >>>> >>> > > > > > > more >>>> >>> > > > > > > > > options: >>>> >>> > > > > > > > > >>>> >>> > > > > > > > > - MATCH >>>> >>> > > > > > > > > - ANY (will match any pattern type) >>>> >>> > > > > > > > > >>>> >>> > > > > > > > > >>>> >>> > > > > > > > > If we can extend creating acls as well with 'MATCH' >>>> >>> pattern >>>> >>> > > > type, it >>>> >>> > > > > > > > would >>>> >>> > > > > > > > > be very beneficial. Even though this kind of acl >>>> should >>>> >>> be >>>> >>> > > > created >>>> >>> > > > > > with >>>> >>> > > > > > > > > utmost care, it will help organizations streamline >>>> their >>>> >>> ACL >>>> >>> > > > > > management >>>> >>> > > > > > > > > processes. >>>> >>> > > > > > > > > >>>> >>> > > > > > > > > Example scenarios : >>>> >>> > > > > > > > > >>>> >>> > > > > > > > > Let's say we need to create ACLs for the following >>>> six >>>> >>> topics: >>>> >>> > > > > > > > > nl-accounts-localtopic, nl-accounts-remotetopic, >>>> >>> > > > > > > de-accounts-localtopic, >>>> >>> > > > > > > > > de-accounts-remotetopic, cz-accounts-localtopic, >>>> >>> > > > > > > cz-accounts-remotetopic >>>> >>> > > > > > > > > >>>> >>> > > > > > > > > Currently, we achieve this using existing >>>> functionality >>>> >>> by >>>> >>> > > > creating >>>> >>> > > > > > > three >>>> >>> > > > > > > > > prefixed ACLs as shown below: >>>> >>> > > > > > > > > >>>> >>> > > > > > > > > kafka-acls --bootstrap-server localhost:9092 \ >>>> >>> > > > > > > > > > --add \ >>>> >>> > > > > > > > > > --allow-principal >>>> >>> > > > > > > > > > >>>> >>> > > > > > > > > >>>> >>> > > > > > > > >>>> >>> > > > > > > >>>> >>> > > > > > >>>> >>> > > > >>>> >>> > > >>>> >>> >>>> User:CN=serviceuser,OU=ServiceUsers,O=Unknown,L=Unknown,ST=Unknown,C=Unknown >>>> >>> > > > > > > > > > \ >>>> >>> > > > > > > > > > --producer \ >>>> >>> > > > > > > > > > --topic nl-accounts- \ >>>> >>> > > > > > > > > > --resource-pattern-type prefixed >>>> >>> > > > > > > > > >>>> >>> > > > > > > > > >>>> >>> > > > > > > > > kafka-acls --bootstrap-server localhost:9092 \ >>>> >>> > > > > > > > > > --add \ >>>> >>> > > > > > > > > > --allow-principal >>>> >>> > > > > > > > > > >>>> >>> > > > > > > > > >>>> >>> > > > > > > > >>>> >>> > > > > > > >>>> >>> > > > > > >>>> >>> > > > >>>> >>> > > >>>> >>> >>>> User:CN=serviceuser,OU=ServiceUsers,O=Unknown,L=Unknown,ST=Unknown,C=Unknown >>>> >>> > > > > > > > > > \ >>>> >>> > > > > > > > > > --producer \ >>>> >>> > > > > > > > > > --topic de-accounts- \ >>>> >>> > > > > > > > > > --resource-pattern-type prefixed >>>> >>> > > > > > > > > >>>> >>> > > > > > > > > >>>> >>> > > > > > > > > kafka-acls --bootstrap-server localhost:9092 \ >>>> >>> > > > > > > > > > --add \ >>>> >>> > > > > > > > > > --allow-principal >>>> >>> > > > > > > > > > >>>> >>> > > > > > > > > >>>> >>> > > > > > > > >>>> >>> > > > > > > >>>> >>> > > > > > >>>> >>> > > > >>>> >>> > > >>>> >>> >>>> User:CN=serviceuser,OU=ServiceUsers,O=Unknown,L=Unknown,ST=Unknown,C=Unknown >>>> >>> > > > > > > > > > \ >>>> >>> > > > > > > > > > --producer \ >>>> >>> > > > > > > > > > --topic cz-accounts- \ >>>> >>> > > > > > > > > > --resource-pattern-type prefixed >>>> >>> > > > > > > > > >>>> >>> > > > > > > > > >>>> >>> > > > > > > > > However, if we had the 'MATCH' pattern type >>>> available, >>>> >>> we could >>>> >>> > > > > > > > accomplish >>>> >>> > > > > > > > > this with a single ACL, as illustrated here: >>>> >>> > > > > > > > > >>>> >>> > > > > > > > > kafka-acls --bootstrap-server localhost:9092 \ >>>> >>> > > > > > > > > > --add \ >>>> >>> > > > > > > > > > --allow-principal >>>> >>> > > > > > > > > > >>>> >>> > > > > > > > > >>>> >>> > > > > > > > >>>> >>> > > > > > > >>>> >>> > > > > > >>>> >>> > > > >>>> >>> > > >>>> >>> >>>> User:CN=serviceuser,OU=ServiceUsers,O=Unknown,L=Unknown,ST=Unknown,C=Unknown >>>> >>> > > > > > > > > > \ >>>> >>> > > > > > > > > > --producer \ >>>> >>> > > > > > > > > > --topic *-accounts-* \ >>>> >>> > > > > > > > > > --resource-pattern-type match >>>> >>> > > > > > > > > >>>> >>> > > > > > > > > >>>> >>> > > > > > > > > >>>> >>> > > > > > > > > This pattern closely resembles PREFIXED but offers >>>> >>> broader >>>> >>> > > > allow/deny >>>> >>> > > > > > > > > rules. >>>> >>> > > > > > > > > >>>> >>> > > > > > > > > Implementing this change could significantly reduce >>>> the >>>> >>> effort >>>> >>> > > in >>>> >>> > > > > > > several >>>> >>> > > > > > > > > acl management processes. >>>> >>> > > > > > > > > >>>> >>> > > > > > > > > I welcome your thoughts and any concerns you may >>>> have >>>> >>> regarding >>>> >>> > > > this >>>> >>> > > > > > > > > proposal. >>>> >>> > > > > > > > > >>>> >>> > > > > > > > > Thanks, >>>> >>> > > > > > > > > Murali >>>> >>> > > > > > > > > >>>> >>> > > > > > > > >>>> >>> > > > > > > > >>>> >>> > > > > > > > -- >>>> >>> > > > > > > > LinkedIn: http://www.linkedin.com/in/claudewarren >>>> >>> > > > > > > > >>>> >>> > > > > > > >>>> >>> > > > > > >>>> >>> > > > > > >>>> >>> > > > > > -- >>>> >>> > > > > > ======================== >>>> >>> > > > > > Okada Haruki >>>> >>> > > > > > ocadar...@gmail.com >>>> >>> > > > > > ======================== >>>> >>> > > > > > >>>> >>> > > > > >>>> >>> > > > > >>>> >>> > > > > -- >>>> >>> > > > > LinkedIn: http://www.linkedin.com/in/claudewarren >>>> >>> > > > >>>> >>> > > >>>> >>> > > >>>> >>> > > -- >>>> >>> > > LinkedIn: http://www.linkedin.com/in/claudewarren >>>> >>> > > >>>> >>> >>>> >> >>>> >>>