首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 5.7 安全特性深度解析:賬號管理、密碼策略、SSL 與 SQL_MODE 變革

     編輯:MySQL 資料庫相關知識

核心變更概覽

領域5.6 行為5.7 變更影響
用戶創建GRANT 隱式創建強制 CREATE USER + GRANT 分離避免意外創建無密賬戶
用戶名長度16 字節32 字節支援更長標識符
認證插件mysql_old_password 可用移除 old_password,默認 mysql_native_password安全性提升
密碼過期無PASSWORD EXPIRE 選項合規輪換
賬戶鎖定無ACCOUNT LOCK/UNLOCK運維隔離
代理用戶基礎支援原生認證插件集成 PROXY 權限權限復用
test 库默認存在默認刪除減少攻擊面
SSL手動配置mysql_ssl_rsa_setup 自動生成,默認加密連接零配置加密
初始化mysql_install_dbmysqld --initialize,隨機密碼存 ~/.mysql_secret首次登錄強制改密
SQL_MODENO_ENGINE_SUBSTITUTION嚴格模式組合(見下表)數據質量強保障

用戶管理新語法

-- 1. 創建用戶(明文密碼)
CREATE USER 'dxy'@'localhost' IDENTIFIED BY '123456';
-- 等價於
CREATE USER 'dxy'@'localhost' IDENTIFIED WITH 'mysql_native_password' BY '123456';

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

-- 3. 授權(不再包含 IDENTIFIED BY)
GRANT SELECT,INSERT,UPDATE,DELETE ON dba_test.* TO 'dxy'@'localhost';

-- 4. 查看完整定義(含哈希、過期、鎖定狀態)
SHOW CREATE USER 'dxy'@'localhost';

密碼過期策略

-- 創建時設置
CREATE USER 'dxy'@'localhost' IDENTIFIED BY '123456' PASSWORD EXPIRE INTERVAL 10 DAY;

-- 存量用戶修改
ALTER USER 'zjy'@'localhost' PASSWORD EXPIRE NEVER;      -- 永不過期
ALTER USER 'dxy'@'localhost' PASSWORD EXPIRE INTERVAL 30 DAY;
ALTER USER 'dxy'@'localhost' PASSWORD EXPIRE;            -- 立即過期

-- 全局默認過期天數
SET GLOBAL default_password_lifetime=90;  -- 0=永不過期

過期後行為

  • 登錄成功但進入「沙箱模式」
  • 只能執行 ALTER USER ... IDENTIFIED BY ... 重置密碼
  • 其他語句報錯:ERROR 1820 (HY000): You must reset your password...

賬戶鎖定/解鎖

ALTER USER 'dxy'@'localhost' ACCOUNT LOCK;   -- 鎖定
-- 登錄報錯:ERROR 3118 (HY000): Account is locked.

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

代理用戶實戰

-- 前置:啟用代理參數
SET GLOBAL check_proxy_users=ON;
SET GLOBAL mysql_native_password_proxy_users=ON;

-- 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';
GRANT PROXY ON 'dxy'@'127.0.0.1' TO 'dxy_proxy'@'127.0.0.1';

-- 3. 驗證
-- 以 dxy_proxy 登錄
SELECT USER(), CURRENT_USER(); 
-- USER()=dxy_proxy, CURRENT_USER()=dxy (權限來自 dxy)

SHOW GRANTS; -- 顯示 dxy 的權限

SSL 零配置加密

# 生成證書(數據目錄下自動創建 *.pem)
mysql_ssl_rsa_setup --datadir=/var/lib/mysql

# 默認連接即加密
mysql -u dba -p -h 127.0.0.1
\s
-- SSL: Cipher in use is DHE-RSA-AES256-SHA

# 強制 SSL 登錄(賬戶級)
CREATE USER 'ssl_user'@'%' IDENTIFIED BY 'pwd' REQUIRE SSL;

SQL_MODE 變革:從寬鬆到嚴格

模式含義違規示例
ONLY_FULL_GROUP_BYGROUP BY 必須包含所有非聚合列SELECT a,b FROM t GROUP BY a
STRICT_TRANS_TABLES事務表嚴格模式:截斷/無效值報錯VARCHAR(10) 插入 20 字符
NO_ZERO_IN_DATE拒絕月/日為 0 的日期'2024-00-01'
NO_ZERO_DATE拒絕 '0000-00-00'DATE 默認值 '0000-00-00'
ERROR_FOR_DIVISION_BY_ZERO除零報錯而非返回 NULLSELECT 1/0
NO_AUTO_CREATE_USERGRANT 必須指定密碼GRANT SELECT ON *.* TO 'x'@'%'
NO_ENGINE_SUBSTITUTION引擎不可用時不自動替換CREATE TABLE ... ENGINE=TOKUDB

主從/遷移一致性要求

主從 SQL_MODE 必須完全一致,否則複製中斷、遷移數據截斷/報錯。建議全環境統一為嚴格模式,代碼層適配標準 SQL。

總結

MySQL 5.7 將安全從「事後補丁」轉為「內核能力」:**分離創建授權、密碼生命周期管理、賬戶狀態控制、權限代理復用、默認加密傳輸、嚴格數據校驗**。升級 5.7 不只是版本號變更,更是安全基線的整體躍升。

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