欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

如何防止“技术员们”绕过程序修改mysql数据库

程序员文章站 2022-05-27 09:33:59
...
这个问题主要防止内部技术人员对数据库直接操作,大家有什么实现的方法吗?

主管要求的功能是这样描述的:

对数据库中的每一行敏感数据设有独有的数字签名,每一次修改数据库我们都在底层进行签名校验。未经授权的数据库修改无法通过校验,程序进行终止操作并冻结账户并弹出警示。此安全模块防范黑客或内部技术人员绕过后台管理模块,直接修改底层数据库的非法行为。

使用的是PHP+MYSQL,我现在想到是思路是用数据库触发器。但触发器如何传参数呢?

感谢几个人的回答,但现在为止还没有答案,peixinchen的回答

peixinchen 52 6小时前 回答 · 6小时前 更新
规章制度的问题就用规章制度的方式解决,不要想用技术手段来防,性价比太低。

当然基本的制度要做到:
1. 数据库权限分级管理,root权限别滥用;
2. 运维系统分级,root权限别滥用。

但这些都防不住管理员进行数据更改,这种时候还是“惩罚措施”最有效。

PS:如果是内部有人恶意破坏,如何进行定位追查,那就是另外的问题了。

我考虑的是,假如是银行的数据系统,一个数据库管理员能直接修改数据库的吗?你能靠制度来管?
现在我就是想看有没有技术的方法实现只能通过程序来写入修改数据。

进过各位的讨论,好像明白了一些,综合沙渺与peixinchen所说,重新思考中……

回复内容:

这个问题主要防止内部技术人员对数据库直接操作,大家有什么实现的方法吗?

主管要求的功能是这样描述的:

对数据库中的每一行敏感数据设有独有的数字签名,每一次修改数据库我们都在底层进行签名校验。未经授权的数据库修改无法通过校验,程序进行终止操作并冻结账户并弹出警示。此安全模块防范黑客或内部技术人员绕过后台管理模块,直接修改底层数据库的非法行为。

使用的是PHP+MYSQL,我现在想到是思路是用数据库触发器。但触发器如何传参数呢?

感谢几个人的回答,但现在为止还没有答案,peixinchen的回答

peixinchen 52 6小时前 回答 · 6小时前 更新
规章制度的问题就用规章制度的方式解决,不要想用技术手段来防,性价比太低。

当然基本的制度要做到:
1. 数据库权限分级管理,root权限别滥用;
2. 运维系统分级,root权限别滥用。

但这些都防不住管理员进行数据更改,这种时候还是“惩罚措施”最有效。

PS:如果是内部有人恶意破坏,如何进行定位追查,那就是另外的问题了。

我考虑的是,假如是银行的数据系统,一个数据库管理员能直接修改数据库的吗?你能靠制度来管?
现在我就是想看有没有技术的方法实现只能通过程序来写入修改数据。

进过各位的讨论,好像明白了一些,综合沙渺与peixinchen所说,重新思考中……

我们现在的做法

  • 程序员和DBA是分开的各尽其责,程序员是没有访问数据库的权限的。
  • 若涉及到数据库修改,走内部的事务系统审批流程,DBA接到任务会按照
    你的事务要求执行,每步都有记录。

不要踩嘛。在特定的需求下,研究内控怎么做是个好问题。

只要把MySQL的用户名和密码开放给PHP层,那么程序员就必然可以直接操作MySQL数据库。因为PHP本质也只是执行原始的SQL语句,从这一点上看“PHP操作MySQL”和“直接操作数据库执行SQL语句”没有本质区别。

我可以提一个有趣的问题:用phpMyAdmin读写数据库,这应该算通过PHP操作MySQL,还是直接操作MySQL?:D

只有把PHP一层直接访问MySQL的权限收回,才有希望限制程序员只能以规定的行为读写数据库。题主的核心需求是模块封装。这个手段就很多了:

  • 在数据库服务器的前边挡一个前级服务器,接收读写请求并翻译为SQL语句
  • 用Zend Guard一类的工具,封装不可分析源代码的数据库读写类
  • 用PHP扩展封装数据库读写(这个开发成本太高)

内控是一个有重大代价的行为——控了别人的权限,就意味着扛下了别人的责任。控制者的疏失和错误,极易引发交流成本和开发时间的增加,甚至会引发受控开发方的反弹、怠工、士气下降等后果。

请动用任何手段之前清楚地知道自己在做什么,三思而行。

直接把敏感的文件加密吧。

规章制度的问题就用规章制度的方式解决,不要想用技术手段来防,性价比太低。

当然基本的制度要做到:
1. 数据库权限分级管理,root权限别滥用;
2. 运维系统分级,root权限别滥用。

但这些都防不住管理员进行数据更改,这种时候还是“惩罚措施”最有效。

PS:如果是内部有人恶意破坏,如何进行定位追查,那就是另外的问题了。

这种需求还是不要技术上来实现了。。。太复杂。

DB_SERVER和WEB_SERVER使用内网连接,若果程序员想看数据数据,那么phpmyadmin的mysql帐号授权只读,如果根本不想让程序员看到数据库的连接信息可以使用php_screw加密php程序,这些都是建立在程序员不能上线上服务器的大前提下!

触发器有什么用,把触发器关了,把数据库文件直接替换,哈哈

数据库管理员和后端程序员分开,各自赋予权限。另外定期备份数据库。

这个需求有点笼统,看着像抄的。

对数据签名是可行的。但是,追责是个问题。比如:A改了字段,而B读取数据的时候通过校验发现数据不对,那么是B的责任吗?

另外,你说触发器实现,那么直接修改数据库也可以使触发器生效啊~

数据签名的话可以这样:每个字段拼接起来,然后加个密,密文作为这行记录的一个字段保存就行了。密钥保管就是社会工程学了

这样就没法弄,我觉得这样技术上没法实现吧,PHP 的程序要去查数据库肯定已经有库的权限,那程序员肯定也可以去操作数据库啊。银行数据库的运维人员肯定是有 root 权限的,你要这样说的话,那个人当然是可以去操作相关记录,关键是这样做属于违法行为,且代价很大。对,他可以做,能做到,但是他不敢做。就像我有能力去杀人,但是我不会去杀。

另外一种是程序员开发的时候使用的是内部环境,数据库也是内部数据库,线上的数据和相关权限不需要对程序员开放,运维去部署就好了。

数据库审查模式也只能是时候审查,还是想做事前的技术防控,我考虑的是,假如是银行的数据系统,一个数据库管理员能直接修改数据库的吗?你能靠制度来管?
现在我就是想看有没有技术的方法实现只能通过程序来写入修改数据。

这就不是说信不信任技术员的问题

不是说不给技术查询和修改数据库,查询修改要通过我的PHP程序来实现,我好进行权限控制和写日志文件。比如说数据库有没有这样的一个功能,触发写入的时候,需要一个密钥才会执行,这个密钥是从程序传参进来的,有密钥则执行。