Si të përdorni MySQL pa fjalëkalim (dhe rreziqe për sigurinë)

Si të përdorni MySQL pa fjalëkalim (dhe rreziqe për sigurinë)

ThonĂ« se fjalĂ«kalimi mĂ« i mirĂ« Ă«shtĂ« ai qĂ« nuk duhet ta mbash mend. NĂ« rastin e MySQL, kjo Ă«shtĂ« e mundur falĂ« plugin-it auth_socket dhe versionit tĂ« tij pĂ«r MariaDB — unix_socket.

Të dy këta pluginë nuk janë aspak të rinj, janë diskutuar shumë në këtë blog, për shembull në artikullin rreth si të ndryshosh fjalëkalimet në MySQL 5.7, duke përdorur plugin-in auth_socket. Megjithatë, duke shqyrtuar çfarë është e re në MariaDB 10.4, zbulova se unix_socket tani instalçohet si parazgjedhje dhe është një nga metodat e autentifikimit («një nga», sepse në MariaDB 10.4 një përdoruesi i janë në dispozicion më shumë se një plugin për autentifikim, siç shpjegohet në dokumentin «Autentifikimi» nga MariaDB 10.04).

Ashtu siç thashë më parë, kjo nuk është e re, dhe kur instalon MySQL duke përdorur paketat .deb të mbështetura nga ekipi i Debianit, përdoruesi me të drejta root krijohet për autentifikim përmes socket-it. Kjo është e saktë si për MySQL ashtu edhe për MariaDB.

root@app:~# apt-cache show mysql-server-5.7 | grep -i maintainers
Mirembajtësi Origjinal: Mirembajtësit e MySQL të Debianit <pkg-mysql-maint@lists.alioth.debian.org>
Mirembajtësi Origjinal: Mirembajtësit e MySQL të Debianit <<<a href="mailto:pkg-mysql-maint@lists.alioth.debian.org">pkg-mysql-maint@lists.alioth.debian.org</a></a>>

Me paketat Debian për MySQL, përdoruesi root autentifikohet si në vijim:

root@app:~# whoami
root=
root@app:~# mysql
Mirë se erdhët në monitorin MySQL. Komandat mbarojnë me ; ose g.
ID e lidhjes tuaj MySQL është 4
Versioni i serverit: 5.7.27-0ubuntu0.16.04.1 (Ubuntu)

Copyright (c) 2000, 2019, Oracle dhe/ose filialet e saj. Të gjitha të drejtat e rezervuara.
Oracle është një markë tregtare e Oracle Corporation dhe/ose filialet e saj. Emra të tjerë mund të jenë marka tregtare të pronarëve të tyre përkatës.

Shkruani 'help;' ose 'h' për ndihmë. Shkruani 'c' për të pastruar deklaratën aktuale të inputit.

mysql> select user, host, plugin, authentication_string from mysql.user where user = 'root';
+------+-----------+-------------+-----------------------+
| user | host      | plugin | authentication_string |
+------+-----------+-------------+-----------------------+
| root | localhost | auth_socket |                       |
+------+-----------+-------------+-----------------------+
1 rresht në set (0.01 sekondë)

Kështu është edhe në rastin e paketës .deb për MariaDB:

10.0.38-MariaDB-0ubuntu0.16.04.1 Ubuntu 16.04

MariaDB [(none)]> show grants;
+------------------------------------------------------------------------------------------------+
| Grants për 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 rreshta në set (0.00 sekondë)

Paketat .deb nga repozitori zyrtar Percona gjithashtu konfigurojnë autentifikimin e përdoruesit me të drejta root nën auth-socket dhe për Percona Server. Le të japim një shembull me Percona Server for MySQL 8.0.16-7 dhe Ubuntu 16.04:

root@app:~# whoami
root
root@app:~# mysql
Mirë se erdhët në monitorin MySQL. Komandat mbarojnë me ; ose g.
ID e lidhjes tuaj MySQL është 9
Versioni i serverit: 8.0.16-7 Percona Server (GPL), Publikimi '7', Rishikimi '613e312'

Copyright (c) 2009-2019 Percona LLC dhe/ose filialet e saj
Copyright (c) 2000, 2019, Oracle dhe/ose filialet e saj. Të gjitha të drejtat e rezervuara.
Oracle është një markë tregtare e Oracle Corporation dhe/ose filialet e saj. Emra të tjerë mund të jenë marka tregtare të pronarëve të tyre përkatës.

Shkruani 'help;' ose 'h' për ndihmë. Shkruani 'c' për të pastruar deklaratën aktuale të inputit.

mysql> select user, host, plugin, authentication_string from mysql.user where user ='root';
+------+-----------+-------------+-----------------------+
| user | host      | plugin | authentication_string |
+------+-----------+-------------+-----------------------+
| root | localhost | auth_socket |                       |
+------+-----------+-------------+-----------------------+
1 rresht në set (0.00 sekondë)

Pra, çfarĂ« Ă«shtĂ« magia? Plugin-i verifikon se pĂ«rdoruesi Linux pĂ«rputhet me pĂ«rdoruesin MySQL, duke pĂ«rdorur opsionin e soket-it SO_PEERCRED — pĂ«r tĂ« grumbulluar informacionin mbi pĂ«rdoruesin qĂ« ekzekuton programin klient. KĂ«shtu, plugin-i mund tĂ« pĂ«rdoret vetĂ«m nĂ« sisteme qĂ« mbĂ«shtesin opsionin SO_PEERCRED, si Linux i njĂ«jtĂ«. Opsioni i soket-it SO_PEERCRED lejon qĂ« tĂ« zbulohet uid i lidhur me soketin e procesit. Dhe pastaj ai merr emrin e pĂ«rdoruesit tĂ« lidhur me kĂ«tĂ« uid.

Le të japim një shembull me përdoruesin «vagrant»:

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

Duke qenë se në MySQL nuk ka përdoruesit «vagrant», na është ndaluar aksesin. Le të krijojmë një përdorues të tillë dhe të provojmë sërish:

MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'vagrant'@'localhost' IDENTIFIED VIA unix_socket;
Kërkesa OK, 0 rreshta të prekur (0.00 sekondë)

vagrant@mysql1:~$ mysql
Mirë se erdhët në monitorin MariaDB. Komandat mbarojnë me ; ose g.
ID e lidhjes tuaj MariaDB është 45
Versioni i serverit: 10.0.38-MariaDB-0ubuntu0.16.04.1 Ubuntu 16.04
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab dhe të tjerë.
Shkruani 'help;' ose 'h' për ndihmë. Shkruani 'c' për të pastruar deklaratën aktuale të inputit.

MariaDB [(none)]> show grants;
+---------------------------------------------------------------------------------+
| Grants për vagrant@localhost                                                    |
+---------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'vagrant'@'localhost' IDENTIFIED VIA unix_socket |
+---------------------------------------------------------------------------------+
1 rresht në set (0.00 sekondë)

Kemi arritur!

Mirë, çfarë ndodh me një distro që nuk është Debian, ku kjo nuk është parazgjedhje? Le të provojmë Percona Server for MySQL 8, të instaluar në CentOS 7:

mysql> show variables like '%version%comment';
+-----------------+---------------------------------------------------+
| Variable_name   | Value                                   |
+-----------------+---------------------------------------------------+
| version_comment | Percona Server (GPL), Release 7, Rishikimi 613e312 |
+-----------------+---------------------------------------------------+
1 rresht në set (0.01 sekondë)

mysql> CREATE USER 'percona'@'localhost' IDENTIFIED WITH auth_socket;
ERROR 1524 (HY000): Plugin 'auth_socket' is not loaded

DĂ«shtim. ÇfarĂ« mungon? Plugin-i nuk Ă«shtĂ« ngarkuar:

mysql> pager grep socket
PAGER e vendosur në 'grep socket'
mysql> show plugins;
47 rreshta në set (0.00 sekondë)

Le të shtojmë plugin-in 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)

Tani tani tani tani! Provojmë përsëri:

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)

Tani mund të kyçemi në sistem me emrin e përdoruesit «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)

Dhe përsëri ia dolëm!

Pyetje: A do të mund të kyçemi në sistem me të njëjtin emër përdoruesi percona, por nga një përdorues tjetër?

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

Jo, nuk do të mundemi.

Përfundim

MySQL është mjaft fleksibel në disa aspekte, njëri prej të cilëve është metoda e autentifikimit. Siç shihet në këtë post, mund të fitohet qasje pa fjalëkalime, në bazë të përdoruesve të OS. Kjo mund të jetë e dobishme në skenarë të caktuar, dhe një prej tyre është kur migroni nga RDS/Aurora në MySQL të zakonshëm, duke përdorur autentifikimin e bazës së të dhënave IAM, për të vazhduar qasjen, por pa fjalëkalime.

Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster