1. 程式人生 > 實用技巧 >MySQL密碼複雜度與密碼過期策略介紹

MySQL密碼複雜度與密碼過期策略介紹

前言:

年底了,你的資料庫是不是該巡檢了?一般巡檢都會關心密碼安全問題,比如密碼複雜度設定,是否有定期修改等。特別是進行等保評測時,評測機構會要求具備密碼安全策略。其實 MySQL 系統本身可以設定密碼複雜度及自動過期策略的,可能比較少用,大多數同學並未詳細去了解。本篇文章我們一起來學習下如何設定資料庫賬號密碼複雜度及自動過期策略。

1.密碼複雜度策略設定

MySQL 系統自帶有 validate_password 外掛,此外掛可以驗證密碼強度,未達到規定強度的密碼則不允許被設定。MySQL 5.7 及 8.0 版本預設情況下貌似都不啟用該外掛,這也使得我們可以隨意設定密碼,比如設定為 123、123456等。如果我們想從根源上規範密碼強度,可以啟用該外掛,下面一起來看下如何通過此外掛來設定密碼複雜度策略。

1)檢視是否已安裝此外掛

進入 MySQL 命令列,通過 show plugins 或者檢視 validate_password 相關引數可以判斷是否已安裝此外掛。若沒有相關引數則代表未安裝此外掛

# 安裝前檢查 為空則說明未安裝此外掛
mysql> show variables like 'validate%';
Empty set (0.00 sec)

2)安裝 validate_password 外掛

# 通過 INSTALL PLUGIN 命令可安裝此外掛
# 每個平臺的檔名字尾都不同 對於 Unix 和類 Unix 系統,為.so,對於 Windows 為.dll
mysql> INSTALL PLUGIN validate_password SONAME 'validate_password.so';
Query OK, 0 rows affected, 1 warning (0.28 sec)

# 檢視 validate_password 相關引數
mysql> show variables like 'validate%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password_check_user_name    | ON     |
| validate_password_dictionary_file    |        |
| validate_password_length             | 8      |
| validate_password_mixed_case_count   | 1      |
| validate_password_number_count       | 1      |
| validate_password_policy             | MEDIUM |
| validate_password_special_char_count | 1      |
+--------------------------------------+--------+
7 rows in set (0.00 sec)

3)密碼強度相關引數解釋

安裝 validate_password 外掛後,多了一些密碼強度相關引數,這些引數從字面意思上也很容易看懂,下面簡單解釋下幾個重點引數。

1、validate_password_policy
代表的密碼策略,預設是MEDIUM 可配置的值有以下:
0 or LOW 僅需需符合密碼長度(由引數validate_password_length指定)
1 or MEDIUM 滿足LOW策略,同時還需滿足至少有1個數字,小寫字母,大寫字母和特殊字元
2 or STRONG 滿足MEDIUM策略,同時密碼不能存在字典檔案(dictionary file)中

2、validate_password_dictionary_file
用於配置密碼的字典檔案,當validate_password_policy設定為STRONG時可以配置密碼字典檔案,字典檔案中存在的密碼不得使用。

3、validate_password_length
用來設定密碼的最小長度,預設值是8

4、validate_password_mixed_case_count
當validate_password_policy設定為MEDIUM或者STRONG時,密碼中至少同時擁有的小寫和大寫字母的數量,預設是1最小是0;預設是至少擁有一個小寫和一個大寫字母。

5、validate_password_number_count
當validate_password_policy設定為MEDIUM或者STRONG時,密碼中至少擁有的數字的個數,預設1最小是0

6、validate_password_special_char_count
當validate_password_policy設定為MEDIUM或者STRONG時,密碼中至少擁有的特殊字元的個數,預設1最小是0

4)密碼複雜度策略具體設定

學習完以上引數,我們就可以根據自身情況來具體設定密碼複雜度策略了,比如我想讓密碼至少 10 位且包含大小寫字母、數字、特殊字元,則可以這樣設定。

# 設定密碼長度至少10位
mysql> set global validate_password_length = 10;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'validate%';                                                                                   
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password_check_user_name    | ON     |
| validate_password_dictionary_file    |        |
| validate_password_length             | 10     |
| validate_password_mixed_case_count   | 1      |
| validate_password_number_count       | 1      |
| validate_password_policy             | MEDIUM |
| validate_password_special_char_count | 1      |
+--------------------------------------+--------+
7 rows in set (0.00 sec)

# 若想永久生效,建議將以下引數寫入配置檔案
[mysqld]
plugin-load = validate_password.so
validate_password_length = 10
validate_password_policy = 1
validate-password = FORCE_PLUS_PERMANENT

5)測試密碼複雜度

密碼複雜度策略只對生效後的操作有效,比如說你之前有個賬號,密碼是 123 ,則該賬號還是可以繼續使用的,不過若再次更改密碼則需滿足複雜度策略。下面我們來測試下密碼複雜度策略的具體效果。

# 新建使用者設定密碼
mysql> create user 'testuser'@'%' identified by '123';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> create user 'testuser'@'%' identified by 'ab123';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> create user 'testuser'@'%' identified by 'Ab@123';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> create user 'testuser'@'%' identified by 'Bsdf@5467672';
Query OK, 0 rows affected (0.01 sec)

# 更改密碼
mysql> alter user 'testuser'@'%' identified by 'dfgf3435';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> alter user 'testuser'@'%' identified by 'dBsdf@5467672';
Query OK, 0 rows affected (0.01 sec)

2.設定密碼自動過期

除了設定密碼複雜度策略外,我們還可以設定密碼自動過期,比如說隔 90 天密碼會過期必須修改密碼後才能繼續使用,這樣我們的資料庫賬號就更加安全了。下面我們來看下如何設定密碼自動過期。

單獨設定某個賬號密碼過期時間

使用 ALTER USER 語句可以使單個賬號密碼過期,也可以更改賬號過期時間。

# 通過 mysql.user 系統表檢視資料庫賬號狀態
mysql> select user,host,password_expired,password_lifetime,password_last_changed,account_locked from mysql.user;
+------------------+-----------+------------------+-------------------+-----------------------+----------------+
| user             | host      | password_expired | password_lifetime | password_last_changed | account_locked |
+------------------+-----------+------------------+-------------------+-----------------------+----------------+
| expuser          | %         | N                |              NULL | 2021-01-05 14:30:30   | N              |
| root             | %         | N                |              NULL | 2020-10-30 14:45:43   | N              |
| testuser         | %         | N                |              NULL | 2021-01-04 17:22:37   | N              |
| mysql.infoschema | localhost | N                |              NULL | 2020-10-30 14:37:09   | Y              |
| mysql.session    | localhost | N                |              NULL | 2020-10-30 14:37:09   | Y              |
| mysql.sys        | localhost | N                |              NULL | 2020-10-30 14:37:09   | Y              |
| root             | localhost | N                |              NULL | 2020-10-30 14:38:55   | N              |
+------------------+-----------+------------------+-------------------+-----------------------+----------------+
7 rows in set (0.01 sec)

# 使 expuser 賬號密碼立即過期
mysql> ALTER USER 'expuser'@'%' PASSWORD EXPIRE;
Query OK, 0 rows affected (0.00 sec)

mysql> select user,host,password_expired,password_lifetime,password_last_changed,account_locked from mysql.user;
+------------------+-----------+------------------+-------------------+-----------------------+----------------+
| user             | host      | password_expired | password_lifetime | password_last_changed | account_locked |
+------------------+-----------+------------------+-------------------+-----------------------+----------------+
| expuser          | %         | Y                |              NULL | 2021-01-05 14:30:30   | N              |
| root             | %         | N                |              NULL | 2020-10-30 14:45:43   | N              |
| testuser         | %         | N                |              NULL | 2021-01-04 17:22:37   | N              |
| mysql.infoschema | localhost | N                |              NULL | 2020-10-30 14:37:09   | Y              |
| mysql.session    | localhost | N                |              NULL | 2020-10-30 14:37:09   | Y              |
| mysql.sys        | localhost | N                |              NULL | 2020-10-30 14:37:09   | Y              |
| root             | localhost | N                |              NULL | 2020-10-30 14:38:55   | N              |
+------------------+-----------+------------------+-------------------+-----------------------+----------------+
7 rows in set (0.00 sec)

# 修改賬號密碼永不過期
mysql> ALTER USER 'expuser'@'%' PASSWORD EXPIRE NEVER;
Query OK, 0 rows affected (0.01 sec)

# 單獨設定該賬號密碼90天過期
mysql> ALTER USER 'expuser'@'%' PASSWORD EXPIRE INTERVAL 90 DAY;
Query OK, 0 rows affected (0.00 sec)

mysql> select user,host,password_expired,password_lifetime,password_last_changed,account_locked from mysql.user;
+------------------+-----------+------------------+-------------------+-----------------------+----------------+
| user             | host      | password_expired | password_lifetime | password_last_changed | account_locked |
+------------------+-----------+------------------+-------------------+-----------------------+----------------+
| expuser          | %         | N                |                90 | 2021-01-05 14:41:28   | N              |
| root             | %         | N                |              NULL | 2020-10-30 14:45:43   | N              |
| testuser         | %         | N                |              NULL | 2021-01-04 17:22:37   | N              |
| mysql.infoschema | localhost | N                |              NULL | 2020-10-30 14:37:09   | Y              |
| mysql.session    | localhost | N                |              NULL | 2020-10-30 14:37:09   | Y              |
| mysql.sys        | localhost | N                |              NULL | 2020-10-30 14:37:09   | Y              |
| root             | localhost | N                |              NULL | 2020-10-30 14:38:55   | N              |
+------------------+-----------+------------------+-------------------+-----------------------+----------------+
7 rows in set (0.00 sec)

# 讓此賬號使用預設的密碼過期全域性策略
mysql> ALTER USER 'expuser'@'%' PASSWORD EXPIRE DEFAULT;
Query OK, 0 rows affected (0.01 sec)

mysql.user 系統表記錄著每個賬號的相關資訊,當 password_expired 欄位值為 Y 時,代表此密碼已過期,使用過期密碼仍可以登入,但不能進行任何操作,進行操作會提示:ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement. 必須更改密碼後才能進行正常操作。

對於給定過期時間的賬號,比如說設定 90 天過期,資料庫系統會比較當前時間與上次修改密碼的時間差值,如果距離上次修改密碼時間超過 90 天,則將此賬號密碼標記為過期,必須更改密碼後才能進行操作。

設定全域性過期策略

要構建全域性密碼自動過期策略,請使用 default_password_lifetime 系統變數。在 5.7.11 版本之前,預設的 default_password_lifetime 值為 360(密碼大約每年必須更改一次),之後的版本預設值為 0,表示密碼不會過期。此引數的單位是天,比如我們可以將此引數設定為 90 ,則表示全域性密碼自動過期策略是 90 天。

# 設定全域性過期策略 先手動更改再加入配置檔案
mysql> SET GLOBAL default_password_lifetime = 90;
Query OK, 0 rows affected (0.01 sec)

mysql> show variables like 'default_password_lifetime';
+---------------------------+-------+
| Variable_name             | Value |
+---------------------------+-------+
| default_password_lifetime | 90    |
+---------------------------+-------+
1 row in set (0.00 sec)

# 寫入配置檔案使得重啟生效
[mysqld]
default_password_lifetime = 90

儘管可以通過將過期的密碼設定為當前值來“重置”它,但出於良好的 Policy 考慮,最好選擇其他密碼。

總結:

本篇文章主要介紹了關於資料庫密碼的兩項安全策略,密碼複雜度加上密碼過期策略,多一份策略多一份安心。要記住:安全無小事。