首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 密碼過期功能完整指南:PCI DSS 合規、自動化策略與帳號鎖定實戰

     編輯:MySQL 綜合教學

MySQL 密碼過期功能完整指南:PCI DSS 合規、自動化策略與帳號鎖定實戰

為滿足 PCI DSS (支付卡產業資料安全標準) 要求「每 90 天變更密碼」,MySQL 5.6.6+ 引入密碼過期機制,5.7.4+ 強化為全域自動策略,5.7.8+ 新增帳號鎖定功能。本文系統整合版本演進、配置策略、自動化運維與最佳實踐。

版本演進時間軸

版本關鍵特性應用場景
5.6.6password_expired 欄位 (Y/N)、ALTER USER ... PASSWORD EXPIRE手動單一帳號過期控制
5.7.4全域變數 default_password_lifetime、ALTER USER ... PASSWORD EXPIRE INTERVAL N DAY自動化全域/個別過期策略
5.7.6ALTER USER USER() IDENTIFIED BY ... 當前用戶修改密碼應用端自我服務修改密碼
5.7.8帳號鎖定 ACCOUNT LOCK/UNLOCK、CREATE USER ... ACCOUNT LOCK離職管控、緊急凍結、自動化合規

核心機制:password_expired 欄位

mysql.user 表中 password_expired 欄位 (ENUM 'Y','N') 控制帳號狀態:

  • N (預設):正常使用
  • Y:帳號進入「受限模式」—— 可登入,但**任何查詢前必須先修改密碼**,否則報錯 ERROR 1820 (HY000): You must SET PASSWORD before executing this statement

不影響已建立的連線 (既有 Session)。

策略一:手動單一帳號過期控制

-- 立即要求 testuser 修改密碼
ALTER USER 'testuser'@'localhost' PASSWORD EXPIRE;

-- 用戶登入後必須執行
SET PASSWORD = PASSWORD('NewComplexPass123!');
-- 或 5.7.6+
ALTER USER USER() IDENTIFIED BY 'NewComplexPass123!';

-- 解除過期狀態 (管理員操作)
ALTER USER 'testuser'@'localhost' PASSWORD EXPIRE NEVER;

策略二:全域自動過期策略 (default_password_lifetime)

配置檔永久生效 (/etc/my.cnf):

[mysqld]
# 所有用戶密碼 90 天自動過期 (PCI DSS 標準)
default_password_lifetime=90

# 永不過期 (預設值,可不寫)
default_password_lifetime=0

運行時動態調整 (需 SUPER 權限,重啟失效):

SET GLOBAL default_password_lifetime = 90;
SET GLOBAL default_password_lifetime = 0; -- 關閉

MySQL 從啟動時間點開始計算,而非密碼最後修改時間 (5.7.4-5.7.10 行為),5.7.11+ 改為以密碼最後修改時間計算。

策略三:個別帳號客製化過期週期 (覆蓋全域策略)

-- 設定特定用戶 30 天過期 (優先於全域 90 天)
ALTER USER 'testuser'@'localhost' PASSWORD EXPIRE INTERVAL 30 DAY;

-- 禁用該用戶過期 (忽略全域策略)
ALTER USER 'testuser'@'localhost' PASSWORD EXPIRE NEVER;

-- 恢復使用全域預設策略
ALTER USER 'testuser'@'localhost' PASSWORD EXPIRE DEFAULT;

注意:INTERVAL 單位為 **天 (DAY)**,不支援小時/月。

策略四:自動化運維 — 定時掃描與通知

資料庫層面無主動通知功能,需應用層或排程腳本配合:

-- 查詢即將過期/已過期帳號 (假設 7 天內預警)
SELECT User, Host, password_expired, password_last_changed
FROM mysql.user
WHERE password_expired = 'N'
  AND password_last_changed < DATE_SUB(NOW(), INTERVAL 83 DAY); -- 90-7=83

搭配 cron + 腳本 (Python/Shell) 發送郵件/企業微信/Slack 通知用戶及管理員。

新功能:帳號鎖定 — 更強管控手段 (5.7.8+)

密碼過期僅限制「查詢前必改密碼」,帳號仍可登入。鎖定則**完全禁止認證**:

-- 建立鎖定帳號
CREATE USER 'contractor'@'%' IDENTIFIED BY 'TempPass123!' ACCOUNT LOCK;

-- 鎖定現有帳號 (離職、異常)
ALTER USER 'contractor'@'%' ACCOUNT LOCK;
-- 登入嘗試報錯:ERROR 3118 (HY000): Access denied for user 'contractor'@'%'. Account is locked.

-- 解鎖恢復
ALTER USER 'contractor'@'%' ACCOUNT UNLOCK;

鎖定 vs 過期對比:

特性密碼過期帳號鎖定
登入能力可登入完全禁止登入
查詢能力改密碼前不可查詢完全不可查詢
適用場景定期輪換、合規要求離職、安全事件、臨時帳號
自動化支援全域/個別策略需外部腳本觸發

PCI DSS 合規實施清單

  1. 策略制定:default_password_lifetime=90 寫入 my.cnf。
  2. 例外管理:服務帳號、自動化腳本帳號設定 PASSWORD EXPIRE NEVER,並記錄在台帳。
  3. 監控告警:部署腳本每日掃描 password_last_changed,提前 7/3/1 天通知。
  4. 離職流程:HR 系統觸發 API 呼叫 ALTER USER ... ACCOUNT LOCK,不可僅停用應用層帳號。
  5. 審計留痕:啟用 log_statement=ddl 或審計插件記錄所有 ALTER USER 操作。

常見坑點與避雷

  1. 5.7.4-5.7.10 計算基準為啟動時間:重啟 MySQL 會重置所有帳號過期倒數!5.7.11+ 已修正為以 password_last_changed 計算。
  2. root 帳號設定過期:極高風險,可能導致無法登入維護。**root 必須設定 NEVER**。
  3. 應用連線池持有舊連線:密碼修改後,連線池需重啟或驅動支援自動重連,否則業務報錯。
  4. 從庫同步延遲:主庫修改密碼/鎖定帳號,Binlog 複製到從庫需時間,極短窗口期從庫仍可登入舊密碼。

總結

MySQL 密碼過期與帳號鎖定提供了從「合規驅動」到「安全管控」的完整工具鏈。核心在於:**全域策略自動化 (default_password_lifetime) + 例外精細管控 (INTERVAL/NEVER/LOCK) + 外部自動化通知/離職聯動**。升級至 5.7.11+ 避免重啟重置 Bug,並建立完整運維 SOP,才能真正落地 PCI DSS 要求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved