年底了,你的mysql密碼安全嗎
前言:
年底了,你的數(shù)據(jù)庫是不是該巡檢了?一般巡檢都會(huì)關(guān)心密碼安全問題,比如密碼復(fù)雜度設(shè)置,是否有定期修改等。特別是進(jìn)行等保評測時(shí),評測機(jī)構(gòu)會(huì)要求具備密碼安全策略。其實(shí) MySQL 系統(tǒng)本身可以設(shè)置密碼復(fù)雜度及自動(dòng)過期策略的,可能比較少用,大多數(shù)同學(xué)并未詳細(xì)去了解。本篇文章我們一起來學(xué)習(xí)下如何設(shè)置數(shù)據(jù)庫賬號密碼復(fù)雜度及自動(dòng)過期策略。
1.密碼復(fù)雜度策略設(shè)置
MySQL 系統(tǒng)自帶有 validate_password 插件,此插件可以驗(yàn)證密碼強(qiáng)度,未達(dá)到規(guī)定強(qiáng)度的密碼則不允許被設(shè)置。MySQL 5.7 及 8.0 版本默認(rèn)情況下貌似都不啟用該插件,這也使得我們可以隨意設(shè)置密碼,比如設(shè)置為 123、123456等。如果我們想從根源上規(guī)范密碼強(qiáng)度,可以啟用該插件,下面一起來看下如何通過此插件來設(shè)置密碼復(fù)雜度策略。
1)查看是否已安裝此插件
進(jìn)入 MySQL 命令行,通過 show plugins 或者查看 validate_password 相關(guān)參數(shù)可以判斷是否已安裝此插件。若沒有相關(guān)參數(shù)則代表未安裝此插件
# 安裝前檢查 為空則說明未安裝此插件 mysql> show variables like 'validate%'; Empty set (0.00 sec)
2)安裝 validate_password 插件
# 通過 INSTALL PLUGIN 命令可安裝此插件 # 每個(gè)平臺的文件名后綴都不同 對于 Unix 和類 Unix 系統(tǒng),為.so,對于 Windows 為.dll mysql> INSTALL PLUGIN validate_password SONAME 'validate_password.so'; Query OK, 0 rows affected, 1 warning (0.28 sec) # 查看 validate_password 相關(guān)參數(shù) 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)密碼強(qiáng)度相關(guān)參數(shù)解釋
安裝 validate_password 插件后,多了一些密碼強(qiáng)度相關(guān)參數(shù),這些參數(shù)從字面意思上也很容易看懂,下面簡單解釋下幾個(gè)重點(diǎn)參數(shù)。
1、validate_password_policy
代表的密碼策略,默認(rèn)是MEDIUM 可配置的值有以下:
- 0 or LOW 僅需需符合密碼長度(由參數(shù)validate_password_length指定)
- 1 or MEDIUM 滿足LOW策略,同時(shí)還需滿足至少有1個(gè)數(shù)字,小寫字母,大寫字母和特殊字符
- 2 or STRONG 滿足MEDIUM策略,同時(shí)密碼不能存在字典文件(dictionary file)中
2、validate_password_dictionary_file
用于配置密碼的字典文件,當(dāng)validate_password_policy設(shè)置為STRONG時(shí)可以配置密碼字典文件,字典文件中存在的密碼不得使用。
3、validate_password_length
用來設(shè)置密碼的最小長度,默認(rèn)值是8
4、validate_password_mixed_case_count
當(dāng)validate_password_policy設(shè)置為MEDIUM或者STRONG時(shí),密碼中至少同時(shí)擁有的小寫和大寫字母的數(shù)量,默認(rèn)是1最小是0;默認(rèn)是至少擁有一個(gè)小寫和一個(gè)大寫字母。
5、validate_password_number_count
當(dāng)validate_password_policy設(shè)置為MEDIUM或者STRONG時(shí),密碼中至少擁有的數(shù)字的個(gè)數(shù),默認(rèn)1最小是0
6、validate_password_special_char_count
當(dāng)validate_password_policy設(shè)置為MEDIUM或者STRONG時(shí),密碼中至少擁有的特殊字符的個(gè)數(shù),默認(rèn)1最小是0
4)密碼復(fù)雜度策略具體設(shè)置
學(xué)習(xí)完以上參數(shù),我們就可以根據(jù)自身情況來具體設(shè)置密碼復(fù)雜度策略了,比如我想讓密碼至少 10 位且包含大小寫字母、數(shù)字、特殊字符,則可以這樣設(shè)置。
5)測試密碼復(fù)雜度
密碼復(fù)雜度策略只對生效后的操作有效,比如說你之前有個(gè)賬號,密碼是 123 ,則該賬號還是可以繼續(xù)使用的,不過若再次更改密碼則需滿足復(fù)雜度策略。下面我們來測試下密碼復(fù)雜度策略的具體效果。
# 新建用戶設(shè)置密碼 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.設(shè)置密碼自動(dòng)過期
除了設(shè)置密碼復(fù)雜度策略外,我們還可以設(shè)置密碼自動(dòng)過期,比如說隔 90 天密碼會(huì)過期必須修改密碼后才能繼續(xù)使用,這樣我們的數(shù)據(jù)庫賬號就更加安全了。下面我們來看下如何設(shè)置密碼自動(dòng)過期。
單獨(dú)設(shè)置某個(gè)賬號密碼過期時(shí)間
使用 ALTER USER 語句可以使單個(gè)賬號密碼過期,也可以更改賬號過期時(shí)間。
# 通過 mysql.user 系統(tǒng)表查看數(shù)據(jù)庫賬號狀態(tài) 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) # 單獨(dú)設(shè)置該賬號密碼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) # 讓此賬號使用默認(rèn)的密碼過期全局策略 mysql> ALTER USER 'expuser'@'%' PASSWORD EXPIRE DEFAULT; Query OK, 0 rows affected (0.01 sec)
mysql.user 系統(tǒng)表記錄著每個(gè)賬號的相關(guān)信息,當(dāng) password_expired 字段值為 Y 時(shí),代表此密碼已過期,使用過期密碼仍可以登錄,但不能進(jìn)行任何操作,進(jìn)行操作會(huì)提示:ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement. 必須更改密碼后才能進(jìn)行正常操作。
對于給定過期時(shí)間的賬號,比如說設(shè)置 90 天過期,數(shù)據(jù)庫系統(tǒng)會(huì)比較當(dāng)前時(shí)間與上次修改密碼的時(shí)間差值,如果距離上次修改密碼時(shí)間超過 90 天,則將此賬號密碼標(biāo)記為過期,必須更改密碼后才能進(jìn)行操作。
設(shè)置全局過期策略
要構(gòu)建全局密碼自動(dòng)過期策略,請使用 default_password_lifetime 系統(tǒng)變量。在 5.7.11 版本之前,默認(rèn)的 default_password_lifetime 值為 360(密碼大約每年必須更改一次),之后的版本默認(rèn)值為 0,表示密碼不會(huì)過期。此參數(shù)的單位是天,比如我們可以將此參數(shù)設(shè)置為 90 ,則表示全局密碼自動(dòng)過期策略是 90 天。
# 設(shè)置全局過期策略 先手動(dòng)更改再加入配置文件 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
盡管可以通過將過期的密碼設(shè)置為當(dāng)前值來“重置”它,但出于良好的 Policy 考慮,最好選擇其他密碼。
總結(jié):
本篇文章主要介紹了關(guān)于數(shù)據(jù)庫密碼的兩項(xiàng)安全策略,密碼復(fù)雜度加上密碼過期策略,多一份策略多一份安心。要記?。喊踩珶o小事。
以上就是年底了,你的mysql密碼安全嗎的詳細(xì)內(nèi)容,更多關(guān)于mysql 密碼安全的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MySQL遷移中explicit_defaults_for_timestamp參數(shù)影響
在MySQL數(shù)據(jù)庫遷移過程中,explicit_defaults_for_timestamp參數(shù)設(shè)置為off可能導(dǎo)致數(shù)據(jù)寫入行為變化,本文就來介紹一下explicit_defaults_for_timestamp參數(shù)影響,感興趣的可以了解一下2024-09-09如何利用Mysql計(jì)算地址經(jīng)緯度距離實(shí)時(shí)位置
最近工作中遇到了一個(gè)附近門店的功能,下面這篇文章主要給大家介紹了關(guān)于如何利用Mysql計(jì)算地址經(jīng)緯度距離實(shí)時(shí)位置的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04mysql從執(zhí)行.sql文件時(shí)處理\n換行的問題
后來注意到,在上面我們恢復(fù)數(shù)據(jù)的時(shí)候是在沒有連接數(shù)據(jù)的狀態(tài)下執(zhí)行的。2009-05-05MySQL實(shí)現(xiàn)批量插入測試數(shù)據(jù)的方式小結(jié)
在開發(fā)過程中我們不管是用來測試性能還是在生產(chǎn)環(huán)境中頁面展示好看一點(diǎn),?經(jīng)常需要一些測試數(shù)據(jù),?本文主要介紹了兩種常用的MySQL測試數(shù)據(jù)批量生成方式,希望對大家有所幫助2023-11-11ubuntu?22.04安裝mysql?8.0步驟與避坑指南
MySQL最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),在WEB應(yīng)用方面MySQL是最好的關(guān)系數(shù)據(jù)庫管理系統(tǒng)應(yīng)用軟件之一,這篇文章主要給大家介紹了關(guān)于ubuntu?22.04安裝mysql?8.0步驟與避坑指南的相關(guān)資料,需要的朋友可以參考下2023-12-12mysql優(yōu)化連接數(shù)防止訪問量過高的方法
這篇文章主要介紹了mysql優(yōu)化連接數(shù)防止訪問量過高的方法,需要的朋友可以參考下2014-06-06