MongoDB(95)如何在MongoDB中使用加密存储引擎?

10 阅读4分钟

在 MongoDB 中使用加密存储引擎(Encrypted Storage Engine)可以确保数据在磁盘上的安全性。加密存储引擎使用 AES 加密算法对数据进行加密和解密,从而保护静态数据(即存储在磁盘上的数据)不被未经授权的访问。

一、加密存储引擎概述

MongoDB 提供的加密存储引擎是一种全磁盘加密(FDE)技术,它确保数据在写入磁盘时被加密,在从磁盘读取时被解密。这在防止数据泄露或盗窃方面提供了额外的安全层。

二、前提条件

  1. MongoDB 企业版:加密存储引擎是 MongoDB 企业版中的功能,在社区版中不可用。
  2. 加密密钥管理:你可以使用 MongoDB 提供的本地密钥文件,或者集成第三方密钥管理服务(如 AWS KMS、Azure Key Vault、Google Cloud KMS)。

三、设置加密存储引擎

下面是如何在 MongoDB 中启用加密存储引擎的详细步骤和示例代码。

1. 创建密钥文件

首先,创建一个加密密钥文件。密钥文件是一个包含随机字节的文件,MongoDB 将用它来加密和解密数据。

创建密钥文件如下:

openssl rand -base64 32 > encryptionKeyFile
chmod 600 encryptionKeyFile

2. 配置 MongoDB 实例

在 MongoDB 配置文件(通常是 mongod.conf)中,添加以下设置以启用加密存储引擎:

security:
  enableEncryption: true
  encryptionKeyFile: /path/to/encryptionKeyFile

storage:
  dbPath: /data/db
  engine: wiredTiger

确保将 /path/to/encryptionKeyFile 替换为实际密钥文件的路径。

3. 启动 MongoDB 实例

使用配置文件启动 MongoDB 实例:

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 设置:

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:

npm install mongoose

2. 编写连接代码

创建一个 app.js 文件,并编写以下代码:

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);
    });

六、验证加密存储引擎

你可以通过以下几种方法验证加密存储引擎是否正常工作:

  1. 检查日志文件:启动 MongoDB 实例后,检查日志文件(通常位于 /var/log/mongodb/mongod.log)以确保加密存储引擎已启用。

    日志中应包含类似以下的条目:

    [initandlisten] WiredTiger opened file file:WiredTiger.wt, size 0, exclusive lock, encryption
    
  2. 验证数据文件:你可以查看 dbPath 目录中的数据文件,这些文件应该是加密的,并且无法直接读取其内容。

七、最佳实践和注意事项

  1. 安全管理密钥文件:确保密钥文件的权限设置正确,并且只有 MongoDB 服务用户可以访问。
  2. 定期轮换密钥:为了增强安全性,定期轮换加密密钥,并使用密钥管理服务进行自动化管理。
  3. 备份和恢复:在启用加密存储引擎时,确保备份策略涵盖加密数据的备份和恢复测试,以防止数据丢失。
  4. 性能影响:加密存储引擎可能会对数据库性能产生一定影响,特别是在高并发读写操作时。请根据实际需求和工作负载进行性能测试。

总结

MongoDB 的加密存储引擎提供了一种强大的方式来保护磁盘上的数据。通过上述步骤,你可以在 MongoDB 企业版中启用加密存储引擎,并集成第三方密钥管理服务来进一步增强安全性。在实际应用中,结合最佳实践来管理加密密钥和备份策略,确保数据在静态状态下的安全性。