在 Linux 系统中,MySQL 的用户管理是保障数据库安全的核心环节,涉及用户创建、权限分配、密码管理及安全策略配置。以下从​​用户创建与删除​​、​​权限管理​​、​​密码策略​​、​​安全加固​​等维度详细说明,并提供具体操作示例。

​​一、MySQL 用户的核心概念​​

MySQL 的用户由两部分组成:用户名+ 主机名(格式:'用户名'@'主机名')。

​用户名​​:标识用户的唯一名称(如 biz_user)。

主机名​​:限制用户可从哪些 IP 或主机连接 MySQL(如 localhost仅本地连接,%允许所有远程主机,192.168.1.%允许特定网段)。

​​二、用户管理核心操作​​

​​1. 连接到 MySQL 服务器​​

需先以管理员(如 root)身份登录 MySQL 客户端:

mysql -u root -p  # 输入 root 密码登录

​​2. 创建用户​​

使用 CREATE USER语句创建用户,需指定用户名和允许连接的主机名。

​语法​​:

CREATE USER [IF NOT EXISTS] '用户名'@'主机名' IDENTIFIED BY '密码';

​示例​​:

•​​创建本地用户(仅允许本机连接)​​:

CREATE USER 'local_user'@'localhost' IDENTIFIED BY 'LocalPass123!';

•​​创建远程用户(允许所有 IP 连接)​​:

CREATE USER 'remote_user'@'%' IDENTIFIED BY 'RemotePass456!';

创建特定网段用户(仅允许 192.168.1.x 连接)​​:

CREATE USER 'lan_user'@'192.168.1.%' IDENTIFIED BY 'LanPass789!';

•​​创建无密码用户(不推荐,仅测试用)​​:

CREATE USER 'test_user'@'localhost' IDENTIFIED BY '';  -- 密码为空

​注意​​:

•MySQL 8.0+ 默认使用 caching_sha2_password身份验证插件,若需兼容旧客户端(如 MySQL 5.7),可指定 IDENTIFIED WITH mysql_native_password BY '密码'

IF NOT EXISTS可避免用户已存在时的报错(可选)。

​​3. 修改用户信息​​

​​(1) 修改用户名​​
RENAME USER '旧用户名'@'主机名' TO '新用户名'@'主机名';

​示例​​:将 old_user@%改为 new_user@%

RENAME USER 'old_user'@'%' TO 'new_user'@'%';
​​(2) 修改用户密码​​

MySQL 8.0+ 推荐使用 ALTER USER语句修改密码(旧版 SET PASSWORD已逐渐弃用)。

​语法​​:

ALTER USER '用户名'@'主机名' IDENTIFIED BY '新密码';

​示例​​:

-- 修改 remote_user 的密码
ALTER USER 'remote_user'@'%' IDENTIFIED BY 'NewRemotePass2025!';

​密码策略相关参数​​(需在 my.cnf中配置,影响所有用户):

[mysqld]
validate_password.policy = MEDIUM       # 密码强度策略(LOW/MEDIUM/STRONG)
validate_password.length = 8            # 最小长度
validate_password.mixed_case_count = 1  # 至少1个大写字母
validate_password.number_count = 1      # 至少1个数字
validate_password.special_char_count = 1 # 至少1个特殊字符

•查看当前密码策略:

SHOW VARIABLES LIKE 'validate_password%';

​​4. 删除用户​​

使用 DROP USER语句删除用户(需确保用户无未提交事务):

DROP USER [IF EXISTS] '用户名'@'主机名';

​示例​​:删除 test_user@localhost

DROP USER IF EXISTS 'test_user'@'localhost';

​​三、权限管理​​

MySQL 的权限控制通过 GRANT(授予权限)和 REVOKE(回收权限)语句实现,支持​​全局级​​、​​数据库级​​、​​表级​​、​​列级​​等细粒度权限。

​​1. 权限类型​​

​​权限级别​​

​​示例​​

​​说明​​

​全局权限​

CREATE USER, SHUTDOWN

控制整个 MySQL 服务器的操作(如创建用户、

关闭服务),仅 root初始拥有。

​数据库权限​

CREATE, DROP, ALTER

控制对某个数据库(如 mydb)的所有表的操作。

​表权限​

SELECT, INSERT, UPDATE

控制对某张表(如 mydb.users)的特定操作。

​列权限​

SELECT(username), UPDATE(age)

控制对表中某一列的操作(如仅允许查询 username列)。

​存储过程/函数权限​

EXECUTE

控制调用存储过程或函数的权限。

​​2. 授予权限(GRANT)​​

​语法​​:

GRANT 权限列表 ON 权限级别 TO '用户名'@'主机名' [WITH GRANT OPTION];

​参数说明​​:

权限列表:单个权限(如 SELECT)或多个权限(如 SELECT, INSERT),ALL PRIVILEGES表示所有限。

权限级别

•全局:*.*(所有数据库的所有表)。

•数据库:mydb.*mydb库的所有表)。

•表:mydb.usersmydb库的 users表)。

•列:(username, age)(表的指定列)。

WITH GRANT OPTION:允许用户将自己的权限授予其他用户(谨慎使用,避免权限扩散)。

​示例​​:

授予全局权限(仅 root 使用)​​:

GRANT CREATE USER, DROP USER ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;

授予数据库级权限(允许操作 mydb库)​​:

GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'biz_user'@'%';

授予表级权限(允许查询 users表的 usernameemail列)​​:

GRANT SELECT(username, email) ON mydb.users TO 'report_user'@'192.168.1.%';

•​​授予存储过程执行权限​​:

GRANT EXECUTE ON PROCEDURE mydb.calculate_bonus TO 'dev_user'@'localhost';

​​3. 回收权限(REVOKE)​​

​语法​​:

REVOKE 权限列表 ON 权限级别 FROM '用户名'@'主机名';

​示例​​:

回收全局的 CREATE USER权限​​:

REVOKE CREATE USER ON *.* FROM 'admin'@'localhost';

回收 mydb库的 DELETE权限​​:

REVOKE DELETE ON mydb.* FROM 'biz_user'@'%';

•​​回收表的 email列查询权限​​:

REVOKE SELECT(email) ON mydb.users FROM 'report_user'@'192.168.1.%';

​​4. 查看用户权限​​

使用 SHOW GRANTS语句查看指定用户的权限:

SHOW GRANTS FOR '用户名'@'主机名';

​示例​​:

-- 查看 remote_user@% 的权限
SHOW GRANTS FOR 'remote_user'@'%';

​输出示例​​:

+-----------------------------------------------------------------------+
| Grants for remote_user@%                                             |
+-----------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `remote_user`@`%`                              |
| GRANT SELECT, INSERT ON `mydb`.* TO `remote_user`@`%`                |
+-----------------------------------------------------------------------+

​​四、安全加固实践​​

​​1. 禁用匿名用户​​

MySQL 安装后可能存在匿名用户(如 '@localhost'),需删除以避免未授权访问:

-- 查看匿名用户
SELECT user, host FROM mysql.user WHERE user = '';

-- 删除匿名用户(示例)
DROP USER ''@'localhost';
DROP USER ''@'127.0.0.1';

​​2. 禁止 root 远程登录​​

默认 root用户可能允许远程登录('root'@'%'),需限制其仅本地访问:

-- 删除 root 的远程权限(若存在)
DROP USER 'root'@'%';

-- 确保 root 仅本地登录(若不存在则创建)
CREATE USER IF NOT EXISTS 'root'@'localhost' IDENTIFIED BY 'StrongRootPass!';

​​3. 定期审计用户权限​​

通过脚本定期检查用户和权限,避免冗余用户或过度授权:

# 导出所有用户和权限到文件
mysql -u root -p -e "SELECT user, host FROM mysql.user;" > mysql_users_$(date +%F).txt
mysql -u root -p -e "SHOW GRANTS FOR 'biz_user'@'%';" >> mysql_privs_$(date +%F).txt

​​4. 启用账户锁定(MySQL 8.0+)​​

可设置失败登录次数限制,锁定恶意尝试的账户:

-- 设置用户最多允许 5 次失败登录,锁定 1 小时
ALTER USER 'biz_user'@'%' 
WITH MAX_FAILED_LOGIN_ATTEMPTS 5 
PASSWORD_LOCK_TIME 1;

​​五、常见问题排查​​

​​1. 用户无法远程连接​​

检查主机名​​:确认用户的主机名是否为 %(如 'user'@'%')。

检查防火墙​​:确保 Linux 防火墙开放 3306 端口(firewalldufw)。

•​​检查权限是否生效​​:执行 FLUSH PRIVILEGES;刷新权限表(修改用户或权限后需执行)。

​​2. 密码复杂度不满足策略​​

临时关闭策略(测试用)​​:

SET GLOBAL validate_password.policy = LOW;
SET GLOBAL validate_password.length = 6;

永久调整​​:修改 my.cnf中的 validate_password参数并重启 MySQL。

​​3. 权限修改后未生效​​

刷新权限​​:执行 FLUSH PRIVILEGES;使修改立即生效(仅对内存中的权限表有效,重启后失效的参数需修改配置文件)。