系统极客一直在努力
专注操作系统及软件使用技能

MySQL 安全加固:数据库全面保护指南

MySQL

数据库安全对于企业信息系统和个人站长来说都是重中之重。本文将详细介绍如何全方位保护 MySQL 数据库安全,帮助你有效防范数据泄露、未授权访问等安全威胁。接下来,我们将通过具体实例,一步步讲解这些关键的安全措施。

本文内容适用于 MySQL 以及 MariaDB 和 Percona 等兼容服务器。

01. 设置强密码策略

密码安全是抵御暴力破解的第一道防线。在 MySQL 中,你可以使用validate_password插件来确保密码强度。

1首先,安装密码验证插件:

INSTALL PLUGIN validate_password SONAME 'validate_password.so';

2然后,设置密码规则:

SET GLOBAL validate_password_length = 12;          # 密码最短 12 位
SET GLOBAL validate_password_mixed_case_count = 1; # 要求大小写混用
SET GLOBAL validate_password_number_count = 1;     # 必须包含数字
SET GLOBAL validate_password_special_char_count = 1; # 必须包含特殊字符

3通过以下命令检查配置是否生效:

SHOW VARIABLES LIKE 'validate_password%';
设置并查看 MySQL 密码策略
设置并查看 MySQL 密码策略

02. 合理控制 root 账号

root 账号拥有 MySQL 数据库的最高权限,往往也是黑客攻击的主要目标。我们可以通过限制 root 账号的访问权限,来增强数据库的安全性。

1限制 root 账号的本地登录:通过将 root 账号的远程访问权限修改为仅限本地连接,减少被远程攻击的风险。

UPDATE mysql.user SET host = '127.0.0.1' WHERE user = 'root' AND host = '%';

2禁用 root 账号的远程访问:修改 MySQL 配置文件(my.cnfmy.ini),加入以下设置,禁用远程访问并绑定本地地址。

[mysqld]
skip-networking
bind-address = 127.0.0.1

3重启 MySQL 服务:修改配置文件后,别忘了重启 MySQL 服务使配置生效。

sudo systemctl restart mysql

03. 清理匿名账户

安装 MySQL 后,可能会默认创建一些匿名账户。这些账号无需用户名即可登录,存在很大的安全隐患,因此我们需要及时清理它们。

1先查看是否存在匿名用户:首先,通过以下命令查看是否存在匿名用户。

SELECT user, host FROM mysql.user WHERE user = '';

2删除匿名账号:如果发现有匿名账号存在,立即删除它们,并刷新权限表使更改生效。

DELETE FROM mysql.user WHERE user = '';
FLUSH PRIVILEGES;
清理 MySQL 匿名账户
清理 MySQL 匿名账户

04. 关闭符号链接

MySQL 的符号链接功能虽然方便,但也可能被黑客利用,来访问数据库目录以外的文件。为了安全起见,建议关闭这个功能。

1在配置文件中禁用符号链接:

[mysqld]
symbolic-links = 0

2重启 MySQL 服务:

sudo systemctl restart mysql

3检查符号链接状态:

SHOW VARIABLES LIKE 'have_symlink';
查看 MySQL 符号链接状态
查看 MySQL 符号链接状态

05. 绑定访问地址

通过bind_address配置,我们可以控制哪些 IP 地址能够连接到 MySQL 数据库。为了增强安全性,建议只允许受信任的 IP 地址访问。

1查看当前绑定地址:

SHOW VARIABLES LIKE 'bind_address';
查看 MySQL 绑定的访问地址
查看 MySQL 绑定的访问地址

2修改配置文件:

[mysqld]
bind_address = 127.0.0.1  # 仅允许本地访问

如果你需要允许其他受信任的 IP 地址访问,可以将bind_address设置为该 IP 地址。

3重启 MySQL 服务:

sudo systemctl restart mysql

06. 启用严格 SQL 模式

严格模式是 MySQL 提供的一项重要安全特性,它能够强制数据库执行更严格的数据验证。这就像为数据库添加了一道质量检验关卡,防止不合格的数据悄悄混入系统,从源头上保障数据完整性。

1设置全局严格模式(临时):可以通过以下命令临时设置全局严格模式。此更改在 MySQL 重启后会失效,适用于即时生效但不想永久修改的情况。

SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES';

2永久启用严格模式:要让设置永久生效,需要将以下配置添加到配置文件:

[mysqld]
sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"

3重启 MySQL 服务:

sudo systemctl restart mysql

4检查 SQL 模式:

SHOW VARIABLES LIKE 'sql_mode';
检查 sql_mode
检查 sql_mode

07. 关闭文件导入功能

MySQL 的LOAD DATA LOCAL INFILE命令虽然为数据导入提供了便利,但同时也存在潜在的安全漏洞。攻击者可能利用此功能读取服务器上的敏感文件,如/etc/passwd等。为了防止这种风险,建议关闭该功能。

1在配置文件中禁用该功能:

[mysqld]
local_infile = 0

2重启 MySQL 服务:

sudo systemctl restart mysql

3检查是否启用了文件导入功能

SHOW VARIABLES LIKE 'local_infile';
查看 MySQL 文件导入功能状态
查看 MySQL 文件导入功能状态

08. 精细化权限管理

权限管理就像是给数据库的每个用户发放「门禁卡」,不同的用户只能访问自己被授权的数据库和操作。这样即使某个账号被攻破,黑客能造成的危害也会被限制在最小范围内。

1查看指定用户的权限:

SHOW GRANTS FOR 'username'@'host';

'username'@'host'替换为实际的用户名和主机地址。例如,查看用户'john'@'localhost'的权限:

SHOW GRANTS FOR 'john'@'localhost';

2先收回所有权限,再按需授予:

REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'username'@'host';

例如,收回用户'john'@'localhost'的所有权限:

REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'john'@'localhost';

3按需授予权限:

合理分配权限的原则是「够用就好」,遵循最小权限原则。只赋予用户执行其工作所需的最小权限。以下是一些常用的权限授予命令:

  • 赋予用户对某个数据库的全部权限:
GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'host';
  • 仅赋予查询权限(SELECT):
GRANT SELECT ON database_name.* TO 'username'@'host';
  • 赋予数据操作权限(SELECTINSERTUPDATEDELETE):
GRANT SELECT, INSERT, UPDATE, DELETE ON database_name.* TO 'username'@'host';

4刷新权限表:

FLUSH PRIVILEGES;

09. 启用 SSL/TLS 传输加密

传输加密就像是给数据穿上了「防护服」,即使数据在传输过程中被中间人攻击截获,攻击者也无法轻易查看到内容。MySQL 支持使用 SSL/TLS 协议来加密客户端和服务器之间的数据传输,确保在传输过程中的机密性和完整性。

1使用 OpenSSL 或类似工具创建证书:

# 生成CA私钥
openssl genrsa -out ca-key.pem 2048

# 生成CA证书
openssl req -new -x509 -days 3600 -key ca-key.pem -out ca-cert.pem

# 生成服务器私钥
openssl genrsa -out server-key.pem 2048

# 生成服务器证书请求
openssl req -new -key server-key.pem -out server-req.pem

# 签署服务器证书
openssl rsa -in server-key.pem -out server-key.pem
openssl x509 -req -in server-req.pem -days 3600 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem

将这些文件存放在安全的位置,例如/etc/mysql/certs/

2配置 MySQL 使用 SSL 证书:

[mysqld]
ssl-ca = /path/to/ca-cert.pem
ssl-cert = /path/to/server-cert.pem
ssl-key = /path/to/server-key.pem

3重启 MySQL 服务:

sudo systemctl restart mysql

4检查加密是否已启用:

SHOW VARIABLES LIKE '%ssl%';
检查 MySQL 是否已启用 SSL 加密
检查 MySQL 是否已启用 SSL 加密

主要关注以下几个变量:

  • have_openssl:显示 MySQL 是否支持 SSL。
  • ssl_cassl_certssl_key:显示是否配置了相应的 SSL 证书文件。
  • Version_ssl_library:显示使用的 SSL 库的版本。

10. 及时更新 MySQL 版本

及时更新 MySQL 版本是预防安全问题和提升系统稳定性的关键措施。新版本通常会修复已知的安全漏洞和软件错误,就像给系统打补丁一样。

1查看当前 MySQL 版本:通过以下 SQL 查询语句查看当前 MySQL 的版本

SELECT VERSION();
查看 MySQL 版本
查看 MySQL 版本

2备份数据库,以防万一:在进行任何重大更新(如 MySQL 版本升级)之前,请务必先备份你的数据库,以防止数据丢失或其他意外问题。

mysqldump -u root -p --all-databases > backup.sql

3更新 MySQL 版本:使用系统的包管理器来更新 MySQL。以 Ubuntu 上的 APT 包管理器为例,更新命令如下:

sudo apt update && sudo apt upgrade mysql-server

MySQL 数据库安全不是一蹴而就的工作,而是需要持续投入的过程。通过以上这些措施的组合实施,我们能够构建起一道相对完善的安全防线。建议定期检查这些配置的有效性,及时发现和处理潜在的安全隐患。

赞(0) 赞赏

评论 抢沙发

微信赞赏