
On dit que le meilleur mot de passe est celui qu'on n'a pas besoin de retenir. Avec MySQL, c'est possible grâce au plugin et sa version pour MariaDB — .
Ces deux plugins ne sont pas nouveaux, ils ont été largement discutés dans ce même blog, par exemple dans l'article sur . Cependant, en explorant les nouveautés de MariaDB 10.4, j'ai découvert que unix_socket est désormais installé par défaut et fait partie des méthodes d'authentification (« une des », car dans MariaDB 10.4, un utilisateur dispose de plusieurs plugins d'authentification disponibles, ce qui est expliqué dans le document ).
Comme je l'ai déjà dit, ce ne sont pas des nouvelles, et lorsque vous installez MySQL en utilisant les paquets .deb maintenus par l'équipe Debian, un utilisateur avec des droits root est créé pour l'authentification via socket. Cela est vrai pour MySQL ainsi que pour MariaDB.
root@app:~# apt-cache show mysql-server-5.7 | grep -i maintainers
Mainteneur d'origine : Debian MySQL Maintainers <pkg-mysql-maint@lists.alioth.debian.org>
Mainteneur d'origine : Debian MySQL Maintainers <<a href="mailto:pkg-mysql-maint@lists.alioth.debian.org">pkg-mysql-maint@lists.alioth.debian.org</a>>Avec les paquets Debian pour MySQL, l'utilisateur root s'authentifie de la manière suivante :
root@app:~# whoami
root=
root@app:~# mysql
Welcome to the MySQL monitor. Les commandes se terminent par ; ou g.
Votre ID de connexion MySQL est 4
Version du serveur : 5.7.27-0ubuntu0.16.04.1 (Ubuntu)
Droits d'auteur (c) 2000, 2019, Oracle et/ou ses filiales. Tous droits réservés.
Oracle est une marque déposée d'Oracle Corporation et/ou de ses
filiales. D'autres noms peuvent être des marques de leurs propriétaires respectifs.
Tapez 'help;' ou 'h' pour obtenir de l'aide. Tapez 'c' pour effacer l'instruction de saisie actuelle.
mysql> select user, host, plugin, authentication_string from mysql.user where user = 'root';
+------+-----------+-------------+-----------------------+
| user | host | plugin | authentication_string |
+------+-----------+-------------+-----------------------+
| root | localhost | auth_socket | |
+------+-----------+-------------+-----------------------+
1 ligne dans l'ensemble (0.01 sec)C'est également le cas avec le paquet .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 lignes dans l'ensemble (0.00 sec)Les paquets .deb du dépôt officiel de Percona configurent également l'authentification de l'utilisateur avec des droits root sous auth-socket pour Percona Server. Prenons un exemple avec et Ubuntu 16.04 :
root@app:~# whoami
root
root@app:~# mysql
Bienvenue dans le moniteur MySQL. Les commandes se terminent par ; ou g.
Votre identifiant de connexion MySQL est 9
Version du serveur : 8.0.16-7 Percona Server (GPL), Release '7', Révision '613e312'
Droits d'auteur (c) 2009-2019 Percona LLC et/ou ses affiliés
Droits d'auteur (c) 2000, 2019, Oracle et/ou ses affiliés. Tous droits réservés.
Oracle est une marque déposée d'Oracle Corporation et/ou de ses
affiliés. D'autres noms peuvent être des marques de leurs
propriétaires respectifs.
Tapez 'help;' ou 'h' pour de l'aide. Tapez 'c' pour effacer l'instruction d'entrée actuelle.
mysql> select user, host, plugin, authentication_string from mysql.user where user ='root';
+------+-----------+-------------+-----------------------+
| user | host | plugin | authentication_string |
+------+-----------+-------------+-----------------------+
| root | localhost | auth_socket | |
+------+-----------+-------------+-----------------------+
1 ligne dans l'ensemble (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 qui exécute le programme client. Ainsi, le plugin ne peut être utilisé que sur des systèmes prenant en charge l'option SO_PEERCRED, comme Linux. L'option de socket SO_PEERCRED permet d'obtenir le uid lié au processus socket. Ensuite, il récupère le nom d'utilisateur associé à ce uid.
Prenons un exemple avec l'utilisateur « vagrant » :
vagrant@mysql1:~$ whoami
vagrant
vagrant@mysql1:~$ mysql
ERREUR 1698 (28000) : Accès refusé pour l'utilisateur 'vagrant'@'localhost'Étant donné qu'il n'y a pas d'utilisateur « vagrant » dans MySQL, l'accès nous est refusé. Créons cet utilisateur et tentons à nouveau :
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'vagrant'@'localhost' IDENTIFIED VIA unix_socket;
Requête OK, 0 lignes affectées (0.00 sec)
vagrant@mysql1:~$ mysql
Bienvenue dans le moniteur MariaDB. Les commandes se terminent par ; ou g.
Votre identifiant de connexion MariaDB est 45
Version du serveur : 10.0.38-MariaDB-0ubuntu0.16.04.1 Ubuntu 16.04
Droits d'auteur (c) 2000, 2018, Oracle, MariaDB Corporation Ab et d'autres.
Tapez 'help;' ou 'h' pour de l'aide. Tapez 'c' pour effacer l'instruction d'entrée actuelle.
MariaDB [(none)]> show grants;
+---------------------------------------------------------------------------------+
| Grants for vagrant@localhost |
+---------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'vagrant'@'localhost' IDENTIFIED VIA unix_socket |
+---------------------------------------------------------------------------------+
1 ligne dans l'ensemble (0.00 sec)C'est réussi !
Et que dire d'une distribution non-Debian où cela n'est pas prévu par défaut ? Essayons Percona Server for MySQL 8, installé sur CentOS 7 :
mysql> show variables like '%version%comment';
+-----------------+---------------------------------------------------+
| Variable_name | Value |
+-----------------+---------------------------------------------------+
| version_comment | Percona Server (GPL), Release 7, Révision 613e312 |
+-----------------+---------------------------------------------------+
1 ligne dans l'ensemble (0.01 sec)
mysql> CREATE USER 'percona'@'localhost' IDENTIFIED WITH auth_socket;
ERREUR 1524 (HY000) : Plugin 'auth_socket' non chargéÉchec. Qu'est-ce qui a manqué ? Le plugin n'est pas chargé :
mysql> pager grep socket
PAGER défini sur 'grep socket'
mysql> show plugins;
47 lignes dans l'ensemble (0,00 sec)Ajoutons le plugin au processus :
mysql> nopager
PAGER défini sur stdout
mysql> INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';
Requête OK, 0 lignes affectées (0,00 sec)
mysql> pager grep socket; show plugins;
PAGER défini sur 'grep socket'
| auth_socket | ACTIF | AUTHENTIFICATION | auth_socket.so | GPL |
48 lignes dans l'ensemble (0,00 sec)Maintenant, nous avons tout ce qu'il faut. Essayons encore une fois :
mysql> CREATE USER 'percona'@'localhost' IDENTIFIED WITH auth_socket;
Requête OK, 0 lignes affectées (0,01 sec)
mysql> GRANT ALL PRIVILEGES ON *.* TO 'percona'@'localhost';
Requête OK, 0 lignes affectées (0,01 sec)Vous pouvez maintenant vous connecter avec le nom d'utilisateur « percona ».
[percona@ip-192-168-1-111 ~]$ whoami
percona
[percona@ip-192-168-1-111 ~]$ mysql -upercona
Bienvenue dans le moniteur MySQL. Les commandes se terminent par ; ou g.
Votre identifiant de connexion MySQL est 19
Version du serveur : 8.0.16-7 Percona Server (GPL), Release 7, Revision 613e312
Copyright (c) 2009-2019 Percona LLC et/ou ses affiliés
Copyright (c) 2000, 2019, Oracle et/ou ses affiliés. Tous droits réservés.
Oracle est une marque déposée d'Oracle Corporation et/ou de ses
affiliés. D'autres noms peuvent être des marques de leurs propriétaires respectifs.
Tapez 'help;' ou 'h' pour obtenir de l'aide. Tapez 'c' pour effacer l'instruction d'entrée actuelle.
mysql> select user, host, plugin, authentication_string from mysql.user where user ='percona';
+---------+-----------+-------------+-----------------------+
| user | host | plugin | authentication_string |
+---------+-----------+-------------+-----------------------+
| percona | localhost | auth_socket | |
+---------+-----------+-------------+-----------------------+
1 ligne dans l'ensemble (0,00 sec)Ça a encore marché !
Question : pouvez-vous vous connecter avec le même nom d'utilisateur percona, mais à partir d'un autre utilisateur ?
[percona@ip-192-168-1-111 ~]$ logout
[root@ip-192-168-1-111 ~]# mysql -upercona
ERREUR 1698 (28000) : Accès refusé pour l'utilisateur 'percona'@'localhost'Non, cela ne fonctionnera pas.
Sortie
MySQL est suffisamment flexible sur plusieurs aspects, dont l'une est la méthode d'authentification. Comme on peut le voir dans ce post, l'accès peut être obtenu sans mots de passe, basé sur les utilisateurs du système d'exploitation. Ceci peut être utile dans certains scénarios, et l'un d'eux est lors de la migration de RDS/Aurora vers un MySQL ordinaire, en utilisant , pour continuer à accéder, mais sans mots de passe.
Source : habr.com
