Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ MySQL Π±Π΅Π· пароля (ΠΈ рисков для бСзопасности)

Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ MySQL Π±Π΅Π· пароля (ΠΈ рисков для бСзопасности)

Говорят, Ρ‡Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠΈΠΉ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ β€” Ρ‚ΠΎΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ Π½Π°Π΄ΠΎ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΡŒ. Π’ случаС с MySQL это Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ благодаря ΠΏΠ»Π°Π³ΠΈΠ½Ρƒ auth_socket ΠΈ Π΅Π³ΠΎ вСрсии для MariaDB β€” unix_socket.

Оба эти ΠΏΠ»Π°Π³ΠΈΠ½Π° β€” вовсС Π½Π΅ Π½ΠΎΠ²Ρ‹, ΠΎ Π½ΠΈΡ… ΠΌΠ½ΠΎΠ³ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ Π² этом ΠΆΠ΅ Π±Π»ΠΎΠ³Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠ°Ρ€ΠΎΠ»ΠΈ Π² MySQL 5.7, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠ»Π°Π³ΠΈΠ½ auth_socket. Однако, разбирая, Ρ‡Ρ‚ΠΎ новСнького Π² MariaDB 10.4, я ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ», Ρ‡Ρ‚ΠΎ unix_socket Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ устанавливаСтся ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈ являСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ («ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ·», ΠΏΠΎΡ‚ΠΎΠΌΡƒ ΠΊΠ°ΠΊ Π² MariaDB 10.4 ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ для Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ доступно большС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ»Π°Π³ΠΈΠ½Π°, Ρ‡Ρ‚ΠΎ ΠΈ ΠΎΠ±ΡŠΡΡΠ½ΡΡ‚Π΅Ρ‚ΡΡ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅ «ΠΡƒΡ‚Снтификация» ΠΎΡ‚ MariaDB 10.04).

Как я ΡƒΠΆΠ΅ сказал, это β€” Π½Π΅ новости, ΠΈ ΠΊΠΎΠ³Π΄Π° ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡˆΡŒ MySQL, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ Debian ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ .deb, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ с root-ΠΏΡ€Π°Π²Π°ΠΌΠΈ создаСтся ΠΏΠΎΠ΄ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ Ρ‡Π΅Ρ€Π΅Π· сокСт. Π­Ρ‚ΠΎ справСдливо ΠΊΠ°ΠΊ для 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>>

Π‘ ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌΠΈ Debian для MySQL, root ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ аутСнтифицируСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

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)

Π’ΠΎ ΠΆΠ΅ ΠΈ Π² случаС с ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ .deb для 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 ΠΈΠ· ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ рСпозитория Percona Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‚ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ с root-ΠΏΡ€Π°Π²Π°ΠΌΠΈ ΠΏΠΎΠ΄ auth-socket ΠΈ для Percona Server. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с Percona Server for MySQL 8.0.16-7 ΠΈ 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)

Π’Π°ΠΊ Π² Ρ‡Π΅ΠΌ ΠΆΠ΅ магия? Плагин провСряСт, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Linux соотвСтствуСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ MySQL, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ сокСт-ΠΎΠΏΡ†ΠΈΡŽ SO_PEERCRED β€” Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅, Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‰Π΅ΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΠ»Π°Π³ΠΈΠ½ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° систСмах, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… ΠΎΠΏΡ†ΠΈΡŽ SO_PEERCRED, Π²Ρ€ΠΎΠ΄Π΅ Ρ‚ΠΎΠΉ ΠΆΠ΅ Linux. Π‘ΠΎΠΊΠ΅Ρ‚-опция SO_PEERCRED позволяСт ΡƒΠ·Π½Π°Π²Π°Ρ‚ΡŒ uid связанного с сокСтом процСсса. А послС ΠΎΠ½ ΡƒΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ связанноС с этим uid имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ «vagrant»:

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

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² MySQL Π½Π΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ «vagrant», Π² доступС Π½Π°ΠΌ ΠΎΡ‚ΠΊΠ°Π·Π°Π½ΠΎ. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΠΌ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ:

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 дистрибутива, Π³Π΄Π΅ это Π½Π΅ прСдусмотрСно ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ? ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Percona Server for MySQL 8, установлСнный Π½Π° 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

Облом. Π§Π΅Π³ΠΎ ΠΆΠ΅ Π½Π΅ Ρ…Π²Π°Ρ‚ΠΈΠ»ΠΎ? Плагин Π½Π΅ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½:

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, Π½ΠΎ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ?

[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 достаточно гибкая Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… аспСктах, ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… β€” ΠΌΠ΅Ρ‚ΠΎΠ΄ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ. Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· этого поста, доступ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±Π΅Π· ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ, Π½Π° основании ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ОБ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… сцСнариях, ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ… β€” ΠΊΠΎΠ³Π΄Π° ΠΌΠΈΠ³Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ с RDS/Aurora Π½Π° ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ MySQL, ΠΏΠΎΠ»ΡŒΠ·ΡƒΡΡΡŒ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… IAM, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ доступ, Π½ΠΎ Π±Π΅Π· ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com