在 MongoDB 中使用加密存储引擎(Encrypted Storage Engine)可以确保数据在磁盘上的安全性。加密存储引擎使用 AES 加密算法对数据进行加密和解密,从而保护静态数据(即存储在磁盘上的数据)不被未经授权的访问。
一、加密存储引擎概述
MongoDB 提供的加密存储引擎是一种全磁盘加密(FDE)技术,它确保数据在写入磁盘时被加密,在从磁盘读取时被解密。这在防止数据泄露或盗窃方面提供了额外的安全层。
二、前提条件
- MongoDB 企业版:加密存储引擎是 MongoDB 企业版中的功能,在社区版中不可用。
- 加密密钥管理:你可以使用 MongoDB 提供的本地密钥文件,或者集成第三方密钥管理服务(如 AWS KMS、Azure Key Vault、Google Cloud KMS)。
三、设置加密存储引擎
下面是如何在 MongoDB 中启用加密存储引擎的详细步骤和示例代码。
1. 创建密钥文件
首先,创建一个加密密钥文件。密钥文件是一个包含随机字节的文件,MongoDB 将用它来加密和解密数据。
创建密钥文件如下:
bash
openssl rand -base64 32 > encryptionKeyFile
chmod 600 encryptionKeyFile
2. 配置 MongoDB 实例
在 MongoDB 配置文件(通常是 mongod.conf)中,添加以下设置以启用加密存储引擎:
yaml
security:
enableEncryption: true
encryptionKeyFile: /path/to/encryptionKeyFile
storage:
dbPath: /data/db
engine: wiredTiger
确保将 /path/to/encryptionKeyFile 替换为实际密钥文件的路径。
3. 启动 MongoDB 实例
使用配置文件启动 MongoDB 实例:
bash
mongod --config /path/to/mongod.conf
四、密钥管理服务集成
如果你希望使用第三方密钥管理服务(KMS)来管理加密密钥,MongoDB 提供了对 AWS KMS、Azure Key Vault 和 Google Cloud KMS 的支持。
下面是使用 AWS KMS 的示例:
1. 创建 AWS KMS 密钥
在 AWS 控制台中,创建一个 KMS 密钥,并获取其 ARN(Amazon Resource Name)。
2. 为管理密钥创建 IAM 角色
确保 MongoDB 实例有权限访问 AWS KMS。你可以创建一个 IAM 角色并为其分配适当的权限。
3. 配置 MongoDB 实例
在 MongoDB 配置文件中,添加 AWS KMS 设置:
yaml
security:
enableEncryption: true
kmsProviders:
aws:
accessKeyId: <AWS_ACCESS_KEY_ID>
secretAccessKey: <AWS_SECRET_ACCESS_KEY>
region: <AWS_REGION>
encryptionKeyId: <AWS_KMS_KEY_ARN>
storage:
dbPath: /data/db
engine: wiredTiger
确保将 <AWS_ACCESS_KEY_ID>、<AWS_SECRET_ACCESS_KEY>、<AWS_REGION> 和 <AWS_KMS_KEY_ARN> 替换为实际的 AWS 凭证和 KMS 密钥 ARN。
五、示例应用程序
下面是一个使用 Node.js 和 Mongoose 连接到启用了加密存储引擎的 MongoDB 的示例应用程序。
1. 安装 Mongoose
在项目目录下运行以下命令安装 Mongoose:
bash
npm install mongoose
2. 编写连接代码
创建一个 app.js 文件,并编写以下代码:
javascript
const mongoose = require('mongoose');
const uri = 'mongodb://localhost:27017/mydatabase';
mongoose.connect(uri, { useNewUrlParser: true, useUnifiedTopology: true })
.then(() => {
console.log('Connected to MongoDB with encrypted storage engine');
})
.catch(err => {
console.error('Error connecting to MongoDB', err);
});
// 定义一个示例 Schema 和 Model
const Schema = mongoose.Schema;
const exampleSchema = new Schema({
name: String,
age: Number
});
const Example = mongoose.model('Example', exampleSchema);
// 插入示例数据
const example = new Example({ name: 'John Doe', age: 30 });
example.save()
.then(doc => {
console.log('Document inserted:', doc);
})
.catch(err => {
console.error('Error inserting document', err);
});
六、验证加密存储引擎
你可以通过以下几种方法验证加密存储引擎是否正常工作:
-
检查日志文件 :启动 MongoDB 实例后,检查日志文件(通常位于
/var/log/mongodb/mongod.log)以确保加密存储引擎已启用。日志中应包含类似以下的条目:
plaintext[initandlisten] WiredTiger opened file file:WiredTiger.wt, size 0, exclusive lock, encryption -
验证数据文件 :你可以查看
dbPath目录中的数据文件,这些文件应该是加密的,并且无法直接读取其内容。
七、最佳实践和注意事项
- 安全管理密钥文件:确保密钥文件的权限设置正确,并且只有 MongoDB 服务用户可以访问。
- 定期轮换密钥:为了增强安全性,定期轮换加密密钥,并使用密钥管理服务进行自动化管理。
- 备份和恢复:在启用加密存储引擎时,确保备份策略涵盖加密数据的备份和恢复测试,以防止数据丢失。
- 性能影响:加密存储引擎可能会对数据库性能产生一定影响,特别是在高并发读写操作时。请根据实际需求和工作负载进行性能测试。
总结
MongoDB 的加密存储引擎提供了一种强大的方式来保护磁盘上的数据。通过上述步骤,你可以在 MongoDB 企业版中启用加密存储引擎,并集成第三方密钥管理服务来进一步增强安全性。在实际应用中,结合最佳实践来管理加密密钥和备份策略,确保数据在静态状态下的安全性。