在 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. 权限类型
2. 授予权限(GRANT)
语法:
GRANT 权限列表 ON 权限级别 TO '用户名'@'主机名' [WITH GRANT OPTION];参数说明:
•权限列表:单个权限(如 SELECT)或多个权限(如 SELECT, INSERT),ALL PRIVILEGES表示所有限。
•权限级别:
•全局:*.*(所有数据库的所有表)。
•数据库:mydb.*(mydb库的所有表)。
•表:mydb.users(mydb库的 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表的 username和 email列):
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).txt4. 启用账户锁定(MySQL 8.0+)
可设置失败登录次数限制,锁定恶意尝试的账户:
-- 设置用户最多允许 5 次失败登录,锁定 1 小时
ALTER USER 'biz_user'@'%'
WITH MAX_FAILED_LOGIN_ATTEMPTS 5
PASSWORD_LOCK_TIME 1;五、常见问题排查
1. 用户无法远程连接
•检查主机名:确认用户的主机名是否为 %(如 'user'@'%')。
•检查防火墙:确保 Linux 防火墙开放 3306 端口(firewalld或 ufw)。
•检查权限是否生效:执行 FLUSH PRIVILEGES;刷新权限表(修改用户或权限后需执行)。
2. 密码复杂度不满足策略
临时关闭策略(测试用):
SET GLOBAL validate_password.policy = LOW;
SET GLOBAL validate_password.length = 6;永久调整:修改 my.cnf中的 validate_password参数并重启 MySQL。
3. 权限修改后未生效
•刷新权限:执行 FLUSH PRIVILEGES;使修改立即生效(仅对内存中的权限表有效,重启后失效的参数需修改配置文件)。