跳到主要内容

5 用户管理

本节介绍 MySQL/MariaDB 中用户与权限的基本概念,包含创建用户、授予 权限、回收权限以及常见安全建议。


5.1 MySQL 用户与连接身份

在 MySQL 中,一个用户由两部分组成:

'用户名'@'主机匹配规则'

示例:

  • 'root'@'localhost':只允许从本机通过本地套接字或 127.0.0.1 登录;
  • 'appuser'@'10.0.0.%':允许从 10.0.0.0/24 网段任意主机登录;
  • 'readonly'@'%':允许从任意来源地址登录(生产环境需谨慎)。

小提示:mysql.user 表中存放了所有账户和权限信息,日常操作通过 CREATE USERGRANT 等语句完成即可,无需直接修改系统表。


5.2 创建与删除用户

5.2.1 创建用户

-- 创建只能从本机登录的管理员
CREATE USER 'admin'@'localhost'
IDENTIFIED BY 'StrongPassw0rd!';

-- 创建应用账户,仅允许 10.0.0.* 网段访问
CREATE USER 'appuser'@'10.0.0.%'
IDENTIFIED BY 'AppPass123!';

5.2.2 修改密码

ALTER USER 'admin'@'localhost'
IDENTIFIED BY 'NewStrongPass!';

或使用 SET PASSWORD(不同版本语法略有区别)。

5.2.3 删除用户

DROP USER IF EXISTS 'appuser'@'10.0.0.%';

5.3 权限模型与 GRANT 语法

5.3.1 权限层级

MySQL 权限大致分为以下几个层级:

  1. 全局权限:对整个实例生效,例如 SUPERRELOADREPLICATION SLAVE
  2. 数据库级权限:针对某个库,例如 SELECTINSERTUPDATE 等;
  3. 表级权限:针对某张表,例如 SELECTINSERTDELETE 等;
  4. 列级权限:更细粒度地控制到单列;
  5. 例程级权限:针对存储过程、函数等。

5.3.2 授予权限 (GRANT)

-- 授予单库读写权限
GRANT SELECT, INSERT, UPDATE, DELETE
ON app_db.*
TO 'appuser'@'10.0.0.%';

-- 授予只读权限
GRANT SELECT
ON reporting_db.*
TO 'readonly'@'%';

-- 授予对某张表的特殊权限
GRANT INSERT, UPDATE
ON app_db.orders
TO 'appuser'@'10.0.0.%';

变更权限后,可使用 FLUSH PRIVILEGES; 强制刷新权限缓存 (MySQL 8 以后一般会自动生效,通常无需手动执行)。

5.3.3 回收权限 (REVOKE)

REVOKE INSERT, UPDATE
ON app_db.orders
FROM 'appuser'@'10.0.0.%';

5.4 角色 (ROLE) 的使用(支持该特性的版本)

角色是权限的集合,可以一次性授予多个用户,便于管理。

-- 创建角色
CREATE ROLE 'app_readonly';

-- 赋予角色一些权限
GRANT SELECT ON app_db.* TO 'app_readonly';

-- 将角色授予具体用户
GRANT 'app_readonly' TO 'report_user'@'10.0.0.%';

-- 启用默认角色
SET DEFAULT ROLE 'app_readonly' TO 'report_user'@'10.0.0.%';

5.5 常见安全建议

  1. 避免直接使用 root 连接业务系统,为每个应用创建专用账号;
  2. 权限遵循“最小授权原则”,只授予真正需要的权限;
  3. 对外网开放的账号务必限制来源 IP(不要使用 '%');
  4. 密码需符合复杂度要求并定期轮换;
  5. 重要环境启用审计日志,记录敏感操作;
  6. 定期检查 mysql.userinformation_schema.user_privileges, 清理长期未使用的账号与多余权限。

通过合理设计账户与权限,可以在保证安全性的同时,为应用提供足够灵活 的数据访问能力。