在决定此类安全事项之前,您应该评估威胁模型。如果不知道您要防御什么,那么您采取的任何措施可能都没有什么价值。
现在,在这种情况下,您可能需要担心一些事情:
- 攻击者可以物理访问您的数据(例如,闯入数据中心,窃取备份磁带等)
- 攻击者获得对您的原始数据库的读取权限
- 攻击者例如通过SQL注入,缓冲区溢出等危害您的应用程序。
对于第一种情况,只要服务器无头即可将数据库和所有备份存储在加密的卷上-窃取服务器或磁带将需要中断磁盘级加密。
对于第二种情况,加密数据库数据确实有帮助,但前提是您不将所需的密钥或密码短语存储在任何地方。
在第三种情况下,一切都取决于发生攻击的上下文:例如,如果是XSS或CSRF攻击,则攻击者可以执行合法用户可以执行的任何操作,并且加密数据根本没有帮助。
因此,您的威胁模型是攻击者,它可以通过找到登录凭据并设法从外部登录到数据库服务器,或者通过获得对数据库服务器的根访问权限来获得对原始数据库的读取访问权限。一个典型的途径是首先获得Web服务器上的Shell访问权限。然后,攻击者可以从那里从配置文件中读取访问凭据,然后连接到数据库。
另一个注意事项是保留密钥和密码的位置,尤其是在使用具有无状态执行模型的平台(例如PHP)的情况下。理想情况下,您可以让客户在需要时键入其密码短语,并将其仅保存在内存中,或者甚至更好地由客户端进行解密(但这通常不可行)。在无状态平台上,通常使用会话,内存缓存,数据库或平面文件来携带状态。但是,与将状态保存在有状态的Web应用程序自己的内存中相比,所有这些漏洞要脆弱得多。避免这是鸡与蛋的问题,因为如果在持久保存状态之前对状态进行加密,那么您刚刚创建了另一个必须牢记的秘密。记住客户端上的密码并将其与需要它的每个请求一起发送可能是最不可怕的解决方案;