6.3.1 用户账户与权限模型基础

在 MySQL 中,用户账户由“用户名@主机”标识,主机部分决定连接来源范围(具体 IP、网段通配如 10.0.% 或任意来源 %)。权限模型基于“用户+对象+权限”三元组进行判断,权限可作用于全局、数据库、表、列与例程等层级,并支持授予管理权限(如 GRANT OPTION)以便转授。理解账户标识与权限层级是安全运维的基础。

文章图片

权限验证流程简述:客户端发起连接后,服务端首先匹配账号与来源主机;认证通过后,再按权限层级从高到低判定是否具备所需操作权限。MySQL 内置系统库 mysql 保存用户、权限与授权元数据,常见表包括 mysql.usermysql.dbmysql.tables_privmysql.columns_priv。对这些表的修改必须通过标准授权语句完成,避免直接写表造成权限不一致。

关键命令与示例(含解释)#

以下示例在 Linux 已安装 MySQL 8.0 前提下执行,命令均给出目的与预期效果。

# 1) 安装(以 Ubuntu 为例)
sudo apt-get update
sudo apt-get install -y mysql-server

# 2) 启动并查看状态
sudo systemctl enable --now mysql
sudo systemctl status mysql --no-pager

# 3) 登录 MySQL(本地 root)
mysql -uroot -p
-- 4) 查看当前用户与主机匹配规则
SELECT user, host, plugin FROM mysql.user;

-- 5) 创建用户:应用账号,只允许 10.0.1.0/24 段
CREATE USER 'appuser'@'10.0.1.%' IDENTIFIED BY 'App#2024pass';

-- 6) 授权:库级最小权限
GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'appuser'@'10.0.1.%';

-- 7) 查看授权结果(明确权限范围)
SHOW GRANTS FOR 'appuser'@'10.0.1.%';

-- 8) 动态权限示例(MySQL 8.0)
GRANT BACKUP_ADMIN ON *.* TO 'backup'@'10.0.2.%';

-- 9) 回收权限与删除用户
REVOKE UPDATE ON appdb.* FROM 'appuser'@'10.0.1.%';
DROP USER 'appuser'@'10.0.1.%';

命令解释与预期效果:
- CREATE USER 'u'@'h':建立账号与来源匹配规则,未授权则无法访问数据。
- GRANT ... ON db.*:授予库级权限,限定对象范围。
- SHOW GRANTS:核对授权是否符合最小权限原则。
- REVOKE / DROP USER:权限回收与账号清理,避免残留风险。

权限类型速览与适用场景#

  • 数据操作:SELECT/INSERT/UPDATE/DELETE,应用账号常用。
  • 结构变更:CREATE/ALTER/DROP/INDEX,仅限 DBA/运维。
  • 管理与监控:RELOAD/PROCESS/SHOW DATABASES,受限使用。
  • 安全相关:CREATE USER/GRANT OPTION,严格控制。
  • 动态权限:如 SYSTEM_USER/BACKUP_ADMIN,细粒度授权更安全。

账户分类与规范示例#

应用账号: appuser@10.0.1.%  -> 只读/读写
运维账号: dba_ops@10.0.0.%  -> 运维专用
审计账号: audit_ro@10.0.0.%-> 只读
应急账号: emergency@10.0.0.% -> 临时授权+定期回收

常见问题与排错#

-- 问题1: 访问被拒绝(Access denied)
-- 排查账号与主机匹配
SELECT user, host FROM mysql.user WHERE user='appuser';

-- 问题2: 账号存在但无权限
SHOW GRANTS FOR 'appuser'@'10.0.1.%';

-- 问题3: 修改权限后不生效
-- 使用标准授权语句,避免直接改表;必要时刷新
FLUSH PRIVILEGES;
# 查看连接来源 IP(服务端)
sudo ss -tnp | grep 3306

练习#

  1. 创建账号 report_ro@10.0.3.%,仅允许查询 reportdb.*,并验证 SHOW GRANTS 输出。
  2. 使用 REVOKE 回收 report_roSELECT 权限,验证查询报错。
  3. backup@10.0.2.% 授予 BACKUP_ADMIN 动态权限,并说明为什么比 SUPER 更安全。