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

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

Si dice che la migliore password sia quella che non bisogna ricordare. Nel caso di 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 blog, ad esempio nell'articolo su come cambiare le password in MySQL 5.7 utilizzando il plugin auth_socket. Tuttavia, analizzando cosa c'è di nuovo in MariaDB 10.4, ho scoperto che unix_socket ora è installato di default ed è uno dei metodi di autenticazione ("uno dei", poiché in MariaDB 10.4 a un utente sono disponibili più di un plugin per l'autenticazione, come spiegato nel documento «Autenticazione» da MariaDB 10.04).

Come ho già detto, non si tratta di 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 è vero sia per MySQL che per MariaDB.

root@app:~# apt-cache show mysql-server-5.7 | grep -i maintainers
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 viene autenticato nel modo seguente:

root@app:~# whoami
root=
root@app:~# mysql
Benvenuto nel monitor di MySQL.  I comandi terminano con ; o g.
Il tuo id connessione MySQL è 4
Versione 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 di proprietà dei rispettivi
proprietari.

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

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 Percona configurano inoltre l'autenticazione dell'utente con diritti di root tramite auth-socket anche per Percona Server. Facciamo un esempio con Percona Server for 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', Revisione '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 assistenza. Digita 'c' per cancellare l'attuale istruzione d'ingresso.

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)

Ma qual è la magia? Il plugin verifica che l'utente Linux corrisponda all'utente MySQL, utilizzando l'opzione di 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 Linux. L'opzione di socket SO_PEERCRED consente di conoscere l'uid associato al processo del socket. E poi 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é in MySQL non esiste l'utente «vagrant», l'accesso ci è negato. Creiamo questo utente e riproviamo:

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

vagrant@mysql1:~$ mysql
Benvenuto nel monitor MariaDB. I comandi terminano con ; o g.
Il tuo ID 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 assistenza. Digita 'c' per cancellare l'attuale istruzione d'ingresso.

MariaDB [(none)]> 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 che dire di una distribuzione non-Debian, dove questo non è previsto di default? Proviamo con 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

Niente da fare. Cosa è mancato? Il plugin non è stato caricato:

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

Aggiungiamo il plugin al processo:

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

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

Ora abbiamo tutto ciò che serve. Proviamo ancora una volta:

mysql> CREA UTENTE 'percona'@'localhost' IDENTIFICATO CON auth_socket;
Query OK, 0 righe interessate (0,01 sec)
mysql> CONCEDE TUTTI I PRIVILEGI SU *.* A 'percona'@'localhost';
Query OK, 0 righe interessate (0,01 sec)

Ora si può 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 MySQL. I comandi finiscono con ; o g.
Il tuo ID di connessione MySQL è 19
Versione del server: 8.0.16-7 Percona Server (GPL), Release 7, Revisione 613e312

Copyright (c) 2009-2019 Percona LLC e/o sue affiliate
Copyright (c) 2000, 2019, Oracle e/o 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'istruzione di input corrente.

mysql> seleziona user, host, plugin, authentication_string da mysql.user dove user ='percona';
+---------+-----------+-------------+-----------------------+
| user    | host     | plugin      | authentication_string |
+---------+-----------+-------------+-----------------------+
| percona | localhost | auth_socket |                       |
+---------+-----------+-------------+-----------------------+
1 riga nel set (0,00 sec)

E ce l'abbiamo fatta di nuovo!

Domanda: si può accedere al sistema con lo stesso login 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.

Conclusione

MySQL è abbastanza flessibile in diversi 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ò essere utile in determinati scenari, e uno di essi è quando si migra da RDS/Aurora a una normale MySQL, utilizzando l'autenticazione del database IAM, per continuare ad accedere, ma 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