1. 前言
数据安全是当今企业管理的重中之重。许多组织和机构都需要保护其数据,以避免被黑客攻击或数据泄露。在数据库中保存的信息储存了组织的重要数据,因此在数据库中实现数据加密可以确保数据的安全性。MongoDB是当今最流行的文档数据库之一,在保证文档数据的存储和高效查询的同时,也提供了强大的安全措施。本文将为您详细介绍如何在MongoDB中实现数据加密。
2. MongoDB的加密特性
MongoDB提供了许多数据加密选项。以下内容将详细阐述这些选项的交互方式以及如何在MongoDB中安装这些选项。
2.1 加密选项
MongoDB提供了两种数据加密选项—— Transpotation Layer Security (TLS)和Encryption at Rest。
TLS是通过网络保护数据的传输过程。MongoDB要求在TLS使用的情况下使用x.509证书。此外,MongoDB还提供了各种控制数据安全的设置,例如,验证客户端和服务端连接的身份、设置超时时间,以及允许或拒绝与特定服务器的连接等。
Encryption at Rest是用于保护MongoDB中存储的数据。此选项的数据加密是透明的,即用户无需进行额外的代码编写、调整或更改数据库设计。MongoDB支持客户端加密和服务器端加密,前者实现了在应用级别的数据加密,后者则实现了在MongoDB存储引擎级别的数据加密。此外,MongoDB还提供了访问控制,控制客户端访问数据库的权限。
2.2 安装加密选项
在MongoDB安装配置的过程中,您需要注意以下几点:
首先,MongoDB版本在3.0以上,才支持加密选项。
其次,TLS需要安装并配置OpenSSL库和相关的操作系统依赖项。
如需了解更多信息,请阅读官方文档。
3. TLS
TLS是对数据传送进行加密的一种方式。客户端使用TLS建立安全的连接,该连接支持多种加密协议,并且保证数据在传送过程中不会被篡改或盗取。以下是MongoDB中TLS的配置步骤。
3.1 申请证书
证书是对信息传输进行加密的必要配置。MongoDB要求使用x.509格式的证书。在本文中,将使用:Let's Encrypt免费证书证书。
使用Let’s Encrypt时,您需要遵循如下步骤:
# 安装Certbot
sudo apt update
sudo apt install certbot
# 申请证书(以下命令用于申请example.com域名的证书,您需要用自己的域名替换命令中的example.com)
sudo certbot certonly --standalone \
--preferred-challenges http -d example.com -d www.example.com \
--non-interactive --agree-tos
注意,您需要将--standalone选项更改为您正在使用的Web服务器。
3.2 开启TLS
开启TLS需要在mongod.conf文件中设置以下参数。
net:
port: 27017
bindIp: 127.0.0.1,192.0.2.1
tls:
mode: requireTLS
certificateKeyFile: /etc/letsencrypt/live/example.com/privkey.pem
certificateKeyFilePassword: eyJ2ZXJpZnkiOiAiOUhhdmJjM2MifQ==
CAFile: /etc/letsencrypt/live/example.com/fullchain.pem
注意,其中的certificateKeyFile字段和CAFile字段应该包含您的证书和公钥。
3.3 验证TLS是否开启
使用以下Mongo Shell命令验证TLS是否正常工作
mongo --tls --tlsCAFile /etc/letsencrypt/live/example.com/fullchain.pem --tlsCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
3.4 配置客户端加密
客户端加密是指在应用程序开发过程中在其代码中引用TLS选项。您可以使用驱动程序来配置客户端加密。
4. Encryption at Rest
数据库加密在数据存储引擎层确保数据的安全。Encryption at Rest支持客户端加密和服务器端加密,以下是MongoDB中Encryption at Rest的配置方法。
4.1 开启Encryption at Rest
开启Encryption at Rest需要在mongod.conf文件中设置下列参数。
storage:
dbPath: /data/db
journal:
enabled: true
engine: wiredTiger
wiredTiger:
encryption:
engine: AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic
keyId: UUID
注意,其中的engine字段应该设置为您所选用的加密引擎。wiredTiger,MongoDB的默认存储引擎,支持AES-256加密算法。另外,keyId字段是由MongoDB分配给每个加密密钥的唯一UUID。
4.2 创建加密密钥文件
MongoDB需要一个加密密钥来执行数据库加密。以下命令可创建包含密钥的加密密钥文件。
openssl rand -base64 96 > /data/SensitiveInformationFile
4.3 启用Encryption at Rest
启用Encryption at Rest可以用以下的mongod启动命令:
mongod --dbpath /data/db --encryptionKeyFile /data/SensitiveInformationFile
4.4 配置客户端加密
客户端加密实现在应用程序开发时引用驱动程序的Encryption at Rest选项。要启用客户端加密,请在应用程序驱动程序中使用以下代码:
from pymongo import MongoClient
from pymongo.encryption import ClientEncryption
from pymongo.encryption_options import AutoEncryptionOpts
client = MongoClient()
kms_providers = {
"local": {"key": masterkey},
}
key_vault_namespace = db.collection_name
auto_encrypt_opts = AutoEncryptionOpts(
kms_providers,
key_vault_namespace,
schema_map=my_schema_map)
client_encryption = ClientEncryption(
auto_encrypt_opts,
"/etc/letsencrypt/live/example.com/cert.pem")
encrypted = client_encryption.encrypt('hello, world!',
algorithm='AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic')
5. 总结
在本文中,我们介绍了MongoDB的加密选项,分别为TLS和Encryption at Rest,并详细阐述了如何安装这两种加密方式,并提供了配置和验证步骤。TLS是保障数据传送安全的加密选项,Encryption at Rest保障的是数据安全存储。此外,我们还介绍了客户端和服务器端加密的实现方法。了解这些选项和实现方法必将提高您的MongoDB数据安全性。