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;

六、练习#

  1. 删除匿名用户并验证 mysql.user 表中无空用户。
  2. appdb 创建只读用户 ro_user,仅允许 SELECT 权限。
  3. 将 root 账号限制为仅允许 localhost 登录,并验证无法从远程登录。