root权限本身不能“降级”,但你可以让它几乎不被日常使用——这才是真正可控的安全状态。关键不是削弱
root,而是隔离它、限制它、替代它。
只允许 root
从本地登录,禁用所有远程访问
生产环境出现
'root'@'%'或
'root'@'192.168.x.x'是高危信号,暴力破解和自动化扫描第一目标就是它。 检查当前 root 登录点:
SELECT User, Host FROM mysql.user WHERE User = 'root';删除远程实例(如果存在):
DROP USER 'root'@'%';<br>DROP USER 'root'@'192.168.1.100';确保只剩
'root'@'localhost'和/或
'root'@'127.0.0.1';前者走 Unix socket,后者走 TCP loopback,更安全 顺手删掉匿名用户:
DROP USER IF EXISTS ''@'localhost';
用专用管理账户替代 root
日常操作
给 DBA 或运维配一个权限“够用但不过界”的账号,比反复提醒“别用 root”管用得多。
创建最小必要权限的管理员:CREATE USER 'dba'@'localhost' IDENTIFIED BY 'SecurePass!2026';<br>GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, SHOW DATABASES ON *.* TO 'dba'@'localhost' WITH GRANT OPTION;明确不授予这些高危权限:
SUPER、
FILE、
SHUTDOWN、
CREATE USER—— 它们在绝大多数运维场景中非必需 如果应用需连接数据库,绝不用
root,而应建专用账号并限定库表范围,例如:
GRANT SELECT, INSERT ON app_db.orders TO 'app_user'@'10.10.5.%';
强制密码强度 + 自动过期,堵住弱口令漏洞
很多入侵不是靠技术,是靠扫出
root的
123456或空密码。 启用密码验证插件(MySQL 5.7+):
INSTALL PLUGIN validate_password SONAME 'validate_password.so';<br>SET GLOBAL validate_password.policy = MEDIUM;设密码最小长度、字符类型要求(写进
/etc/my.cnf永久生效):
validate_password_length = 14<br>validate_password_mixed_case_count = 1<br>validate_password_number_count = 1<br>validate_password_special_char_count = 1让密码定期失效,避免长期不换:
ALTER USER 'root'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
监听地址和系统层加固,别让 root
暴露在网络里
即使你删了
'root'@'%',若 MySQL 还在监听
0.0.0.0:3306,攻击者仍可能通过其他用户或漏洞间接提权。 修改配置文件,把
bind-address改为
127.0.0.1(仅本地)或内网 IP:
[mysqld]<br>bind-address = 127.0.0.1确认 MySQL 进程以普通用户运行(非
root):
ps aux | grep mysqld—— 应显示
mysql用户,而非
root防火墙只放行可信来源的 3306 端口(如跳板机 IP),不要对全网开放
最常被忽略的一点:权限变更后必须执行
FLUSH PRIVILEGES;,否则新规则不生效;而很多人改完就以为完成了。还有,
root账户名本身可以重命名(比如改成
'sysadm'@'localhost'),虽然不能彻底防住有经验的攻击者,但能有效过滤掉大量自动化脚本的暴力尝试。
