Com utilitzar MySQL sense contrasenya (i riscos de seguretat)

Com utilitzar MySQL sense contrasenya (i riscos de seguretat)

Diuen que la millor contrasenya és la que no cal recordar. En el cas de MySQL, això és possible gràcies al connector auth_socket i la seva versió per a MariaDB - unix_socket.

Aquests dos complements no són gens nous; s'ha parlat molt sobre ells en aquest mateix bloc, per exemple a l'article sobre com canviar les contrasenyes a MySQL 5.7 mitjançant el connector auth_socket. Tanmateix, mentre mirava les novetats de MariaDB 10.4, vaig descobrir que ara unix_socket està instal·lat per defecte i és un dels mètodes d'autenticació ("un dels", perquè a MariaDB 10.4 hi ha més d'un connector disponible per a un usuari per a l'autenticació, que s'explica al document "Autenticació" de MariaDB 10.04).

Com he dit, això no és novetat, i quan s'instal·la MySQL utilitzant els paquets .deb suportats per l'equip de Debian, es crea un usuari root per a l'autenticació del sòcol. Això és cert tant per a MySQL com per a MariaDB.

root@app:~# apt-cache show mysql-server-5.7 | grep -i maintainers
Original-Maintainer: Debian MySQL Maintainers <[email protected]>
Original-Maintainer: Debian MySQL Maintainers <<a href="mailto:[email protected]">[email protected]</a>>

Amb els paquets de Debian per a MySQL, l'usuari root s'autentica de la següent manera:

root@app:~# whoami
root=
root@app:~# mysql
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 4
Server version: 5.7.27-0ubuntu0.16.04.1 (Ubuntu)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

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)

El mateix passa amb el paquet .deb per a 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)

Els paquets .deb del repositori oficial de Percona també configuren l'autenticació d'usuari root sota auth-socket i per al servidor Percona. Posem un exemple amb Servidor Percona per a MySQL 8.0.16-7 i Ubuntu 16.04:

root@app:~# whoami
root
root@app:~# mysql
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 9
Server version: 8.0.16-7 Percona Server (GPL), Release '7', Revision '613e312'

Copyright (c) 2009-2019 Percona LLC and/or its affiliates
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

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.00 sec)

Aleshores, quina és la màgia? El connector comprova que l'usuari de Linux coincideixi amb l'usuari de MySQL mitjançant l'opció de sòcol SO_PEERCRED per recopilar informació sobre l'usuari que executa el programa client. Per tant, el connector només es pot utilitzar en sistemes que admeten l'opció SO_PEERCRED, com Linux. L'opció de sòcol SO_PEERCRED us permet conèixer l'uid del procés associat al sòcol. I aleshores ja rep el nom d'usuari associat a aquest uid.

Aquí teniu un exemple amb l'usuari "vagrant":

vagrant@mysql1:~$ whoami
vagrant
vagrant@mysql1:~$ mysql
ERROR 1698 (28000): Access denied for user 'vagrant'@'localhost'

Com que no hi ha cap usuari "vagabund" a MySQL, se'ns denega l'accés. Creem aquest usuari i tornem a provar-ho:

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

vagrant@mysql1:~$ mysql
Welcome to the MariaDB monitor.  Commands end with ; or g.
Your MariaDB connection id is 45
Server version: 10.0.38-MariaDB-0ubuntu0.16.04.1 Ubuntu 16.04
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

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

Succeït!

Bé, què passa amb una distribució que no sigui Debian on això no es proporciona per defecte? Provem el servidor Percona per a MySQL 8 instal·lat a CentOS 7:

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

mysql> CREATE USER 'percona'@'localhost' IDENTIFIED WITH auth_socket;
ERROR 1524 (HY000): Plugin 'auth_socket' is not loaded

llàstima. Què faltava? Connector no carregat:

mysql> pager grep socket
PAGER set to 'grep socket'
mysql> show plugins;
47 rows in set (0.00 sec)

Afegim un connector al procés:

mysql> nopager
PAGER set to stdout
mysql> INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';
Query OK, 0 rows affected (0.00 sec)

mysql> pager grep socket; show plugins;
PAGER set to 'grep socket'
| auth_socket                     | ACTIVE | AUTHENTICATION | auth_socket.so | GPL     |
48 rows in set (0.00 sec)

Ara tenim tot el que necessitem. Intenta-ho una altre vegada:

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

Ara podeu iniciar sessió amb el nom d'usuari “percona”.

[percona@ip-192-168-1-111 ~]$ whoami
percona
[percona@ip-192-168-1-111 ~]$ mysql -upercona
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 19
Server version: 8.0.16-7 Percona Server (GPL), Release 7, Revision 613e312

Copyright (c) 2009-2019 Percona LLC and/or its affiliates
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

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

I va tornar a funcionar!

Pregunta: serà possible iniciar sessió al sistema amb el mateix inici de sessió percona, però com un usuari diferent?

[percona@ip-192-168-1-111 ~]$ logout
[root@ip-192-168-1-111 ~]# mysql -upercona
ERROR 1698 (28000): Access denied for user 'percona'@'localhost'

No, no funcionarà.

Sortida

MySQL és bastant flexible en diversos aspectes, un dels quals és el mètode d'autenticació. Com podeu veure en aquesta publicació, l'accés es pot obtenir sense contrasenyes, en funció dels usuaris del sistema operatiu. Això pot ser útil en determinats escenaris, i un d'ells és quan es migra des de RDS/Aurora a MySQL normal mitjançant Autenticació de bases de dades IAMper accedir encara, però sense contrasenyes.

Font: www.habr.com

Afegeix comentari