6.2.6 初始安全设置(root密码、权限、测试库)
初始安全设置的目标是立刻消除默认风险并建立最小权限基线。安装完成后应尽快设置 root 强密码并禁用空密码登录,确保所有账户必须使用安全认证方式;如果启用本地 socket 认证,也需确认仅允许受控系统账户访问。
原理草图(权限基线与访问范围):
一、快速安全初始化(推荐 mysql_secure_installation)#
适用场景:官方安装后首次初始化。
# 以 root 身份在服务器执行
mysql_secure_installation
交互建议(示例):
- 设置 root 密码:Y,输入强密码
- 移除匿名用户:Y
- 禁止 root 远程登录:生产一般 Y(如需远程管理,可后续单独授权)
- 删除 test 数据库:Y
- 重新加载权限表:Y
命令解释:
mysql_secure_installation 会调用内置脚本完成删除匿名用户、删除 test 库、限制 root 登录范围、刷新权限表等操作。
二、手工安全初始化(适合自定义或审计)#
登录 MySQL 后执行以下完整步骤:
-- 1) 设置 root 密码(MySQL 8+)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Str0ng#Passw0rd';
-- 2) 删除匿名用户
DELETE FROM mysql.user WHERE User='';
-- 3) 限制 root 登录范围(仅允许本机)
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost');
-- 4) 删除 test 数据库及其权限
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
-- 5) 立即生效
FLUSH PRIVILEGES;
-- 6) 创建业务用户与最小权限示例
CREATE DATABASE appdb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER 'appuser'@'10.10.%' IDENTIFIED BY 'App#Pass123';
GRANT SELECT,INSERT,UPDATE,DELETE ON appdb.* TO 'appuser'@'10.10.%';
命令解释:
- ALTER USER:设置或重置账号密码
- DELETE FROM mysql.user:清理系统用户表中的匿名或不需要的账号
- DROP DATABASE:移除测试库
- GRANT:最小权限授权,避免使用 root 进行业务操作
三、密码复杂度与过期策略(可选增强)#
启用 validate_password 插件,提高密码强度:
-- 安装插件
INSTALL PLUGIN validate_password SONAME 'validate_password.so';
-- 查看当前规则
SHOW VARIABLES LIKE 'validate_password%';
-- 设置复杂度(示例)
SET GLOBAL validate_password.policy = MEDIUM;
SET GLOBAL validate_password.length = 12;
四、验证与预期效果#
-- 验证匿名用户不存在
SELECT User,Host FROM mysql.user WHERE User='';
-- 验证 test 库不存在
SHOW DATABASES LIKE 'test';
-- 验证 root 登录范围
SELECT User,Host FROM mysql.user WHERE User='root';
预期结果:
- 无匿名用户
- 不存在 test 库
- root 仅允许指定 Host
五、常见问题与排错#
问题 1:设置密码后无法登录
# 使用本地 socket 方式登录(MySQL 8+ 常见)
sudo mysql
排错说明: 若 root 使用 auth_socket 认证,请用 sudo mysql 进入后再修改认证方式。
-- 将 root 切换为密码认证
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Str0ng#Passw0rd';
FLUSH PRIVILEGES;
问题 2:权限未生效
FLUSH PRIVILEGES;
排错说明: 手工修改 mysql.* 表后必须刷新权限。
问题 3:远程无法连接
检查 root 是否被限制为 localhost;建议创建专用远程管理用户:
CREATE USER 'dba'@'192.168.1.%' IDENTIFIED BY 'Dba#Pass123';
GRANT ALL PRIVILEGES ON *.* TO 'dba'@'192.168.1.%' WITH GRANT OPTION;
六、练习#
- 删除匿名用户并验证
mysql.user表中无空用户。 - 为
appdb创建只读用户ro_user,仅允许SELECT权限。 - 将 root 账号限制为仅允许
localhost登录,并验证无法从远程登录。