OAuth, SASL e IRC: un nuovo modo di autenticarsi su SimosNap
Su SimosNap esistono da tempo diversi modi per autenticarsi al proprio account IRC. È possibile farlo nel modo più classico, identificandosi con NickServ dopo la connessione, oppure utilizzare SASL PLAIN per autenticarsi direttamente durante l'accesso alla rete.
Sono sistemi standard, funzionano e continueranno naturalmente a essere disponibili.
Ma c'è una situazione nella quale inserire nuovamente la password del proprio account IRC comincia a sembrare poco naturale: quando l'utente si è già autenticato su un sito o un servizio attraverso SimosNap.
Se SimosNap sa già chi sei, perché dovrebbe chiederti ancora la password NickServ soltanto per entrare in chat?
Da questa domanda è nato il nuovo sistema di autenticazione IRC sul quale abbiamo lavorato nelle ultime settimane.
Dal login sul sito direttamente a IRC
SimosNap dispone già di un sistema OAuth 2.0/OpenID Connect che permette a siti e applicazioni autorizzate di utilizzare l'account SimosNap per identificare un utente.
Il passo successivo è stato collegare questa identità anche alla rete IRC.
Un sito o un'applicazione che integra il nuovo sistema può autenticare l'utente attraverso OAuth e permettergli successivamente di aprire KiwiIRC trovandosi già identificato sul proprio account IRC, senza dover digitare nuovamente la password NickServ.
Dal punto di vista dell'utente il risultato è molto semplice: si effettua il login sul sito, si apre la chat e si entra già autenticati.
Dietro a un'operazione apparentemente così banale c'è però una questione importante. Non volevamo che il token OAuth utilizzato dal sito diventasse anche la credenziale utilizzata dal browser per entrare su IRC.
Per questo abbiamo mantenuto nettamente separati i due sistemi.
Il token OAuth rimane sul server dell'applicazione. È il backend a utilizzarlo per richiedere a SimosNap una credenziale creata esclusivamente per l'accesso IRC: un token temporaneo che viene poi utilizzato da KiwiIRC attraverso SASL.
In altre parole, il sito non consegna alla webchat né la password NickServ né il proprio token OAuth. Le consegna una sorta di lasciapassare temporaneo, creato appositamente per quella autenticazione IRC.
Un nuovo meccanismo SASL: SIMOSNAP
SASL non è una novità sulla nostra rete. SASL PLAIN è disponibile da tempo e permette già di autenticare un account durante la connessione a IRC utilizzando le normali credenziali.
La novità è aver aggiunto un altro meccanismo, chiamato SIMOSNAP, pensato espressamente per questo nuovo sistema SSO.
Il percorso può essere riassunto così:
sito o applicazione → OAuth SimosNap → token IRC temporaneo → KiwiIRC → SASL SIMOSNAP → InspIRCd → Anope
KiwiIRC presenta il token durante la connessione utilizzando SASL. InspIRCd continua a svolgere il proprio normale ruolo nel trasporto dell'autenticazione verso i servizi, mentre Anope verifica a quale account appartiene quella credenziale e decide se l'utente può essere autenticato.
Questo era per noi un requisito importante.
Non volevamo costruire un secondo sistema di account parallelo a NickServ e nemmeno modificare il funzionamento fondamentale della rete. Gli account IRC continuano a essere quelli gestiti da Anope e SASL continua a essere il meccanismo utilizzato durante la connessione.
Abbiamo aggiunto un nuovo modo per dimostrare in maniera sicura che l'utente che sta entrando in chat corrisponde a quell'account.
Un token che non diventa una nuova password
Anche il token utilizzato da SASL SIMOSNAP è stato progettato volutamente con uno scopo molto limitato.
Non è una password alternativa dell'account IRC.
È una credenziale casuale da 256 bit, ha una durata massima di cinque minuti e può essere utilizzata una sola volta.
Sul server non viene inoltre conservato il token in chiaro, ma soltanto il suo hash. Quando viene presentato e risulta valido, verifica e consumo avvengono nella stessa operazione: dopo quell'autenticazione il token non è più utilizzabile.
Abbiamo verificato questo comportamento anche durante lo sviluppo: provare a presentare nuovamente lo stesso token non permette di effettuare una seconda autenticazione.
La differenza rispetto a una password permanente è quindi sostanziale. Se il token non viene utilizzato, dopo pochi minuti perde comunque validità. Se viene utilizzato, smette di essere valido immediatamente.
E soprattutto la password NickServ non deve essere fornita al sito o alla webchat per effettuare questo tipo di accesso.
OAuth e IRC rimangono due cose diverse
Uno degli aspetti che abbiamo voluto mantenere chiaro anche nell'architettura è la separazione tra OAuth e IRC.
Il token OAuth serve al rapporto tra l'applicazione e SimosNap. Può avere uno scopo e un ciclo di vita completamente diversi da quello necessario per una singola connessione IRC.
Per questo non viene semplicemente passato a KiwiIRC.
Il backend dell'applicazione lo utilizza per richiedere a SimosNap una nuova credenziale molto più limitata, destinata esclusivamente all'autenticazione IRC.
Questo significa che KiwiIRC non deve conoscere il token OAuth utilizzato dal sito e Anope non deve diventare un server OAuth.
Ognuno continua a fare il proprio lavoro.
OAuth identifica l'utente nel rapporto tra il sito e SimosNap. Il token SSO crea il collegamento temporaneo con IRC. SASL autentica la connessione e Anope rimane l'autorità finale sull'account IRC.
E quando KiwiIRC si riconnette?
Durante lo sviluppo ci siamo trovati davanti a un altro problema interessante.
Una webchat deve poter gestire normalmente una perdita di connessione e tentare di riconnettersi. Ma un token SASL monouso, per definizione, non può essere utilizzato una seconda volta.
La soluzione più semplice sarebbe stata renderlo riutilizzabile per un certo periodo di tempo. Avremmo però perso proprio una delle caratteristiche di sicurezza che volevamo ottenere.
Abbiamo quindi separato l'autenticazione dalla possibilità di riconnettersi.
Il sistema utilizza un reconnect token che non viene presentato ad Anope come credenziale SASL. Quando KiwiIRC deve effettuare una nuova connessione, viene utilizzato per chiedere a SimosNap un nuovo token IRC temporaneo e monouso.
La nuova connessione effettua quindi una nuova autenticazione SASL SIMOSNAP con una nuova credenziale.
Il token utilizzato nella connessione precedente rimane inutilizzabile.
Per l'utente tutto questo è trasparente: KiwiIRC può continuare a gestire automaticamente le riconnessioni senza chiedere nuovamente la password.
Account e nickname non sono necessariamente la stessa cosa
IRC ha inoltre una caratteristica che un normale sistema di login Web spesso non possiede: uno stesso account può avere più nickname associati.
Anche questo aspetto è stato tenuto in considerazione.
Un'applicazione può recuperare gli alias appartenenti all'account autenticato e permettere all'utente di scegliere quale nickname utilizzare entrando in chat. È inoltre possibile verificarne la presenza sulla rete, in modo da sapere quali identità risultano già collegate.
L'autenticazione rimane comunque riferita all'account IRC.
Nickname utilizzato nella sessione e account verificato da Anope rimangono quindi due concetti distinti, esattamente come avviene normalmente sulla rete.
Cosa cambia davvero per l'utente
Fortunatamente, quasi niente.
Anzi, è proprio questo l'obiettivo.
Un utente effettua il login su un sito attraverso SimosNap, apre la chat e vi entra già autenticato sul proprio account IRC. Non deve ricordare o reinserire la password NickServ e il sito che integra il sistema non ha motivo di chiedergliela.
Se la connessione cade, la webchat può ottenere una nuova credenziale temporanea e autenticarsi nuovamente durante la riconnessione.
Tutta la gestione dei token rimane dietro le quinte.
Allo stesso tempo non abbiamo eliminato nessuno dei sistemi esistenti.
L'identificazione tradizionale tramite NickServ continua a funzionare. SASL PLAIN continua a essere disponibile per autenticarsi durante la connessione utilizzando account e password. E quando il nuovo sistema SSO non è disponibile, KiwiIRC può continuare a utilizzare la normale autenticazione SASL.
SIMOSNAP è quindi una possibilità in più, non un nuovo requisito per collegarsi alla rete.
Un ponte tra Web e IRC, non un sostituto di IRC
Forse è proprio questo l'aspetto del progetto che ci interessava maggiormente.
Negli anni abbiamo costruito diversi servizi intorno a IRC, ma l'obiettivo non è mai stato sostituire il protocollo o duplicarne inutilmente le funzioni.
Anche questa volta abbiamo cercato di seguire lo stesso principio.
OAuth continua a occuparsi dell'identità tra SimosNap e le applicazioni Web. SASL continua a occuparsi dell'autenticazione durante la connessione IRC. InspIRCd continua a gestire il server IRC e Anope continua a essere l'autorità sugli account della rete.
Il nuovo sistema costruisce semplicemente un ponte sicuro tra questi elementi.
Per farlo abbiamo sviluppato il meccanismo SASL SIMOSNAP, la gestione dei token temporanei, l'integrazione necessaria in KiwiIRC e un modulo specifico per Anope, senza modificare il core di InspIRCd o quello di Anope e senza trasformare OAuth in qualcosa che non è.
E tutto questo, alla fine, serve a ottenere un risultato estremamente semplice:
se ti sei già autenticato con SimosNap, possiamo riconoscerti anche quando entri su IRC.
La documentazione tecnica arriverà a breve
Il sistema è già operativo, ma il lavoro non è ancora concluso dal punto di vista della documentazione.
Stiamo preparando la documentazione tecnica necessaria per permettere a siti e applicazioni di integrare correttamente il nuovo sistema OAuth/SSO e l'accesso IRC tramite SASL SIMOSNAP. La pubblicheremo prossimamente sul sito SimosNap.
Coglieremo l'occasione anche per aggiornare la documentazione relativa alla nostra infrastruttura IRC, che al momento non riflette ancora completamente la recente migrazione a InspIRCd 4 e le novità introdotte con la nuova versione.
L'obiettivo è avere una documentazione aggiornata non soltanto sul nuovo sistema di autenticazione, ma più in generale sugli strumenti e sulle possibilità oggi disponibili per chi vuole integrare i propri servizi con la rete SimosNap.