Sådan bruger du MySQL uden adgangskode (og sikkerhedsrisici)

Sådan bruger du MySQL uden adgangskode (og sikkerhedsrisici)

De siger, at den bedste adgangskode er den, du ikke behøver at huske. I tilfælde af MySQL er dette muligt takket være plugin'et auth_socket og dens version til MariaDB - unix_socket.

Begge disse plugins er slet ikke nye, de er blevet diskuteret meget i denne blog, fx i artiklen om hvordan man ændrer adgangskoder i MySQL 5.7 ved hjælp af auth_socket plugin. Men mens jeg kiggede på, hvad der er nyt i MariaDB 10.4, opdagede jeg, at unix_socket nu er installeret som standard og er en af ​​godkendelsesmetoderne ("en af", fordi i MariaDB 10.4 er mere end ét plugin tilgængeligt for én bruger til godkendelse, hvilket er forklaret i dokumentet "Godkendelse" fra MariaDB 10.04).

Som sagt er dette ikke en nyhed, og når du installerer MySQL ved hjælp af .deb-pakkerne, der understøttes af Debian-teamet, oprettes en root-bruger til socket-godkendelse. Dette gælder både for MySQL og 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>>

Med Debian-pakker til MySQL bliver root-brugeren autentificeret som følger:

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)

Det samme er tilfældet med .deb-pakken til 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)

.deb-pakkerne fra det officielle Percona-lager konfigurerer også root-brugergodkendelse under auth-socket og for Percona Server. Lad os give et eksempel med Percona Server til MySQL 8.0.16-7 og 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)

Så hvad er magien? Pluginnet kontrollerer, at Linux-brugeren matcher MySQL-brugeren ved at bruge SO_PEERCRED-socket-indstillingen for at indsamle oplysninger om brugeren, der kører klientprogrammet. Pluginnet kan således kun bruges på systemer, der understøtter SO_PEERCRED-indstillingen, såsom Linux. SO_PEERCRED socket-indstillingen giver dig mulighed for at finde ud af uid'et for processen, der er forbundet med socket. Og så modtager han allerede brugernavnet forbundet med denne uid.

Her er et eksempel med brugeren "vagrant":

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

Da der ikke er nogen "vagrant" bruger i MySQL, nægtes vi adgang. Lad os oprette sådan en bruger og prøve igen:

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)

skete!

Nå, hvad med en ikke-Debian-distribution, hvor denne ikke leveres som standard? Lad os prøve Percona Server til MySQL 8 installeret på 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

Øv bøv. Hvad manglede? Plugin ikke indlæst:

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

Lad os tilføje et plugin til processen:

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 har vi alt, hvad vi har brug for. Lad os prøve igen:

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)

Du kan nu logge ind med brugernavnet "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)

Og det virkede igen!

Spørgsmål: vil det være muligt at logge ind på systemet under samme percona login, men som en anden bruger?

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

Nej, det vil ikke virke.

Output

MySQL er ret fleksibel i flere aspekter, hvoraf et er godkendelsesmetoden. Som du kan se fra dette indlæg, kan adgang opnås uden adgangskoder, baseret på OS-brugere. Dette kan være nyttigt i visse scenarier, og et af dem er, når du migrerer fra RDS/Aurora til almindelig MySQL ved hjælp af IAM-databasegodkendelsefor stadig at få adgang, men uden adgangskoder.

Kilde: www.habr.com

Tilføj en kommentar