MySQL-ті құпия сөзсіз қалай пайдалануға болады (және қауіпсіздік тәуекелдері)

MySQL-ті құпия сөзсіз қалай пайдалануға болады (және қауіпсіздік тәуекелдері)

Олар ең жақсы құпия сөзді есте сақтаудың қажеті жоқ дейді. MySQL жағдайында бұл плагиннің арқасында мүмкін болады auth_socket және оның MariaDB нұсқасы - unix_розетка.

Бұл плагиндердің екеуі де мүлдем жаңа емес; олар туралы осы блогта көп айтылды, мысалы, туралы мақалада auth_socket плагинін пайдаланып MySQL 5.7 жүйесінде құпия сөздерді өзгерту жолы. Дегенмен, MariaDB 10.4 нұсқасындағы жаңалықтарды зерттей келе, мен unix_socket енді әдепкі бойынша орнатылғанын және аутентификация әдістерінің бірі екенін білдім («біреуі», өйткені MariaDB 10.4-те бір пайдаланушыға аутентификация үшін бір плагин қолжетімді, ол құжатта түсіндіріледі MariaDB ұсынған «Түпнұсқалық растау» 10.04).

Мен айтқанымдай, бұл жаңалық емес және Debian командасы қолдайтын .deb бумаларын пайдаланып MySQL орнату кезінде розетка аутентификациясы үшін түбірлік пайдаланушы жасалады. Бұл MySQL және 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>>

MySQL үшін Debian пакеттерімен түбірлік пайдаланушы келесідей аутентификацияланады:

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)

MariaDB үшін .deb бумасында да солай:

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)

Ресми Percona репозиторийіндегі .deb бумалары аутентификациялық ұяшық астында және Percona сервері үшін түбірлік пайдаланушы аутентификациясын конфигурациялайды. -мен мысал келтірейік MySQL 8.0.16-7 үшін Percona сервері және 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)

Сонымен, сиқыр неде? Плагин клиенттік бағдарламаны іске қосатын пайдаланушы туралы ақпаратты жинау үшін SO_PEERCRED ұяшығы опциясын пайдаланып Linux пайдаланушысының MySQL пайдаланушысына сәйкес келетінін тексереді. Осылайша, плагинді тек Linux сияқты SO_PEERCRED опциясын қолдайтын жүйелерде пайдалануға болады. SO_PEERCRED ұяшығы опциясы розеткамен байланысты процестің uid нөмірін білуге ​​мүмкіндік береді. Содан кейін ол осы пайдаланушы идентификаторымен байланысты пайдаланушы атын алады.

Мұнда «vagrant» пайдаланушысымен мысал келтірілген:

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

MySQL-де «қаңғыбас» пайдаланушы болмағандықтан, бізге кіруге тыйым салынады. Осындай пайдаланушыны жасап, әрекетті қайталап көрейік:

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)

Болды!

Әдепкі бойынша бұл қамтамасыз етілмеген Debian емес тарату туралы не деуге болады? CentOS 8 жүйесінде орнатылған MySQL 7 үшін Percona серверін қолданып көрейік:

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

Баммер. Не жетіспеді? Плагин жүктелмеді:

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

Процесске плагин қосамыз:

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)

Қазір бізде қажеттінің бәрі бар. Қайталап көрейік:

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)

Енді сіз «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)

Және ол қайтадан жұмыс істеді!

Сұрақ: жүйеге бір перкона логинімен, бірақ басқа пайдаланушы ретінде кіруге болады ма?

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

Жоқ, ол жұмыс істемейді.

қорытынды

MySQL бірнеше аспектілерде өте икемді, олардың бірі аутентификация әдісі болып табылады. Осы жазбадан көріп отырғаныңыздай, кіруді OS пайдаланушыларына негізделген құпия сөздерсіз алуға болады. Бұл белгілі бір сценарийлерде пайдалы болуы мүмкін және олардың бірі RDS/Aurora-дан кәдімгі MySQL-ге көшу кезінде. IAM дерекқорының аутентификациясыәлі де қол жеткізу үшін, бірақ құпия сөздерсіз.

Ақпарат көзі: www.habr.com

пікір қалдыру