1. 首页 > MySQL教程 > 正文

MySQL教程FG196-MySQL访问控制与账号管理

Part01-基础概念与理论知识

MySQL的访问控制和账号管理是数据库安全的核心组成部分,通过精确控制用户的权限,可以有效防止未授权访问和数据泄露。更多学习教程www.fgedu.net.cn

1.1 MySQL访问控制体系

MySQL采用两级权限检查机制:连接验证和请求验证。连接验证确保用户可以连接到MySQL服务器,请求验证确保用户对特定资源有执行特定操作的权限。

1.2 用户账号结构

MySQL用户账号由用户名和主机名两部分组成,格式为username@hostname,这种结构允许同一用户名从不同主机登录时拥有不同的权限。

# 查看当前所有用户
mysql> SELECT user, host FROM mysql.user;
+—————+———–+
| user | host |
+—————+———–+
| root | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
+—————+———–+
3 rows in set (0.00 sec)

1.3 权限类型

MySQL权限分为系统权限和对象权限两大类:

  • 系统权限:如CREATE USER、SUPER、RELOAD等,用于管理服务器操作
  • 对象权限:如SELECT、INSERT、UPDATE、DELETE等,用于管理数据库对象

1.4 认证插件

MySQL支持多种认证插件,如mysql_native_password、caching_sha2_password、sha256_password等,用于验证用户身份。

# 查看当前用户的认证插件
mysql> SELECT user, host, plugin FROM mysql.user WHERE user = ‘root’;
+——+———–+———————–+
| user | host | plugin |
+——+———–+———————–+
| root | localhost | caching_sha2_password |
+——+———–+———————–+
1 row in set (0.00 sec)

Part02-生产环境规划与建议

在生产环境中,合理规划和设计MySQL的访问控制和账号管理策略至关重要。学习交流加群风哥微信: itpux-com

2.1 账号命名规范

制定清晰的账号命名规范有助于提高管理效率和安全性:

  • 应用账号:app_name@host_pattern(如:webshop@’%’)
  • DBA账号:dba_username@admin_host(如:dba_feng@’192.168.1.100’)
  • 只读账号:readonly_app@host_pattern(如:readonly_reports@’%’)

2.2 权限分离原则

遵循最小权限原则,为不同角色分配刚好满足工作需求的权限:

  • 应用账号:只授予特定数据库的SELECT、INSERT、UPDATE、DELETE权限
  • 报表账号:只授予特定表的SELECT权限
  • DBA账号:授予所有数据库的所有权限

2.3 认证插件选择

在生产环境中,推荐使用更安全的认证插件:

生产环境建议:MySQL 8.0默认使用caching_sha2_password,这是目前最安全的认证插件,推荐在生产环境中使用。对于需要兼容旧客户端的场景,可以使用mysql_native_password,但应尽量避免。

2.4 账号生命周期管理

建立完整的账号生命周期管理流程:

  • 账号创建:严格的审批流程
  • 权限授予:最小权限原则
  • 定期审核:每季度审核一次权限
  • 账号禁用/删除:员工离职或系统停用后及时处理

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

本部分介绍在生产环境中实施MySQL访问控制和账号管理的具体步骤和最佳实践。

3.1 创建用户账号

创建用户账号时,应指定主机名和认证插件,并设置强密码。

# 创建应用账号
mysql> CREATE USER ‘webshop’@’%’ IDENTIFIED WITH caching_sha2_password BY ‘WebShop@2026’;
Query OK, 0 rows affected (0.01 sec)

# 创建只读账号
mysql> CREATE USER ‘readonly_reports’@’%’ IDENTIFIED WITH caching_sha2_password BY ‘Reports@2026’;
Query OK, 0 rows affected (0.01 sec)

# 创建DBA账号
mysql> CREATE USER ‘dba_feng’@’192.168.1.100’ IDENTIFIED WITH caching_sha2_password BY ‘DBA@Feng2026’;
Query OK, 0 rows affected (0.01 sec)

3.2 授予和回收权限

根据最小权限原则,为用户授予必要的权限。

# 为应用账号授予特定数据库的权限
mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON webshop.* TO ‘webshop’@’%’;
Query OK, 0 rows affected (0.01 sec)

# 为只读账号授予特定表的SELECT权限
mysql> GRANT SELECT ON webshop.orders TO ‘readonly_reports’@’%’;
mysql> GRANT SELECT ON webshop.customers TO ‘readonly_reports’@’%’;
Query OK, 0 rows affected (0.01 sec)

# 为DBA账号授予所有权限
mysql> GRANT ALL PRIVILEGES ON *.* TO ‘dba_feng’@’192.168.1.100’ WITH GRANT OPTION;
Query OK, 0 rows affected (0.01 sec)

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

# 回收用户权限
mysql> REVOKE DELETE ON webshop.* FROM ‘webshop’@’%’;
Query OK, 0 rows affected (0.01 sec)

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

3.3 密码策略配置

配置强密码策略,提高账号安全性。

# 查看当前密码策略
mysql> SHOW VARIABLES LIKE ‘validate_password%’;
+————————————–+——–+
| Variable_name | Value |
+————————————–+——–+
| validate_password.check_user_name | ON |
| validate_password.dictionary_file | |
| validate_password.length | 8 |
| validate_password.mixed_case_count | 1 |
| validate_password.number_count | 1 |
| validate_password.policy | MEDIUM |
| validate_password.special_char_count | 1 |
+————————————–+——–+
7 rows in set (0.01 sec)

# 设置密码策略
mysql> SET GLOBAL validate_password.length = 12;
mysql> SET GLOBAL validate_password.policy = ‘STRONG’;
Query OK, 0 rows affected (0.00 sec)

3.4 资源限制配置

为用户配置资源限制,防止滥用资源。

# 设置用户资源限制
mysql> CREATE USER ‘limited_user’@’%’ IDENTIFIED BY ‘Limit@2026’
WITH MAX_QUERIES_PER_HOUR 100
MAX_UPDATES_PER_HOUR 50
MAX_CONNECTIONS_PER_HOUR 20
MAX_USER_CONNECTIONS 5;
Query OK, 0 rows affected (0.01 sec)

# 修改已有用户的资源限制
mysql> ALTER USER ‘webshop’@’%’ WITH MAX_USER_CONNECTIONS 100;
Query OK, 0 rows affected (0.01 sec)

# 查看用户资源限制
mysql> SHOW CREATE USER ‘limited_user’@’%’;
+——————————————————————————————————————————————————————–+
| CREATE USER for limited_user@% |
+——————————————————————————————————————————————————————–+
| CREATE USER `limited_user`@`%` IDENTIFIED BY PASSWORD ‘*A1B2C3D4E5F6G7H8I9J0’ WITH MAX_QUERIES_PER_HOUR 100 MAX_UPDATES_PER_HOUR 50 MAX_CONNECTIONS_PER_HOUR 20 MAX_USER_CONNECTIONS 5 |
+——————————————————————————————————————————————————————–+
1 row in set (0.00 sec)

3.5 账号锁定与解锁

锁定可疑账号或临时禁用账号。

# 锁定账号
mysql> ALTER USER ‘suspicious_user’@’%’ ACCOUNT LOCK;
Query OK, 0 rows affected (0.01 sec)

# 解锁账号
mysql> ALTER USER ‘suspicious_user’@’%’ ACCOUNT UNLOCK;
Query OK, 0 rows affected (0.01 sec)

# 查看账号锁定状态
mysql> SELECT user, host, account_locked FROM mysql.user WHERE user = ‘suspicious_user’;
+——————+——+—————-+
| user | host | account_locked |
+——————+——+—————-+
| suspicious_user | % | N |
+——————+——+—————-+
1 row in set (0.00 sec)

Part04-生产案例与实战讲解

本部分通过实际案例展示如何在生产环境中管理MySQL账号和权限。

4.1 案例1:为电商网站创建应用账号

为电商网站创建一个应用账号,仅授予必要的权限。

# 1. 创建webshop数据库
mysql> CREATE DATABASE webshop CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Query OK, 1 row affected (0.01 sec)

# 2. 创建应用账号
mysql> CREATE USER ‘webshop_app’@’%’ IDENTIFIED WITH caching_sha2_password BY ‘WebShop@App2026’;
Query OK, 0 rows affected (0.01 sec)

# 3. 授予权限
mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON webshop.* TO ‘webshop_app’@’%’;
mysql> GRANT EXECUTE ON PROCEDURE webshop.get_product_details TO ‘webshop_app’@’%’;
Query OK, 0 rows affected (0.01 sec)

# 4. 验证权限
mysql> SHOW GRANTS FOR ‘webshop_app’@’%’;
+——————————————————————————————————————+
| Grants for webshop_app@% |
+——————————————————————————————————————+
| GRANT USAGE ON *.* TO `webshop_app`@`%` |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `webshop`.* TO `webshop_app`@`%` |
| GRANT EXECUTE ON PROCEDURE `webshop`.`get_product_details` TO `webshop_app`@`%` |
+——————————————————————————————————————+
3 rows in set (0.00 sec)

4.2 案例2:创建报表只读账号

为数据分析团队创建一个只读账号,仅能访问报表所需的表。

# 1. 创建报表账号
mysql> CREATE USER ‘report_user’@’192.168.2.%’ IDENTIFIED WITH caching_sha2_password BY ‘Report@User2026’;
Query OK, 0 rows affected (0.01 sec)

# 2. 授予只读权限
mysql> GRANT SELECT ON webshop.orders TO ‘report_user’@’192.168.2.%’;
mysql> GRANT SELECT ON webshop.customers TO ‘report_user’@’192.168.2.%’;
mysql> GRANT SELECT ON webshop.products TO ‘report_user’@’192.168.2.%’;
Query OK, 0 rows affected (0.01 sec)

# 3. 测试只读账号
$ mysql -ureport_user -p’Report@User2026′ -h192.168.1.10 -Dwebshop

mysql> SELECT COUNT(*) FROM orders;
+———-+
| COUNT(*) |
+———-+
| 15234 |
+———-+
1 row in set (0.02 sec)

mysql> INSERT INTO orders (customer_id, product_id, quantity) VALUES (1, 100, 2);
ERROR 1142 (42000): INSERT command denied to user ‘report_user’@’192.168.2.50’ for table ‘orders’

4.3 案例3:实施账号定期轮换

定期更换数据库账号密码,提高安全性。

# 1. 生成随机强密码(使用MySQL函数)
mysql> SELECT SUBSTRING(MD5(RAND()), 1, 12) AS random_password;
+——————+
| random_password |
+——————+
| 8a2b3c4d5e6f |
+——————+
1 row in set (0.00 sec)

# 2. 修改用户密码
mysql> ALTER USER ‘webshop_app’@’%’ IDENTIFIED WITH caching_sha2_password BY ‘8a2b3c4d5e6f’;
Query OK, 0 rows affected (0.01 sec)

# 3. 记录密码更换日志
mysql> INSERT INTO dba_audit.password_changes (username, changed_by, change_time) VALUES (‘webshop_app@%’, ‘dba_feng’, NOW());
Query OK, 1 row affected (0.00 sec)

Part05-风哥经验总结与分享

作为资深DBA,风哥在MySQL访问控制和账号管理方面积累了丰富的经验。

风哥提示:在生产环境中,永远不要使用root账号直接连接应用程序,必须为每个应用创建独立的账号,并严格限制权限范围。

5.1 常见问题与解决方案

  • 问题1:用户无法连接到MySQL服务器
    解决方案:检查用户的host字段是否正确,确保客户端IP在允许范围内;检查密码是否正确;检查防火墙设置。
  • 问题2:用户权限不足
    解决方案:使用SHOW GRANTS查看用户当前权限;根据最小权限原则授予必要的权限;执行FLUSH PRIVILEGES刷新权限。
  • 问题3:密码策略限制过严
    解决方案:根据实际需求调整validate_password相关参数;对于内部系统,可以适当降低密码复杂度要求。

5.2 最佳实践总结

  • 遵循最小权限原则,只授予必要的权限
  • 使用强密码策略,定期更换密码
  • 限制用户的连接来源(使用具体的IP地址或IP段)
  • 为不同应用创建独立账号,便于权限管理和审计
  • 定期审核用户权限,及时回收不再需要的权限
  • 使用角色管理权限(MySQL 8.0及以上版本)
  • 启用账号锁定功能,防止暴力破解
  • 记录所有权限变更操作,便于审计和追溯

5.3 安全加固建议

安全加固建议:

  • 禁用root账号远程登录,仅允许本地访问
  • 删除默认的匿名账号和测试数据库
  • 使用SSL加密连接,保护数据传输安全
  • 启用审计日志,记录所有重要操作
  • 定期备份mysql系统数据库,防止权限数据丢失
风哥提示:MySQL的访问控制和账号管理是一个持续的过程,需要定期审查和更新策略,以适应不断变化的安全需求。更多学习教程公众号风哥教程itpux_com
GF-MySQL数据库培训文档系列

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

联系我们

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

微信号:itpux-com

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