数据库如何设置更安全的权限?

话题来源: 宝塔9.6版本安全设置全面解读

说到数据库权限管理,这可能是很多运维人员又爱又恨的话题。记得有次帮客户排查数据泄露事件,发现他们居然还在用root账户跑应用,权限放得那叫一个开,连备份脚本都直接硬编码了数据库密码。这种”裸奔”式的权限配置,不出问题才怪!数据库作为企业核心数据的最后一道防线,权限设置真不能马虎。

最小权限原则:从”能做什么”到”只能做什么”

我见过太多开发者为了方便,直接给数据库用户授予ALL PRIVILEGES。这就像把家里钥匙交给快递员,还告诉他”所有房间随便进”。实际上,应该遵循最小权限原则——一个用户只能拥有完成其工作所必需的最低权限。比如只读报表用户就只给SELECT,写日志的应用账号给INSERT就行。

MySQL 8.0有个很实用的功能叫”角色”(ROLE),可以把权限打包成组。我们给电商系统这样配置:创建order_readonly角色(只有orders表的select权限)、order_write角色(增删改查权限),然后根据不同员工的职能分配角色。这样调整权限时只需要改角色定义,不用一个个改用户。

那些容易被忽视的危险权限

FILE权限绝对是个”定时炸弹”——它允许读写服务器文件系统。曾经有黑客通过SQL注入获取FILE权限后,直接往web目录写木马。还有PROCESS权限,能看到所有连接执行的SQL语句,包括带密码的。如果非管理员需要查看执行计划,建议改用EXPLAIN而不是给PROCESS。

更隐蔽的是GRANT OPTION权限,它允许用户把自己的权限转授给别人。某次安全审计时发现,一个普通业务账号居然能创建新用户,就是因为当初有人图省事给了WITH GRANT OPTION。

连接限制:给权限加把锁

光有权限控制还不够,还要限制连接方式。我强烈建议:禁用root远程登录(改localhost)、限制应用账号的host(比如只允许内网IP段)。MySQL的max_user_connections参数也要设置,防止某个账号被爆破导致连接数耗尽。

对于重要环境,可以用SSL加密连接。虽然配置起来有点麻烦(要生成证书啥的),但比起数据泄露的风险,这点成本真不算什么。有个客户就因为数据库是明文传输,被内网嗅探到了客户信息。

数据库安全没有银弹,权限管理更是需要持续优化的过程。每次业务变更都要重新审视权限分配是否还合理,就像我常跟团队说的:”权限给出去只要一秒,收回来可能就要付出惨痛代价”。

评论