新年伊始,你的數據庫是否是該巡檢了?通常巡檢都會關心密碼安全問題,好比密碼複雜度設置,是否有按期修改等。特別是進行等保評測時,評測機構會要求具有密碼安全策略。其實 MySQL 系統自己能夠設置密碼複雜度及自動過時策略的,可能比較少用,大多數同窗並未詳細去了解。本篇文章咱們一塊兒來學習下如何設置數據庫帳號密碼複雜度及自動過時策略。mysql
MySQL 系統自帶有 validate_password 插件,此插件能夠驗證密碼強度,未達到規定強度的密碼則不容許被設置。MySQL 5.7 及 8.0 版本默認狀況下貌似都不啓用該插件,這也使得咱們能夠隨意設置密碼,好比設置爲 12三、123456等。若是咱們想從根源上規範密碼強度,能夠啓用該插件,下面一塊兒來看下如何經過此插件來設置密碼複雜度策略。面試
進入 MySQL 命令行,經過 show plugins 或者查看 validate_password 相關參數能夠判斷是否已安裝此插件。若沒有相關參數則表明未安裝此插件。算法
# 安裝前檢查 爲空則說明未安裝此插件sql
mysql> show variables like 'validate%';數據庫
Empty set (0.00 sec)安全
# 經過 INSTALL PLUGIN 命令可安裝此插件session
# 每一個平臺的文件名後綴都不一樣 對於 Unix 和類 Unix 系統,爲.so,對於 Windows 爲.dllide
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)
安裝 validate_password 插件後,多了一些密碼強度相關參數,這些參數從字面意思上也很容易看懂,下面簡單解釋下幾個重點參數。
a、validate_password_policy
表明的密碼策略,默認是MEDIUM 可配置的值有如下:
0 or LOW 僅需需符合密碼長度(由參數validate_password_length指定) 1 or MEDIUM 知足LOW策略,同時還需知足至少有1個數字,小寫字母,大寫字母和特殊字符 2 or STRONG 知足MEDIUM策略,同時密碼不能存在字典文件(dictionary file)中
b、validate_password_dictionary_file
用於配置密碼的字典文件,當validate_password_policy設置爲STRONG時能夠配置密碼字典文件,字典文件中存在的密碼不得使用。
c、validate_password_length
用來設置密碼的最小長度,默認值是8
d、validate_password_mixed_case_count
當validate_password_policy設置爲MEDIUM或者STRONG時,密碼中至少同時擁有的小寫和大寫字母的數量,默認是1最小是0;默認是至少擁有一個小寫和一個大寫字母。
e、validate_password_number_count
當validate_password_policy設置爲MEDIUM或者STRONG時,密碼中至少擁有的數字的個數,默認1最小是0
f、validate_password_special_char_count
當validate_password_policy設置爲MEDIUM或者STRONG時,密碼中至少擁有的特殊字符的個數,默認1最小是0
學習完以上參數,咱們就能夠根據自身狀況來具體設置密碼複雜度策略了,好比我想讓密碼至少 10 位且包含大小寫字母、數字、特殊字符,則能夠這樣設置。
密碼複雜度策略只對生效後的操做有效,好比說你以前有個帳號,密碼是 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)
除了設置密碼複雜度策略外,咱們還能夠設置密碼自動過時,好比說隔 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 考慮,最好選擇其餘密碼。
本篇文章主要介紹了關於數據庫密碼的兩項安全策略,密碼複雜度加上密碼過時策略,多一份策略多一份安心。要記住:安全無小事。
最後,特別推薦一個分享C/C++和算法的優質內容,學習交流,技術探討,面試指導,簡歷修改...還有超多源碼素材等學習資料,零基礎的視頻等着你!
還沒關注的小夥伴,能夠長按關注一下: