如何在MongoDB Community Edition上实现静态数据加密?
问题描述:
我已经通过MongoDB docs了解如何配置仅在MongoDB Enterprise中可用的加密。如何在MongoDB Community Edition上实现静态数据加密?
如何实现静止数据MongoDB Community Edition v3.4?
答
就在几个月前,我对自己提出了同样的问题。这是我迄今发现的选项列表:
- 加密文件系统级别上的存储卷。这是Atlas提供的,大多数云提供商都支持:http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html,https://docs.microsoft.com/en-us/azure/security-center/security-center-disk-encryption等等。结合云密钥管理,它是最简单的方法。大多数操作系统的本地存储也可以实现同样的效果。请询问如何在relevant StackExchange community中提供有关底层操作系统的足够详细信息。
- Percona MongoDB server有一些企业功能,包括审计和加密。 IIRC使用由OS提供的磁盘加密,因此它与前一个基本相同。
- 在应用程序级别上加密敏感数据。例如https://www.openssl.org/docs/manmaster/man1/rsautl.html。它更灵活一点,但是你会失去一些功能,比如在加密字段上进行全文搜索和排序索引。
- 购买企业许可证。不直接回答问题,但与以前的选择相比,可能更具成本效益。
答
与Alex Blex suggested一样,您可以使用Community Edition以外的其他选项。
但是,如果你还是想要去与社区版,
可以使用mongoose.js与MongoDB的交互。它有getter和setter能满足您的要求:
http://mongoosejs.com/docs/2.7.x/docs/getters-setters.html
在你的猫鼬的模式,可以为字段指定get
和set
功能。
var mySchema = new Schema({
name: {
type: String,
default: '',
trim: true,
required: 'Please enter group name',
unique: true,
get: decryptFunction,
set: encryptFunction
}
});
mySchema.set('toObject', {getters: true});
mySchema.set('toJSON', {getters: true});
set
将在您将任何值分配给该字段时执行。它会将该值作为参数,然后您可以编写自己的加密逻辑。
只要您访问字段的值,就会执行get
。它将获得加密值作为参数,您可以在此处编写解密逻辑。您需要编写decryptFunction
和encryptFunction
。
但是,你将无法查询与原始值的这些字段。由于mongodb不知道文本是否被加密。