So verwenden Sie MySQL ohne Passwort (und Sicherheitsrisiken)

So verwenden Sie MySQL ohne Passwort (und Sicherheitsrisiken)

Man sagt, dass das beste Passwort das ist, das man sich nicht merken muss. Im Fall von MySQL ist dies dank des Plugins möglich auth_socket und seine Version für MariaDB - unix_socket.

Beide Plugins sind überhaupt nicht neu; im selben Blog wurde viel über sie gesagt, zum Beispiel im Artikel über So ändern Sie Passwörter in MySQL 5.7 mit dem auth_socket-Plugin. Als ich mir jedoch die Neuerungen in MariaDB 10.4 ansah, entdeckte ich, dass unix_socket jetzt standardmäßig installiert ist und eine der Authentifizierungsmethoden („eine von“) ist, da in MariaDB 10.4 einem Benutzer mehr als ein Plugin zur Authentifizierung zur Verfügung steht wird im Dokument erläutert „Authentifizierung“ von MariaDB 10.04).

Wie gesagt, das ist keine Neuigkeit, und bei der Installation von MySQL mit den vom Debian-Team unterstützten .deb-Paketen wird ein Root-Benutzer für die Socket-Authentifizierung 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 <[email protected]>
Original-Maintainer: Debian MySQL Maintainers <<a href="mailto:[email protected]">[email protected]</a>>

Bei Debian-Paketen für MySQL wird der Root-Benutzer wie folgt authentifiziert:

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)

Das Gleiche 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 und für Percona Server. Geben wir 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 also die Magie? Das Plugin prüft mithilfe der Socket-Option SO_PEERCRED, 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 verwendet werden, die die Option SO_PEERCRED unterstützen, wie beispielsweise Linux. Mit der Socket-Option SO_PEERCRED können Sie die UID des Prozesses ermitteln, der dem Socket zugeordnet ist. Und dann 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 „vagrant“-Benutzer gibt, wird uns der Zugriff verweigert. Lassen Sie uns einen solchen Benutzer erstellen und es erneut versuchen:

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 bereitgestellt wird? Probieren wir Percona Server für MySQL 8 aus, installiert auf 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

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 wir 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. Lass es uns erneut versuchen:

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)

Sie können sich nun mit dem Benutzernamen „percona“ anmelden.

[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: Ist es möglich, sich mit demselben Percona-Login, aber als einem anderen Benutzer, am System anzumelden?

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

Abschluss

MySQL ist in mehreren Aspekten recht flexibel, einer davon ist die Authentifizierungsmethode. Wie Sie diesem Beitrag entnehmen können, kann der Zugriff je nach Betriebssystembenutzer ohne Passwörter erfolgen. Dies kann in bestimmten Szenarien nützlich sein, und eines davon ist die Migration von RDS/Aurora auf normales MySQL mit IAM-Datenbankauthentifizierungum weiterhin Zugriff zu erhalten, jedoch ohne Passwörter.

Source: habr.com

Kommentar hinzufügen