Hvernig á að nota MySQL án lykilorðs (og öryggisáhættu)

Hvernig á að nota MySQL án lykilorðs (og öryggisáhættu)

Þeir segja að besta lykilorðið sé það sem þú þarft ekki að muna. Þegar um MySQL er að ræða er þetta mögulegt þökk sé viðbótinni auth_socket og útgáfa þess fyrir MariaDB - unix_socket.

Bæði þessi viðbætur eru alls ekki nýjar, þær hafa verið mikið ræddar á þessu bloggi, til dæmis í greininni um hvernig á að breyta lykilorðum í MySQL 5.7 með auth_socket tappi. Hins vegar, þegar ég skoðaði hvað er nýtt í MariaDB 10.4, uppgötvaði ég að unix_socket er nú sjálfgefið uppsett og er ein af auðkenningaraðferðunum ("ein af", vegna þess að í MariaDB 10.4 eru fleiri en ein viðbót í boði fyrir einn notanda til auðkenningar, sem er útskýrt í skjalinu „Authentication“ frá MariaDB 10.04).

Eins og ég sagði þá eru þetta ekki fréttir og þegar MySQL er sett upp með því að nota .deb pakkana sem Debian teymið styður, er rótnotandi búinn til fyrir socket authentication. Þetta á bæði við 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>>

Með Debian pakka fyrir MySQL er rótnotandinn auðkenndur sem hér segir:

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)

Sama er tilfellið með .deb pakkann fyrir 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 pakkarnir frá opinberu Percona geymslunni stilla einnig auðkenningu rótarnotenda undir auðkenningar-socket og fyrir Percona Server. Við skulum gefa dæmi með Percona Server fyrir 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)

Svo hver er galdurinn? Viðbótin athugar hvort Linux notandinn passi við MySQL notandann með því að nota SO_PEERCRED falsvalkostinn til að safna upplýsingum um notandann sem keyrir biðlaraforritið. Þannig er aðeins hægt að nota viðbótina á kerfum sem styðja SO_PEERCRED valkostinn, eins og Linux. SO_PEERCRED falsvalkosturinn gerir þér kleift að finna út uid ferlisins sem tengist falsinu. Og þá fær hann nú þegar notandanafnið sem tengist þessu uid.

Hér er dæmi um notandann „flæking“:

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

Þar sem það er enginn „flækingur“ notandi í MySQL er okkur meinaður aðgangur. Búum til slíkan notanda og reynum aftur:

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)

Gerðist!

Jæja, hvað með dreifingu sem er ekki Debian þar sem þetta er ekki sjálfgefið? Við skulum prófa Percona Server fyrir MySQL 8 uppsett á 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

Ömurlegt. Hvað vantaði? Viðbót ekki hlaðið:

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

Við skulum bæta viðbót við ferlið:

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)

Nú höfum við allt sem við þurfum. Reynum aftur:

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)

Þú getur nú skráð þig inn með notendanafninu „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 það virkaði aftur!

Spurning: verður hægt að skrá sig inn í kerfið undir sama percona innskráningu, en sem annar notandi?

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

Nei, það gengur ekki.

Output

MySQL er nokkuð sveigjanlegt í nokkrum þáttum, einn þeirra er auðkenningaraðferðin. Eins og þú sérð af þessari færslu er hægt að fá aðgang án lykilorða, byggt á notendum stýrikerfisins. Þetta getur verið gagnlegt í ákveðnum tilfellum og ein þeirra er þegar flutt er úr RDS/Aurora yfir í venjulega MySQL með því að nota IAM gagnagrunnsvottunað fá samt aðgang, en án lykilorða.

Heimild: www.habr.com

Bæta við athugasemd