面试题答案
一键面试静态数据加密
- 启用WiredTiger存储引擎加密:
- MongoDB从3.2版本开始,WiredTiger存储引擎支持透明数据加密(TDE)。要启用它,需配置一个加密密钥。首先,生成一个加密密钥文件,例如使用
openssl rand -base64 96 > keyFile
生成一个96字节的Base64编码密钥文件。 - 然后在
mongod.conf
文件中进行配置:
storage: engine: wiredTiger wiredTiger: engineConfig: encrypt: true encryptionKeyFile: /path/to/keyFile
- 重启
mongod
服务,此时所有新写入的数据都会在磁盘上加密存储。
- MongoDB从3.2版本开始,WiredTiger存储引擎支持透明数据加密(TDE)。要启用它,需配置一个加密密钥。首先,生成一个加密密钥文件,例如使用
- 字段级加密:
- 使用MongoDB的客户端加密功能。可以利用MongoDB的官方驱动程序和
mongodb - client - encryption
库。 - 首先生成一个主密钥(Master Key),并存储在密钥管理服务(KMS)中,如AWS KMS、Google Cloud KMS等。
- 然后在客户端代码中,配置加密上下文。例如在Node.js中:
const { MongoClient, ClientEncryption } = require('mongodb'); const { promisify } = require('util'); const kmsProviders = { aws: { accessKeyId: 'YOUR_AWS_ACCESS_KEY', secretAccessKey: 'YOUR_AWS_SECRET_KEY', region: 'YOUR_AWS_REGION' } }; const masterKey = { key: 'YOUR_MASTER_KEY_FROM_KMS', keyAltName: 'YOUR_KEY_ALT_NAME' }; const client = new MongoClient('mongodb://localhost:27017'); const clientEncryption = new ClientEncryption( kmsProviders, masterKey, { keyVaultNamespace: 'encryption.__keyVault' }, client ); const encryptOptions = { keyId: new Uint8Array([...]), // 从KMS获取的密钥ID algorithm: 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic' }; const encryptedField = clientEncryption.encrypt('sensitiveData', encryptOptions);
- 使用MongoDB的客户端加密功能。可以利用MongoDB的官方驱动程序和
传输中的数据加密
- TLS/SSL加密:
- 为MongoDB配置TLS/SSL加密,需获取SSL证书和私钥。可以从证书颁发机构(CA)获取,也可以使用OpenSSL生成自签名证书。
- 在
mongod.conf
文件中配置:
net: tls: mode: requireTLS certificateKeyFile: /path/to/cert_and_key.pem
- 客户端连接时也需要配置TLS/SSL选项。例如在MongoDB shell中:
mongo --tls --tlsCertificateKeyFile /path/to/client.pem "mongodb://localhost:27017"
可能遇到的性能问题及解决方案
- 静态数据加密性能问题:
- 性能问题:加密和解密操作会增加CPU负载,导致写入和读取性能下降。
- 解决方案:
- 使用高性能的CPU,以应对加密和解密带来的计算开销。
- 调整WiredTiger存储引擎的配置参数,如
cacheSizeGB
,确保有足够的内存缓存数据,减少磁盘I/O。例如:
storage: wiredTiger: engineConfig: cacheSizeGB: 2
- 传输中的数据加密性能问题:
- 性能问题:TLS/SSL加密会增加网络延迟和带宽消耗,特别是在高并发场景下。
- 解决方案:
- 使用硬件加速的SSL/TLS卸载设备,将加密和解密操作从服务器CPU转移到专门的硬件设备上。
- 优化网络拓扑,减少网络跳数和延迟,确保有足够的带宽。例如,使用高速网络连接和优化的网络设备。