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

MySQL 用戶管理與權限控制實戰:創建、授權、密碼策略、審計清單

     編輯:MySQL 綜合教學

核心操作速查表

操作SQL (8.0+ 推薦語法)舊版兼容語法
創建用戶CREATE USER 'user'@'host' IDENTIFIED BY 'pass';GRANT USAGE ON *.* TO 'user'@'host' IDENTIFIED BY 'pass';
授權 (庫級)GRANT SELECT,INSERT,UPDATE,DELETE ON db.* TO 'user'@'host';同
授權 (表級)GRANT SELECT ON db.tbl TO 'user'@'host';同
授權 (列級)GRANT SELECT (col1,col2) ON db.tbl TO 'user'@'host';同
刷新權限FLUSH PRIVILEGES;同
查看權限SHOW GRANTS FOR 'user'@'host';同
撤銷權限REVOKE INSERT ON db.* FROM 'user'@'host';同
刪除用戶DROP USER 'user'@'host';DELETE FROM mysql.user WHERE User='user' AND Host='host'; FLUSH PRIVILEGES;
修改密碼 (自身)SET PASSWORD = 'newpass';SET PASSWORD FOR 'user'@'host' = PASSWORD('newpass');
修改密碼 (管理員)ALTER USER 'user'@'host' IDENTIFIED BY 'newpass';UPDATE mysql.user SET authentication_string=PASSWORD('newpass') WHERE User='user' AND Host='host'; FLUSH PRIVILEGES;
重命名用戶RENAME USER 'old'@'host' TO 'new'@'host';不支持

Host 模式精講

Host 值含義典型場景
localhostUnix Socket 本地連接本機腳本、管理任務
127.0.0.1TCP/IP 回環本機應用走 TCP
::1IPv6 回環IPv6 環境
192.168.1.100精確 IP固定 IP 應用服務器
192.168.1.%網段通配符動態擴縮容應用集群
%任意主機**僅測試/開發**,生產禁用
app.example.com域名 (需 DNS 解析、skip_name_resolve=OFF)雲環境彈性 IP

最小權限模型實戰 (RBAC 思想)

-- 1. 唯讀角色 (報表、BI、只讀 API)
CREATE ROLE 'role_readonly';
GRANT SELECT ON prod_db.* TO 'role_readonly';
GRANT SELECT ON reporting_db.* TO 'role_readonly';

-- 2. 開發角色 (無 DDL 權限)
CREATE ROLE 'role_dev';
GRANT SELECT, INSERT, UPDATE, DELETE ON dev_db.* TO 'role_dev';
GRANT CREATE TEMPORARY TABLES ON dev_db.* TO 'role_dev';

-- 3. 運維角色 (含 DDL、無 DROP DATABASE)
CREATE ROLE 'role_ops';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX, DROP ON prod_db.* TO 'role_ops';
GRANT SHOW VIEW, EVENT, TRIGGER ON prod_db.* TO 'role_ops';

-- 4. 用戶綁定角色
CREATE USER 'bi_user'@'10.0.1.%' IDENTIFIED BY '...';
GRANT 'role_readonly' TO 'bi_user'@'10.0.1.%';
SET DEFAULT ROLE 'role_readonly' TO 'bi_user'@'10.0.1.%';  -- 8.0 自動激活

-- 5. 應用賬號 (極度最小化)
CREATE USER 'order_svc'@'10.0.2.%' IDENTIFIED BY '...';
GRANT INSERT, SELECT ON prod_db.orders TO 'order_svc'@'10.0.2.%';
GRANT SELECT ON prod_db.customers TO 'order_svc'@'10.0.2.%';
GRANT EXECUTE ON PROCEDURE prod_db.sp_create_order TO 'order_svc'@'10.0.2.%';

密碼安全策略 (validate_password 插件)

-- 安裝插件 (8.0 內建)
INSTALL PLUGIN validate_password SONAME 'validate_password.so';

-- 配置 (持久化寫入 my.cnf)
[mysqld]
validate_password.length = 12
validate_password.mixed_case_count = 1
validate_password.number_count = 1
validate_password.special_char_count = 1
validate_password.policy = MEDIUM  -- LOW/MEDIUM/STRONG
validate_password.dictionary_file = '/usr/share/dict/words'  -- 禁用弱密碼字典

-- 動態調整
SET GLOBAL validate_password.length = 16;

審計與巡檢清單 (月度執行)

  1. 通配符 Host 掃描:
    SELECT User, Host FROM mysql.user WHERE Host = '%';
  2. 弱密碼/空密碼檢測:
    SELECT User, Host, plugin, authentication_string
    FROM mysql.user
    WHERE authentication_string = '' OR LENGTH(authentication_string) < 20;
  3. 匿名用戶清理:
    DROP USER ''@'localhost', ''@'%';
  4. 過期未登錄用戶 (8.0+ last_login 欄位):
    SELECT User, Host FROM mysql.user WHERE last_login < DATE_SUB(NOW(), INTERVAL 90 DAY);
  5. 權限過度授予檢查:
    SELECT User, Host, Grantee, Privilege_Type, Is_Grantable
    FROM information_schema.USER_PRIVILEGES
    WHERE Privilege_Type IN ('FILE','PROCESS','SUPER','SHUTDOWN','RELOAD','CREATE USER')
      AND Grantee NOT IN ('root@localhost','admin@10.0.0.%');

常見坑位

  • GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' 含 GRANT OPTION,該用戶可授權他人,**極度危險**。
  • FLUSH PRIVILEGES 僅在直接操作 mysql.* 系統表後需要;GRANT/REVOKE/CREATE USER 自動生效。
  • 8.0 caching_sha2_password 默認插件,舊版驅動 (JDBC <8.0.13, PHP mysqlnd <7.4) 連接失敗,需 ALTER USER ... IDENTIFIED WITH mysql_native_password BY 'pass'; 或升級驅動。
  • REVOKE 不會級聯撤銷被授權者再授權的權限,需手動遞歸清理。

將用戶管理納入 **IaC (Terraform/Ansible) 代碼化**,所有賬號變更走 PR 流程,實現權限狀態「版本可控、審計可追、回滾可及」。

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