96、数据库安全加固:最小权限原则、密码策略、网络安全、漏洞修复
说实话,数据库安全这个话题,我每次讲都觉得特别沉重。
为什么?因为太多人栽在这上面了。我自己就见过不少项目,功能做得花里胡哨,结果安全一塌糊涂。数据库裸奔在公网上,密码用"123456",一个普通开发人员拿着root权限到处跑……嗯,不出事才怪。
今天咱们就聊聊数据库安全加固。说白了,就是给你的数据库穿上防弹衣。我会从四个维度来讲:最小权限、密码策略、网络安全、漏洞修复。这四点做好了,至少能挡住90%的常见攻击。
核心观点:数据库安全不是某个单一措施,而是一套组合拳。少一环,都可能出大问题。
一、最小权限原则:别给任何人一把万能钥匙
最小权限原则,听起来很学术,其实道理特别简单:只给一个人完成他工作所需的最小权限。
我见过最夸张的一个项目,所有开发人员都用同一个数据库账号,而且这个账号是root。你想想看,一个刚入职的实习生,不小心执行了个DROP TABLE,整个生产库就没了。这种事儿不是没发生过。
警告:永远不要在生产环境中使用root或管理员账号进行日常操作。这是最基本的安全红线。
我个人习惯的做法是这样的:
- 按角色划分账号:比如只读账号、读写账号、管理账号。每个账号的权限严格限定。
- 按库/表粒度控制:一个应用只需要访问某个库的某几张表,那就只给这些表的权限。
- 定期审计:每季度检查一次账号权限,把那些离职人员、过期账号清理掉。
举个例子,在MySQL里创建只读账号:
-- 创建一个只能查询的账号
CREATE USER 'readonly_user'@'192.168.1.%' IDENTIFIED BY 'StrongPass123!';
GRANT SELECT ON mydb.* TO 'readonly_user'@'192.168.1.%';
FLUSH PRIVILEGES;
你看,这个账号只能查,不能改。就算密码泄露了,攻击者也拿它没办法删数据。
小技巧:我建议把权限脚本纳入版本管理。每次变更都留记录,出了问题能追溯。
二、密码策略:别再用"123456"了
说到密码,我就想起一个真实案例。有一次我去给一家公司做安全审计,发现他们的数据库密码是"admin123"。我问他们为什么用这个,回答是"好记"。
好记是好记,但黑客也"好猜"啊。
密码策略这块,我总结了几个要点:
- 复杂度要求:至少12位,包含大小写字母、数字、特殊字符。别嫌麻烦,这是第一道防线。
- 定期更换:我建议每90天换一次密码。当然,别频繁到让员工把密码写在便利贴上。
- 禁止重复使用:换密码时,不能跟最近5次用过的密码相同。
- 加密存储:密码绝对不能明文存储。用SHA-256加盐哈希,或者直接用数据库自带的加密函数。
在MySQL里启用密码策略:
-- 安装密码验证插件
INSTALL PLUGIN validate_password SONAME 'validate_password.so';
-- 设置策略级别
SET GLOBAL validate_password.policy = STRONG;
SET GLOBAL validate_password.length = 12;
嗯,这里要注意:密码策略别设得太死板。我曾经见过一个项目,密码要求32位,结果员工全把密码记在桌面文本文件里——这反而更不安全。
三、网络安全:别让数据库暴露在公网上
这个问题我每次讲都要强调一遍:数据库不要直接暴露在公网上。
你想想看,你把数据库端口(比如3306、5432)直接开在公网上,就等于告诉全世界:"来啊,来攻击我啊"。扫描工具一抓一个准。
我建议的做法:
- 绑定内网IP:数据库只监听内网地址,不监听0.0.0.0。
- 防火墙限制:只允许特定IP段访问数据库端口。
- 使用VPN或跳板机:远程管理时,先连VPN,再通过跳板机访问数据库。
- 启用TLS加密:数据传输过程中加密,防止中间人攻击。
配置MySQL只监听内网:
# 在my.cnf中修改
[mysqld]
bind-address = 192.168.1.100 # 只监听内网IP
skip-networking = 0 # 启用网络连接(但只监听指定IP)
重要:我曾经帮一个客户排查问题,发现他们的数据库被植入了后门。原因就是数据库端口暴露在公网上,而且没有做IP白名单。修复花了整整一周,损失惨重。
四、漏洞修复:别让你的数据库"带病运行"
数据库软件也是软件,也会有漏洞。我见过太多人,数据库装上去之后就不管了,版本一用就是好几年。
你知道这意味着什么吗?意味着所有已知漏洞都敞开着,攻击者随便找个CVE编号就能攻破。
漏洞修复这块,我的经验是:
- 保持版本更新:至少跟上大版本的小版本更新。比如MySQL 8.0,尽量用最新的小版本。
- 关注安全公告:订阅官方安全公告,或者用自动化工具扫描。
- 建立补丁流程:先在测试环境打补丁,验证没问题再上生产。
- 关闭不必要的功能:比如MySQL的
LOAD DATA LOCAL、FILE权限,用不到就关掉。
检查MySQL版本和已知漏洞:
-- 查看当前版本
SELECT VERSION();
-- 查看已安装的插件
SHOW PLUGINS;
-- 关闭危险功能(在my.cnf中)
[mysqld]
local-infile = 0
skip-symbolic-links = yes
避坑指南:我曾经在生产环境直接升级数据库版本,结果因为一个不兼容的SQL语法导致应用崩溃。从那以后,我坚持"先在测试环境跑一周,没问题再上生产"的原则。
五、总结:安全是持续的过程,不是一次性任务
数据库安全加固,说白了就是四个字:层层设防。
最小权限原则管住人,密码策略管住账号,网络安全管住链路,漏洞修复管住软件。四者缺一不可。
我见过太多"偏科"的案例:密码设得很复杂,但权限给得太大;网络隔离做得很好,但版本从来不更新。这些都是在给攻击者留后门。
最后送大家一句话:安全不是成本,是投资。今天花一小时加固,明天可能省下一百万的损失。
核心行动清单:
- ✅ 检查所有数据库账号,删除不必要的权限
- ✅ 启用密码策略,强制复杂密码
- ✅ 确认数据库只监听内网,配置防火墙
- ✅ 检查数据库版本,打上最新补丁
- ✅ 建立定期安全审计机制
公众号:蓝海资料掘金营,微信deep3321