Kuidas kasutada MySQLi ilma paroolita (ja turvariskideta)

Kuidas kasutada MySQLi ilma paroolita (ja turvariskideta)

Öeldakse, et parim parool on see, mida ei pea mäletama. MySQL'i puhul on see võimalik tänu plugina auth_socket ja selle versioonile MariaDB jaoks — unix_socket.

Mõlemad need pluginaid ei ole sugugi uued, neist on palju räägitud ka selles blogis, näiteks artiklis selle kohta, kuidas muuta MySQL 5.7 parooli, kasutades plugina auth_socket. Kuid MariaDB 10.4 uudistades avastasin, et unix_socket seadistatakse nüüd vaikimisi ja on üks autentimise meetoditest ("üheks", sest MariaDB 10.4 puhul on ühel kasutajal autentimiseks rohkem kui üks plugin, millest räägitakse dokumendis "Autentimine" MariaDB 10.04).

Nii nagu ma juba ütlesin, ei ole see uudis, ja kui installida MySQL, kasutades Debian meeskonna toetatud .deb pakette, luuakse root-õigustega kasutaja autentimiseks soketi kaudu. See kehtib nii MySQLi kui ka MariaDB puhul.

root@app:~# apt-cache show mysql-server-5.7 | grep -i maintainers
Originaal-haldur: Debian MySQL Haldurid <pkg-mysql-maint@lists.alioth.debian.org>
Originaal-haldur: Debian MySQL Haldurid <<a href="mailto:pkg-mysql-maint@lists.alioth.debian.org"&gt;pkg-mysql-maint@lists.alioth.debian.org</a>>

Debiani pakettide jaoks MySQLi puhul autentitakse root kasutaja järgmiselt:

root@app:~# whoami
root=
root@app:~# mysql
Tere tulemast MySQL monitori. Käsklused lõppevad ; või g.
Teie MySQL ühenduse ID on 4
Serveri versioon: 5.7.27-0ubuntu0.16.04.1 (Ubuntu)

Kopeerimine (c) 2000, 2019, Oracle ja/või selle tütarettevõtted. Kõik õigused kaitstud.
Oracle on Oracle Corporationi ja/või selle tütarettevõtete registreeritud kaubamärk. Teised nimed võivad olla vastavate omanike kaubamärgid.

Tippige 'help;' või 'h' abi saamiseks. Tippige 'c', et praegune sisendlaused kustutada.

mysql> select user, host, plugin, authentication_string from mysql.user where user = 'root';
+------+-----------+-------------+-----------------------+
| user | host      | plugin | authentication_string |
+------+-----------+-------------+-----------------------+
| root | localhost | auth_socket |                       |
+------+-----------+-------------+-----------------------+
1 rida komplektis (0.01 sekundi jooksul)

Sama kehtib ka .deb paketi puhul MariaDB jaoks:

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 rida komplektis (0.00 sekundi jooksul)

.deb paketid ametlikust Percona hoidlast seadistavad samuti root-kasutaja autentimise auth-socket all ka Percona Serveri jaoks. Toome näite Percona Server for MySQL 8.0.16-7 ja Ubuntu 16.04:

root@app:~# whoami
root
root@app:~# mysql
Tere tulemast MySQL monitorisse. Käsklused lõppevad ; või g.
Teie MySQL ühenduse ID on 9
Serveri versioon: 8.0.16-7 Percona Server (GPL), versioon '7', revision '613e312'

Autoriõigus (c) 2009-2019 Percona LLC ja/või selle tütarettevõtted
Autoriõigus (c) 2000, 2019, Oracle ja/või selle tütarettevõtted. Kõik õigused kaitstud.
Oracle on registreeritud kaubamärk Oracle Corporation ja/või selle
tütarettevõtete. Teised nimed võivad olla nende omanike kaubamärgid.

Tippige 'help;' või 'h' abi saamiseks. Tippige 'c', et praegune sisend lahti teha.

mysql> select user, host, plugin, authentication_string from mysql.user where user ='root';
+------+-----------+-------------+-----------------------+
| user | host      | plugin      | authentication_string |
+------+-----------+-------------+-----------------------+
| root | localhost | auth_socket |                       |
+------+-----------+-------------+-----------------------+
1 rida seades (0.00 sek)

Mis siis on selle maagia? Plugin kontrollib, et Linuxi kasutaja vastaks MySQL kasutajale, kasutades sokli valikut SO_PEERCRED — et koguda teavet kasutaja kohta, kes käivitab kliendirakenduse. Seega saab plaani kasutada ainult süsteemides, mis toetavad SO_PEERCRED valikut, nagu Linux. Sokli valik SO_PEERCRED võimaldab teada UID-d, mis on seotud sokli protsessiga. Siis saab ta juba seotud UID kaudu kasutajanime.

Toome näite kasutajast «vagrant»:

vagrant@mysql1:~$ whoami
vagrant
vagrant@mysql1:~$ mysql
VIGA 1698 (28000): Juurdepääs on keelatud kasutajale 'vagrant'@'localhost'

Kuna MySQL-is ei ole kasutajat «vagrant», on juurdepääs keelatud. Loome sellise kasutaja ja proovime uuesti:

MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'vagrant'@'localhost' IDENTIFIED VIA unix_socket;
Küsimus OK, 0 rida mõjutatud (0.00 sek)

vagrant@mysql1:~$ mysql
Tere tulemast MariaDB monitorisse. Käsklused lõppevad ; või g.
Teie MariaDB ühenduse ID on 45
Serveri versioon: 10.0.38-MariaDB-0ubuntu0.16.04.1 Ubuntu 16.04
Autoriõigus (c) 2000, 2018, Oracle, MariaDB Corporation Ab ja teised.
Tippige 'help;' või 'h' abi saamiseks. Tippige 'c', et praegune sisend lahti teha.

MariaDB [(none)]> show grants;
+---------------------------------------------------------------------------------+
| Grants for vagrant@localhost                                                      |
+---------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'vagrant'@'localhost' IDENTIFIED VIA unix_socket |
+---------------------------------------------------------------------------------+
1 rida seades (0.00 sek)

Saime hakkama!

Ent kuidas on asjadega mitte-Debiani väljalaskega, kus see pole vaikimisi ette nähtud? Proovime Percona Server for MySQL 8, paigaldatud CentOS 7-le:

mysql> show variables like '%version%comment';
+-----------------+---------------------------------------------------+
| Variable_name   | Value                                            |
+-----------------+---------------------------------------------------+
| version_comment | Percona Server (GPL), Release 7, Revision 613e312 |
+-----------------+---------------------------------------------------+
1 rida seades (0.01 sek)

mysql> CREATE USER 'percona'@'localhost' IDENTIFIED WITH auth_socket;
VIGA 1524 (HY000): Plugin 'auth_socket' ei ole laaditud

Ootus. Mida jäi puudu? Plugin ei ole laaditud:

mysql> pager grep socket
PAGER on seadistatud 'grep socket'
mysql> show plugins;
47 rida komplektis (0.00 sek)

Lisame protsessile plugina:

mysql> nopager
PAGER on seadistatud stdout
mysql> INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';
Küsimus OK, 0 rida puudutatud (0.00 sek)

mysql> pager grep socket; show plugins;
PAGER on seadistatud 'grep socket'
| auth_socket | ACTIVE | AUTHENTICATION | auth_socket.so | GPL |
48 rida komplektis (0.00 sek)

Nüüd on meil kõik vajalik. Proovime veel kord:

mysql> CREATE USER 'percona'@'localhost' IDENTIFIED WITH auth_socket;
Küsimus OK, 0 rida puudutatud (0.01 sek)
mysql> GRANT ALL PRIVILEGES ON *.* TO 'percona'@'localhost';
Küsimus OK, 0 rida puudutatud (0.01 sek)

Nüüd võib siseneda süsteemi logige 'percona' all.

[percona@ip-192-168-1-111 ~]$ whoami
percona
[percona@ip-192-168-1-111 ~]$ mysql -upercona
Tere tulemast MySQL monitori. Käskude lõpetamiseks kasutage ; või g.
Teie MySQL ühenduse id on 19
Serveri versioon: 8.0.16-7 Percona Server (GPL), Väljalase 7, Ülevaade 613e312

Autoriõigus (c) 2009-2019 Percona LLC ja/või selle tütarettevõtted
Autoriõigus (c) 2000, 2019, Oracle ja/või selle tütarettevõtted. Kõik õigused on kaitstud.

Oracle on Oracle Corporation ja/või selle tütarettevõtete registreeritud kaubamärk. Teised nimed võivad olla nende vastavate omanike kaubamärgid.

Tippige 'help;' või 'h', et saada abi. Tippige 'c', et kustutada praegune sisendilausung.

mysql> select user, host, plugin, authentication_string from mysql.user where user ='percona';
+---------+-----------+-------------+-----------------------+
| user    | host      | plugin      | authentication_string |
+---------+-----------+-------------+-----------------------+
| percona | localhost | auth_socket |                       |
+---------+-----------+-------------+-----------------------+
1 rida komplektis (0.00 sek)

Ja jälle õnnestus!

Küsimus: kas on võimalik siseneda süsteemi sama kasutajanimega percona, kuid teise kasutaja alt?

[percona@ip-192-168-1-111 ~]$ logout
[root@ip-192-168-1-111 ~]# mysql -upercona
VIGA 1698 (28000): Juhtum keelatud kasutajale 'percona'@'localhost'

Ei, ei õnnestu.

Kokkuvõte

MySQL on mitmes aspektis paindlik, üks neist on autentimismeetod. Nagu näha sellest postitusest, on juurdepääsu võimalik saada ilma paroolideta, tuginedes OS kasutajatele. See võib olla kasulik teatud stsenaariumides, sealhulgas olukordades, kui migreerite RDS/Aurora'lt tavalisele MySQL-le, kasutades andmebaasi IAM autentimist, et jätkuvalt juurdepääsu saada, kuid ilma paroolideta.

Allikas: habr.com

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster