萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> 資料庫綜合

MySQL 用戶權限管理全攻略:GRANT、直改授權表、密碼重置與最小權限原則

用戶體系核心概念

MySQL 用戶由 用戶名 + 宿主 唯一標識(如 'app'@'10.0.1.%'),支持通配符 %。權限分為 全局權限(實例級)、庫級、表級、列級、存儲程序級、代理用戶 六個層級,存儲於 mysql 系統庫的 user、db、tables_priv、columns_priv、procs_priv、proxies_priv 表中。

方式一:GRANT 語句(推薦,自動刷新權限緩存)

創建超級管理員(僅限內網/堡壘機)

CREATE USER 'admin'@'10.0.1.%' IDENTIFIED BY 'SuperStrongPass!';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'10.0.1.%' WITH GRANT OPTION;

創建應用讀寫賬號(單庫)

CREATE USER 'app_rw'@'10.0.1.%' IDENTIFIED BY 'AppRwPass123!';
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `biz_db`.* TO 'app_rw'@'10.0.1.%';

創建只讀賬號(報表/分析)

CREATE USER 'app_ro'@'10.0.1.%' IDENTIFIED BY 'AppRoPass123!';
GRANT SELECT ON `biz_db`.* TO 'app_ro'@'10.0.1.%';

創建 DBA 運維賬號(無數據權限,僅管理實例)

CREATE USER 'dba_ops'@'10.0.1.%' IDENTIFIED BY 'DbaOpsPass123!';
GRANT RELOAD, PROCESS, SHOW DATABASES, SUPER, REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'dba_ops'@'10.0.1.%';

創建無權限佔位賬號(後續動態授權)

CREATE USER 'placeholder'@'localhost' IDENTIFIED BY 'Pass123!';
GRANT USAGE ON *.* TO 'placeholder'@'localhost';  -- 僅允許連接

方式二:直接操作授權表(需手動 FLUSH PRIVILEGES)

適用於批量導入、遷移、自動化腳本。注意:MySQL 8.0+ 授權表結構變化大(user 表無 Password 列,改為 authentication_string),建議優先用 GRANT。

INSERT INTO mysql.user (Host, User, authentication_string, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, ...)
VALUES ('10.0.1.%', 'batch_user', PASSWORD('BatchPass123!'), 'Y','Y','Y','Y','Y','Y', ...);

INSERT INTO mysql.db (Host, Db, User, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv)
VALUES ('10.0.1.%', 'biz_db', 'batch_user', 'Y','Y','Y','Y','Y','Y');

FLUSH PRIVILEGES;

密碼管理與重置

常規修改密碼

-- 當前用戶
ALTER USER USER() IDENTIFIED BY 'NewPass123!';

-- 指定用戶(需 UPDATE 權限)
ALTER USER 'app_rw'@'10.0.1.%' IDENTIFIED BY 'NewPass123!';

忘記 root 密碼緊急重置

  1. 編輯 my.cnf,[mysqld] 區添加 skip-grant-tables。
  2. 重啟 MySQL:systemctl restart mysqld。
  3. 無密登錄:mysql -u root。
  4. 修改密碼:
    FLUSH PRIVILEGES;  -- skip-grant-tables 下必須先執行
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewRootPass123!';
  5. 移除 skip-grant-tables,再次重啟。

密碼策略強化(validate_password 組件)

INSTALL COMPONENT 'file://component_validate_password';
SET GLOBAL validate_password.length = 12;
SET GLOBAL validate_password.mixed_case_count = 1;
SET GLOBAL validate_password.number_count = 1;
SET GLOBAL validate_password.special_char_count = 1;
SET GLOBAL validate_password.policy = 'STRONG';

最小權限原則落地清單

角色典型權限集禁止權限
應用讀寫SELECT, INSERT, UPDATE, DELETE, EXECUTE (單庫)DROP, ALTER, GRANT, FILE, SHUTDOWN, PROCESS
應用只讀SELECT (單庫)所有寫權限、管理權限
開發/測試SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX (測試庫)生產庫任何權限、GRANT、SHUTDOWN
BI/報表SELECT (只讀庫/視圖)寫權限、PROCESS、FILE
備份賬號SELECT, RELOAD, LOCK TABLES, REPLICATION CLIENT, SHOW VIEW, EVENT, TRIGGERDROP、ALTER、GRANT
監控賬號PROCESS, REPLICATION CLIENT, SELECT ON performance_schema.*數據權限、管理權限

定期審計動作

  1. 檢查 mysql.user 表:是否有無 Host 限制的 root(Host='%')、匿名用戶(User='')、弱密碼用戶。
  2. 清理無用賬號:DROP USER 'old_dev'@'%';。
  3. 收回過度授權:REVOKE DROP ON *.* FROM 'app_rw'@'%';。
  4. 輪換關鍵賬號密碼(季度/半年)。

權限管理的核心是「最小權限、來源可控、定期審計」。將 GRANT 納入基礎設施代碼,通過 Terraform/Ansible 管理,實現權限即代碼,才是現代運維的正確姿勢。

copyright © 萬盛學電腦網 all rights reserved