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ë)

Thuhet se fjalĂ«kalimi mĂ« i mirĂ« Ă«shtĂ« ai qĂ« nuk ka nevojĂ« tĂ« mbahet mend. NĂ« rastin e MySQL, kjo Ă«shtĂ« reale falĂ« plugin-it auth_socket dhe versionit tĂ« tij pĂ«r MariaDB — unix_socket.

Të dy këto plugin-e nuk janë aspak të reja, për to është folur shumë në këtë blog, për shembull në artikullin në lidhje me si të ndryshoni fjalëkalimet në MySQL 5.7 duke përdorur plugin-in auth_socket. Megjithatë, duke shqyrtuar se çfarë është e re në MariaDB 10.4, zbulova se unix_socket tani instalohet si parazgjedhje dhe është një nga metodat e autentifikimit ("një nga", sepse në MariaDB 10.4 një përdoruesi i është ofruar më shumë se një plugin për autentifikimin, gjë që shpjegohet në dokumentin "Autentifikimi" nga MariaDB 10.04).

Siç e thashë, kjo nuk janë lajme të reja, dhe kur instaloni MySQL duke përdorur paketat e mbështetura nga ekipi Debian .deb, përdoruesi me privilegje root krijohet për autentifikim përmes soketëve. Kjo është e vërtetë si për MySQL, ashtu edhe për 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>>

Me paketat Debian për MySQL, përdoruesi root autentikohet në këtë mënyrë:

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

Kopjimi (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 e
filialeve të saj. Emra të tjerë mund të jenë marka të tregtare të pronarëve të tyre.

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ë grup (0.01 sek)

Po ashtu ë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 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 rreshta në grup (0.00 sek)

Paketat .deb nga depoja zyrtare e Percona gjithashtu konfiguroni autentikimin e përdoruesit me privilegje root nën auth_socket dhe për Percona Server. 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 vini në monitorin MySQL. Komandat përfundojnë me ; ose g.
ID-ja e lidhjes suaj MySQL është 9
Versioni i serverit: 8.0.16-7 Percona Server (GPL), Lëshimi '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ë e regjistruar e Oracle Corporation dhe/ose e filialeve të saj. Emra të tjerë mund të jenë marka tregtare të pronarëve përkatës.

Shkruaj 'help;' ose 'h' për ndihmë. Shkruaj '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ë grup (0.00 sek)

Cila është magjia këtu? Plugin-i kontrollon që përdoruesi Linux të përputhet me përdoruesin MySQL, duke përdorur opsionin e soketëve SO_PEERCRED - për të mbledhur informacionin në lidhje me 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. Opsioni i soketëve SO_PEERCRED lejon marrjen e uid lidhur me soketin e procesit. Kështu ai merr emrin e përdoruesit të lidhur me këtë uid.

Le të shqyrtojmë një shembull me përdoruesin "vagrant":

vagrant@mysql1:~$ whoami
vagrant
vagrant@mysql1:~$ mysql
ERROR 1698 (28000): Qasje e ndaluar për përdoruesin 'vagrant'@'localhost'

Duke qenë se nuk ka përdorues "vagrant" në MySQL, na është refuzuar qasja. Të krijojmë një përdorues të tillë dhe të provojmë përsëri:

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

vagrant@mysql1:~$ mysql
Mirë se vini në monitorin MariaDB. Komandat përfundojnë me ; ose g.
ID-ja e lidhjes suaj 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ët.
Shkruaj 'help;' ose 'h' për ndihmë. Shkruaj 'c' për të pastruar deklaratën aktuale të inputit.

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

Kemi arritur!

Si është kjo për një shpërndarje që nuk është Debian, ku kjo nuk është parashikuar si standard? Të provojmë Percona Server për MySQL 8, i instaluar në CentOS 7:

mysql> show variables like '%version%comment';
+-----------------+---------------------------------------------------+
| Variable_name   | Vlera                                   |
+-----------------+---------------------------------------------------+
| version_comment | Percona Server (GPL), Lëshimi 7, Rishikimi 613e312 |
+-----------------+---------------------------------------------------+
1 rresht në grup (0.01 sek)

mysql> CREATE USER 'percona'@'localhost' IDENTIFIED WITH auth_socket;
ERROR 1524 (HY000): Plugin 'auth_socket' nuk është ngarkuar

DĂ«shtim. ÇfarĂ« nuk Ă«shtĂ« mjaftueshĂ«m? Plagjini nuk u ngarkua:

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

Të shtojmë në proces plagjinin:

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 kemi gjithçka që na nevojitet. Të 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ë hyjmë në sistem me emrin 'percona'.

[percona@ip-192-168-1-111 ~]$ whoami
percona
[percona@ip-192-168-1-111 ~]$ mysql -upercona
Mirë se vini në monitorin MySQL. Komandat përfundojnë me ; ose g.
ID e lidhjes suaj MySQL është 19
Versioni i serverit: 8.0.16-7 Percona Server (GPL), Çliroje 7, Rishikimi 613e312

Kopjimi (c) 2009-2019 Percona LLC dhe/ose filialet e saj
Kopjimi (c) 2000, 2019, Oracle dhe/ose filialet e saj. Të gjitha të drejtat e rezervuara.

Oracle është një markë e regjistruar e Oracle Corporation dhe/ose filialet e saj. Emra të tjerë mund të jenë marka tregtare të pronarëve përkatës.

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

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ë hyj 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): Qasje e refuzuar për përdoruesin 'percona'@'localhost'

Jo, nuk do të mundesh.

Përfundimi

MySQL është mjaft fleksibël në disa aspekte, një prej të cilëve është metoda e autentikimit. Siç duket nga ky postim, mund të fitohet qasja pa fjalëkalime, në bazë të përdoruesve të OS. Kjo mund të jetë e dobishme në disa skenarë, dhe një prej tyre është kur migroni nga RDS/Aurora në MySQL të zakonshme, duke përdorur autentikimin e bazës së të dhënave IAM, për të vazhduar qasjen, por pa fjalëkalime.

Burimi: habr.com

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