Come utilizzare MySQL senza password (e senza rischi per la sicurezza)

Come utilizzare MySQL senza password (e senza rischi per la sicurezza)

Si dice che la password migliore sia quella che non bisogna ricordare. Con MySQL, questo è possibile grazie al plugin auth_socket e alla sua versione per MariaDB — unix_socket.

Entrambi questi plugin non sono affatto nuovi, se ne è parlato molto in questo stesso blog, ad esempio nell'articolo su come cambiare le password in MySQL 5.7 utilizzando il plugin auth_socket. Tuttavia, analizzando le novità in MariaDB 10.4, ho scoperto che unix_socket ora viene installato di default ed è uno dei metodi di autenticazione ("uno dei", perché in MariaDB 10.4 a un utente sono disponibili più di un plugin per l'autenticazione, come spiegato nel documento "Autenticazione" di MariaDB 10.04).

Come ho già detto, queste non sono novità, e quando si installa MySQL utilizzando i pacchetti .deb supportati dal team Debian, l'utente con diritti di root viene creato per l'autenticazione tramite socket. Questo è valido sia per MySQL che per MariaDB.

root@app:~# apt-cache show mysql-server-5.7 | grep -i maintainer
Maintainer originale: Debian MySQL Maintainers <pkg-mysql-maint@lists.alioth.debian.org>
Maintainer originale: Debian MySQL Maintainers <<<a href="mailto:pkg-mysql-maint@lists.alioth.debian.org">pkg-mysql-maint@lists.alioth.debian.org</a></a>>

Con i pacchetti Debian per MySQL, l'utente root si autentica nel seguente modo:

root@app:~# whoami
root=
root@app:~# mysql
Benvenuto nel monitor MySQL. I comandi terminano con ; o g.
Il tuo ID connessione MySQL è 4
Versione del server: 5.7.27-0ubuntu0.16.04.1 (Ubuntu)

Copyright (c) 2000, 2019, Oracle e/o le sue affiliate. Tutti i diritti riservati.
Oracle è un marchio registrato di Oracle Corporation e/o delle sue
affiliate. Altri nomi possono essere marchi dei rispettivi
proprietari.

Digita 'help;' o 'h' per aiuto. Digita 'c' per cancellare la dichiarazione di input corrente.

mysql> select user, host, plugin, authentication_string from mysql.user where user = 'root';
+------+-----------+-------------+-----------------------+
| user | host      | plugin | authentication_string |
+------+-----------+-------------+-----------------------+
| root | localhost | auth_socket |                       |
+------+-----------+-------------+-----------------------+
1 row in set (0.01 sec)

Lo stesso vale per il pacchetto .deb per MariaDB:

10.0.38-MariaDB-0ubuntu0.16.04.1 Ubuntu 16.04

MariaDB [(none)]> show grants;
+------------------------------------------------------------------------------------------------+
| Grants for root@localhost                                                                       |
+------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED VIA unix_socket WITH GRANT OPTION |
| GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION                                     |
+------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

I pacchetti .deb dal repository ufficiale di Percona configurano anche l'autenticazione dell'utente con privilegi root tramite auth-socket per Percona Server. Ecco un esempio con Percona Server per MySQL 8.0.16-7 e Ubuntu 16.04:

root@app:~# whoami
root
root@app:~# mysql
Benvenuto nel monitor MySQL. I comandi terminano con ; o g.
Il tuo ID connessione MySQL è 9
Versione del server: 8.0.16-7 Percona Server (GPL), Release '7', Revision '613e312'

Copyright (c) 2009-2019 Percona LLC e/o le sue affiliate
Copyright (c) 2000, 2019, Oracle e/o le sue affiliate. Tutti i diritti riservati.
Oracle è un marchio registrato di Oracle Corporation e/o delle sue
affiliate. Altri nomi possono essere marchi dei rispettivi
proprietari.

Digita 'help;' o 'h' per aiuto. Digita 'c' per cancellare la dichiarazione di input corrente.

mysql> select user, host, plugin, authentication_string from mysql.user where user ='root';
+------+-----------+-------------+-----------------------+
| user | host      | plugin | authentication_string |
+------+-----------+-------------+-----------------------+
| root | localhost | auth_socket |                       |
+------+-----------+-------------+-----------------------+
1 riga nel set (0.00 sec)

Allora, qual è la magia? Il plugin verifica che l'utente Linux corrisponda all'utente MySQL, utilizzando l'opzione socket SO_PEERCRED — per raccogliere informazioni sull'utente che esegue il programma client. Pertanto, il plugin può essere utilizzato solo su sistemi che supportano l'opzione SO_PEERCRED, come ad esempio Linux. L'opzione socket SO_PEERCRED consente di identificare l'uid associato al processo del socket. E dopo, ottiene il nome utente associato a questo uid.

Facciamo un esempio con l'utente «vagrant»:

vagrant@mysql1:~$ whoami
vagrant
vagrant@mysql1:~$ mysql
ERRORE 1698 (28000): Accesso negato per l'utente 'vagrant'@'localhost'

Poiché non esiste un utente 'vagrant' in MySQL, l'accesso è stato negato. Creiamo questo utente e riproviamo:

MariaDB [(nessuno)]> GRANT ALL PRIVILEGES ON *.* TO 'vagrant'@'localhost' IDENTIFIED VIA unix_socket;
Query OK, 0 righe modificate (0.00 sec)

vagrant@mysql1:~$ mysql
Benvenuto nel monitor di MariaDB. I comandi terminano con ; o g.
Il tuo ID di connessione MariaDB è 45
Versione del server: 10.0.38-MariaDB-0ubuntu0.16.04.1 Ubuntu 16.04
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab e altri.
Digita 'help;' o 'h' per aiuto. Digita 'c' per cancellare l'istruzione di input corrente.

MariaDB [(nessuno)]> show grants;
+---------------------------------------------------------------------------------+
| Grants for vagrant@localhost                                                   |
+---------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'vagrant'@'localhost' IDENTIFIED VIA unix_socket |
+---------------------------------------------------------------------------------+
1 riga nel set (0.00 sec)

Fatto!

E per una distribuzione non Debian, dove questo non è previsto di default? Proviamo Percona Server per MySQL 8, installato su CentOS 7:

mysql> show variables like '%version%comment';
+-----------------+---------------------------------------------------+
| Variable_name   | Value                                   |
+-----------------+---------------------------------------------------+
| version_comment | Percona Server (GPL), Release 7, Revision 613e312 |
+-----------------+---------------------------------------------------+
1 riga nel set (0,01 sec)

mysql> CREATE USER 'percona'@'localhost' IDENTIFIED WITH auth_socket;
ERRORE 1524 (HY000): Il plugin 'auth_socket' non è caricato

Peccato. Cosa è mancato? Il plugin non è caricato:

mysql> pager grep socket
PAGER impostato su 'grep socket'
mysql> show plugins;
47 righe nel set (0,00 sec)

Aggiungiamo il plugin al processo:

mysql> nopager
PAGER impostato su stdout
mysql> INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';
Query OK, 0 righe interessate (0,00 sec)

mysql> pager grep socket; show plugins;
PAGER impostato su 'grep socket'
| auth_socket                     | ATTIVO | AUTENTICAZIONE | auth_socket.so | GPL     |
48 righe nel set (0,00 sec)

Ora abbiamo tutto il necessario. Provamosi ancora:

mysql> CREATE USER 'percona'@'localhost' IDENTIFIED WITH auth_socket;
Query OK, 0 righe interessate (0,01 sec)
mysql> GRANT ALL PRIVILEGES ON *.* TO 'percona'@'localhost';
Query OK, 0 righe interessate (0,01 sec)

Ora puoi accedere al sistema con il login „percona“.

[percona@ip-192-168-1-111 ~]$ whoami
percona
[percona@ip-192-168-1-111 ~]$ mysql -upercona
Benvenuto nel monitor di MySQL. I comandi terminano con ; o g.
Il tuo ID di connessione MySQL è 19
Versione del server: 8.0.16-7 Percona Server (GPL), Release 7, Revision 613e312

Copyright (c) 2009-2019 Percona LLC e/o le sue affiliate
Copyright (c) 2000, 2019, Oracle e/o le sue affiliate. Tutti i diritti riservati.

Oracle è un marchio registrato di Oracle Corporation e/o delle sue affiliate. Altri nomi possono essere marchi dei rispettivi proprietari.

Digita 'help;' o 'h' per aiuto. Digita 'c' per cancellare l'attuale dichiarazione di input.

mysql> select user, host, plugin, authentication_string from mysql.user where user ='percona';
+---------+-----------+-------------+-----------------------+
| user    | host   | plugin   | authentication_string |
+---------+-----------+-------------+-----------------------+
| percona | localhost | auth_socket |                       |
+---------+-----------+-------------+-----------------------+
1 riga nel set (0.00 sec)

E ci siamo riusciti di nuovo!

Domanda: è possibile accedere al sistema con lo stesso nome utente percona, ma da un altro utente?

[percona@ip-192-168-1-111 ~]$ logout
[root@ip-192-168-1-111 ~]# mysql -upercona
ERRORE 1698 (28000): Accesso negato per l'utente 'percona'@'localhost'

No, non è possibile.

Risultato

MySQL è abbastanza flessibile sotto vari aspetti, uno dei quali è il metodo di autenticazione. Come si può vedere in questo post, l'accesso può essere ottenuto senza password, basandosi sugli utenti del sistema operativo. Questo può tornare utile in determinati scenari, ed uno di questi è quando si migra da RDS/Aurora a una MySQL standard, utilizzando autenticazione del database IAM, per continuare ad accedere senza password.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster