Comment utiliser MySQL sans mot de passe (et risques de sécurité)


Ils disent que le meilleur mot de passe est celui qui n'a pas besoin d'être retenu. Dans le cas de MySQL, c'est réel grâce au plugin auth_socket et sa version pour MariaDB - unix_socket .


Ces deux plugins ne sont pas nouveaux du tout, ils ont été beaucoup discutés dans le même blog, par exemple, dans un article sur la façon de changer les mots de passe dans MySQL 5.7 en utilisant le plugin auth_socket . Cependant, en analysant les nouveautés de MariaDB 10.4, j'ai constaté que unix_socket est maintenant installé par défaut et est l'une des méthodes d'authentification ("l'une des", car dans MariaDB 10.4 plus d'un plugin est disponible pour l'authentification pour un utilisateur, ce qui est expliqué dans le document "Authentification" de MariaDB 10.04 ).


Comme je l'ai dit, ce n'est pas une nouveauté, et lorsque vous installez MySQL en utilisant les paquets .deb pris en charge par l'équipe Debian, un utilisateur avec les droits root est créé pour l'authentification via le socket. Cela est vrai pour MySQL et 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>> 

Avec les packages Debian pour MySQL, l'utilisateur root s'authentifie comme suit:


 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) 

Il en va de même avec le package .deb pour 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) 

Les packages .deb du référentiel officiel Percona configurent également l'authentification racine pour l'auth-socket et pour Percona Server. Voici un exemple avec Percona Server pour MySQL 8.0.16-7 et 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) 

Alors quelle est la magie? Le plugin vérifie que l'utilisateur Linux correspond à l'utilisateur MySQL en utilisant l'option de socket SO_PEERCRED - pour collecter des informations sur l'utilisateur exécutant le programme client. Ainsi, le plugin ne peut être utilisé que sur des systèmes prenant en charge l'option SO_PEERCRED, tels que Linux. L'option de socket SO_PEERCRED vous permet de reconnaître l'uid du processus associé au socket. Et après cela, il obtient déjà le nom d'utilisateur associé à cet uid.


Voici un exemple avec l'utilisateur "vagabond":


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

Puisqu'il n'y a aucun utilisateur vagabond dans MySQL, l'accès nous est refusé. Créez un tel utilisateur et réessayez:


 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) 

Ça s'est avéré!


Eh bien, qu'en est-il d'une distribution non Debian où elle n'est pas fournie par défaut? Essayons Percona Server pour MySQL 8 installé sur 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'est-ce qui manquait? Plugin non chargé:


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

Ajoutez un plugin au processus:


 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) 

Maintenant, nous avons tout ce dont nous avons besoin. Essayons encore une fois:


 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) 

Vous pouvez maintenant vous connecter en utilisant le login "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) 

Et ça a encore marché!


Question: sera-t-il possible de se connecter en utilisant la même connexion percona, mais à partir d'un autre utilisateur?


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

Non, ça ne marchera pas.


Conclusion


MySQL est assez flexible à plusieurs égards, dont la méthode d'authentification. Comme on peut le voir dans cet article, l'accès peut être obtenu sans mot de passe, en fonction des utilisateurs du système d'exploitation. Cela peut être utile dans certains scénarios, et l'un d'eux est lorsque vous migrez de RDS / Aurora vers MySQL normal, en utilisant l' authentification de base de données IAM pour y accéder, mais sans mots de passe.

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


All Articles