MySQL 数据库核心漏洞防护-账户安全以及日志权限加固

MySQL 数据库核心漏洞防护-账户安全以及日志权限加固
28.7的博客MySQL数据库安全加固方案
数据库作为核心数据存储载体,常面临SQL注入、口令破解、权限提升等安全威胁。本文针对6大核心风险,提供可落地的MySQL数据库加固措施,覆盖账户安全、配置防护、权限管控、日志审计等维度。
一、数据库面临的核心安全漏洞
在MySQL数据库运维中,需优先关注以下6类高风险漏洞:
- SQL注入(通过恶意SQL语句操控数据库)
- 口令破解(暴力破解或弱口令导致账户沦陷)
- 数据库漏洞利用(利用MySQL版本漏洞或未修复缺陷入侵)
- 权限提升(低权限账户通过配置缺陷获取高权限)
- 信息窃取(未授权读取数据文件、日志或敏感数据)
- 拒绝服务(恶意请求耗尽数据库资源,导致服务不可用)
二、重点防护方向
针对上述漏洞,本文聚焦以下6个核心防护场景,提供分步加固方案:
- 防口令破解(账户安全加固)
- 防止SQL注入(应用与数据库协同防护)
- 防止数据库漏洞利用(版本更新与配置限制)
- 防权限提升(权限最小化与访问控制)
- 防信息窃取(文件权限与敏感操作禁用)
- 防拒绝服务(资源限制与连接管控)
三、具体加固措施
3.1 防口令破解:账户安全加固
账户是数据库的第一道防线,需通过“强密码+账户清理+访问限制”降低破解风险。
3.1.1 重命名root账户并设置强密码
默认root账户是攻击者的主要目标,通过重命名账户+强密码,将“单密码爆破”升级为“账号+密码双爆破”,大幅提升攻击成本。
操作步骤:
1 | -- 1. 重命名root账户(示例:改为28.7Blog,仅允许本地访问) |
3.1.2 删除测试账户与空密码账户
MySQL初始化时可能默认创建test测试账户,或存在空密码账户,这些是典型的入侵入口,必须清理。
操作步骤:
查询风险账户
1
2-- ① 查询所有账户(检查是否存在test等测试账户)
SELECT user, host FROM mysql.user;图:查询MySQL所有用户列表
1
2
3
4-- ② 查询空密码账户(authentication_string为空或NULL)
SELECT user, authentication_string
FROM mysql.user
WHERE LENGTH(authentication_string) = 0 OR authentication_string IS NULL;图:查询MySQL空密码账户
删除风险账户
1
2
3
4
5
6
7
8-- 删除test测试账户(根据实际host调整,如@'localhost'或@'%')
DROP USER 'test'@'localhost';
-- 删除空密码账户(替换username为实际空密码账户名)
DROP USER 'username'@'localhost';
-- 刷新权限
FLUSH PRIVILEGES;
3.2 日志审计:启用错误日志
MySQL错误日志记录启动/关闭信息、严重错误、警告,是事后追溯攻击行为的关键依据,必须强制启用。
操作步骤:
编辑MySQL配置文件(不同系统路径可能不同,示例为Ubuntu):
1
vim /etc/mysql/mysql.conf.d/mysqld.cnf
图:打开MySQL配置文件
配置错误日志路径(确保路径存在且MySQL有写入权限):
1
2[mysqld]
log_error = /var/log/mysql/error.log # 错误日志路径重启MySQL服务,使配置生效:
1
systemctl restart mysql
3.3 配置防护:禁用符号链接
启用符号链接(symbolic-links)可能导致攻击者通过链接篡改数据库文件,甚至突破目录限制,需禁用。
操作步骤:
编辑MySQL配置文件:
1
vim /etc/mysql/mysql.conf.d/mysqld.cnf
在
[mysqld]段添加/修改配置:1
symbolic-links=0 # 禁用符号链接
图:配置禁用符号链接
重启MySQL服务:
1
systemctl restart mysql
图:重启MySQL服务验证配置
3.4 隐藏性防护:修改默认监听端口
MySQL默认监听3306端口,是扫描器的重点目标。修改为高位端口(如33060)可降低被主动扫描的概率。
操作步骤:
编辑MySQL配置文件:
1
vim /etc/mysql/mysql.conf.d/mysqld.cnf
修改
port参数(示例改为33060,确保端口未被占用):1
2[mysqld]
port = 33060 # 自定义监听端口图:修改MySQL监听端口
重启MySQL服务,并验证端口监听:
1
2systemctl restart mysql
netstat -tulnp | grep mysql # 确认端口已改为33060图:验证MySQL新端口监听
3.5 访问控制:禁止任意远程登录(仅允许可信IP)
默认root账户可能允许远程登录(host=%),攻击者可通过远程爆破入侵。需限制仅可信IP能远程访问,且保留root本地权限。
操作步骤:
创建专用远程管理账户(避免使用root远程登录):
1
2
3
4
5
6
7
8
9-- 示例:允许192.168.20.1(可信IP)远程登录,账户为remote_user
CREATE USER 'remote_user'@'192.168.20.1'
IDENTIFIED WITH mysql_native_password BY 'Eef9ch@oh-'; # 强密码
-- 授予必要权限(遵循最小权限原则,示例授予SELECT/UPDATE)
GRANT SELECT, UPDATE ON *.* TO 'remote_user'@'192.168.20.1';
-- 刷新权限
FLUSH PRIVILEGES;图:创建可信IP的远程账户
禁用root远程登录(若存在
root@%账户):1
2
3-- 删除root远程账户(若存在)
DROP USER 'root'@'%';
FLUSH PRIVILEGES;
3.6 信息泄露防护:禁用MySQL历史命令
MySQL会将执行过的命令记录到~/.mysql_history文件,若攻击者获取该文件,可泄露敏感操作(如密码、表结构),需禁用记录。
操作步骤:
- 删除现有历史命令文件,并创建空链接(指向
/dev/null,写入即丢弃):图:禁用MySQL历史命令1
2
3cd ~ # 进入当前用户家目录(若为root操作,路径为/root)
rm -rf .mysql_history # 删除原有历史文件
ln -s /dev/null .mysql_history # 建立空链接,禁止记录命令
3.7 权限管控:禁止MySQL用户的Shell权限
MySQL系统用户(默认名为mysql)仅用于运行数据库服务,无需Shell登录权限。若启用Shell,可能被攻击者利用登录系统,需设置为/sbin/nologin。
操作步骤:
1 | # 修改mysql用户的Shell为nologin(禁止登录) |
图:禁止MySQL用户Shell权限
3.8 防文件读取:禁用load_file函数
load_file函数可读取服务器本地文件(如/etc/passwd、敏感配置),是SQL注入中“文件读取”攻击的核心手段,需通过配置禁用。
操作步骤:
编辑MySQL配置文件:
1
vim /etc/mysql/mysql.conf.d/mysqld.cnf
在
[mysqld]段添加配置:1
local-infile=0 # 禁用load_file及本地文件读取功能
重启MySQL服务:
1
systemctl restart mysql
3.9 文件权限加固:数据文件/日志文件权限管控
MySQL数据文件、日志文件包含敏感信息(如数据内容、账户密码),需限制仅mysql用户可读写,防止其他用户窃取。
3.9.1 强化数据文件权限
MySQL数据默认存储在/var/lib/mysql/,需设置权限为700(仅所有者可读写执行)。
1 | # 递归设置数据目录权限(所有者为mysql:mysql,权限700) |
图:验证MySQL数据文件权限
3.9.2 强化二进制日志权限
二进制日志记录数据库所有修改操作,若泄露可能被用于数据恢复或攻击分析,需限制权限。
1 | # 设置二进制日志所有者为mysql:mysql(日志路径需与配置一致) |
图:强化二进制日志权限
3.9.3 强化错误日志权限
错误日志可能包含账户登录失败、服务异常等信息,需设置权限为600(仅所有者可读写)。
1 | # 设置错误日志权限为600,所有者为mysql:mysql |
图:强化MySQL错误日志权限
四、加固后验证与维护
- 权限验证:通过
SELECT user, host, authentication_string FROM mysql.user;确认账户无空密码、无测试账户。 - 配置验证:通过
show variables like '%symbolic_links%';、show variables like '%local_infile%';确认禁用项生效。 - 日志验证:查看
/var/log/mysql/error.log,确认服务启动日志正常记录。 - 定期维护:每季度更新MySQL版本(修复已知漏洞)、每半年审计一次账户权限与日志。









