1. 首页 > MySQL教程 > 正文

MySQL教程FG197-MySQL权限体系

Part01-基础概念与理论知识

MySQL权限体系是数据库安全的核心,它决定了用户可以执行哪些操作以及访问哪些资源。MySQL使用基于权限表的权限管理系统,通过精确控制权限,可以有效防止未授权访问和数据泄露。更多学习教程www.fgedu.net.cn

1.1 权限表结构

MySQL的权限信息存储在mysql数据库的多个系统表中:

  • user表:存储全局权限,适用于所有数据库
  • db表:存储数据库级别的权限
  • table_priv表:存储表级别的权限
  • column_priv表:存储列级别的权限
  • procs_priv表:存储存储过程和函数的权限
  • proxies_priv表:存储代理用户的权限
# 查看mysql数据库中的权限表
mysql> SHOW TABLES FROM mysql WHERE table_name LIKE ‘%priv%’;
+————————–+
| Tables_in_mysql |
+————————–+
| column_priv |
| procs_priv |
| proxies_priv |
| table_priv |
| user |
+————————–+
5 rows in set (0.00 sec)

1.2 权限检查流程

MySQL在处理用户请求时,会按照以下顺序检查权限:

  1. 检查user表中的全局权限
  2. 检查db表中的数据库级别权限
  3. 检查table_priv表中的表级别权限
  4. 检查column_priv表中的列级别权限
  5. 如果是存储过程或函数,检查procs_priv表

1.3 权限生效机制

权限修改后需要通过以下方式之一使其生效:

  • 执行FLUSH PRIVILEGES命令
  • 重启MySQL服务
  • 断开并重新建立用户连接(某些权限)

Part02-生产环境规划与建议

MySQL权限体系采用层级结构,从全局级别到列级别,粒度逐渐细化。学习交流加群风哥微信: itpux-com

2.1 全局权限

全局权限适用于所有数据库,存储在mysql.user表中。全局权限通常用于数据库管理操作。

# 查看全局权限列表
mysql> SHOW PRIVILEGES LIKE ‘%GLOBAL%’;
+—————-+—————————————+—————-+——————————————-+
| Privilege | Context | Comment | Level |
+—————-+—————————————+—————-+——————————————-+
| BINLOG ADMIN | Server Admin | Administer binlog | GLOBAL |
| BINLOG REPLAY | Server Admin | Replay binlog events | GLOBAL |
| CLONE ADMIN | Server Admin | Administer cloning | GLOBAL |
| CREATE USER | Server Admin | Create new users | GLOBAL |
| FILE | File access on server | Read and write files | GLOBAL |
| PROCESS | Server Admin | View server process information | GLOBAL |
| RELOAD | Server Admin | Reload server configurations | GLOBAL |
| REPLICATION CLIENT | Server Admin | Ask where source or replica | GLOBAL |
| REPLICATION SLAVE | Server Admin | Read binary log events from source | GLOBAL |
| SHOW DATABASES | Server Admin | Show all databases | GLOBAL |
| SHUTDOWN | Server Admin | Shutdown server | GLOBAL |
| SUPER | Server Admin | Super user privileges | GLOBAL |
| SYSTEM_USER | Server Admin | Create system users | GLOBAL |
+—————-+—————————————+—————-+——————————————-+
13 rows in set (0.00 sec)

2.2 数据库级别权限

数据库级别权限适用于特定数据库中的所有对象,存储在mysql.db表中。

# 查看数据库级别权限
mysql> SHOW GRANTS FOR ‘webshop’@’%’;
+———————————————————+
| Grants for webshop@% |
+———————————————————+
| GRANT USAGE ON *.* TO `webshop`@`%` |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `webshop`.* TO `webshop`@`%` |
+———————————————————+
2 rows in set (0.00 sec)

2.3 表级别权限

表级别权限适用于特定数据库中的特定表,存储在mysql.table_priv表中。

2.4 列级别权限

列级别权限适用于特定表中的特定列,存储在mysql.column_priv表中,是最细粒度的权限控制。

2.5 存储过程和函数权限

存储过程和函数权限适用于特定的存储过程和函数,存储在mysql.procs_priv表中。

Part03-生产环境项目实施方案

MySQL提供了多种类型的权限,可分为以下几大类:

3.1 数据访问权限

用于控制对数据库数据的访问和操作:

  • SELECT:查询数据
  • INSERT:插入数据
  • UPDATE:更新数据
  • DELETE:删除数据

3.2 结构管理权限

用于控制数据库和表结构的修改:

  • CREATE:创建数据库或表
  • ALTER:修改表结构
  • DROP:删除数据库或表
  • INDEX:创建或删除索引

3.3 管理权限

用于控制数据库服务器的管理操作:

  • CREATE USER:创建用户
  • GRANT OPTION:授予权限给其他用户
  • RELOAD:重新加载权限表
  • SHUTDOWN:关闭服务器
  • SUPER:执行超级用户操作

3.4 复制权限

用于控制MySQL复制功能:

  • REPLICATION SLAVE:作为复制从库的权限
  • REPLICATION CLIENT:查询复制状态的权限

3.5 其他权限

  • FILE:读写服务器文件
  • PROCESS:查看进程信息
  • SHOW DATABASES:查看所有数据库
  • LOCK TABLES:锁定表

Part04-生产案例与实战讲解

本部分介绍在生产环境中管理MySQL权限的具体操作和最佳实践。

4.1 授予权限

使用GRANT语句授予用户权限,可以指定不同的权限级别。

# 授予全局权限
mysql> GRANT CREATE USER, RELOAD ON *.* TO ‘dba_assistant’@’localhost’;
Query OK, 0 rows affected (0.01 sec)

# 授予数据库级别权限
mysql> GRANT ALL PRIVILEGES ON webshop.* TO ‘web_admin’@’%’;
Query OK, 0 rows affected (0.01 sec)

# 授予表级别权限
mysql> GRANT SELECT, UPDATE ON webshop.customers TO ‘customer_service’@’192.168.1.%’;
Query OK, 0 rows affected (0.01 sec)

# 授予列级别权限
mysql> GRANT SELECT (customer_id, name, email), UPDATE (email) ON webshop.customers TO ‘support’@’%’;
Query OK, 0 rows affected (0.01 sec)

# 授予存储过程权限
mysql> GRANT EXECUTE ON PROCEDURE webshop.get_order_details TO ‘report_user’@’%’;
Query OK, 0 rows affected (0.01 sec)

# 授予带GRANT OPTION的权限
mysql> GRANT SELECT ON webshop.* TO ‘manager’@’%’ WITH GRANT OPTION;
Query OK, 0 rows affected (0.01 sec)

4.2 查看权限

使用SHOW GRANTS语句查看用户的权限。

# 查看当前用户的权限
mysql> SHOW GRANTS;
+————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————-+
| Grants for root@localhost |
+————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————-+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `root`@`localhost` WITH GRANT OPTION |
| GRANT APPLICATION_PASSWORD_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,CLONE_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,GROUP_REPLICATION_ADMIN,INNODB_REDO_LOG_ARCHIVE,INNODB_REDO_LOG_ENABLE,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_APPLIER,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SERVICE_CONNECTION_ADMIN,SESSION_VARIABLES_ADMIN,SET_USER_ID,SHOW_ROUTINE,SYSTEM_USER,SYSTEM_VARIABLES_ADMIN,TABLE_ENCRYPTION_ADMIN,XA_RECOVER_ADMIN ON *.* TO `root`@`localhost` WITH GRANT OPTION |
+————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————-+
2 rows in set (0.00 sec)

# 查看特定用户的权限
mysql> SHOW GRANTS FOR ‘support’@’%’;
+——————————————————————————————————–+
| Grants for support@% |
+——————————————————————————————————–+
| GRANT USAGE ON *.* TO `support`@`%` |
| GRANT SELECT (customer_id, name, email), UPDATE (email) ON `webshop`.`customers` TO `support`@`%` |
+——————————————————————————————————–+
2 rows in set (0.00 sec)

4.3 回收权限

使用REVOKE语句回收用户的权限。

# 回收全局权限
mysql> REVOKE RELOAD ON *.* FROM ‘dba_assistant’@’localhost’;
Query OK, 0 rows affected (0.01 sec)

# 回收数据库级别权限
mysql> REVOKE DROP ON webshop.* FROM ‘web_admin’@’%’;
Query OK, 0 rows affected (0.01 sec)

# 回收表级别权限
mysql> REVOKE UPDATE ON webshop.customers FROM ‘customer_service’@’192.168.1.%’;
Query OK, 0 rows affected (0.01 sec)

# 回收列级别权限
mysql> REVOKE UPDATE (email) ON webshop.customers FROM ‘support’@’%’;
Query OK, 0 rows affected (0.01 sec)

# 刷新权限
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

4.4 权限验证

验证用户权限是否正确生效。

# 测试用户权限
$ mysql -usupport -p’Support@2026′ -h192.168.1.10 -Dwebshop

mysql> SELECT customer_id, name, email FROM customers WHERE customer_id = 1;
+————-+———+——————-+
| customer_id | name | email |
+————-+———+——————-+
| 1 | 张三 | zhang@example.com |
+————-+———+——————-+
1 row in set (0.00 sec)

mysql> SELECT password FROM customers WHERE customer_id = 1;
ERROR 1143 (42000): SELECT command denied to user ‘support’@’192.168.1.50’ for column ‘password’ in table ‘customers’

mysql> UPDATE customers SET email = ‘new@example.com’ WHERE customer_id = 1;
ERROR 1143 (42000): UPDATE command denied to user ‘support’@’192.168.1.50′ for column ’email’ in table ‘customers’

4.5 权限审计

定期审计用户权限,确保符合最小权限原则。

# 审计所有用户的权限
mysql> SELECT CONCAT(‘SHOW GRANTS FOR ”’, user, ”’@”’, host, ”’;’) AS grant_command FROM mysql.user;
+————————————————–+
| grant_command |
+————————————————–+
| SHOW GRANTS FOR ‘root’@’localhost’; |
| SHOW GRANTS FOR ‘mysql.session’@’localhost’; |
| SHOW GRANTS FOR ‘mysql.sys’@’localhost’; |
| SHOW GRANTS FOR ‘webshop’@’%’; |
| SHOW GRANTS FOR ‘readonly_reports’@’%’; |
| SHOW GRANTS FOR ‘dba_feng’@’192.168.1.100’; |
+————————————————–+
6 rows in set (0.00 sec)

# 检查具有SUPER权限的用户
mysql> SELECT user, host FROM mysql.user WHERE Super_priv = ‘Y’;
+——+———–+
| user | host |
+——+———–+
| root | localhost |
+——+———–+
1 row in set (0.00 sec)

Part05-风哥经验总结与分享

作为资深DBA,风哥在MySQL权限管理方面积累了丰富的经验。

风哥提示:MySQL权限管理的核心原则是最小权限原则,即只为用户授予完成其工作所需的最小权限集,避免过度授权。

5.1 权限管理最佳实践

  • 遵循最小权限原则:只为用户授予必要的权限
  • 使用角色管理权限:MySQL 8.0引入了角色功能,可以将权限分配给角色,再将角色分配给用户,简化权限管理
  • 定期审查权限:每季度或半年审查一次用户权限,及时回收不再需要的权限
  • 限制权限范围:尽量使用细粒度的权限(如表级别、列级别)而不是全局权限
  • 使用命名规范:为用户和角色使用清晰的命名规范,便于管理和审计

5.2 常见权限问题与解决方案

  • 问题1:权限修改后不生效
    解决方案:执行FLUSH PRIVILEGES命令刷新权限,或让用户重新连接数据库
  • 问题2:用户无法访问特定表
    解决方案:检查用户是否有该表所在数据库的权限,以及该表的具体权限
  • 问题3:无法创建用户
    解决方案:检查当前用户是否有CREATE USER权限或SUPER权限
  • 问题4:无法授予权限给其他用户
    解决方案:检查当前用户是否有GRANT OPTION权限

5.3 生产环境权限配置建议

生产环境建议:

  • 禁用root账号远程登录,只允许本地访问
  • 为每个应用创建独立的数据库账号,不要共享账号
  • 数据库管理员账号应限制在特定IP地址访问
  • 定期更换数据库账号密码
  • 启用审计日志,记录所有权限变更操作
  • 使用SSL加密连接,保护权限信息传输安全

5.4 权限管理工具推荐

  • MySQL Shell:MySQL官方提供的交互式命令行工具,支持权限管理
  • MySQL Workbench:图形化管理工具,提供直观的权限管理界面
  • phpMyAdmin:Web-based管理工具,适合简单的权限管理
  • Ansible:自动化配置工具,可以批量管理MySQL权限
风哥提示:MySQL权限体系是数据库安全的第一道防线,正确配置和管理权限可以有效防止未授权访问和数据泄露。建议建立完善的权限管理制度,包括权限申请、审批、授予、审计和回收等流程。更多学习教程公众号风哥教程itpux_com
GF-MySQL数据库培训文档系列

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息