数据库密码泄露风险,CMS数据库权限最小化
很多CMS站点还在用root账号连接数据库,一旦配置文件被读取或备份泄露,攻击者就能直接拖库。把CMS使用的数据库账号权限降到刚好够用,是防止密码泄露后损失扩大的关键一步。
下面从准备到验证,带你完成一次权限最小化改造。
改造前先确认三件事
动手前需要知道CMS当前用的是哪个库、哪个账号,以及账号被授予了什么权限。
- 找到CMS配置文件。常见路径:
- WordPress:
wp-config.php - 宝塔面板安装的PHP站点:
/www/wwwroot/你的域名/config/database.php或wp-config.php - 其他CMS:通常在
config、application/database.php等目录
- 记录里面的
DB_NAME、DB_USER、DB_PASSWORD、DB_HOST。 - 登录数据库查看现有账号权限。在服务器命令行执行:
mysql -u root -p
进入后查看用户:
SELECT user, host FROM mysql.user;
查看某个账号权限:
SHOW GRANTS FOR 'cms_user'@'localhost';
如果看到 ALL PRIVILEGES 或 WITH GRANT OPTION,说明权限过大。
创建专用低权限账号
不要直接修改原账号,先新建一个只对CMS库有增删改查权限的账号,验证CMS能正常运行后再切换。
假设CMS数据库名为 cms_db,新账号为 cms_limited,密码用强密码。
CREATE USER 'cms_limited'@'localhost' IDENTIFIED BY '你的强密码';
GRANT SELECT, INSERT, UPDATE, DELETE ON cms_db.* TO 'cms_limited'@'localhost';
FLUSH PRIVILEGES;
如果CMS需要建表或升级,可临时加 CREATE, ALTER, INDEX, DROP,升级完成后立即回收。
日常运行只保留增删改查即可。
宝塔面板操作路径:数据库 → 添加数据库 → 填写数据库名和用户名 → 权限选择“指定数据库”而不是“所有数据库”。
收紧连接来源和文件权限
账号权限最小化不只是SQL层面,登录来源和配置文件也要一起管住。
- 数据库只允许本机连接。检查
my.cnf或宝塔MySQL配置中的bind-address,建议设为127.0.0.1。 - 账号主机名用
localhost或127.0.0.1,不要用%。如果CMS和数据库不在同一台机器,只允许应用服务器内网IP,例如:
CREATE USER 'cms_limited'@'10.0.0.5' IDENTIFIED BY '你的强密码';
- CMS配置文件权限设为600或640,属主为Web运行用户。宝塔中可在文件管理右键 → 权限,取消其他用户的读取权限。
- 不要把数据库密码提交到Git仓库,也不要把
wp-config.php备份放到网站根目录。
常见报错与避坑
切换账号后如果网站报“数据库连接错误”或“Access denied”,按下面顺序排查。
- 确认新账号密码和配置文件一致,注意特殊字符在配置文件中是否需要转义。
- 确认
host匹配。用localhost创建但配置写127.0.0.1,在部分MySQL版本中会被视为不同来源。 - 确认CMS需要的权限是否缺失。例如部分插件会执行
CREATE TEMPORARY TABLES,可在测试环境先加权限,观察日志后再决定是否保留。 - 不要给CMS账号授予
FILE、PROCESS、SUPER权限,这些权限泄露后风险更高。 - 修改前先备份数据库和配置文件,避免改错后无法快速回滚。
验证权限是否真的最小化
改完后不要只看网站能打开,还要实际验证权限边界。
- 用新账号登录,尝试执行越权操作:
SHOW DATABASES;
应该只看到 cms_db 和 information_schema,看不到其他业务库。
- 尝试删除其他库的表,应该被拒绝。
- 查看当前授权:
SHOW GRANTS FOR 'cms_limited'@'localhost';
输出中不应出现 ALL PRIVILEGES、GRANT OPTION、FILE。
- 检查CMS后台功能是否正常:发布文章、上传图片、更新插件。如果都正常,说明权限刚好够用。
如果密码已经泄露
怀疑密码泄露时,仅改密码不够,还要同步做三件事:
- 立即修改数据库账号密码,并更新CMS配置文件。
- 检查是否有陌生账号或异常授权,执行
SELECT user, host FROM mysql.user;核对。 - 查看数据库慢查询日志和Web访问日志,确认是否有批量导出行为。
数据库密码泄露风险无法完全避免,但通过CMS数据库权限最小化,可以把泄露后的影响限制在单个库的增删改查范围内。
建议每季度复查一次账号权限,并在CMS升级后确认没有新增不必要的授权。