MySQL8 安全指南

MySQL8 安全指南,MySQL8教程,介绍 MySQL8 安全指南和示例。

【全栈教程】:https://try8.cn/article
教程目录:
教程内容:
最近更新:2023-04-17

一、MySQL8 安全指南介绍

MySQL 数据库安全涉及的范围很广泛,大到服务器系统、网络传输,小到具体的操作习惯和 SQL 语法等,本章讲解影响 MySQL 安全的一些主要因素,以及引导大家分析这些因素是如何影响 MySQL 安全的。

  • 确保 MySQL 用户密码安全、用户权限安全,防止 SQL 注入和数据损坏等;
  • 确保 MySQL 仅授权用户读取和写入数据文件、日志文件等;
  • 确保 MySQL 网络安全,限制其在有限主机可用;
  • 确保 MySQL 数据库数据、配置和日志文件进行充分的备份。


1.1、一般安全问题

我们一般需要考虑保护整个服务器主机,而不仅仅是 MySQL 服务器免受所有类型的攻击:窃听、篡改、回放和拒绝服务等。MySQL8 安全指南涉及的一般安全问题的思想,几乎适用于所有的应用程序。

  • 除了 root 账号之外,永远不要让任何人访问系统数据库 user.mysql 表;
  • 不要在数据库中存储密码明文,应该使用 SHA2() 或其它散列替代;
  • 不应信任用户输入的任何数据,代码应该增加防御性;
  • 应该使用加密协议传输数据,例如 SSL 和 SSH 等。


1.2、账号安全管理

MySQL 允许客户端连接到服务器、并访问数据库帐户信息。MySQL 权限系统的主要功能是对连接的用户进行身份验证,并将该用户与数据库的权限相关联,例如 SELECT、INSERT、UPDATE 和 DELETE 等。


监测用户的权限:

# 账号 root@% 权限示例
show grants for 'root'@'%';


安全登录方式:

# 推荐方式:密码不要出现在命令行中
mysql -u root -p db_name
# 不推荐方式:密码直接出现在命令行中
mysql -u root -ppassword db_name


安全修改密码:

# 推荐方式:在 MySQL8 内部修改
alter user 'user_name'@'host_name' identified by 'password';
# 不推荐方式:在外部命令行修改
mysqladmin -u user_name -h host_name password 'password'


安全密码过期策略:

[mysqld]
# 默认过期时间,单位为天
default_password_lifetime=180
# 禁止重复使用最近 6 个密码
password_history=6
# 禁止使用超过 365 天的密码
password_reuse_interval=365


安全密码过期语句:

# 手动设置用户过期
alter user 'root'@'localhost' password expire;
# 每 90 天用户修改一次密码
alter user 'root'@'localhost' password expire interval 90 day;
# 禁用用户密码过期
alter user 'root'@'localhost' password expire never;
# 设置用户使用默认过期策略
alter user 'root'@'localhost' password expire default;


安全账户锁定:

alter user 'root'@'localhost' account lock;
alter user 'root'@'localhost' account unlock;


1.3、使用加密连接

当您必须以安全的方式在网络上传输数据时,未加密的连接是不可接受的。要使任何类型的数据不被窃读,请使用加密。加密算法必须包含安全元素以抵御多种已知攻击,例如更改加密消息的顺序或重放数据。


例如,要为服务器启用加密连接,可以更改配置文件,并根据需要更改文件名:

[mysqld]
ssl_ca=ca.pem
ssl_cert=server-cert.pem
ssl_key=server-key.pem


将加密连接设置为强制:

[mysqld]
require_secure_transport=ON


1.4、安全功能插件

在 MySQL8 版本之前, 默认实现本机身份验证的插件是 mysql_native_password,该插件内置于服务器,无需显示加载,也无法通过卸载来禁用。在 MySQL8 版本,caching_sha2_password 是默认的身份验证插件。


修改方式:

[mysqld]
# MySQL8 之前的老版本
default_authentication_plugin=mysql_native_password
# MySQL8 版本
default_authentication_plugin=caching_sha2_password


二、MySQL8 安全指南实战

2.1、默认端口

避免使用熟知的默认端口3306,修改为其它端口,降低被初级扫描的风险。

[mysqld]
port=33061


2.2、local-infile

禁用 local_infile 会降低攻击者通过SQL注入读取敏感文件的能力。

[mysqld]
local-infile=0


2.3、主机通配符

避免在主机名称中只使用通配符,有助于限定可以连接数据库的客户端。

# 切换系统数据库
use mysql;
# 查看通配符账号
select user,Host from user where Host='%';
# 删除或者修改为其他限定符
drop user 'user_name'@'%'; 
update user set host = 'localhost' where host = '%';
# 优化刷新权限
optimize table user;
flush privileges;


2.4、启动服务账号

您需要禁用 root 和非 sudo 权限来启动 MySQL 服务,使用最低权限账户运行 MySQL 服务可减小 MySQL 受到漏洞威胁的影响,受限的账户将无法访问与 MySQL 无关的资源。


2.5、skip-grant-tables

此选项会导致所有客户端都对所有数据库拥有全部的访问权限,一般忘记密码使用,应该删除此参数。

[mysqld]
skip-grant-tables


2.6、开启错误日志

[mysqld]
log-error=/data/error.log


2.7、关闭记录密码

当 log-raw 记录启用时,有权访问日志文件的人可能会看到纯文本密码。

log-raw=0


2.8、删除匿名账号

delete from user where user='';
flush privileges;


三、MySQL8 安全指南总结

MySQL8教程 - MySQL8 安全指南,介绍 MySQL 和 MySQL8 数据库,从 MySQL8 安全指南介绍开始,逐步到 MySQL8 安全指南实战示例等,通篇实用易懂,让 MySQL8 入门更加快速和简单。


《MySQL8教程》主打原创、全部免费,欢迎学习和转载,如需交流请加微信号:try8_cn。