Details
-
Bug
-
Status: Closed (View Workflow)
-
Critical
-
Resolution: Fixed
-
10.4.12
-
None
Description
If you use ALTER USER to remove unix_socket authentication from root@localhost, it seems to come back after either the server is restarted or FLUSH PRIVILEGES is executed, because the authentication plugin is not removed from the user account's row in mysql.global_priv.
To reproduce:
Check that the user has unix_socket authentication:
MariaDB [(none)]> SHOW CREATE USER 'root'@'localhost'; |
+----------------------------------------------------------------------------------------------------+ |
| CREATE USER for root@localhost | |
+----------------------------------------------------------------------------------------------------+ |
| CREATE USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING 'invalid' OR unix_socket | |
+----------------------------------------------------------------------------------------------------+ |
1 row in set (0.000 sec) |
Remove it:
MariaDB [(none)]> ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('password'); |
Query OK, 0 rows affected (0.001 sec) |
Check again:
MariaDB [(none)]> SHOW CREATE USER 'root'@'localhost'; |
+---------------------------------------------------------------------------------------------------+ |
| CREATE USER for root@localhost | |
+---------------------------------------------------------------------------------------------------+ |
| CREATE USER 'root'@'localhost' IDENTIFIED BY PASSWORD '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' | |
+---------------------------------------------------------------------------------------------------+ |
1 row in set (0.000 sec) |
Restart the server:
$ sudo systemctl restart mariadb
|
Check again:
MariaDB [(none)]> SHOW CREATE USER 'root'@'localhost'; |
+--------------------------------------------------------------------------------------------------------------------------------------+ |
| CREATE USER for root@localhost | |
+--------------------------------------------------------------------------------------------------------------------------------------+ |
| CREATE USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' OR unix_socket | |
+--------------------------------------------------------------------------------------------------------------------------------------+ |
1 row in set (0.000 sec) |
More in-depth analysis shows that the unix_socket entry is not actually removed from mysql.global_priv after the ALTER USER statement:
MariaDB [(none)]> ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('password'); |
Query OK, 0 rows affected (0.001 sec) |
|
MariaDB [(none)]> SELECT JSON_DETAILED(Priv) FROM mysql.global_priv WHERE User='root' AND Host='localhost'\G |
*************************** 1. row ***************************
|
JSON_DETAILED(Priv): {
|
"access": 1073741823, |
"plugin": "mysql_native_password", |
"authentication_string": "*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19", |
"auth_or": |
[
|
|
{
|
},
|
|
{
|
"plugin": "unix_socket" |
}
|
],
|
"password_last_changed": 1584045156 |
}
|
1 row in set (0.000 sec) |
And the server restart isn't even necessary. The authentication method also comes back with a FLUSH PRIVILEGES:
MariaDB [(none)]> SHOW CREATE USER 'root'@'localhost'; |
+---------------------------------------------------------------------------------------------------+ |
| CREATE USER for root@localhost | |
+---------------------------------------------------------------------------------------------------+ |
| CREATE USER 'root'@'localhost' IDENTIFIED BY PASSWORD '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' | |
+---------------------------------------------------------------------------------------------------+ |
1 row in set (0.000 sec) |
|
MariaDB [(none)]> FLUSH PRIVILEGES; |
Query OK, 0 rows affected (0.001 sec) |
|
MariaDB [(none)]> SHOW CREATE USER 'root'@'localhost'; |
+--------------------------------------------------------------------------------------------------------------------------------------+ |
| CREATE USER for root@localhost | |
+--------------------------------------------------------------------------------------------------------------------------------------+ |
| CREATE USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' OR unix_socket | |
+--------------------------------------------------------------------------------------------------------------------------------------+ |
1 row in set (0.000 sec) |
Attachments
Issue Links
- is caused by
-
MDEV-11340 Allow multiple alternative authentication methods for the same user
-
- Closed
-
-
MDEV-12484 Enable unix socket authentication by default
-
- Closed
-
- relates to
-
MDEV-23374 ALTER USER documentation needs to reflect multiple authentication methods
-
- Closed
-
-
MDEV-21929 Enhance ALTER USER for multiple authentication methods
-
- Open
-
Activity
Field | Original Value | New Value |
---|---|---|
Description |
If you remove {{unix_socket}} authentication from {{root@localhost}}, it seems to come back after the server is restarted.
To reproduce: Check that the user has {{unix_socket}} authentication: {code:sql} MariaDB [(none)]> SHOW CREATE USER 'root'@'localhost'; +----------------------------------------------------------------------------------------------------+ | CREATE USER for root@localhost | +----------------------------------------------------------------------------------------------------+ | CREATE USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING 'invalid' OR unix_socket | +----------------------------------------------------------------------------------------------------+ 1 row in set (0.000 sec) {code} Remove it: {code:sql} MariaDB [(none)]> ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('password'); Query OK, 0 rows affected (0.001 sec) {code} Check again: {code:sql} MariaDB [(none)]> SHOW CREATE USER 'root'@'localhost'; +---------------------------------------------------------------------------------------------------+ | CREATE USER for root@localhost | +---------------------------------------------------------------------------------------------------+ | CREATE USER 'root'@'localhost' IDENTIFIED BY PASSWORD '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' | +---------------------------------------------------------------------------------------------------+ 1 row in set (0.000 sec) {code} Restart the server: {code:sh} $ sudo systemctl restart mariadb {code} Check again: {code:sql} MariaDB [(none)]> SHOW CREATE USER 'root'@'localhost'; +--------------------------------------------------------------------------------------------------------------------------------------+ | CREATE USER for root@localhost | +--------------------------------------------------------------------------------------------------------------------------------------+ | CREATE USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' OR unix_socket | +--------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.000 sec) {code} |
If you remove {{unix_socket}} authentication from {{root@localhost}}, it seems to come back after the server is restarted.
To reproduce: Check that the user has {{unix_socket}} authentication: {code:sql} MariaDB [(none)]> SHOW CREATE USER 'root'@'localhost'; +----------------------------------------------------------------------------------------------------+ | CREATE USER for root@localhost | +----------------------------------------------------------------------------------------------------+ | CREATE USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING 'invalid' OR unix_socket | +----------------------------------------------------------------------------------------------------+ 1 row in set (0.000 sec) {code} Remove it: {code:sql} MariaDB [(none)]> ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('password'); Query OK, 0 rows affected (0.001 sec) {code} Check again: {code:sql} MariaDB [(none)]> SHOW CREATE USER 'root'@'localhost'; +---------------------------------------------------------------------------------------------------+ | CREATE USER for root@localhost | +---------------------------------------------------------------------------------------------------+ | CREATE USER 'root'@'localhost' IDENTIFIED BY PASSWORD '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' | +---------------------------------------------------------------------------------------------------+ 1 row in set (0.000 sec) {code} Restart the server: {code:sh} $ sudo systemctl restart mariadb {code} Check again: {code:sql} MariaDB [(none)]> SHOW CREATE USER 'root'@'localhost'; +--------------------------------------------------------------------------------------------------------------------------------------+ | CREATE USER for root@localhost | +--------------------------------------------------------------------------------------------------------------------------------------+ | CREATE USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' OR unix_socket | +--------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.000 sec) {code} More in-depth analysis shows that the {{unix_socket}} entry is not actually removed from {{mysql.global_priv}} after the {{ALTER USER}} statement: {code:sql} MariaDB [(none)]> ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('password'); Query OK, 0 rows affected (0.001 sec) MariaDB [(none)]> SELECT JSON_DETAILED(Priv) FROM mysql.global_priv WHERE User='root' AND Host='localhost'\G *************************** 1. row *************************** JSON_DETAILED(Priv): { "access": 1073741823, "plugin": "mysql_native_password", "authentication_string": "*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19", "auth_or": [ { }, { "plugin": "unix_socket" } ], "password_last_changed": 1584045156 } 1 row in set (0.000 sec) {code} And the server restart isn't even necessary. The authentication method also comes back with a {{FLUSH PRIVILEGES}}: {code:sql} MariaDB [(none)]> SHOW CREATE USER 'root'@'localhost'; +---------------------------------------------------------------------------------------------------+ | CREATE USER for root@localhost | +---------------------------------------------------------------------------------------------------+ | CREATE USER 'root'@'localhost' IDENTIFIED BY PASSWORD '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' | +---------------------------------------------------------------------------------------------------+ 1 row in set (0.000 sec) MariaDB [(none)]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.001 sec) MariaDB [(none)]> SHOW CREATE USER 'root'@'localhost'; +--------------------------------------------------------------------------------------------------------------------------------------+ | CREATE USER for root@localhost | +--------------------------------------------------------------------------------------------------------------------------------------+ | CREATE USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' OR unix_socket | +--------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.000 sec) {code} |
Summary | unix_socket authentication comes back for root@localhost after server restart | ALTER USER doesn't remove excess authentication plugins from mysql.global_priv |
Description |
If you remove {{unix_socket}} authentication from {{root@localhost}}, it seems to come back after the server is restarted.
To reproduce: Check that the user has {{unix_socket}} authentication: {code:sql} MariaDB [(none)]> SHOW CREATE USER 'root'@'localhost'; +----------------------------------------------------------------------------------------------------+ | CREATE USER for root@localhost | +----------------------------------------------------------------------------------------------------+ | CREATE USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING 'invalid' OR unix_socket | +----------------------------------------------------------------------------------------------------+ 1 row in set (0.000 sec) {code} Remove it: {code:sql} MariaDB [(none)]> ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('password'); Query OK, 0 rows affected (0.001 sec) {code} Check again: {code:sql} MariaDB [(none)]> SHOW CREATE USER 'root'@'localhost'; +---------------------------------------------------------------------------------------------------+ | CREATE USER for root@localhost | +---------------------------------------------------------------------------------------------------+ | CREATE USER 'root'@'localhost' IDENTIFIED BY PASSWORD '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' | +---------------------------------------------------------------------------------------------------+ 1 row in set (0.000 sec) {code} Restart the server: {code:sh} $ sudo systemctl restart mariadb {code} Check again: {code:sql} MariaDB [(none)]> SHOW CREATE USER 'root'@'localhost'; +--------------------------------------------------------------------------------------------------------------------------------------+ | CREATE USER for root@localhost | +--------------------------------------------------------------------------------------------------------------------------------------+ | CREATE USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' OR unix_socket | +--------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.000 sec) {code} More in-depth analysis shows that the {{unix_socket}} entry is not actually removed from {{mysql.global_priv}} after the {{ALTER USER}} statement: {code:sql} MariaDB [(none)]> ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('password'); Query OK, 0 rows affected (0.001 sec) MariaDB [(none)]> SELECT JSON_DETAILED(Priv) FROM mysql.global_priv WHERE User='root' AND Host='localhost'\G *************************** 1. row *************************** JSON_DETAILED(Priv): { "access": 1073741823, "plugin": "mysql_native_password", "authentication_string": "*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19", "auth_or": [ { }, { "plugin": "unix_socket" } ], "password_last_changed": 1584045156 } 1 row in set (0.000 sec) {code} And the server restart isn't even necessary. The authentication method also comes back with a {{FLUSH PRIVILEGES}}: {code:sql} MariaDB [(none)]> SHOW CREATE USER 'root'@'localhost'; +---------------------------------------------------------------------------------------------------+ | CREATE USER for root@localhost | +---------------------------------------------------------------------------------------------------+ | CREATE USER 'root'@'localhost' IDENTIFIED BY PASSWORD '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' | +---------------------------------------------------------------------------------------------------+ 1 row in set (0.000 sec) MariaDB [(none)]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.001 sec) MariaDB [(none)]> SHOW CREATE USER 'root'@'localhost'; +--------------------------------------------------------------------------------------------------------------------------------------+ | CREATE USER for root@localhost | +--------------------------------------------------------------------------------------------------------------------------------------+ | CREATE USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' OR unix_socket | +--------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.000 sec) {code} |
If you use {{ALTER USER}} to remove {{unix_socket}} authentication from {{root@localhost}}, it seems to come back after either the server is restarted or {{FLUSH PRIVILEGES}} is executed, because the authentication plugin is not removed from the user account's row in {{mysql.global_priv}}.
To reproduce: Check that the user has {{unix_socket}} authentication: {code:sql} MariaDB [(none)]> SHOW CREATE USER 'root'@'localhost'; +----------------------------------------------------------------------------------------------------+ | CREATE USER for root@localhost | +----------------------------------------------------------------------------------------------------+ | CREATE USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING 'invalid' OR unix_socket | +----------------------------------------------------------------------------------------------------+ 1 row in set (0.000 sec) {code} Remove it: {code:sql} MariaDB [(none)]> ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('password'); Query OK, 0 rows affected (0.001 sec) {code} Check again: {code:sql} MariaDB [(none)]> SHOW CREATE USER 'root'@'localhost'; +---------------------------------------------------------------------------------------------------+ | CREATE USER for root@localhost | +---------------------------------------------------------------------------------------------------+ | CREATE USER 'root'@'localhost' IDENTIFIED BY PASSWORD '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' | +---------------------------------------------------------------------------------------------------+ 1 row in set (0.000 sec) {code} Restart the server: {code:sh} $ sudo systemctl restart mariadb {code} Check again: {code:sql} MariaDB [(none)]> SHOW CREATE USER 'root'@'localhost'; +--------------------------------------------------------------------------------------------------------------------------------------+ | CREATE USER for root@localhost | +--------------------------------------------------------------------------------------------------------------------------------------+ | CREATE USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' OR unix_socket | +--------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.000 sec) {code} More in-depth analysis shows that the {{unix_socket}} entry is not actually removed from {{mysql.global_priv}} after the {{ALTER USER}} statement: {code:sql} MariaDB [(none)]> ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('password'); Query OK, 0 rows affected (0.001 sec) MariaDB [(none)]> SELECT JSON_DETAILED(Priv) FROM mysql.global_priv WHERE User='root' AND Host='localhost'\G *************************** 1. row *************************** JSON_DETAILED(Priv): { "access": 1073741823, "plugin": "mysql_native_password", "authentication_string": "*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19", "auth_or": [ { }, { "plugin": "unix_socket" } ], "password_last_changed": 1584045156 } 1 row in set (0.000 sec) {code} And the server restart isn't even necessary. The authentication method also comes back with a {{FLUSH PRIVILEGES}}: {code:sql} MariaDB [(none)]> SHOW CREATE USER 'root'@'localhost'; +---------------------------------------------------------------------------------------------------+ | CREATE USER for root@localhost | +---------------------------------------------------------------------------------------------------+ | CREATE USER 'root'@'localhost' IDENTIFIED BY PASSWORD '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' | +---------------------------------------------------------------------------------------------------+ 1 row in set (0.000 sec) MariaDB [(none)]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.001 sec) MariaDB [(none)]> SHOW CREATE USER 'root'@'localhost'; +--------------------------------------------------------------------------------------------------------------------------------------+ | CREATE USER for root@localhost | +--------------------------------------------------------------------------------------------------------------------------------------+ | CREATE USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' OR unix_socket | +--------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.000 sec) {code} |
Link |
This issue is caused by |
Link |
This issue is caused by |
Status | Open [ 1 ] | Confirmed [ 10101 ] |
Link | This issue relates to MDEV-21929 [ MDEV-21929 ] |
Priority | Major [ 3 ] | Critical [ 2 ] |
Status | Confirmed [ 10101 ] | In Progress [ 3 ] |
Status | In Progress [ 3 ] | Stalled [ 10000 ] |
Fix Version/s | 10.4.13 [ 24223 ] | |
Fix Version/s | 10.4 [ 22408 ] | |
Resolution | Fixed [ 1 ] | |
Status | Stalled [ 10000 ] | Closed [ 6 ] |
Link |
This issue relates to |
Workflow | MariaDB v3 [ 104822 ] | MariaDB v4 [ 157427 ] |
Here's the workaround:
Query OK, 1 row affected (0.001 sec)