数据库常被聊起的是对业务如何优化等内容,然而今天我更想聊聊底层的数据安全保护方面的事情。
说到数据库的安全防护,很多人会立刻想到数据库有鉴权,有透明加密等等这些东西。那么这些东西是否能构筑一个完整的数据安全保护体系呢。我们不妨先来看看数据库的数据是如何保存的。

上图是一个典型的数据库部署方式,数据库实例运行在主机的操作系统中,驱动通过网络连入并通过鉴权访问数据库。数据库底层是操作系统提供的文件系统(目前几乎所有开源数据库都是这样使用的)。文件系统再往下就到硬件的盘了(图中黑色边框是硬件,蓝色边框的是软件)。
一般数据库都会在图上标记红颜色的地方,做很完善的鉴权操作和数据加密等处理,避免数据被恶意访问或者删除。
然而我们不能忽略来自另外一个攻击面的可能性。如果有黑客或者病毒从操作系统攻入,进入操作系统之后,就可以直接看到文件系统中的文件。而这些文件正是数据库用户的数据,如果被删除或者篡改加密,后果都是难以想象的(即使被加密的数据,也防不了删除)。

在这条红线标记的攻击路径上,数据库能做更多的事情吗?会很难。因为数据库说到底是运行在操作系统中的一个软件,不论他做什么样的方案设计,都会被局限在绿色的框框中,而红色的攻击路径是完全旁路了绿色框框中的任何实现的。
如何解决呢?我认为有两种思路。
第一种思路很直观,那就是干脆把图中的文件系统也纳入到绿色框框里,由数据库来实现不就行了?
但其实并没那么简单。因为文件系统这一层,在OS中其实是构筑在设备之上,即使不使用操作系统提供的文件系统,依然需要在操作系统中看到对应硬盘所在的设备(也就是裸盘),才能构建起自己的文件系统。但是这个设备对OS可见,对于攻入操作系统的黑客或者病毒而言,自然也是没有任何防护的。所以到了这一步,最多只能防住那些直接rm -rf *的操作,如果直接对设备执行dd就还是BBQ了(见下图)。

那我们自然会想到,能不能做得更绝一些,干脆不让操作系统看到设备呢?这就要分情况讨论了。
对于直连在主机上的盘,恐怕是不行,因为如果操作系统看不见这些直连设备,那么操作系统中的软件自然也看不到这些设备,就无法对其操作(毕竟数据库还得执行正常读写哪)。
所以,如果要让系统看不见这些设备,软件还能访问,唯一办法是让这个盘从主机上被拔下来,插到存储系统上面,然后我们的软件通过RDMA的网络去连接那块盘。这时,我们可以看到即使操作系统被黑客或者病毒攻破,也是没有任何问题的(见下图)。

看到这里,有小伙伴可能会问,这样的文件系统+RDMA有方案吗?答案当然是肯定的。
事实上,Cantian引擎现在就支持这样的对接方式。作为一个完全开源的引擎,Cantian引擎在社区上首先支持了对接标准文件语义,但上面提到的标准文件的问题也一样存在。因为只要是操作系统中的软件,前面的问题就绕不过去。
所以,为满足一些对数据高安全可靠用户的需要,Cantian同时提供对接一款叫DBStor的组件,这个组件实现了一个基于RDMA的文件系统功能。在数据库实例所在的操作系统中,完全看不到任何目录、文件、设备。所有的操作都是基于安全认证的RDMA网络完成的。
有些小伙伴又会问了,那如果我只用社区的Cantian,且只对接标准文件的话,还有啥招吗。
当然也是有的,这就是我们说的第二个思路。从存储层阻止黑客或病毒的删除/篡改行为。
我们如果把盘从操作系统上抽离出来,放在存储阵列上,那么就可以基于存储提供的能力进行保护。以华为OceanStor Dorado为例,文件可以归属在不同的区,当文件被快照保护起来后,从操作系统下发的删除甚至于直接对设备dd操作都是不会被破坏原文件。而对更高要求的保护,可以实现系统管理员都无法删除,只能等待设定的保护时间到了才可以删。
快照的保护是定时自动执行的,因此对数据库而言,处于在线修改区的数据量相对很少,即使遭到了入侵破坏,损失也是非常可控的。

总结一下。当今数据库其实已经做了很多安全防护手段,但是数据库作为一个运行在操作系统中的纯软件,要考虑从操作系统其他路径以旁路方式攻击的可能。
这时最好的应对办法就是把盘从数据库主机上抽出来,放在外置存储设备上,然后通过外置存储设备的快照保护等功能进行防护,形成纵深防御。更加极致的做法就是直接通过私有接口隐藏掉操作系统中的目录和设备,实现彻底的防护。




