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

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

Se dice que la mejor contraseña es la que no necesitas recordar. En el caso de MySQL, esto es posible gracias al plugin auth_socket y su versión para MariaDB — unix_socket.

Ambos plugins no son 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 plugin auth_socket. Sin embargo, al examinar las novedades en MariaDB 10.4, descubrí que unix_socket ahora se establece por defecto y es uno de los métodos de autenticación (“uno de”, porque en MariaDB 10.4, un usuario tiene acceso a más de un plugin de autenticación, como se explica en el documento “Autenticación” de MariaDB 10.04).

Como ya mencioné, esto no es nuevo, y cuando instalas MySQL usando los paquetes .deb soportados por el equipo de Debian, se crea un usuario con privilegios de root para autenticar a través de socket. Esto es cierto tanto para MySQL como para MariaDB.

root@app:~# apt-cache show mysql-server-5.7 | grep -i mantenedores
Mantenedor-original: Mantenedores de MySQL de Debian <pkg-mysql-maint@lists.alioth.debian.org>
Mantenedor-original: Mantenedores de MySQL de Debian <<a href="mailto:pkg-mysql-maint@lists.alioth.debian.org"&gt;pkg-mysql-maint@lists.alioth.debian.org</a>>

Con los paquetes Debian para MySQL, el usuario root se autentica de la siguiente manera:

root@app:~# whoami
root=
root@app:~# mysql
Bienvenido al monitor de MySQL. Los comandos terminan con ; o g.
Tu ID de conexión de MySQL es 4
Versión del servidor: 5.7.27-0ubuntu0.16.04.1 (Ubuntu)

Copyright (c) 2000, 2019, Oracle y/o sus afiliados. Todos los derechos reservados.
Oracle es una marca registrada de Oracle Corporation y/o sus
afiliados. Otros nombres pueden ser marcas comerciales de sus respectivos
propietarios.

Escribe 'help;' o 'h' para ayuda. Escribe 'c' para limpiar la declaración de entrada actual.

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 sucede 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 con privilegios de root bajo auth-socket y para Percona Server. Tomemos un ejemplo con Percona Server for MySQL 8.0.16-7 y Ubuntu 16.04:

root@app:~# whoami
root
root@app:~# mysql
Bienvenido al monitor de MySQL. Los comandos terminan con ; o g.
Tu ID de conexión de MySQL es 9
Versión del servidor: 8.0.16-7 Percona Server (GPL), Lanzamiento '7', Revisión '613e312'

Copyright (c) 2009-2019 Percona LLC y/o sus afiliados
Copyright (c) 2000, 2019, Oracle y/o sus afiliados. Todos los derechos reservados.
Oracle es una marca registrada de Oracle Corporation y/o sus afiliados. Otros nombres pueden ser marcas registradas de sus respectivos propietarios.

Escribe 'help;' o 'h' para ayuda. Escribe 'c' para limpiar la declaración de entrada actual.

mysql> select user, host, plugin, authentication_string from mysql.user where user ='root';
+------+-----------+-------------+-----------------------+
| user | host    | plugin | authentication_string |
+------+-----------+-------------+-----------------------+
| root | localhost | auth_socket |                       |
+------+-----------+-------------+-----------------------+
1 fila en el conjunto (0.00 seg)

¿Y cuál es la magia? El plugin verifica que el usuario de Linux corresponda al usuario de MySQL, utilizando la opción de socket SO_PEERCRED — para recopilar información sobre el usuario que ejecuta el programa cliente. Así, el plugin solo puede usarse en sistemas que soporten la opción SO_PEERCRED, como Linux. La opción de socket SO_PEERCRED permite conocer el uid asociado al proceso del socket. Luego, ya puede obtenerse el nombre de usuario correspondiente a ese uid.

Tomemos un ejemplo con el usuario «vagrant»:

vagrant@mysql1:~$ whoami
vagrant
vagrant@mysql1:~$ mysql
ERROR 1698 (28000): Acceso denegado para el usuario 'vagrant'@'localhost'

Dado que no hay un usuario «vagrant» en MySQL, se nos ha denegado el acceso. Creamos ese usuario y repetimos el intento:

MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'vagrant'@'localhost' IDENTIFIED VIA unix_socket;
Consulta OK, 0 filas afectadas (0.00 seg)

vagrant@mysql1:~$ mysql
Bienvenido al monitor de MariaDB. Los comandos terminan con ; o g.
Tu ID de conexión de MariaDB es 45
Versión del servidor: 10.0.38-MariaDB-0ubuntu0.16.04.1 Ubuntu 16.04
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab y otros.
Escribe 'help;' o 'h' para ayuda. Escribe 'c' para limpiar la declaración de entrada actual.

MariaDB [(none)]> show grants;
+---------------------------------------------------------------------------------+
| Grants for vagrant@localhost                                                   |
+---------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'vagrant'@'localhost' IDENTIFIED VIA unix_socket |
+---------------------------------------------------------------------------------+
1 fila en el conjunto (0.00 seg)

¡Lo logramos!

¿Y qué hay de una distribución que no sea Debian, donde esto no está previsto por defecto? Intentemos Percona Server for 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 fila en el conjunto (0.01 seg)

mysql> CREATE USER 'percona'@'localhost' IDENTIFIED WITH auth_socket;
ERROR 1524 (HY000): Plugin 'auth_socket' no está cargado

Error. What was missing? The plugin was not loaded:

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

Let's add the plugin to the process:

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)

Now we have everything we need. Let's try again:

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)

You can now log in with the username "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)

And it worked again!

Question: will it be possible to log in with the same username percona, but from another user?

[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, it won't work.

Salida

MySQL is quite flexible in several aspects, one of which is the authentication method. As seen from this post, access can be obtained without passwords, based on OS users. This can be useful in certain scenarios, one of which is when migrating from RDS/Aurora to regular MySQL, using IAM database authentication, to still access without passwords.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster