Cum să folosești MySQL fără parolă (și fără riscuri pentru securitate)

Cum să folosești MySQL fără parolă (și fără riscuri pentru securitate)

Se spune că cea mai bună parolă este cea pe care nu trebuie să o ții minte. În cazul MySQL, acest lucru este real datorită pluginului auth_socket și versiunea sa pentru MariaDB — unix_socket.

Ambele aceste pluginuri nu sunt deloc noi, au fost discutate mult în acest blog, de exemplu în articolul despre cum să schimbi parolele în MySQL 5.7 folosind pluginul auth_socket. Totuși, analiza ceea ce este nou în MariaDB 10.4, am descoperit că unix_socket este acum instalat implicit și este unul dintre metodele de autentificare („unul dintre”, având în vedere că în MariaDB 10.4, unui utilizator îi sunt disponibile mai multe pluginuri pentru autentificare, ceea ce este explicat în documentul „Autentificare” de MariaDB 10.04).

Așa cum am spus, acestea nu sunt noutăți și atunci când instalezi MySQL folosind pachetele Debian suportate, utilizatorul cu drepturi de root este creat pentru autentificarea prin socket. Acest lucru este valabil atât pentru MySQL, cât și pentru 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"&gt;pkg-mysql-maint@lists.alioth.debian.org</a>>

Cu pachetele Debian pentru MySQL, utilizatorul root este autentificat astfel:

root@app:~# whoami
root=
root@app:~# mysql
Bine ai venit în monitorul MySQL. Comenzile se termină cu ; sau g.
ID-ul tău de conecțiune MySQL este 4
Versiunea serverului: 5.7.27-0ubuntu0.16.04.1 (Ubuntu)

Copyright (c) 2000, 2019, Oracle și/sau afiliații săi. Toate drepturile rezervate.
Oracle este un marcă înregistrată a Oracle Corporation și/sau afiliații săi. Alte nume pot fi mărci comerciale ale respective ale lor.

Tastează 'help;' sau 'h' pentru ajutor. Tastează 'c' pentru a șterge declarația de intrare curentă.

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)

La fel este și în cazul pachetului .deb pentru 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)

Pachetele .deb din depozitul oficial Percona configurează, de asemenea, autentificarea utilizatorului cu drepturi de root sub auth-socket și pentru Percona Server. Să dăm un exemplu cu Percona Server for MySQL 8.0.16-7 și Ubuntu 16.04:

root@app:~# whoami
root
root@app:~# mysql
Bine ai venit la monitorul MySQL. Comenzile se termină cu ; sau g.
ID-ul de conexiune MySQL este 9
Versiunea serverului: 8.0.16-7 Percona Server (GPL), Lansare '7', Revizie '613e312'

Copyright (c) 2009-2019 Percona LLC și/sau afiliații săi
Copyright (c) 2000, 2019, Oracle și/sau afiliații săi. Toate drepturile rezervate.
Oracle este un marcă înregistrată a Oracle Corporation și/sau afiliații săi. Alte nume pot fi mărci comerciale ale proprietarilor lor respectivi.

Tastează 'help;' sau 'h' pentru ajutor. Tastează 'c' pentru a șterge instrucțiunea de input curentă.

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)

Dar care este magia? Pluginul verifică dacă utilizatorul Linux corespunde utilizatorului MySQL, folosind opțiunea de socket SO_PEERCRED — pentru a aduna informații despre utilizatorul care rulează programul client. Astfel, pluginul poate fi utilizat doar pe sistemele care suportă opțiunea SO_PEERCRED, cum ar fi Linux. Opțiunea de socket SO_PEERCRED permite obținerea uid-ului asociat socket-ului procesului. Apoi, acesta primește numele utilizatorului asociat cu acest uid.

Să luăm un exemplu cu utilizatorul „vagrant”:

vagrant@mysql1:~$ whoami
vagrant
vagrant@mysql1:~$ mysql
EROARE 1698 (28000): Acces refuzat pentru utilizator 'vagrant'@'localhost'

Deoarece în MySQL nu există utilizatorul „vagrant”, accesul ne este refuzat. Să creăm acest utilizator și să repetăm încercarea:

MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'vagrant'@'localhost' IDENTIFIED VIA unix_socket;
Interogare OK, 0 rânduri afectate (0.00 sec)

vagrant@mysql1:~$ mysql
Bine ai venit la monitorul MariaDB. Comenzile se termină cu ; sau g.
ID-ul de conexiune MariaDB este 45
Versiunea serverului: 10.0.38-MariaDB-0ubuntu0.16.04.1 Ubuntu 16.04
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab și altele.
Tastează 'help;' sau 'h' pentru ajutor. Tastează 'c' pentru a șterge instrucțiunea de input curentă.

MariaDB [(none)]> show grants;
+---------------------------------------------------------------------------------+
| Granturi pentru vagrant@localhost                                               |
+---------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'vagrant'@'localhost' IDENTIFIED VIA unix_socket |
+---------------------------------------------------------------------------------+
1 row in set (0.00 sec)

A reușit!

Dar ce facem în cazul unei distribuții care nu este Debian, unde acest lucru nu este supportat implicit? Să încercăm Percona Server for MySQL 8, instalat pe 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;
EROARE 1524 (HY000): Pluginul 'auth_socket' nu este încărcat

Întâmpinăm o problemă. Ce a lipsit? Pluginul nu a fost încărcat:

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

Să adăugăm pluginul în proces:

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)

Acum avem tot ce ne trebuie. Să încercăm din nou:

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)

Acum putem să ne logăm cu utilizatorul „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)

Și din nou a funcționat!

Întrebare: Va reuși să se logheze din nou cu același utilizator percona, dar de la un alt utilizator?

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

Nu, nu va reuși.

Ieșire

MySQL este suficient de flexibilă în mai multe privințe, unul dintre acestea fiind metoda de autentificare. Așa cum se vede din acest post, accesul poate fi obținut fără parole, bazându-se pe utilizatorii sistemului de operare. Acest lucru poate fi util în anumite scenarii, iar unul dintre acestea este atunci când migrați de la RDS/Aurora la MySQL obișnuit, folosind autentificarea bazei de date IAM, pentru a continua să aveți acces, dar fără parole.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster