利用区块链(这里指联盟链)的不可篡改性,实现对Linux服务器中的重要文件的修改历史进行存证,可以有很多种解决思路,只不过有的思路实现起来,工程量较大:
1、可以编写一种新的Linux内核模块用以支持【联盟链文件系统】,这样就可以直接将文件以对APP透明的方式,通过内核模块里的驱动程序将数据写入到区块链系统。文件可以分片存放到区块链中,每次修改,只更新被修改的分片,这就有些类似于IPFS项目了。
2、可以将文件和文件修改历史记录到关系数据库中,然后改造数据库的存储引擎,将插入或更新类型的SQL语句封装为一笔交易,打包到区块后,随着区块的广播而同步到各个节点,这样就可以实现基于区块链共识算法的关系数据库。
3、用inotify,NFS-server,NAS设备、联盟链相配合,比较浅显直观,但是也有不少漏洞,比如inotify脚本被不小心关停了之后就会出大问题,凑合一下也许能用,举个例子,以前做过的检察院存证的POC实验:
APP创建或修改Linux服务器中的文件file.txt,其位于/var/nfs-mount-dir/app/目录下,nfs-mount-dir是NFS的挂载目录,因为Linux服务器有很多台,共享同一个NFS目录;
Linux的inotify机制只能监控本地磁盘目录的文件修改情况,并不支持NFS挂载目录,因此若需监控/var/nfs-mount-dir目录,则需要在NFS-server主机上部署inotify脚本;
若NFS-server主机是普通的Linux主机,则在其中部署inotify脚本,监控其本地目录/var/local-disk-dir/目录;
若NFS-server主机是专用的NAS设备,虽然能够登录到设备内部安装部署inotify脚本,但不方便,一种变通的做法是:APP先将文件存放在Linux服务器本地目录,比如/var/local-disk-dir/目录,用inotify脚本监控/var/local-disk-dir/目录;
若发现被监控目录下的file.txt被修改了,则触发inotify脚本,调用文件备份转移工具(比如rsync),将file.txt重命名,比如加上版本后缀,然后转移到备份设备中(比如另一台NAS设备、另一台Linux NFS-server)或者联盟链;
若文件数据较大,不方便直接放在联盟链上进行存储,则inotify脚本可以计算并上传文件的HASH值到联盟链,联盟链本身具备防篡改特性,所以file.txt文件被修改的次数、每次对应的HASH值也是不可篡改的、可信的,这样后续浏览区块链的数据就能得到与文件修改相关的一些历史信息。
网友评论