Autenticazione a plugin
In MariaDB 5.2 l'autenticazione degli utenti è delegata ai plugin. Sono disponibili due plugin: mysql_native_password
e mysql_old_password
- essi implementano l'autenticazione della password di 20 byte compatibile con MySQL (usata in MySQL 4.0 e successivi) e l'offuscamento a 9 byte (usato in MySQL 3.23).
Estensione SQL
Per ogni utente, si può specificare un plugin di autenticazione con un'estensione delle istruzioni GRANT
o CREATE USER
:
GRANT <privilegi> ON <livello> TO <utente> IDENTIFIED VIA <plugin> [ USING <stringa> ] CREATE USER <utente> IDENTIFIED VIA <plugin> [ USING <stringa> ]
La clausola opzionale USING
serve a specificare informazioni sull'autenticazione a un plugin; il suo formato è definito completamente dal plugin stesso. Per esempio, per il plugin mysql_native_password
dovrebbe essere una password offuscata:
CREATE USER mysqltest_up1 IDENTIFIED VIA mysql_native_password USING '*E8D46CE25265E545D225A8A6F1BAF642FEBEE5CB';
E' solo un modo diverso per dire:
CREATE USER mysqltest_up1 IDENTIFIED BY PASSWORD '*E8D46CE25265E545D225A8A6F1BAF642FEBEE5CB';
MariaDB contiene tre plugin di autenticazione, ma non sono installati per default. Il plugin socket_peercred
permette agli utenti di autenticarsi tramite uno unix socket, se l'utente è già autenticato nel sistema operativo. Esempio:
$ whoami serg $ mysql --user=serg Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 2 Server version: 5.2.0-MariaDB-alpha-debug Source distribution MariaDB [test]> quit Bye $ mysql --user=monty ERROR 1045 (28000): Access denied for user 'monty'@'localhost' (using password: NO)
In questo esempio, un utente serg
ha già effettuato l'accesso nel sistema e ha un pieno accesso alla shell. Siccome si è già identificato nell'OS, non c'è bisogno che ripeta l'operazione per il database, MariaDB si fida delle credenziali dell'OS. Ma non può connettersi al database con un altro utente. Entrambi gli utenti sono stati creati con il plugin socket_peercred
.
Altri due plugin presenti nella distribuzione MariaDB (two_questions
e three_attempts
) dimostrano come implementare un dialogo con l'utente. Il primo chiede una password e una conferma ("Are you sure?"), il secondo concede tre tentativi per inserire una password corretta. Per questi tre plugin, la password deve essere specificata in chiaro nella clausola USING
:
CREATE USER insicuro IDENTIFIED VIA two_questions USING 'nonmoltosegreta';
Strumenti client
Il processo di autenticazione è una comunicazione tra il server e un client. MariaDB implementa sia i plugin lato server, sia lato client. I plugin client vengono caricati automaticamente su richiesta nella libreria client. I client che non utilizzano la libreria libmysqlclient
o che usano una sua build completamente statica possono usare l'autenticazione tradizionale di MySQL e i plugin server che (come socket_peercred
) non conversano con il client.
Il client da riga di comando mysql
ha ora due nuovi argomenti:
--plugin-dir=percorso
| Directory per i plugin lato client. |
--default-auth=nome
| Plugin di autenticazione lato client da usare per default. |
Due plugin sono compilati nella libreria client e permettono l'autenticazione MySQL tradizionale. Il plugin dialog
plugin, distribuito con MariaDB, legge il prompt dal server, lo scrive a video per l'utente, legge l'input digitato dall'utente e lo invia al server. Entrambi i plugin lato server di esempio lo utilizzano per comunicare con l'utente.
Le estensioni alla libreria client
I plugin di autenticazione sono caricati in modo automatico e trasparente all'applicazione client, e non è richiesto alcun supporto particolare. Tuttavia, un client potrebbe aver bisogno di specificare il percorso in cui si trovano i plugin da caricare o un plugin di autenticazione predefinito plugin (si veda Il plugin client predefinito, sotto). Per fare questo, si usa la funzione mysql_options
:
mysql_options(mysql, MYSQL_PLUGIN_DIR, "percorso"); mysql_options(mysql, MYSQL_DEFAULT_AUTH, "nome");
Plugin client predefinito
Secondo il MySQL Client Server Protocol il server prima invia al client il pacchetto di handshake (stretta di mano), poi il client risponde con un pacchetto contenente il nome utente.
Solo dopo aver letto il pacchetto client, il server può trovare la riga giusta della tabella mysql.user
per sapere quale plugin utilizzare con quel determinato utente. Il pacchetto handshake del server viene inviato utilizzando il plugin di autenticazione predefinito del server, la risposta del client usa il plugin di autenticazione predefinito del client. Se il server capisce che i due plugin non corrispondono, riavvia l'autenticazione su entrambi i lati, cioè sul client e sul server.
Quindi, utilizzando il plugin di autenticazione predefinito corretto, il client può evitare che l'autenticazione venga riavviata e i due pacchetti aggiuntivi non verranno inviati nella rete.
Il plugin client Dialog
Il plugin cliente Dialog, strettamente parlando, non fa parte dell'API client-server o di autenticazione. Ma può essere caricato in qualsiasi applicazione client che utilizza la libreria libmysqlclient
. Questo plugin consente all'applicazione di personalizzare la UI della funzione di dialogo.
Se l'applicazione implementa una funzione come la seguente:
extern "C" char *mysql_authentication_dialog_ask( MYSQL *mysql, int type, const char *prompt, char *buf, int buf_len)
il plugin dialog
la utilizzerà. La funzione accetta come argomenti: un tipo di domanda "type" (che è 1 per una domanda normale e 2 per una password - senza echo), un prompt e un buffer. La funzione restituisce un puntatore alla stringa di caratteri inviata dall'utente. Essa può essere registrata in buf
o allocata con malloc()
.
Usando questa funzione, un'applicazione GUI può far apparire una finestra di dialogo, un'applicazione di rete può inviare la domanda attraverso la rete, a seconda dei casi. Se l'applicazione non definisce una funzione mysql_authentication_dialog_ask
, il plugin dialog
utilizza fputs()
e fgets()
.
Fornire questa funzione callback è particolarmente importante su Windows, perché le applicazioni GUI non hanno una console associata e la funzione di dialogo di default non può essere in grado di comunicare con l'utente. Un esempio di client grafico per Windows che effettua questa operazione correttamente è HeidiSQL.
L'API dei plugin di autenticazione
L'API dei plugin di autenticazione è documentata approfonditamente nei file mysql/plugin_auth.h
(parte server) mysql/client_plugin.h
(parte client) e mysql/plugin_auth_common.h
. Si vedano anche i plugin di esempio in plugin/auth/
.
Vedi anche
- Il manuale di MySQL sulla pluggable authentication ¶
- Il manuale di MySQL su come scrivere plugin di autenticazione