Hi Jacek, thanks for sharing! I'm super busy until the middle of next week but I've blocked out some time to read through this. I'm looking forward to the discussion :)
Cheers, Derek On Fri, May 26, 2023 at 2:08 AM Jacek Lewandowski < lewandowski.ja...@gmail.com> wrote: > Hi, > > I'm happy that this discussion has started because we wanted to propose > something we have been working on. I've created > https://cwiki.apache.org/confluence/display/CASSANDRA/CEP-31+%28DRAFT%29+Negotiated+authentication+and+authorization > with some details. It is a draft and we are open to suggestions and > cooperation on that. > > Basically what we have been using in DataStax for years already is based > on embedding negotiations in SASL messages. In particular, the > authentication mechanism chosen by the client is sent in a preamble of the > first authentication message. It does not require a new protocol - > everything we need is internal to authentication message exchange. It is > also backward compatible as if the server does not receive the mechanism > preamble, it will just continue assuming the default authentication > mechanism. > > Please have a look and let me know what you think. I'll start a separate > thread on that topic soon. > > thanks > - - -- --- ----- -------- ------------- > Jacek Lewandowski > > > pt., 26 maj 2023 o 04:08 Dinesh Joshi <djo...@apache.org> napisał(a): > >> Leaving the naming aside (the hardest part of any software), I am >> generally positive about your idea. A protocol version bump may be >> avoidable like you suggested. Perhaps a prototype of this idea is in order >> to help shape the idea? Would you like to take it on? >> >> On May 21, 2023, at 4:21 AM, Derek Chen-Becker <de...@chen-becker.org> >> wrote: >> >> We had a recent discussion in Slack about how to potentially use the >> OPTIONS and SUPPORTED messages in the existing CQL protocol to allow the >> server to advertise more than one authentication method and allow the >> client to then choose which authenticator to use. The primary use case here >> is to allow seamless migration to a new authenticator without having to >> have all parties involved agree on a single class (and avoid a disruptive >> change). There's already a ticket open that was focused on making a change >> to the binary protocol ( >> https://issues.apache.org/jira/browse/CASSANDRA-11471) but I think that >> we can accomplish this in a backwards compatible way that avoids a change >> to the protocol itself. >> >> What I propose is to allow a server configured for this graceful auth >> change to send an additional value in the [string multimap] body of the >> SUPPORTED message that indicates which authenticators are supported, in >> descending priority order. For example, if I wanted to migrate my server to >> support both PlainTextAuthProvider and some new MyAwesomeAuthProvider, I >> would configure my client to query options and the server would respond with >> >> 'AUTHENTICATORS': ['MyAwesomeAuthProvider', 'PlainTextAuthProvider'] >> >> The client can then choose from its own supported providers and send it >> as part of the STARTUP message [string map] body: >> >> 'AUTHENTICATOR': 'MyAwesomeAuthenticator' >> >> I'm not good with naming so feel free to propose a different key for >> either of these map entries. In any case, the server then validates that >> the client-chosen authenticator is actually supported and would then >> proceed with the AUTHENTICATE message. In the case where the client sends >> an invalid/unsupported authenticator choice, the server can simply respond >> with an AUTHENTICATE using the most-preferred configured authenticator. >> >> I think this is a better approach than changing the binary protocol >> because the mechanism already exists for negotiating options and this seems >> like a natural use case that avoids having to create an entirely new >> version of the protocol. It does not appear to conflict with the existing >> protocol definition but I'm not 100% certain. Section 4.1.1 discusses >> "Possible options" for the STARTUP message ( >> https://github.com/apache/cassandra/blob/trunk/doc/native_protocol_v4.spec#L296), >> but that's an unfortunate use of English that's ambiguous as to whether it >> means "The only ones supported" or "Supported but not exclusively". >> >> I've taken a look at the Java and Python driver source so far and I can't >> find anything that would seem to cause a problem by returning a SUPPORTED >> multimap entry that the client isn't aware of (in both they would appear to >> ignore it), but I'll also admit that this is the first time I've looked at >> this part of the client code and I could be missing something. Is anyone >> aware of possible problems that would be caused by using this approach? In >> particular, if there are clients that strictly validate all entries in the >> SUPPORTED map then this could cause a problem. >> >> Worst case, we may still need a protocol version bump if the enumeration >> of STARTUP options is intended to be strict, but at least this would not >> require a new message type and would fit into the existing framework for >> negotiation between client and server. >> >> Thoughts, questions, or concerns would be appreciated. >> >> Cheers, >> >> Derek >> >> -- >> +---------------------------------------------------------------+ >> | Derek Chen-Becker | >> | GPG Key available at https://keybase.io/dchenbecker and | >> | https://pgp.mit.edu/pks/lookup?search=derek%40chen-becker.org | >> | Fngrprnt: EB8A 6480 F0A3 C8EB C1E7 7F42 AFC5 AFEE 96E4 6ACC | >> +---------------------------------------------------------------+ >> >> >> -- +---------------------------------------------------------------+ | Derek Chen-Becker | | GPG Key available at https://keybase.io/dchenbecker and | | https://pgp.mit.edu/pks/lookup?search=derek%40chen-becker.org | | Fngrprnt: EB8A 6480 F0A3 C8EB C1E7 7F42 AFC5 AFEE 96E4 6ACC | +---------------------------------------------------------------+