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


Dicen que la mejor contraseña es aquella que no necesita ser recordada. En el caso de MySQL, esto es real gracias al complemento auth_socket y su versión para MariaDB: unix_socket .


Ambos complementos no son nuevos en absoluto, se han discutido mucho en el mismo blog, por ejemplo, en un artículo sobre cómo cambiar las contraseñas en MySQL 5.7 utilizando el complemento auth_socket . Sin embargo, al analizar 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 la autenticación de un usuario, que se explica en el documento "Autenticación" de MariaDB 10.04 ).


Como dije, esto no es una novedad, y cuando instala MySQL usando los paquetes .deb compatibles con el equipo de Debian, se crea un usuario con derechos de root para la autenticación a través 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 <pkg-mysql-maint@lists.alioth.debian.org> Original-Maintainer: Debian MySQL Maintainers <<a href="mailto:pkg-mysql-maint@lists.alioth.debian.org">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 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 es el caso 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 de raíz para auth-socket y para Percona Server. Aquí hay un ejemplo con el 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 solo se puede usar en sistemas que admitan la opción SO_PEERCRED, como Linux. La opción de socket SO_PEERCRED le permite reconocer el uid del proceso asociado al socket. Y después de eso, ya obtiene el nombre de usuario asociado con este uid.


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


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

Como no hay un usuario vagabundo en MySQL, se nos niega el acceso. Cree dicho usuario e intente 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 no Debian donde no se proporciona por defecto? Probemos el Servidor Percona 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 

Bummer ¿Qué faltaba? Plugin no cargado:


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

Agregue 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. Probemos una vez más:


 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 inicio de sesión "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 funcionó de nuevo!


Pregunta: ¿será posible iniciar sesión con el mismo inicio de sesión de Percona, pero desde 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 se puede ver en esta publicación, el acceso se puede obtener sin contraseñas, según los usuarios del sistema operativo. Esto puede ser útil en ciertos escenarios, y uno de ellos es cuando migra de RDS / Aurora a MySQL normal, utilizando la autenticación de la base de datos IAM para acceder aún, pero sin contraseñas.

Source: https://habr.com/ru/post/478930/


All Articles