微服务设计安全篇 - 静态数据的安全

数据加密是一种责任,尤其当它是敏感数据时

March 31, 2017 - 1 minute read -
web service security

数据加密是一种责任,尤其当它是敏感数据时。希望我们已经做了可以做的一切,以确保攻击者不能攻破我们的网络,也不能攻破我们的应用程序或操作系统,然后近距离访问底层数据。然而,我们需要做好准备,万一他们真的攻破了,我们该怎么办。深度防御非常关键。

在许多有名的安全漏洞中,都发生了静态数据被攻击者获取的情况,且其中的内容对攻击者 来说是可读的。这要么是因为数据以未加密的形式存储,要么是因为保护数据的机制有根本性的缺陷。

安全信息的保护机制是多种多样的,但无论你挑选哪种方案,有一些基本的东西需要牢记。

1. 使用众所周知的加密算法

搞砸数据加密最简单的办法是,尝试实现你自己的加密算法,或甚至试图实现别人的。无论使用哪种编程语言,都有被广泛认可的加密算法可供使用,它们都是经过同行评审,并定期打补丁的。使用那些算法!并且订阅选择的算法的邮件列表/公告列表,以确保你知道他们新发现的漏洞,这样就可以给算法打补丁或更新了。

对静态数据的加密,除非你有一个很好的理由选择别的,否则选择你的开发平台上的AES-128或AES-256的一个广为人知的实现即可。Java和.NET运行时都包含AES的实现,它们都是经过充分测试的。

关于密码,你应该考虑使用一种叫做加盐密码哈希(salted password hashing)的技术。

实现得不好的加密比没有加密更糟糕,因为虚假的安全感会让你的视线从球上面移开😑。

2. 一切皆与密钥有关

加密的过程依赖一个数据加密算法和一个密钥,然后私用二者对数据进行加密。那么,你的密钥存储在哪里?如果加密数据是因为担心有人窃取整个数据库,那么把密钥存储在同一个数据库中,并不会真正消除这种担心!因此,我们需要把密钥存储到其他地方,但存到哪里呢?

一个解决方案是,使用单独的安全设备来加密和解密数据。另一个方法是,使用单独的密钥库,当你的服务需要密钥的时候可以访问它。密钥的生命周期管理(和更改它们的权限)是非常重要的操作,而这些系统可以帮你处理这个事情。

有些数据库甚至包含内置的加密支持,比如SQL Server的透明数据加密(Transparent Data Encryption),旨在以一种透明的方式处理这个问题。即使你选择的数据库已经这样做了,也需要研究密钥是如何处理的,并且理解你要防范的威胁是否真的消除了。

再说一次,加密很复杂。避免实现自己的方案,花些时间在已有的方案研究上!

3. 选择你的目标

假设一切都要加密,可以再一定程度上把事情简化,不需要再去猜测什么应该或不应该被保护。然而,你仍然需要考虑哪些数据可以被放入日志文件,以帮助识别问题,而且一切加密的计算开销会变得相当重,因此需要更强大的硬件。当你把数据库迁移作为重构数据库模式的一部分时,这就更具挑战性。根据所做的更改,数据可能需要解密、迁移和重加密。

通过把系统划分为更细粒度的服务,你可能发现加密整个数据存储是可行的,但即使可行也不要这么做。限制加密到一组指定的表是明智的做法。

4. 按需解密

第一次看到数据的时候就对它加密。只在需要时进行解密,并确保解密后的数据不会存储在任何地方。

5. 加密备份

备份是有好处的。我们想要备份重要的数据,哪些我们非常担心的需要加密的数据,几乎也自然重要到需要备份!所以它看起来像是显而易见的观点,但是我们需要确保备份也被加密。这意味着,我们需要知道应该用哪个密钥来处理哪个版本的数据,特别是当密钥更改时。清晰的密钥管理变得非常重要。