新特性解讀 | MySQL 8.0 多因素身份認證

愛可生雲資料庫發表於2022-03-22

作者:金長龍

愛可生測試工程師,負責DMP產品的測試工作

本文來源:原創投稿

*愛可生開源社群出品,原創內容未經授權不得隨意使用,轉載請聯絡小編並註明來源。


MySQL 8.0.27 增加了多因素身份認證(MFA)功能,可以為一個使用者指定多重的身份校驗。為此還引入了新的系統變數 authentication_policy ,用於管理多因素身份認證功能。

我們知道在 MySQL 8.0.27 之前,create user 的時候可以指定一種認證外掛,在未明確指定的情況下會取系統變數 default_authentication_plugin的值。default_authentication_plugin 的有效值有3個,分別是 mysql_native_password ,sha256_password ,caching_sha2_password ,這個3個認證外掛是內建的、不需要註冊步驟的外掛。

一、系統變數 authentication_policy

在 MySQL 8.0.27 中由 authentication_policy 來管理使用者的身份認證,先啟個 mysql

root@ubuntu:~# docker run --name mysql-1 -e MYSQL_ROOT_PASSWORD=123 -d --ip 172.17.0.2 mysql:8.0.27

同時檢視下 authentication_policy 和 default_authentication_plugin 的值

root@ubuntu:~# docker run -it --rm mysql:8.0.27 mysql -h172.17.0.2 -uroot -p123
......
  
mysql> show global variables like 'authentication_policy';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| authentication_policy | *,,   |
+-----------------------+-------+
1 row in set (0.02 sec)
 
mysql> show global variables like 'default_authentication_plugin';
+-------------------------------+-----------------------+
| Variable_name                 | Value                 |
+-------------------------------+-----------------------+
| default_authentication_plugin | caching_sha2_password |
+-------------------------------+-----------------------+
1 row in set (0.00 sec)

我們看到 authentication_policy 的預設值是*,,

第1個元素值是星號(),表示可以是任意外掛,預設值取 default_authentication_plugin 的值。如果該元素值不是星號(),則必須設定為 mysql_native_password ,sha256_password ,caching_sha2_password 中的一個。

第2,3個元素值為空,這兩個位置不能設定成內部儲存的外掛。如果元素值為空,代表外掛是可選的。

建個使用者看一下,不指定外掛名稱時,自動使用預設外掛 caching_sha2_password

mysql> create user 'wei1'@'localhost' identified by '123';
Query OK, 0 rows affected (0.01 sec)
  
mysql> select user,host,plugin from mysql.user where user='wei1';
+------+-----------+-----------------------+
| user | host      | plugin                |
+------+-----------+-----------------------+
| wei1  | localhost | caching_sha2_password |
+------+-----------+-----------------------+
1 row in set (0.00 sec)

指定外掛名稱時,會使用到對應的外掛

mysql> create user 'wei2'@'localhost' identified with mysql_native_password by '123';
Query OK, 0 rows affected (0.01 sec)
 
mysql> select user,host,plugin from mysql.user where user='wei2';
+------+-----------+-----------------------+
| user | host      | plugin                |
+------+-----------+-----------------------+
| wei2 | localhost | mysql_native_password |
+------+-----------+-----------------------+
1 row in set (0.01 sec)

嘗試變更一下 authentication_policy 第一個元素的值,設定為 sha256_password

mysql> set global authentication_policy='sha256_password,,';
Query OK, 0 rows affected (0.00 sec)
 
mysql> show global variables like 'authentication_policy';
+-----------------------+-------------------+
| Variable_name         | Value             |
+-----------------------+-------------------+
| authentication_policy | sha256_password,, |
+-----------------------+-------------------+
1 row in set (0.00 sec)

再次建立一個使用者,不指定外掛的名稱

mysql> create user 'wei3'@'localhost' identified by '123';
Query OK, 0 rows affected (0.01 sec)
 
mysql> select user,host,plugin from mysql.user where user='wei3';
+------+-----------+-----------------+
| user | host      | plugin          |
+------+-----------+-----------------+
| wei3 | localhost | sha256_password |
+------+-----------+-----------------+
1 row in set (0.00 sec)

可以看到預設使用的外掛是 sha256_password ,說明當 authentication_policy 第一個元素指定外掛名稱時,default_authentication_plugin 被棄用了。

二、多重身份驗證的使用者

首先我們恢復 authentication_policy 至預設值

mysql> set global authentication_policy='*,,';
Query OK, 0 rows affected (0.01 sec)
 
mysql> show global variables like 'authentication_policy';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| authentication_policy | *,,   |
+-----------------------+-------+
1 row in set (0.01 sec)

建立一個雙重認證的使用者。如下建立失敗了,因為不可以同時用2種內部儲存外掛。

mysql> create user 'wei3'@'localhost' identified by '123' and identified with mysql_native_password by '123';
ERROR 4052 (HY000): Invalid plugin "mysql_native_password" specified as 2 factor during "CREATE USER".

那我們來裝一個可插拔外掛 Socket Peer-Credential

mysql> INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';
Query OK, 0 rows affected (0.00 sec)
 
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%socket%';
+-------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+-------------+---------------+
| auth_socket | ACTIVE        |
+-------------+---------------+
1 row in set (0.00 sec)

再建立一個雙重認證的使用者

mysql> create user 'wei4'@'localhost' identified by '123' and identified with auth_socket as 'root';
Query OK, 0 rows affected (0.05 sec)
 
mysql> select user,host,plugin,User_attributes from mysql.user where user='wei4';
+------+-----------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------+
| user | host      | plugin                | User_attributes                                                                                                                              |
+------+-----------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------+
| wei4 | localhost | caching_sha2_password | {"multi_factor_authentication": [{"plugin": "auth_socket", "passwordless": 0, "authentication_string": "root", "requires_registration": 0}]} |
+------+-----------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

建立成功,之後使用者'wei4'@'localhost'必須提供正確的密碼,且同時本地主機的登入使用者為 root 時,才會驗證通過。

來試一下,以主機 root 使用者身份,提供正確的密碼 123 ,登入成功。

root@ubuntu:~# docker exec -it mysql-1 bash
root@1d118873f98e:/# mysql -uwei4 --password1=123 --password2
mysql: [Warning] Using a password on the command line interface can be insecure.
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.0.27 MySQL Community Server - GPL
 
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
 
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>

修改一下,將'wei4'@'localhost'要求的主機登入使用者修改為wei4

mysql> alter user 'wei4'@'localhost' modify 2 factor identified with auth_socket as 'wei4';
Query OK, 0 rows affected (0.16 sec)
 
mysql> select user,host,plugin,User_attributes from mysql.user where user='wei4';
+------+-----------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------+
| user | host      | plugin                | User_attributes                                                                                                                              |
+------+-----------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------+
| wei4 | localhost | caching_sha2_password | {"multi_factor_authentication": [{"plugin": "auth_socket", "passwordless": 0, "authentication_string": "wei4", "requires_registration": 0}]} |
+------+-----------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

再次以主機 root 使用者身份,提供正確的密碼 123 ,登入失敗

root@ubuntu:~# docker exec -it mysql-1 bash 
root@1d118873f98e:/# mysql -uwei4 --password1=123 --password2 
mysql: [Warning] Using a password on the command line interface can be insecure. 
Enter password: 
ERROR 1698 (28000): Access denied for user 'wei4'@'localhost'  
root@1d118873f98e:/#

因此可以認定雙重身份認證機制是生效的。MySQL 8.0.27 最多可以對一個使用者設定三重的身份認證,這裡不再做展示說明。

簡單總結下,已有的密碼口令身份驗證很適合網站或者應用程式的訪問,但是在特定的情況下 如網路線上金融交易方面可能還是不夠安全。多因素身份認證(MFA)功能的引入,可以在一定程度上提升資料庫系統的安全性。

參考資料:

https://dev.mysql.com/doc/ref...

相關文章