MySQL 数据库安全涉及的范围很广泛,大到服务器系统、网络传输,小到具体的操作习惯和 SQL 语法等,本章讲解影响 MySQL 安全的一些主要因素,以及引导大家分析这些因素是如何影响 MySQL 安全的。
我们一般需要考虑保护整个服务器主机,而不仅仅是 MySQL 服务器免受所有类型的攻击:窃听、篡改、回放和拒绝服务等。MySQL8 安全指南涉及的一般安全问题的思想,几乎适用于所有的应用程序。
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;
当您必须以安全的方式在网络上传输数据时,未加密的连接是不可接受的。要使任何类型的数据不被窃读,请使用加密。加密算法必须包含安全元素以抵御多种已知攻击,例如更改加密消息的顺序或重放数据。
例如,要为服务器启用加密连接,可以更改配置文件,并根据需要更改文件名:
[mysqld] ssl_ca=ca.pem ssl_cert=server-cert.pem ssl_key=server-key.pem
将加密连接设置为强制:
[mysqld] require_secure_transport=ON
在 MySQL8 版本之前, 默认实现本机身份验证的插件是 mysql_native_password,该插件内置于服务器,无需显示加载,也无法通过卸载来禁用。在 MySQL8 版本,caching_sha2_password 是默认的身份验证插件。
修改方式:
[mysqld] # MySQL8 之前的老版本 default_authentication_plugin=mysql_native_password # MySQL8 版本 default_authentication_plugin=caching_sha2_password
避免使用熟知的默认端口3306,修改为其它端口,降低被初级扫描的风险。
[mysqld] port=33061
禁用 local_infile 会降低攻击者通过SQL注入读取敏感文件的能力。
[mysqld] local-infile=0
避免在主机名称中只使用通配符,有助于限定可以连接数据库的客户端。
# 切换系统数据库 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;
您需要禁用 root 和非 sudo 权限来启动 MySQL 服务,使用最低权限账户运行 MySQL 服务可减小 MySQL 受到漏洞威胁的影响,受限的账户将无法访问与 MySQL 无关的资源。
此选项会导致所有客户端都对所有数据库拥有全部的访问权限,一般忘记密码使用,应该删除此参数。
[mysqld] skip-grant-tables
[mysqld] log-error=/data/error.log
当 log-raw 记录启用时,有权访问日志文件的人可能会看到纯文本密码。
log-raw=0
delete from user where user=''; flush privileges;
MySQL8教程 - MySQL8 安全指南,介绍 MySQL 和 MySQL8 数据库,从 MySQL8 安全指南介绍开始,逐步到 MySQL8 安全指南实战示例等,通篇实用易懂,让 MySQL8 入门更加快速和简单。
《MySQL8教程》主打原创、全部免费,欢迎学习和转载,如需交流请加微信号:try8_cn。