MySQL gebruiken zonder wachtwoord (en beveiligingsrisico's)

MySQL gebruiken zonder wachtwoord (en beveiligingsrisico's)

Ze zeggen dat het beste wachtwoord het wachtwoord is dat je niet hoeft te onthouden. In het geval van MySQL is dit mogelijk dankzij de plug-in auth_socket en de versie voor MariaDB - unix_socket.

Beide plug-ins zijn helemaal niet nieuw; er is veel over gezegd in dezelfde blog, bijvoorbeeld in het artikel over hoe u wachtwoorden kunt wijzigen in MySQL 5.7 met behulp van de plug-in auth_socket. Toen ik echter onderzocht wat er nieuw is in MariaDB 10.4, ontdekte ik dat unix_socket nu standaard is geïnstalleerd en een van de authenticatiemethoden is (“een van”, omdat in MariaDB 10.4 meer dan één plug-in beschikbaar is voor één gebruiker voor authenticatie, wat wordt uitgelegd in het document "Authenticatie" van MariaDB 10.04).

Zoals ik al zei, is dit geen nieuws, en bij het installeren van MySQL met behulp van de .deb-pakketten die door het Debian-team worden ondersteund, wordt een rootgebruiker aangemaakt voor socketauthenticatie. Dit geldt voor zowel MySQL als 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>>

Bij Debian-pakketten voor MySQL wordt de rootgebruiker als volgt geverifieerd:

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)

Hetzelfde is het geval met het .deb-pakket voor 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)

De .deb-pakketten uit de officiële Percona-repository configureren ook rootgebruikersauthenticatie onder auth-socket en voor Percona Server. Laten we een voorbeeld geven met Percona Server voor MySQL 8.0.16-7 en 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)

Dus wat is de magie? De plug-in controleert of de Linux-gebruiker overeenkomt met de MySQL-gebruiker met behulp van de SO_PEERCRED-socketoptie om informatie te verzamelen over de gebruiker die het clientprogramma uitvoert. De plug-in kan dus alleen worden gebruikt op systemen die de SO_PEERCRED-optie ondersteunen, zoals Linux. Met de socketoptie SO_PEERCRED kunt u de uid van het proces dat aan de socket is gekoppeld, achterhalen. En dan ontvangt hij al de gebruikersnaam die bij deze uid hoort.

Hier is een voorbeeld met de gebruiker "vagrant":

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

Omdat er geen "zwerverachtige" gebruiker in MySQL is, wordt ons de toegang geweigerd. Laten we zo'n gebruiker aanmaken en het opnieuw proberen:

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)

Gebeurd!

Welnu, hoe zit het met een niet-Debian-distributie waarin dit niet standaard wordt geleverd? Laten we Percona Server voor MySQL 8 proberen, geïnstalleerd op 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

Jammer. Wat miste er? Plug-in niet geladen:

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

Laten we een plug-in aan het proces toevoegen:

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)

Nu hebben we alles wat we nodig hebben. Laten we het opnieuw proberen:

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)

U kunt nu inloggen met de gebruikersnaam “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)

En het werkte weer!

Vraag: is het mogelijk om met dezelfde percona login in te loggen op het systeem, maar als een andere gebruiker?

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

Nee, het zal niet werken.

Uitgang

MySQL is in verschillende opzichten behoorlijk flexibel, waaronder de authenticatiemethode. Zoals je in dit bericht kunt zien, kan toegang worden verkregen zonder wachtwoorden, op basis van OS-gebruikers. Dit kan handig zijn in bepaalde scenario's, en een daarvan is bij het migreren van RDS/Aurora naar gewone MySQL met behulp van IAM-databaseverificatieom toch toegang te krijgen, maar zonder wachtwoorden.

Bron: www.habr.com

Voeg een reactie