MySQL 8.0.x中,我們?nèi)绻窗踩?guī)范配置了賬號密碼過期策略的話,那么如何查看賬號密碼還有多長時間就會過期;如何做好賬號密碼過期監(jiān)控;以及提前及時處理賬號密碼過期問題就是DBA必須處理的一些事情。這里簡單討論一下這些事情。個人經(jīng)驗僅供參考,如有不足或錯誤的地方,敬請指正一二。這篇文章的具體測試環(huán)境為MySQL 8.0.35.
設(shè)置賬號密碼過期
一般系統(tǒng)變量default_password_lifetime控制著全局范圍的賬號密碼過期時間。
mysql>?show?variables?like?'default_password_lifetime';
+---------------------------+-------+
|?Variable_name?????????????|?Value?|
+---------------------------+-------+
|?default_password_lifetime?|?180???|
+---------------------------+-------+
1?row?in?set?(0.02?sec)
mysql>?
這個系統(tǒng)系統(tǒng)變量可以在my.cnf中設(shè)置。也可以在MySQL運行時設(shè)置并持久化。
SET?PERSIST?default_password_lifetime?=?365;
你創(chuàng)建賬號時可以指定賬號密碼過期使用默認的全局策略,也可以不指定,它也會使用全局的密碼過期策略,如下所示, 下面兩個SQL其實是等價的。
create?user?test2@'%'?identified?by?random?password?;
create?user?test2@'%'?identified?by?random?password?password?expire?default;
另外,你也可以在創(chuàng)建賬號時設(shè)置賬號密碼過期時間,如下所示,那么此過期時間會覆蓋系統(tǒng)變量default_password_lifetime的值(優(yōu)先級高于全局變量)。這個值也會記錄到系統(tǒng)表mysql.user中password_lifetime中,如果創(chuàng)建用戶時沒有指定賬號密碼過期期限,而是使用全局策略,那么此時password_lifetime的值為NULL。
CREATE?USER?'test'@'%'?IDENTIFIED?BY?RANDOM?PASSWORD?PASSWORD?EXPIRE?INTERVAL?20?DAY;
手動設(shè)置賬號密碼過期
我們也可以手工設(shè)置賬號密碼過期,如下所示:
ALTER?USER?'USER_NAME'@'HOSTNAME'?PASSWORD?EXPIRE;
ALTER?USER?'USER_NAME'@'HOSTNAME'?PASSWORD?EXPIRE?INTERVAL?90?DAY;
如果手工將一個賬號手工設(shè)置為賬號密碼過期,那么系統(tǒng)表mysql.user中的password_expired會變?yōu)閅,而密碼全局過期策略下過期的賬號的字段password_expired則永遠為N。這些細節(jié)不知你有沒有注意過。
查詢賬號密碼過期期限
根據(jù)MySQL密碼過期策略,密碼過期是自動的,并基于密碼期限,對于給定帳戶,密碼期限是從其最近一次密碼更改的日期和時間開始評估的。系統(tǒng)表為每個帳戶指示上次更改其密碼的時間(mysql.user表的password_last_changed字段值),如果密碼的期限大于其允許的生存期,服務(wù)器會自動將密碼視為在客戶端連接時已過期。這適用于沒有明確的手動設(shè)置密碼過期的賬戶。
查看數(shù)據(jù)庫中賬號密碼還有多久即將過期,可以使用下面這個SQL:
select?user
?????,?host
?????,?plugin
?????,?password_expired
?????,?password_last_changed
?????,?if(ifnull(password_lifetime,?CAST(@@default_password_lifetime?as?signed))<1,'NEVER',
???????concat(
????????????cast(???ifnull(password_lifetime,?@@default_password_lifetime)?as?signed)
??????????+?cast(datediff(password_last_changed,?now())?as?signed),?"?days"))?as?
???????days_till_expires
from?mysql.user;
或者使用下面優(yōu)化調(diào)整過的SQL
--如果使用ALTER?USER?'test'@'%'?PASSWORD?EXPIRE命令使賬號密碼過期,但是days_till_expires依然顯示賬號密碼還有N天才過期。
select?user
?????,?host
?????,?plugin
?????,?password_expired
?????,?password_last_changed
?????,?if(password_expired='Y','password_expired',
??????????if(ifnull(password_lifetime,?CAST(@@default_password_lifetime?as?signed))<1,'NEVER',
??????????concat(
???????????????cast(???ifnull(password_lifetime,?@@default_password_lifetime)?as?signed)
?????????????+?cast(datediff(password_last_changed,?now())?as?signed),?"?days")))??
???????as?days_till_expires
from?mysql.user;
監(jiān)控賬號密碼過期
監(jiān)控賬號密碼過期,我們可以使用python腳本監(jiān)控MySQL賬號密碼過期問題,如果密碼小于N(N可以是30,60)天即將過期,那么發(fā)出下面告警郵件:
處理即將密碼過期賬號
對于即將過期的賬號密碼,分兩種情況:
1:password_lifetime為null,default_password_lifetime不為null的情況,重置密碼后,它的過期期限變?yōu)閐efault_password_lifetime的值。
mysql>?alter?user?zbx_monitor@'localhost'?identified?by?"*******";
Query?OK,?0?rows?affected?(0.04?sec)
2:password_lifetime不為null的情況(手工設(shè)置密碼過期期限的情況),那么你可以有以下幾種方式來處理
mysql>?alter?user?test@'%'?identified?by?"******";
Query?OK,?0?rows?affected?(0.01?sec)
此時password_lifetime會變?yōu)橹爸付ǖ倪^期期限,當然,你也可以在修改賬號密碼時指定過期期限。
#不修改賬號密碼
mysql>?alter?user?test@'%'??password?expire?interval?180?day;
Query?OK,?0?rows?affected?(0.01?sec)
#修改賬號密碼
mysql>?alter?user?test@'%'?identified?by?"******"?password?expire?interval?190?day;
Query?OK,?0?rows?affected?(0.06?sec)
賬號密碼過期后,依然能連接上MySQL,但是此時做任何操操作都會報ERROR 1820(HY000)錯誤,如下所示:
mysql>?select?*?from?dual;
ERROR?1820?(HY000):?You?must?reset?your?password?using?ALTER?USER?statement?before?executing?this?statement.
mysql>?
從 MySQL 8.0.14 開始,允許用戶帳戶擁有雙重密碼,指定為主密碼和輔助密碼。雙密碼功能可以在以下場景中無縫執(zhí)行憑據(jù)更改:
一個系統(tǒng)有大量的MySQL服務(wù)器,可能涉及復(fù)制。
多個應(yīng)用程序連接到不同的 MySQL 服務(wù)器。
必須對應(yīng)用程序用來連接服務(wù)器的一個或多個帳戶定期更改憑據(jù)。
DBA如果經(jīng)歷過的,也許都知道有時候修改數(shù)據(jù)庫賬號密碼是比較麻煩的事情,系統(tǒng)開發(fā)人員或系統(tǒng)Support人員會覺得比較麻煩,因為對于復(fù)雜系統(tǒng),一不小心,賬號密碼配置出了差錯或紕漏,可能會導(dǎo)致生產(chǎn)事故,另外,修改賬號密碼也會影響系統(tǒng)業(yè)務(wù)的可用性(可能需要短暫的停止應(yīng)用系統(tǒng)服務(wù)...),所以對于定期修改賬號密碼,很多時候是名存實亡。因此要么不會修改數(shù)據(jù)庫賬號密碼,要么按規(guī)范定期修改賬號密碼,也是使用相同的賬號密碼,并不會修改賬戶密碼。
如果使用雙密碼,就可以更輕松地分階段修改密碼,無需密切合作,也無需停機。確實是一個很了不起的創(chuàng)新。其他數(shù)據(jù)庫暫時還沒有這種特性。
#建立新的主密碼,保留當前密碼作為輔助密碼文章來源:http://www.zghlxwxcb.cn/news/detail-837783.html
ALTER?USER?'test'@'%'?IDENTIFIED?BY?'****'?RETAIN?CURRENT?PASSWORD;
#等到應(yīng)用程序切換密碼后,丟棄舊密碼(輔助密碼)文章來源地址http://www.zghlxwxcb.cn/news/detail-837783.html
ALTER?USER?'test'@'%'?DISCARD?OLD?PASSWORD;
到了這里,關(guān)于MySQL如何查看/監(jiān)控/處理賬號密碼過期問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!