数据库安全对于企业信息系统和个人站长来说都是重中之重。本文将详细介绍如何全方位保护 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%';
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.cnf
或my.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;
04. 关闭符号链接
MySQL 的符号链接功能虽然方便,但也可能被黑客利用,来访问数据库目录以外的文件。为了安全起见,建议关闭这个功能。
1在配置文件中禁用符号链接:
[mysqld]
symbolic-links = 0
2重启 MySQL 服务:
sudo systemctl restart mysql
3检查符号链接状态:
SHOW VARIABLES LIKE 'have_symlink';
05. 绑定访问地址
通过bind_address
配置,我们可以控制哪些 IP 地址能够连接到 MySQL 数据库。为了增强安全性,建议只允许受信任的 IP 地址访问。
1查看当前绑定地址:
SHOW VARIABLES LIKE 'bind_address';
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';
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';
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';
- 赋予数据操作权限(
SELECT
、INSERT
、UPDATE
和DELETE
):
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%';
主要关注以下几个变量:
have_openssl
:显示 MySQL 是否支持 SSL。ssl_ca
,ssl_cert
,ssl_key
:显示是否配置了相应的 SSL 证书文件。Version_ssl_library
:显示使用的 SSL 库的版本。
10. 及时更新 MySQL 版本
及时更新 MySQL 版本是预防安全问题和提升系统稳定性的关键措施。新版本通常会修复已知的安全漏洞和软件错误,就像给系统打补丁一样。
1查看当前 MySQL 版本:通过以下 SQL 查询语句查看当前 MySQL 的版本
SELECT VERSION();
2备份数据库,以防万一:在进行任何重大更新(如 MySQL 版本升级)之前,请务必先备份你的数据库,以防止数据丢失或其他意外问题。
mysqldump -u root -p --all-databases > backup.sql
3更新 MySQL 版本:使用系统的包管理器来更新 MySQL。以 Ubuntu 上的 APT 包管理器为例,更新命令如下:
sudo apt update && sudo apt upgrade mysql-server
MySQL 数据库安全不是一蹴而就的工作,而是需要持续投入的过程。通过以上这些措施的组合实施,我们能够构建起一道相对完善的安全防线。建议定期检查这些配置的有效性,及时发现和处理潜在的安全隐患。
最新评论
目前没有这个功能,只能每次启动应用程序后,手动将其拖动到目标虚拟桌面。
另外,多桌面好像经常有bug,最底下的任务栏会锁死,比如图标失效,时间静止,怎么破?
搭车,win11能否设定某个app在固定桌面启动?我是按照功能分桌面的,比如:浏览,聊天,工作1,工作2,游戏。。。
1.需要无线网卡支持 AP 模式;2.无线网卡通常不能同时作为客户端和热点工作(可以使用有线网络作为热点的互联网来源);3.可以使用 nmcli 或其他工具创建虚拟无线网卡接口,这样就可以同时连接 Wi-Fi 和创建热点。4.使用双无线网卡,一个联网,一个当热点。