6.3.1 用户账户与权限模型基础
在 MySQL 中,用户账户由“用户名@主机”标识,主机部分决定连接来源范围(具体 IP、网段通配如 10.0.% 或任意来源 %)。权限模型基于“用户+对象+权限”三元组进行判断,权限可作用于全局、数据库、表、列与例程等层级,并支持授予管理权限(如 GRANT OPTION)以便转授。理解账户标识与权限层级是安全运维的基础。
权限验证流程简述:客户端发起连接后,服务端首先匹配账号与来源主机;认证通过后,再按权限层级从高到低判定是否具备所需操作权限。MySQL 内置系统库 mysql 保存用户、权限与授权元数据,常见表包括 mysql.user、mysql.db、mysql.tables_priv、mysql.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
练习#
- 创建账号
report_ro@10.0.3.%,仅允许查询reportdb.*,并验证SHOW GRANTS输出。 - 使用
REVOKE回收report_ro的SELECT权限,验证查询报错。 - 为
backup@10.0.2.%授予BACKUP_ADMIN动态权限,并说明为什么比SUPER更安全。