网站防篡改内容监控

网站防篡改内容监控

一、背景介绍需求引入

  很久很久以前的需求了,先上一张图。

   话说,曾经我们的新闻发布架构图不是这样的,是全部都放到线上,说是有个机房的:新闻编辑后台,数据库等等(当时我还没来这家公司)。

   然后,发生了一件非常严重的事,说是网站内容被篡改,链接到一个澳门赌博网站。查不出是什么病毒,只能运维和开发半夜三更去机房,切断了网络,一步步重置服务器,重装各个服务搞回来的。最后,据说是因为后台编辑页面有个上传功能,估计病毒是从这里入侵服务器的。

  于是,我们伟大的经理敢为人先地,提出了上面的架构:把后台、数据库都放到公司内网虚拟机上,内容管理员编辑好文章内容定时传到gitlab上,线上服务器再定时拉取下来。

  当然,我们不会把特别大的文件,编辑后从内网存到gitlab,再传到线上的;而是直接传到线上服务器。具体原因我忘记了,开发之前有说过,好像说是gitlab对文件大小有限制,还是由于gitlab服务器端上的文件过大,会导致客户端(即线上服务器啦)下载文件容易超时,导致同步不了。。。额,不纠结这个原因。然后文章内容或者比较小的文件都是通过这条链路上传到线上服务器的。我特别说下,线上服务器之前没做这需求的时候,不是单向定时拉取的,还能定时上传到gitlab上!(先卖个关子呗)

  需求来了~~~~要搞个防篡改的监控,就是如果线上内容受到非法篡改的时候,能马上报警给我们知道

 

二、问题解决

   查了一堆资料,说是可以用md5去搞。然后理了下思路,要分两部分去处理:

  (1)大文件:直接上传到线上服务器 ——》 不走gitlab线路,定时算md5,传到内网比较

  (2)小文件:按图上的线路同步 ——》根据git status返回状态去判断

 

1、大文件处理

  大文件我是用md5去搞的,先在内网服务器建个跟线上相同路径的目录(包括用户账号),即大文件放置的目录,我都建了一个。为什么这么弄,因为好看,真的是因为好看,不开玩笑。运行md5命令的时候,会得出的一个结果,后面是文件路径目录,这样人眼比对方便。类似这样:

   所以预先算好个md5的文件,放到内网上,然后线上有个脚本,定时会计算这堆大文件的md5值(用md5sum命令),定时传到内网上,用命令diff比对文件是否一致,不一致就是线上这堆大文件遭受到篡改了。

 

2、小文件处理

   这个我稍微说得详细点吧。gitlab同步到线上服务器的线路要改成单向的,就是只能下载不能上传。如果不改,哪天这个同步账号逆向上传东西到gitlab上,然后内网又上传,很容易导致git不同步报错。而且这样设置是对内容篡改监控起到帮助作用的。

  线上禁止push只能pull代码怎么做了,在gitlab上另外建一个用户(之前没做这需求的时候,是跟内网用同一个兼具上传+拉取的账号,想想都阔怕呢),设置为reporter,就可以达到这个目的。

  然后利用一个隐藏文件 .gitignore,把没通过gitlab,直接上传服务器的大文件都加进去,相当于白名单不检查,不然git status 会报错说你没add 进去仓库的,如下图:

  然后这个文件加个普通用户不能修改的权限,用chattr +i 去上锁,只有root用户能编辑这个文件。线上就跑着个定时 git status获取结果的脚本,返回信息如果是 “nothing to commit” 就万事大吉了。

 

  为什么这样处理就可以?因为同步嘛,内网和线上一样的文件只会被覆盖!!!哪怕篡改了线上某个文件,只要内网是有这个文件的,定时脚本一执行,一定会把这个被篡改过的文件修正过来。而且因为传输线路是单向的,所以根本不会存在线上这个被篡改的文件会逆向传回到gitlab的情况。

   所以一遇到这个报警,不要害怕,通常就是因为我那位可爱的开发同事自己偷偷上传大文件上去,不经过gitlab,又不告诉我,自己又忘记往.gitignore添加这个大文件的白名单导致的啦。

 

posted @ 2021-02-02 22:37  windysai  阅读(675)  评论(0编辑  收藏  举报