Sorry for the delay in getting to this Joel. This is great work - really well thought out and put together. I'm a +1 on it; had the following observations or questions reviewing the CEP:
Rather than going with a new discretely allowed option to a closed list of allowable options in STARTUP, what if we went the route we did with SUPPORTED and offered a variable [string multimap] so we could add future STARTUP options w/out fully revving the protocol spec in the future? (https://github.com/apache/cassandra/blob/trunk/doc/native_protocol_v5.spec#L462-L491) Any opinion on us deprecating the existing cassandra.yaml#authenticator: option to be renamed as "fallback_authenticator", and updating the text to reflect that? Or *default_authenticator*; something to denote through the naming that the role of that is secondary to the newly added *authenticator_negotiation*? I'm 50/50 on this; I don't love deprecation (knowing we're going to keep supporting the old nomenclature into perpetuity), but I do think the topic of auth is important enough that a little config disruption and maintenance here to steer new users to the new, more secure method of auth might warrant the change. > `‘requireAuthentication’ should be set to true as soon as all clients are > using other authenticators.` A hot prop or mutable vtable (... did we ever do mutable / change config through vtables? Hm, looks like not yet: https://issues.apache.org/jira/browse/CASSANDRA-15254) so we could change this live on a cluster w/out bouncing would be nice. Be nicer if that change also coincided w/a change in config via 1 UX through the DB. ;) But that's a *different* problem than what you're looking to address so worth deferring on that piece probably. re: thundering herd risk - this tickled my memory. We did some work on pre-caching things in the Auth cache and I *vaguely recall* getting it into its own ThreadPool; I was upstreaming other peoples' code so it's not as durable in my memory as usual. https://issues.apache.org/jira/browse/CASSANDRA-16958 and https://issues.apache.org/jira/browse/CASSANDRA-16957 come to mind. Ah, there we are: https://issues.apache.org/jira/browse/CASSANDRA-17812. We have a separate executor specifically for auth messages in Dispatcher.java; might be worth keeping an eye on this to see if it proves to be a new bottleneck w/a more heavyweight negotiation on connection. The JIRA link in the CEP just links to the ASF C* JIRA - I couldn't find a ticket for this CEP yet in JIRA. Generally we use that to link to a specific ticket; was a minor speed bump just FYI. And we have some prior art in the following: - CASSANDRA-13048: Support SASL mechanism negotiation in existing Authenticators - CASSANDRA-11471: Add SASL mechanism negotiation to the native protocol Might be good to link to those and once we get a JIRA up for CEP-50, we can flag those 2 as duplicates of it and close them out once it's done. Overall - looks great. Again: +1 from me. On Tue, Jul 8, 2025, at 8:34 PM, Joel Shepherd wrote: > Hi Doug - That's an interesting suggestion for a load test: I'll include > something like that in our plans. > > You're right about the logic in RoleManager: it should be doing the right > thing with MutualTlsWithPasswordFallbackAuthenticator. > > Thanks! -- Joel. > > On 7/8/2025 1:52 PM, Doug Rohrer wrote: >> >> +1 from me (I think committer +1s are "binding" on CEPs given our previous >> "how we do things" conversation, but either way, +1)... >> >> One interesting perf test to think about would be the difference between >> negotiated auth with MutualTlsAuthenticator and PasswordAuthenticator and >> the combined MutualTlsWithPasswordFallbackAuthenticator, as I think it'll >> provide a pretty good indication of the (hopefully negligible) performance >> difference when negotiating. >> >> Also, because I was curious about your last comment... >> MutualTlsWithPasswordFallbackAuthenticator _derives_ from >> PasswordAuthenticator, so *instanceof PasswordAuthenticator* checks return >> *true* for instances of it, and therefore (assuming you're talking about >> supportedOptions/alterableOptions in >> https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/auth/CassandraRoleManager.java#L167-L172), >> it should work fine. Not that that helps _you_ solve your problem, but at >> least the existing classes should work. >> >> Thanks for putting the CEP together and working on the implementation! >> >> Doug >> >>> On Jul 3, 2025, at 2:38 PM, Joel Shepherd <sheph...@amazon.com> wrote: >>> >>> Thanks Andy - My hope/expectation is this would significantly reduce the >>> amount of friction involved when either implementing or migrating to a new >>> authenticator. I suspect it will benefit more complex environments too, >>> when a single authenticator isn't ideal for all clients. >>> >>> At this point, the stickiest bits I've run into have involved logic that >>> switches on "the" authenticator class, because of the hardcoded dependency >>> on a specific authn implementation, and working out how to sanely extend >>> the logic once it's possible for a single node to be using different >>> authenticators for different client sessions. Solvable but will take some >>> refactoring and might also generate debate about what the right behaviors >>> are in that scenario. An example is the RoleManager which currently creates >>> additional role attributes if the Password Authenticator is in use ... >>> which, now that you mention it, I wonder if that's already broken for the >>> MutualTlsWithPasswordFallbackAuthenticator. Hmm. >>> >>> Anyway, thanks for the feedback -- Joel. >>> >>> On 7/3/2025 7:52 AM, Tolbert, Andy wrote: >>>> >>>> Hi Joel, >>>> >>>> +1 (nb), I think this is a really good idea and well fleshed our CEP! >>>> >>>> The capability to allow the server to support multiple authenticators >>>> would be very useful. CEP-34 added a >>>> 'MutualTlsWithPasswordFallbackAuthenticator' for simultaneously supporting >>>> both mTLS and Password authentication, primarily as a means to introduce >>>> mTLS auth without breaking password auth and also a possible gradual >>>> migration to mTLS, but this only works for combining these two particular >>>> authenticators, and also creates another authenticator to support. >>>> >>>> The migration to any new auth strategy would likely involve the need to >>>> simultaneously support an existing and new auth provider. I think the >>>> approach you describe is well described and should meet this need assuming >>>> users use a driver that supports it. >>>> >>>> In terms of the protocol, utilizing the capabilities of the existing >>>> OPTIONS, STARTUP and SUPPORTED messages to communicate what authenticators >>>> are supported/should be used is pretty clever as it shouldn't require a >>>> protocol version uprev, and hopefully wouldn't be too complicated for a >>>> driver to implement. >>>> >>>> Thanks, >>>> Andy >>>> >>>> On Mon, Jun 30, 2025 at 11:44 AM Joel Shepherd <sheph...@amazon.com> wrote: >>>>> Erm ... and here's the CEP: >>>>> https://cwiki.apache.org/confluence/display/CASSANDRA/CEP-50%3A+Authentication+Negotiation >>>>> >>>>> (Thanks for the heads up, Abe ...) >>>>> >>>>> -- Joel. >>>>> >>>>> On 6/30/2025 9:37 AM, Joel Shepherd wrote: >>>>> > Hello - We would like to propose CEP-50: Authentication Negotiation >>>>> > for adoption by the community: <link> . >>>>> > >>>>> > This CEP proposes minor changes to the initial handshake protocol >>>>> > (OPTIONS, SUPPORTED and STARTUP messages) to enable a client to inform >>>>> > the node of the authenticators supported by the client, and changes in >>>>> > the node's authentication-related areas to enable it to pick its >>>>> > preferred authenticator for each client client connection. The CEP >>>>> > explains why this approach is proposed, instead of implementing a >>>>> > "negotiating authenticator". >>>>> > >>>>> > Authentication negotiation will make it easier and safer for >>>>> > administrators to migrate clusters to stronger authentication >>>>> > mechanisms (including switching on authentication for a cluster that >>>>> > has been using "allow-all" authentication) without downtime, and to >>>>> > support environments where different clients prefer different >>>>> > authentication mechanisms (e.g., username and password for ad-hoc >>>>> > cqlsh access, mutual TLS for programmatic access, etc.), without >>>>> > having to pick a single "lowest common denominator" authenticator for >>>>> > all. Additionally, the proposed changes are intended to be backwards >>>>> > compatible for both clients and nodes. >>>>> > >>>>> > Thanks in advance for your time and feedback. Please keep the >>>>> > discussion on this mailing list thread. >>>>> > >>>>> > Thanks! -- Joel. >>>>> > >>>>> > >>>>> > >>>>> >