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

MySQL 5.7 安全特性深度解析:賬號管理、密碼策略、SSL、SQL Mode

     編輯:MySQL 綜合教學

MySQL 5.7 安全特性深度解析:賬號管理、密碼策略、SSL、SQL Mode

MySQL 5.7 在安全體系上進行了重大重構:賬號創建與授權分離、密碼過期/鎖定策略、代理用戶、默認 SSL 加密、嚴格 SQL Mode、移除測試庫、初始化隨機密碼。本文逐項解析配置方法、實戰場景與避坑指南。

一、賬號管理重構:創建與授權分離

1.1 棄用 GRANT 創建用戶

# 5.7 前 (棄用,報 Warning)
GRANT ALL ON *.* TO 'dxy'@'localhost' IDENTIFIED BY '123456';
# Warning: Using GRANT for creating new user is deprecated...

1.2 標準兩步走:CREATE USER + GRANT

-- 步驟1: 創建用戶 (認證插件、密碼策略、鎖定、過期均在這裡控制)
CREATE USER 'dxy'@'localhost' IDENTIFIED BY '123456';
-- 等同於指定默認插件
CREATE USER 'dxy'@'localhost' IDENTIFIED WITH 'mysql_native_password' BY '123456';

-- 使用哈希值創建 (避免明文傳輸)
CREATE USER 'dxy'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9';

-- 步驟2: 授權
GRANT SELECT, INSERT, UPDATE, DELETE ON dba_test.* TO 'dxy'@'localhost';

1.3 管理員賬號權限全集

-- 查看默認 root 權限
SHOW GRANTS FOR 'root'@'localhost';
-- 輸出兩條:
-- GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION
-- GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION

-- 創建新管理員
CREATE USER 'dba'@'127.0.0.1' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'dba'@'127.0.0.1' WITH GRANT OPTION;
GRANT PROXY ON ''@'' TO 'dba'@'127.0.0.1' WITH GRANT OPTION;  -- 代理用戶授權需此權限

1.4 常用查看命令

-- 查看權限
SHOW GRANTS FOR 'dxy'@'localhost';

-- 查看創建語句 (含哈希密碼、過期策略、鎖定狀態)
SHOW CREATE USER 'dxy'@'localhost';
-- CREATE USER 'dxy'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS '*HASH' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK

二、密碼過期策略:強制定期輪換

適用場景:合規要求、定期輪換、洩露風險降低、程序強制斷開重連獲取新密碼。

2.1 策略選項

子句含義受控變量
PASSWORD EXPIRE DEFAULT默認策略,過期天數由 default_password_lifetime 全局變量控制 (默認 0=不過期)default_password_lifetime
PASSWORD EXPIRE NEVER永不過期-
PASSWORD EXPIRE INTERVAL N DAYN 天后過期-
PASSWORD EXPIRE立即過期 (下次登錄強制改密)-

2.2 實戰操作

-- 鎖定賬號 (拒絕所有連接)
ALTER USER 'dxy'@'localhost' ACCOUNT LOCK;
-- 登錄報錯: ERROR 3118 (HY000): Access denied for user 'dxy'@'localhost'. Account is locked.

-- 解鎖恢復
ALTER USER 'dxy'@'localhost' ACCOUNT UNLOCK;

四、代理用戶:權限委派與審計溯源

場景:連接池用戶代理業務用戶、審計需區分真實操作者、多租戶權限復用。

4.1 前置條件

-- 1. 原始賬號 (擁有實際權限)
CREATE USER 'dxy'@'127.0.0.1' IDENTIFIED BY '123456';
GRANT ALL ON test.* TO 'dxy'@'127.0.0.1';

-- 2. 代理賬號 (應用連接池使用)
CREATE USER 'dxy_proxy'@'127.0.0.1' IDENTIFIED BY '123456';

-- 3. 授予代理權限
GRANT PROXY ON 'dxy'@'127.0.0.1' TO 'dxy_proxy'@'127.0.0.1';

-- 4. 驗證
-- 代理賬號登錄後:
SELECT USER(), CURRENT_USER();
-- USER() = 'dxy_proxy@127.0.0.1' (連接用戶)
-- CURRENT_USER() = 'dxy@127.0.0.1' (生效權限用戶)

SHOW GRANTS;  -- 顯示 dxy 的權限
-- 實際操作權限 = dxy 的權限

五、其他賬號限制選項

性能提示: SSL 加密傳輸約帶來 20-25% CPU 開銷,內網高並發場景權衡啟用。

6.3 初始化方式變更:mysqld --initialize

SELECT @@sql_mode;
-- ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,
-- ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

7.2 核心模式解讀與影響

Mode作用違規示例報錯信息
ONLY_FULL_GROUP_BYGROUP BY 必須包含所有非聚合列SELECT name, MAX(age) FROM t GROUP BY name (若 SELECT id 未在 GROUP BY)Expression #1 of SELECT list is not in GROUP BY clause
STRICT_TRANS_TABLES事務表嚴格模式:數據截斷/類型不匹配/空值違約 → 報錯回滾VARCHAR(10) 插入 20字符 / NOT NULL列插入NULL / 日期插入 'abc'Data too long / Field doesn't have default / Incorrect datetime value
NO_ZERO_IN_DATE嚴格模式下禁止月/日為 0 的日期'2023-00-01', '2023-01-00'Incorrect date value
NO_ZERO_DATE嚴格模式下禁止 '0000-00-00'INSERT '0000-00-00'Incorrect datetime value
ERROR_FOR_DIVISION_BY_ZERO嚴格模式下除零報錯而非返回 NULLSELECT 1/0; INSERT INTO t VALUES (1/0);Division by 0
NO_AUTO_CREATE_USERGRANT 必須指定密碼,禁止隱式創建用戶GRANT SELECT ON *.* TO 'newuser'@'%';Can't find any matching row in the user table
NO_ENGINE_SUBSTITUTION指定引擎不可用時不自動降級,直接報錯CREATE TABLE t (...) ENGINE=Tokudb; (未安裝)Unknown storage engine 'Tokudb'

7.3 主從/遷移一致性要求

  • 主從雙端 SQL Mode 必須一致,否則復制中斷 (如主庫允許零日期、從庫嚴格模式報錯)
  • 數據遷移前對齊 SQL Mode,或使用兼容模式導入
  • 建議:開發規範使用標準 SQL,不依賴寬鬆模式行為

八、總結:5.7 安全清單

特性5.7 行為運維動作
創建用戶CREATE USER + GRANT 兩步腳本遷移、禁用 GRANT 創建
用戶名長度32字節 (原16)應用層長度驗證調整
密碼過期支持 INTERVAL/DEFAULT/NEVER合規場景配置策略
賬號鎖定ACCOUNT LOCK/UNLOCK熔斷腳本集成
代理用戶PROXY 權限 + 參數啟用連接池/審計場景評估
test庫默認移除舊實例手動 DROP
SSLmysql_ssl_rsa_setup 一鍵生成、默認加密生產環境配置證書、強制關鍵賬號 REQUIRE SSL
初始化mysqld --initialize 隨機密碼部署腳本更新、首次登錄改密
SQL Mode默認嚴格模式組合主從一致、應用 SQL 合規化改造
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved