Cómo utilizar MySQL sin contraseña (y riesgos de seguridad)

Cómo utilizar MySQL sin contraseña (y riesgos de seguridad)

Dicen que la mejor contraseña es la que no hay que recordar. En el caso de MySQL esto es posible gracias al plugin socket_autenticación y su versión para MariaDB - unix_socket.

Ambos complementos no son nada nuevos; se ha hablado mucho de ellos en este mismo blog, por ejemplo en el artículo sobre cómo cambiar contraseñas en MySQL 5.7 usando el complemento auth_socket. Sin embargo, mientras investigaba las novedades de MariaDB 10.4, descubrí que unix_socket ahora está instalado de forma predeterminada y es uno de los métodos de autenticación ("uno de", porque en MariaDB 10.4 hay más de un complemento disponible para un usuario para la autenticación, lo que se explica en el documento "Autenticación" de MariaDB 10.04).

Como dije, esto no es ninguna novedad, y al instalar MySQL usando los paquetes .deb soportados por el equipo de Debian, se crea un usuario root para la autenticación del socket. Esto es cierto tanto para MySQL como para 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>>

Con los paquetes Debian para MySQL, el usuario root se autentica de la siguiente 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)

Lo mismo ocurre con el paquete .deb para 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)

Los paquetes .deb del repositorio oficial de Percona también configuran la autenticación del usuario raíz en auth-socket y para el servidor Percona. Pongamos un ejemplo con Servidor Percona para MySQL 8.0.16-7 y 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)

Entonces, ¿cuál es la magia? El complemento verifica que el usuario de Linux coincida con el usuario de MySQL utilizando la opción de socket SO_PEERCRED para recopilar información sobre el usuario que ejecuta el programa cliente. Por lo tanto, el complemento sólo se puede utilizar en sistemas que admitan la opción SO_PEERCRED, como Linux. La opción de socket SO_PEERCRED le permite averiguar el uid del proceso asociado con el socket. Y luego ya recibe el nombre de usuario asociado con este uid.

Aquí hay un ejemplo con el usuario "vagrant":

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

Como no hay ningún usuario "vagabundo" en MySQL, se nos niega el acceso. Creemos dicho usuario e intentemos nuevamente:

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)

¡Resultó!

Bueno, ¿qué pasa con una distribución que no es Debian donde esto no se proporciona de forma predeterminada? Probemos Percona Server para MySQL 8 instalado en 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

Gorrón. ¿Lo que faltaba? Complemento no cargado:

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

Agreguemos un complemento al proceso:

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)

Ahora tenemos todo lo que necesitamos. Intentemoslo de nuevo:

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)

Ahora puede iniciar sesión con el nombre de usuario "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)

¡Y volvió a funcionar!

Pregunta: ¿será posible iniciar sesión en el sistema con el mismo inicio de sesión de percona, pero como un usuario diferente?

[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á.

conclusión

MySQL es bastante flexible en varios aspectos, uno de los cuales es el método de autenticación. Como puede ver en esta publicación, se puede obtener acceso sin contraseñas, según los usuarios del sistema operativo. Esto puede ser útil en ciertos escenarios, y uno de ellos es al migrar de RDS/Aurora a MySQL normal usando Autenticación de base de datos IAMpara seguir teniendo acceso, pero sin contraseñas.

Fuente: habr.com

Añadir un comentario