Wie man MySQL ohne Passwort benutzt (und Sicherheitsrisiken)


Sie sagen, dass das beste Passwort eines ist, an das man sich nicht erinnern muss. Im Falle von MySQL ist dies real dank des auth_socket- Plugins und seiner Version für MariaDB - unix_socket .


Beide Plugins sind überhaupt nicht neu, sie wurden viel im selben Blog diskutiert, zum Beispiel in einem Artikel über das Ändern von Passwörtern in MySQL 5.7 mithilfe des auth_socket-Plugins . Als ich jedoch analysierte, was in MariaDB 10.4 neu ist, stellte ich fest, dass unix_socket jetzt standardmäßig installiert ist und eine der Authentifizierungsmethoden ist ("eins von"), da in MariaDB 10.4 mehr als ein Plugin für die Authentifizierung für einen Benutzer verfügbar ist, was im Dokument erklärt wird "Authentifizierung" von MariaDB 10.04 ).


Wie gesagt, dies ist keine Neuigkeit, und wenn Sie MySQL mit den vom Debian-Team unterstützten .deb-Paketen installieren, wird ein Benutzer mit Root-Rechten für die Authentifizierung über den Socket erstellt. Dies gilt sowohl für MySQL als auch für 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>> 

Mit Debian-Paketen für MySQL authentifiziert sich der Root-Benutzer wie folgt:


 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) 

Gleiches gilt für das .deb-Paket für 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) 

Die .deb-Pakete aus dem offiziellen Percona-Repository konfigurieren auch die Root-Benutzerauthentifizierung unter auth-socket für Percona Server. Hier ist ein Beispiel mit Percona Server für MySQL 8.0.16-7 und 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) 

Was ist die Magie? Das Plugin überprüft mithilfe der SO_PEERCRED-Socket-Option, ob der Linux-Benutzer mit dem MySQL-Benutzer übereinstimmt, um Informationen über den Benutzer zu sammeln, der das Client-Programm ausführt. Daher kann das Plugin nur auf Systemen wie Linux verwendet werden, die die Option SO_PEERCRED unterstützen. Mit der Socket-Option SO_PEERCRED können Sie die UID des mit dem Socket verbundenen Prozesses erkennen. Danach erhält er bereits den mit dieser UID verknüpften Benutzernamen.


Hier ist ein Beispiel mit dem Benutzer "vagrant":


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

Da es in MySQL keinen unbekannten Benutzer gibt, wird uns der Zugriff verweigert. Erstellen Sie einen solchen Benutzer und versuchen Sie es erneut:


 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) 

Es stellte sich heraus!


Was ist mit einer Nicht-Debian-Distribution, bei der dies nicht standardmäßig vorgesehen ist? Versuchen wir, Percona Server für MySQL 8 unter CentOS 7 zu installieren:


 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 

Schade. Was hat gefehlt? Plugin nicht geladen:


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

Fügen Sie dem Prozess ein Plugin hinzu:


 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) 

Jetzt haben wir alles was wir brauchen. Versuchen wir es noch einmal:


 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) 

Jetzt können Sie sich mit dem Login "percona" einloggen.


 [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) 

Und es hat wieder funktioniert!


Frage: Wird es möglich sein, sich mit demselben Percona-Login anzumelden, aber mit einem anderen Benutzer?


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

Nein, es wird nicht funktionieren.


Fazit


MySQL ist in mehreren Aspekten recht flexibel, unter anderem in Bezug auf die Authentifizierungsmethode. Wie aus diesem Beitrag hervorgeht, kann der Zugriff basierend auf den Benutzern des Betriebssystems ohne Kennwörter erfolgen. Dies kann in bestimmten Szenarien nützlich sein. Eine davon ist die Migration von RDS / Aurora auf reguläres MySQL, wobei die IAM-Datenbankauthentifizierung verwendet wird, um weiterhin auf MySQL zuzugreifen, jedoch ohne Kennwörter.

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


All Articles