文档信息
- mysql 版本: 8.0+
- 适用场景: 生产环境、开发环境、测试环境
- 安全级别: 包含安全最佳实践建议
- 更新日期: 2025-12-22
1. mysql 8.0 认证机制变化
1.1 默认认证插件变更
mysql 5.7 vs 8.0 对比
| 特性 | mysql 5.7 | mysql 8.0 |
|---|---|---|
| 默认认证插件 | mysql_native_password | caching_sha2_password |
| 密码加密强度 | sha1(较弱) | sha256(强) |
| ssl/tls 要求 | 可选 | 首次连接必需 |
| root 默认主机 | % 或 localhost | localhost |
| 密码验证策略 | 宽松 | 严格(默认启用 validate_password) |
新认证插件特点
caching_sha2_password:
-- 查看认证插件 select user, host, plugin from mysql.user where user='root';
优势:
- ✅ sha-256 哈希算法,安全性更高
- ✅ 支持密码缓存,提高性能
- ✅ 支持多种认证方式
限制:
- ⚠️ 旧版客户端(< 5.7)不支持
- ⚠️ 某些应用需要显式指定支持
1.2 密码验证策略(validate_password)
mysql 8.0 默认启用密码验证组件:
-- 查看密码策略配置 show variables like 'validate_password%';
输出示例:
+--------------------------------------+--------+ | variable_name | value | +--------------------------------------+--------+ | validate_password.check_user_name | on | | validate_password.length | 8 | | validate_password.mixed_case_count | 1 | | validate_password.number_count | 1 | | validate_password.policy | medium | | validate_password.special_char_count | 1 | +--------------------------------------+--------+
策略级别:
- low: 仅检查长度(最小 8 位)
- medium: 长度 + 数字 + 大小写 + 特殊字符
- strong: medium + 字典检查
2. 远程登录配置步骤
2.1 方案一:创建独立的远程 root 用户(推荐)
步骤 1:登录 mysql
# windows cd "c:\program files\mysql\mysql server 8.0\bin" mysql -uroot -p # linux mysql -uroot -p
步骤 2:创建远程用户
-- 方式 1:允许任意 ip 访问(开发环境) create user 'root'@'%' identified by 'yourstrongpassword123!'; -- 方式 2:仅允许特定 ip(推荐) create user 'root'@'192.168.1.100' identified by 'yourstrongpassword123!'; -- 方式 3:允许特定网段 create user 'root'@'192.168.1.%' identified by 'yourstrongpassword123!'; -- 方式 4:允许特定域名 create user 'root'@'app.example.com' identified by 'yourstrongpassword123!';
密码要求(medium 策略):
- ✅ 至少 8 个字符
- ✅ 包含大写字母
- ✅ 包含小写字母
- ✅ 包含数字
- ✅ 包含特殊字符(如 !@#$%)
步骤 3:授予完整权限
-- 授予所有权限(等同于 root) grant all privileges on *.* to 'root'@'%' with grant option; -- 刷新权限 flush privileges;
权限说明:
all privileges: 所有权限*.*: 所有数据库的所有表with grant option: 允许该用户授权给其他用户
步骤 4:验证用户创建
-- 查看用户列表 select user, host, plugin, account_locked from mysql.user; -- 查看权限 show grants for 'root'@'%';
预期输出:
+-----------------------------------------------+ | grants for root@% | +-----------------------------------------------+ | grant all privileges on *.* to `root`@`%` | | with grant option | +-----------------------------------------------+
2.2 方案二:修改现有 root 用户主机(不推荐)
⚠️ 安全警告:此方法会修改 localhost 的 root 用户,可能导致本地管理权限问题。
-- 查看当前 root 用户 select user, host from mysql.user where user='root'; -- 修改主机为 %(允许任意 ip) update mysql.user set host='%' where user='root' and host='localhost'; -- 刷新权限 flush privileges;
风险:
- ❌ 本地无法使用
root@localhost登录 - ❌ 违反最小权限原则
- ❌ 不符合安全最佳实践
2.3 配置 mysql 服务器绑定地址
修改配置文件
windows: c:\programdata\mysql\mysql server 8.0\my.ini
linux: /etc/my.cnf 或 /etc/mysql/my.cnf
[mysqld] # 允许所有 ip 连接(默认为 127.0.0.1) bind-address = 0.0.0.0 # 或绑定特定网卡 ip # bind-address = 192.168.1.100 # 端口(默认 3306) port = 3306 # 最大连接数 max_connections = 500
重启 mysql 服务
windows:
# 方法 1:服务管理器 sc stop mysql80 sc start mysql80 # 方法 2:管理工具 net stop mysql80 net start mysql80
linux:
# systemd sudo systemctl restart mysql # sysv sudo service mysql restart
验证绑定地址
# windows netstat -ano | findstr :3306 # linux netstat -tuln | grep 3306 ss -tuln | grep 3306
预期输出:
tcp 0.0.0.0:3306 0.0.0.0:0 listening
0.0.0.0表示监听所有网卡127.0.0.1表示仅本地访问
2.4 配置防火墙规则
windows 防火墙
方法 1:图形界面
控制面板 → windows defender 防火墙 → 高级设置 → 入站规则 → 新建规则 规则类型:端口 协议:tcp 端口:3306 操作:允许连接 配置文件:根据需要选择(域、专用、公用) 名称:mysql 8.0 remote access
方法 2:命令行
# 允许 3306 端口入站 netsh advfirewall firewall add rule name="mysql 8.0" dir=in action=allow protocol=tcp localport=3306 # 查看规则 netsh advfirewall firewall show rule name="mysql 8.0" # 删除规则(如需要) netsh advfirewall firewall delete rule name="mysql 8.0"
linux 防火墙
firewalld (centos/rhel 7+):
# 永久开放 3306 端口 sudo firewall-cmd --permanent --add-port=3306/tcp # 或添加 mysql 服务 sudo firewall-cmd --permanent --add-service=mysql # 重载防火墙 sudo firewall-cmd --reload # 查看规则 sudo firewall-cmd --list-all
iptables (传统方式):
# 允许 3306 端口 sudo iptables -a input -p tcp --dport 3306 -j accept # 保存规则 sudo iptables-save > /etc/iptables/rules.v4 # 查看规则 sudo iptables -l -n
ufw (ubuntu/debian):
# 允许 3306 端口 sudo ufw allow 3306/tcp # 或指定来源 ip sudo ufw allow from 192.168.1.0/24 to any port 3306 # 启用防火墙 sudo ufw enable # 查看状态 sudo ufw status
2.5 处理认证插件兼容性
问题场景
旧版客户端或应用连接 mysql 8.0 时报错:
authentication plugin 'caching_sha2_password' cannot be loaded
解决方案 1:使用兼容插件(临时方案)
-- 为远程用户设置旧版认证插件 alter user 'root'@'%' identified with mysql_native_password by 'yourpassword123!'; -- 刷新权限 flush privileges;
⚠️ 安全提示:mysql_native_password 安全性较低,仅在必要时使用。
解决方案 2:升级客户端(推荐)
确保客户端库版本支持 caching_sha2_password:
- mysql connector/j: 8.0.9+
- mysql-connector-python: 8.0.16+
- php mysqli: php 7.4+
- node.js mysql2: 2.0.0+
解决方案 3:修改默认认证插件
全局设置(my.ini/my.cnf):
[mysqld] # 设置默认认证插件为兼容模式 default_authentication_plugin=mysql_native_password
重启 mysql 后,新建用户将默认使用 mysql_native_password。
2.6 ssl/tls 配置(可选但推荐)
mysql 8.0 默认启用 ssl,但可能需要配置:
查看 ssl 状态
show variables like '%ssl%';
强制用户使用 ssl
-- 创建用户时强制 ssl create user 'root'@'%' identified by 'password123!' require ssl; -- 修改现有用户 alter user 'root'@'%' require ssl; -- 取消 ssl 要求 alter user 'root'@'%' require none;
客户端连接示例
# 使用 ssl 连接 mysql -h 192.168.1.100 -u root -p --ssl-mode=required # 不使用 ssl(如果服务器允许) mysql -h 192.168.1.100 -u root -p --ssl-mode=disabled
3. 安全加固方案
3.1 最小权限原则(推荐生产环境)
不要直接开放 root@‘%’,而是创建特定用途的账户:
-- 应用程序专用账户(只读权限) create user 'app_read'@'192.168.1.%' identified by 'appreadpass123!'; grant select on myapp_db.* to 'app_read'@'192.168.1.%'; -- 应用程序专用账户(读写权限) create user 'app_write'@'192.168.1.%' identified by 'appwritepass123!'; grant select, insert, update, delete on myapp_db.* to 'app_write'@'192.168.1.%'; -- 备份专用账户 create user 'backup'@'192.168.1.10' identified by 'backuppass123!'; grant select, lock tables, show view, event, trigger on *.* to 'backup'@'192.168.1.10'; -- 监控专用账户 create user 'monitor'@'192.168.1.20' identified by 'monitorpass123!'; grant process, replication client on *.* to 'monitor'@'192.168.1.20'; -- 刷新权限 flush privileges;
3.2 ip 白名单机制
方式 1:数据库层面
-- 只允许特定 ip 段访问 create user 'admin'@'10.0.0.0/255.255.255.0' identified by 'password123!'; -- mysql 8.0.23+ 支持 cidr 表示法 create user 'admin'@'10.0.0.0/24' identified by 'password123!';
方式 2:防火墙层面
# linux iptables - 只允许特定 ip sudo iptables -a input -p tcp -s 192.168.1.100 --dport 3306 -j accept sudo iptables -a input -p tcp --dport 3306 -j drop # firewalld - 创建富规则 sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="3306" accept'
3.3 密码策略强化
-- 查看当前密码策略 show variables like 'validate_password%'; -- 设置为 strong 级别 set global validate_password.policy=strong; -- 设置最小密码长度 set global validate_password.length=12; -- 设置密码过期策略 alter user 'root'@'%' password expire interval 90 day; -- 设置密码重用限制 set global password_history=5; -- 不能重用最近 5 个密码 set global password_reuse_interval=365; -- 365 天内不能重用
配置文件持久化(my.ini/my.cnf):
[mysqld] # 密码策略 validate_password.policy=strong validate_password.length=12 validate_password.mixed_case_count=2 validate_password.number_count=2 validate_password.special_char_count=2 # 密码过期和重用 default_password_lifetime=90 password_history=5 password_reuse_interval=365
3.4 连接限制
-- 限制最大连接数 alter user 'root'@'%' with max_connections_per_hour 100; alter user 'root'@'%' with max_queries_per_hour 10000; -- 查看用户资源限制 select user, host, max_connections, max_user_connections from mysql.user where user='root';
全局配置:
[mysqld] max_connections=500 max_user_connections=50 max_connect_errors=10
3.5 审计日志(enterprise)
mysql 企业版支持审计插件:
-- 安装审计插件 install plugin audit_log soname 'audit_log.so'; -- 配置审计规则 set global audit_log_policy='all'; set global audit_log_format='json';
社区版替代方案:
- 使用 general log(性能影响大)
- 使用 proxysql 进行审计
- 使用操作系统的审计功能(auditd)
4. 常见问题排查
4.1 连接被拒绝
错误信息
error 2003 (hy000): can't connect to mysql server on '192.168.1.100' (10061)
排查步骤
1. 检查 mysql 服务状态
# windows sc query mysql80 # linux sudo systemctl status mysql
2. 检查端口监听
# windows netstat -ano | findstr :3306 # linux ss -tuln | grep 3306
预期输出应包含 0.0.0.0:3306 而非 127.0.0.1:3306。
3. 检查防火墙
# windows netsh advfirewall firewall show rule name=all | findstr mysql # linux sudo firewall-cmd --list-all sudo iptables -l -n | grep 3306
4. 检查 bind-address
show variables like 'bind_address';
应该是 0.0.0.0 或服务器 ip,而非 127.0.0.1。
4.2 认证失败
错误信息
error 1045 (28000): access denied for user 'root'@'192.168.1.100' (using password: yes)
排查步骤
1. 验证用户存在
-- 在服务器本地登录 mysql -uroot -p -- 查询用户 select user, host, plugin from mysql.user where user='root';
2. 检查主机匹配
-- 查看允许的主机 select user, host from mysql.user where user='root';
如果只有 root@localhost,需要创建 root@'%' 或 root@'客户端ip'。
3. 验证密码
-- 重置密码 alter user 'root'@'%' identified by 'newpassword123!'; flush privileges;
4. 检查账户锁定
select user, host, account_locked from mysql.user where user='root'; -- 如果被锁定,解锁 alter user 'root'@'%' account unlock;
4.3 认证插件不支持
错误信息
authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(/usr/local/mysql/lib/plugin/caching_sha2_password.so, 2): image not found
解决方案
方案 1:修改用户认证插件
alter user 'root'@'%' identified with mysql_native_password by 'password123!'; flush privileges;
方案 2:升级客户端
- mysql workbench: 8.0+
- navicat: 12.0+
- phpmyadmin: 4.9+
- mysql connector: 对应语言的 8.0+ 版本
方案 3:在连接字符串中指定
# jdbc
jdbc:mysql://192.168.1.100:3306/db?defaultauthenticationplugin=mysql_native_password
# python
mysql.connector.connect(
host='192.168.1.100',
user='root',
password='password123!',
auth_plugin='mysql_native_password'
)
4.4 ssl 连接问题
错误信息
error 2026 (hy000): ssl connection error: error:00000001:lib(0):func(0):reason(1)
解决方案
1. 检查 ssl 配置
show variables like '%ssl%';
2. 禁用 ssl 要求(临时)
alter user 'root'@'%' require none;
3. 客户端显式指定 ssl 模式
# 禁用 ssl mysql -h 192.168.1.100 -u root -p --ssl-mode=disabled # 可选 ssl mysql -h 192.168.1.100 -u root -p --ssl-mode=preferred # 必需 ssl mysql -h 192.168.1.100 -u root -p --ssl-mode=required
4.5 密码验证策略限制
错误信息
error 1819 (hy000): your password does not satisfy the current policy requirements
解决方案
方案 1:使用符合策略的强密码
-- 检查策略要求 show variables like 'validate_password%'; -- 使用符合要求的密码 alter user 'root'@'%' identified by 'strongpass123!@#';
方案 2:临时降低策略级别(不推荐)
set global validate_password.policy=low; set global validate_password.length=6; -- 修改密码 alter user 'root'@'%' identified by 'simple1!'; -- 改回严格策略 set global validate_password.policy=medium; set global validate_password.length=8;
5. 生产环境建议
5.1 安全清单
必须实施(critical)
- ✅ 禁止使用 root@‘%’:创建专用管理账户
- ✅ 强密码策略:启用 validate_password,medium 或 strong
- ✅ ip 白名单:仅允许已知 ip 访问
- ✅ 定期更新密码:设置密码过期策略
- ✅ 防火墙规则:严格限制 3306 端口访问
推荐实施(high)
- ✅ 启用 ssl/tls:加密传输数据
- ✅ 最小权限原则:按需分配权限
- ✅ 审计日志:记录所有管理操作
- ✅ 定期备份:包括用户权限表
- ✅ 监控连接:异常登录告警
可选实施(medium)
- 📝 使用 vpn 或堡垒机访问
- 📝 启用双因素认证(需要插件)
- 📝 数据库连接池限制
- 📝 定期安全审计
5.2 账户管理策略
-- 管理员账户(dba 使用) create user 'dba_admin'@'10.0.1.%' identified by 'dbaadminpass123!'; grant all privileges on *.* to 'dba_admin'@'10.0.1.%' with grant option; -- 应用只读账户 create user 'app_reader'@'10.0.2.%' identified by 'appreadpass123!'; grant select on production_db.* to 'app_reader'@'10.0.2.%'; -- 应用读写账户 create user 'app_writer'@'10.0.2.%' identified by 'appwritepass123!'; grant select, insert, update, delete on production_db.* to 'app_writer'@'10.0.2.%'; -- 备份账户 create user 'backup_user'@'10.0.3.10' identified by 'backuppass123!'; grant select, lock tables, reload, show view on *.* to 'backup_user'@'10.0.3.10'; -- 监控账户 create user 'monitor'@'10.0.4.%' identified by 'monitorpass123!'; grant process, replication client, select on *.* to 'monitor'@'10.0.4.%'; flush privileges;
5.3 连接配置最佳实践
my.ini/my.cnf 生产配置示例
[mysqld] # 网络配置 bind-address=0.0.0.0 port=3306 max_connections=500 max_connect_errors=100 # 认证配置 default_authentication_plugin=caching_sha2_password # ssl 配置 require_secure_transport=on # 强制使用 ssl ssl_ca=/etc/mysql/ssl/ca.pem ssl_cert=/etc/mysql/ssl/server-cert.pem ssl_key=/etc/mysql/ssl/server-key.pem # 密码策略 validate_password.policy=strong validate_password.length=12 validate_password.mixed_case_count=2 validate_password.number_count=2 validate_password.special_char_count=2 default_password_lifetime=90 password_history=5 password_reuse_interval=365 # 性能配置 max_allowed_packet=256m wait_timeout=28800 interactive_timeout=28800 # 日志配置 log_error=/var/log/mysql/error.log slow_query_log=1 slow_query_log_file=/var/log/mysql/slow.log long_query_time=2 # 字符集 character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci
5.4 监控与告警
监控指标
连接监控:
-- 当前连接数 show status like 'threads_connected'; -- 最大连接数 show variables like 'max_connections'; -- 连接错误 show status like 'connection_errors%'; -- 详细连接信息 select * from information_schema.processlist where user='root';
失败登录监控:
-- 查看错误日志 select * from performance_schema.error_log where error_code in (1045, 1130) -- access denied, host blocked order by logged desc limit 50;
告警脚本示例(linux)
#!/bin/bash
# mysql_monitor.sh
# 配置
mysql_user="monitor"
mysql_pass="monitorpass123!"
alert_email="admin@example.com"
max_connections_percent=80
# 获取当前连接数
current=$(mysql -u$mysql_user -p$mysql_pass -e "show status like 'threads_connected';" | awk 'nr==2 {print $2}')
max=$(mysql -u$mysql_user -p$mysql_pass -e "show variables like 'max_connections';" | awk 'nr==2 {print $2}')
# 计算百分比
percent=$((current * 100 / max))
# 告警
if [ $percent -gt $max_connections_percent ]; then
echo "warning: mysql connections at ${percent}% (${current}/${max})" | \
mail -s "mysql connection alert" $alert_email
fi
# 检查失败登录
failed=$(mysql -u$mysql_user -p$mysql_pass -e "show status like 'aborted_connects';" | awk 'nr==2 {print $2}')
if [ $failed -gt 100 ]; then
echo "warning: $failed failed connection attempts" | \
mail -s "mysql security alert" $alert_email
fi
添加到 crontab:
# 每 5 分钟检查一次 */5 * * * * /path/to/mysql_monitor.sh
5.5 定期维护任务
每日任务
-- 1. 检查异常连接 select user, host, count(*) as connections from information_schema.processlist group by user, host having connections > 10; -- 2. 检查锁定账户 select user, host, account_locked from mysql.user where account_locked='y'; -- 3. 检查过期密码 select user, host, password_expired from mysql.user where password_expired='y';
每周任务
-- 1. 审查用户权限 select user, host, group_concat(distinct db) as databases from mysql.db group by user, host; -- 2. 检查未使用的账户(需要配合日志) select user, host, password_last_changed from mysql.user where password_last_changed < date_sub(now(), interval 90 day);
每月任务
- 密码轮换(关键账户)
- 权限审计
- 安全补丁更新
- 访问日志分析
6. 应用程序连接示例
6.1 命令行连接
# 基本连接 mysql -h 192.168.1.100 -p 3306 -u root -p # 指定数据库 mysql -h 192.168.1.100 -u root -p mydb # 使用 ssl mysql -h 192.168.1.100 -u root -p --ssl-mode=required # 使用旧版认证插件 mysql -h 192.168.1.100 -u root -p --default-auth=mysql_native_password # 执行 sql 文件 mysql -h 192.168.1.100 -u root -p < script.sql
6.2 编程语言连接
java (jdbc)
string url = "jdbc:mysql://192.168.1.100:3306/mydb" +
"?usessl=true" +
"&requiressl=true" +
"&allowpublickeyretrieval=true";
connection conn = drivermanager.getconnection(
url,
"root",
"password123!"
);
python (mysql-connector-python)
import mysql.connector
config = {
'host': '192.168.1.100',
'port': 3306,
'user': 'root',
'password': 'password123!',
'database': 'mydb',
'ssl_disabled': false,
'auth_plugin': 'caching_sha2_password'
}
conn = mysql.connector.connect(**config)
php (mysqli)
<?php
$mysqli = new mysqli(
'192.168.1.100',
'root',
'password123!',
'mydb',
3306
);
// 启用 ssl
$mysqli->ssl_set(null, null, '/path/to/ca.pem', null, null);
$mysqli->real_connect(
'192.168.1.100',
'root',
'password123!',
'mydb',
3306,
null,
mysqli_client_ssl
);
?>
node.js (mysql2)
const mysql = require('mysql2');
const connection = mysql.createconnection({
host: '192.168.1.100',
port: 3306,
user: 'root',
password: 'password123!',
database: 'mydb',
ssl: {
rejectunauthorized: true
}
});
connection.connect();
.net (mysql.data)
string connstr = "server=192.168.1.100;port=3306;" +
"user=root;password=password123!;" +
"database=mydb;sslmode=required;";
mysqlconnection conn = new mysqlconnection(connstr);
conn.open();
7. 故障恢复指南
7.1 忘记 root 密码
windows 环境
1. 停止 mysql 服务
sc stop mysql80
2. 跳过权限验证启动
# 创建 init 文件 echo alter user 'root'@'localhost' identified by 'newpassword123!'; > c:\mysql-init.txt # 使用 init 文件启动 "c:\program files\mysql\mysql server 8.0\bin\mysqld.exe" --defaults-file="c:\programdata\mysql\mysql server 8.0\my.ini" --init-file=c:\mysql-init.txt --console
3. 正常重启
# ctrl+c 停止上述进程 sc start mysql80 # 删除 init 文件 del c:\mysql-init.txt
linux 环境
1. 停止 mysql
sudo systemctl stop mysql
2. 跳过权限验证启动
# 创建 init 文件 sudo cat > /tmp/mysql-init.sql << eof alter user 'root'@'localhost' identified by 'newpassword123!'; flush privileges; eof # 使用 init 文件启动 sudo mysqld --init-file=/tmp/mysql-init.sql & # 等待几秒 sleep 5
3. 正常重启
# 停止临时进程 sudo killall mysqld # 正常启动 sudo systemctl start mysql # 删除 init 文件 sudo rm /tmp/mysql-init.sql
7.2 账户被锁定
-- 查看锁定状态 select user, host, account_locked from mysql.user where user='root'; -- 解锁账户 alter user 'root'@'%' account unlock; -- 清除连接错误计数 flush hosts;
7.3 权限丢失
-- 重新授予完整权限 grant all privileges on *.* to 'root'@'%' with grant option; flush privileges; -- 验证权限 show grants for 'root'@'%';
8. 安全审计清单
8.1 配置审计
-- 1. 检查空密码账户(危险!) select user, host from mysql.user where authentication_string=''; -- 2. 检查匿名用户(危险!) select user, host from mysql.user where user=''; -- 3. 检查过于宽松的权限 select user, host from mysql.user where host='%' and user='root'; -- 4. 检查不安全的认证插件 select user, host, plugin from mysql.user where plugin='mysql_old_password'; -- 5. 检查 ssl 配置 show variables like '%ssl%'; -- 6. 检查密码策略 show variables like 'validate_password%'; -- 7. 检查连接限制 show variables like 'max_connections'; show variables like 'max_connect_errors';
8.2 加固建议
-- 删除匿名用户 delete from mysql.user where user=''; -- 删除 test 数据库 drop database if exists test; -- 删除远程 root(如果不需要) delete from mysql.user where user='root' and host!='localhost'; -- 刷新权限 flush privileges;
9. 快速参考
9.1 常用命令速查
-- 用户管理 create user 'user'@'host' identified by 'password'; drop user 'user'@'host'; alter user 'user'@'host' identified by 'newpassword'; rename user 'old'@'host' to 'new'@'host'; -- 权限管理 grant all privileges on *.* to 'user'@'host'; grant select, insert on db.* to 'user'@'host'; revoke all privileges on *.* from 'user'@'host'; show grants for 'user'@'host'; -- 账户管理 alter user 'user'@'host' account lock; alter user 'user'@'host' account unlock; alter user 'user'@'host' password expire; alter user 'user'@'host' require ssl; -- 刷新权限 flush privileges; flush hosts;
9.2 关键配置项
[mysqld] # 网络 bind-address=0.0.0.0 port=3306 # 认证 default_authentication_plugin=caching_sha2_password # 密码 validate_password.policy=medium validate_password.length=8 # ssl require_secure_transport=on # 连接 max_connections=500 max_connect_errors=100
10. 总结
核心要点
- mysql 8.0 默认更安全:新认证插件、密码策略、localhost 限制
- 远程访问三要素:用户权限 + 服务器配置 + 防火墙规则
- 安全优先:生产环境避免使用 root@‘%’,采用最小权限原则
- 兼容性处理:旧客户端需要切换到 mysql_native_password
- 持续监控:审计日志、连接监控、异常告警
推荐配置流程
-- 1. 创建专用远程管理账户(而非 root) create user 'db_admin'@'指定ip' identified by 'strongpassword123!'; -- 2. 授予必要权限 grant all privileges on *.* to 'db_admin'@'指定ip' with grant option; -- 3. 设置安全选项 alter user 'db_admin'@'指定ip' require ssl; alter user 'db_admin'@'指定ip' password expire interval 90 day; -- 4. 刷新权限 flush privileges; -- 5. 验证 show grants for 'db_admin'@'指定ip';
服务器配置:
[mysqld] bind-address=0.0.0.0 validate_password.policy=medium require_secure_transport=on
防火墙:仅开放到特定 ip 的 3306 端口。
到此这篇关于mysql8.0 root用户远程登录配置完整步骤记录的文章就介绍到这了,更多相关mysql8.0 root用户远程登录配置内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论