11. MongoDB 安全认证与备份恢复

MongoDB 安全体系: RBAC 角色权限、TLS 加密、审计日志与备份恢复策略

生产环境的 MongoDB 需要系统的安全加固,包括访问控制、网络加密、审计日志和数据备份策略。本文覆盖 RBAC 角色权限、TLS 双向认证、备份恢复方案、审计合规、静态与字段级加密、网络安全隔离以及 MongoDB Atlas 安全功能,提供从原理到实操的完整指南。

1. RBAC 角色权限

1.1 创建用户与角色

MongoDB 从 2.6 版本开始引入基于角色的访问控制(RBAC),每个用户通过角色关联到具体的权限集合。启用 --auth 后,所有客户端连接必须携带凭据,未授权用户仅能访问 local 库。

// 启用认证后连接 admin 库
use admin;

db.createUser({
    user: "app_user",
    pwd: "secure_password",
    roles: [
        { role: "readWrite", db: "shop" },           // 读写 shop 库
        { role: "read", db: "analytics" }            // 只读 analytics
    ]
});

// 自定义角色
db.createRole({
    role: "orderProcessor",
    privileges: [
        { resource: { db: "shop", collection: "orders" },
          actions: ["find", "insert", "update"] },
        { resource: { db: "shop", collection: "inventory" },
          actions: ["find", "update"] }
    ],
    roles: []
});

1.2 内置角色

角色权限
read读取所有非系统集合
readWrite读写所有非系统集合
dbAdmin管理索引、统计、验证规则
userAdmin管理用户和角色
dbOwnerreadWrite + dbAdmin + userAdmin
clusterManager管理复制集/分片

1.3 LDAP 与 Kerberos 外部认证

在企业级部署中,将 MongoDB 接入中央身份认证系统(如 Active Directory 或 OpenLDAP)可避免在每个数据库节点上维护独立用户。LDAP 认证模式下,MongoDB 将用户名/密码转发至 LDAP 服务器进行验证,验证通过后返回预定义的映射角色。

# mongod.conf LDAP 配置
security:
  authorization: enabled
  ldap:
    servers: "ldap.company.internal:389"
    bind:
      queryUser: "cn=mongo-reader,ou=service,dc=company,dc=com"
      queryPassword: "ldappass"
    userToDNMapping:
      - match: "(.+)"
        ldapQuery: "DC=company,DC=com??sub?(userPrincipalName={0}@company.com)"
    authz:
      queryTemplate: "DC=company,DC=com??sub?(&(objectClass=group)(member={USER}))"

setParameter:
  authenticationMechanisms: "PLAIN"

Kerberos 提供更强健的单点登录能力,适合已经部署 MIT Kerberos 或 Active Directory 的环境下使用。MongoDB Community 版不内置 Kerberos 支持,需使用 MongoDB Enterprise 版本或构建时开启 GSSAPI 模块。Kerberos 使用票据(Ticket)机制,客户端获得 TGT 后向 KDC 申请 MongoDB 服务票据,后续通信无需再次传输密码。

1.4 x.509 证书认证

x.509 证书认证基于公钥基础设施(PKI),无需密码即可验证客户端身份。服务器和客户端各持有一份由受信任 CA 签发的证书,TLS 握手阶段交换证书并互相校验。该方式天然集成 TLS 加密,安全性高于密码认证。

# 使用 x.509 证书创建用户(证书主题需匹配)
use $external;
db.createUser({
    user: "CN=app-client,OU=Engineering,O=Company,L=Shanghai,ST=Shanghai,C=CN",
    roles: [
        { role: "readWrite", db: "shop" }
    ]
});

客户端连接时指定证书文件:

mongo --tls \
      --host mongo.example.com \
      --tlsCertificateKeyFile /certs/client.pem \
      --tlsCAFile /certs/ca.pem \
      --authenticationMechanism MONGODB-X509 \
      --authenticationDatabase '$external'

1.5 AWS IAM / Azure AD 外部认证

在公有云部署中,利用云厂商的身份服务可简化凭据管理。MongoDB Atlas 原生支持 AWS IAM 与 Azure AD 的联邦身份认证。自建 MongoDB 可通过 $external 数据库自定义认证插件实现类似效果。

# MongoDB Atlas 使用 AWS IAM 身份连接
mongo "mongodb+srv://cluster0.mongodb.net" \
  --authenticationMechanism MONGODB-AWS \
  --authenticationDatabase '$external' \
  --username <AWS_ACCESS_KEY_ID>

Atlas 会通过 AWS Signature Version 4 流程验证临时凭证的合法性,无需在应用配置中嵌入数据库密码。Azure AD 支持通过 OAuth 2.0 授权码流程获取访问令牌,随后以 MONGODB-OIDC 机制连接。

2. TLS 加密

2.1 单向 TLS 配置

MongoDB 支持 TLS/SSL 加密客户端与服务器之间的所有网络流量,防止数据在传输过程中被窃听或篡改。生产环境强烈建议启用 requireTLS 模式,拒绝所有明文连接。

# mongod.conf
net:
  tls:
    mode: requireTLS
    certificateKeyFile: /etc/ssl/mongodb.pem
    CAFile: /etc/ssl/ca.pem
    allowConnectionsWithoutCertificates: false

# 客户端连接
mongo --tls --host mongo.example.com \
      --tlsCertificateKeyFile client.pem \
      --tlsCAFile ca.pem

2.2 双向 TLS(mTLS)

单向 TLS 仅验证服务器身份,mTLS 则要求客户端也提供由同一 CA 签发的证书,实现双向身份校验。这种方式杜绝了仅靠密码泄露即可登入数据库的风险,是金融服务和政务系统的常见要求。

# mongod.conf mTLS 配置
net:
  tls:
    mode: requireTLS
    certificateKeyFile: /etc/ssl/mongodb.pem
    CAFile: /etc/ssl/ca.pem
    allowConnectionsWithoutCertificates: false
    # 可选:允许客户端证书中的 CN 作为用户名直接映射
    certificateSelector: subject=CN
# 客户端提供证书完成双向认证
mongosh --tls \
  --host mongo.example.com:27017 \
  --tlsCertificateKeyFile /certs/client.pem \
  --tlsCAFile /certs/ca.pem \
  --authenticationMechanism MONGODB-X509 \
  --authenticationDatabase '$external'

2.3 自动证书轮换(cert-manager)

在 Kubernetes 环境中,使用 cert-manager 结合 Let’s Encrypt 或自签 CA 可实现证书的自动签发与轮换。将证书以 Secret 形式挂载到 MongoDB Pod,设置较短的证书有效期(例如 90 天),cert-manager 将在到期前自动更新 Secret,配合 MongoDB 对证书文件变更的重新加载机制实现零停机轮换。

# cert-manager Certificate 资源
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: mongodb-tls
  namespace: database
spec:
  secretName: mongodb-tls-secret
  issuerRef:
    name: internal-ca-issuer
    kind: ClusterIssuer
  dnsNames:
    - mongo-0.mongo.database.svc.cluster.local
    - mongo-1.mongo.database.svc.cluster.local
    - mongo-2.mongo.database.svc.cluster.local
  usages:
    - server auth
    - client auth
  # 30 天后自动签发新证书
  renewBefore: 720h

2.4 TLS 传输性能影响

开启 TLS 后,CPU 需要额外处理握手、密钥协商和对称加密/解密操作。在大多数场景下,WireTiger 和操作系统层面的 AES-NI 指令集会显著加速加密,开销控制在 5% 至 15% 之间。如果工作负载以短连接为主(每次连接仅执行少量操作),TLS 握手延迟将成为主要瓶颈;务必使用连接池并保持长连接。对于极高吞吐量的场景,建议进行基准测试(如使用 mongoperf)以量化具体影响。

3. 备份恢复

3.1 mongodump / mongorestore

mongodump 执行逻辑层面的全量备份,导出 BSON 格式的数据文件。其优点是灵活、无需特殊权限,缺点是大规模集合备份耗时较长且恢复时重建索引开销显著。

# 备份(指定复制集)
mongodump --uri="mongodb://user:pass@rs0/mongo1:27017,mongo2:27017/shop?replicaSet=rs0" \
          --out=/backup/$(date +%Y%m%d)

# 恢复
mongorestore --uri="mongodb://user:pass@localhost/shop" \
             --dir=/backup/20240115/shop \
             --drop  # 恢复前删除现有集合

3.2 文件系统快照(更快)

文件系统快照利用 LVM 或云盘提供的块级快照能力,可在秒级完成备份。快照期间无需关心集合大小,但要求 MongoDB 开启 journal 并使用 WiredTiger 存储引擎。

# 使用 LVM 或云盘快照
# 要求开启 journal 并使用 WiredTiger

# 1. 锁定写入(仅 secondary 或 standalone)
mongo --eval "db.fsyncLock()"

# 2. 创建快照
lvcreate --snapshot --size 10G --name mongo-snap /dev/vg0/mongo

# 3. 解锁
db.fsyncUnlock()

3.3 oplog 还原到时间点

MongoDB 的 oplog(操作日志)记录了复制集上的所有写操作。备份后保留一段时间窗口内的 oplog dump,即可将数据恢复到精确的时间点。

# 基于 oplog 恢复到特定时间点
mongorestore --oplogReplay --oplogLimit "1705315200:1" /backup/

--oplogLimit 接受 BSON 时间戳格式(秒 : 计数器),恢复过程会重放截止到该时间戳之前的所有操作。

3.4 MongoDB Atlas 云备份

Atlas 提供持续云备份(Cloud Backup),基于底层云盘快照实现。无需手动维护备份脚本,可配置保留策略、跨区域复制以及按需时间点恢复(PITR)。Atlas 备份支持 AWS S3、Azure Blob、GCP Cloud Storage 作为底层存储,利用云厂商的多可用区耐久性保障数据安全。

# Atlas CLI 配置快照保留策略
atlas backups snapshots schedule update \
  --clusterName production-cluster \
  --retentionDays 30 \
  --projectId <PROJECT_ID>

# 触发手动快照
atlas backups snapshots create \
  --clusterName production-cluster \
  --description "pre-migration-snapshot" \
  --projectId <PROJECT_ID>

3.5 Percona Backup for MongoDB(PBM)

PBM 是 Percona 开源的分布式备份工具,专为 MongoDB 复制集和分片集群设计。它采用 物理热备份(基于 WiredTiger 的 hot backup API)结合 oplog,支持增量备份以及任意时间点恢复。

# 1. 安装 PBM Agent 到每个 MongoDB 节点
# 2. 配置远程存储(S3 或本地 MinIO)
pbm config --set storage.s3.bucket=mongo-backup \
           --set storage.s3.region=cn-north-1 \
           --set storage.s3.endpointUrl=https://s3.cn-north-1.amazonaws.com.cn

# 执行全量物理备份
pbm backup

# 查看备份列表
pbm list

# 恢复到指定时间点
pbm restore --time "2026-09-10T08:00:00Z"

3.6 增量备份策略

物理增量备份仅复制自上次备份以来发生变化的数据块,显著降低备份时间和存储占用。配合 oplog 的连续备份,可将 RPO 压缩到秒级。增量备份的实现要点:锁定 secondary 节点进行一致性快照、记录快照元数据、以及持续归档 oplog 到对象存储。

# 增量备份脚本示例(配合 LVM 或 ZFS)
#!/bin/bash
SNAP_DATE=$(date +%Y%m%d_%H%M%S)
MONGO_SECONDARY="mongo-secondary.internal:27017"

mongosh --eval "rs.secondaryOk(); db.fsyncLock()" "$MONGO_SECONDARY"

# 仅增量复制变化数据(以 ZFS send/receive 为例)
zfs snapshot tank/mongo@$SNAP_DATE
zfs send -i tank/mongo@last_snap tank/mongo@$SNAP_DATE | gzip > /backup/incr_$SNAP_DATE.gz

mongosh --eval "db.fsyncUnlock()" "$MONGO_SECONDARY"
echo "tank/mongo@$SNAP_DATE" > /backup/last_snap

4. 备份策略

策略RPORTO适用
每日 mongodump24h小时级中小数据量
hourly 增量 + 每日全量1h小时级大数据量
文件系统快照分钟级分钟级云环境
跨区复制集秒级分钟级高可用要求

4.1 备份验证与恢复测试

备份的价值只有在成功恢复时才能体现。生产环境应建立自动化的恢复演练流程,定期(如每月一次)在隔离环境中执行完整恢复,验证数据完整性与应用兼容性。

#!/bin/bash
# 自动化恢复验证脚本
RESTORE_TEST_DB="restore_test_$(date +%s)"

mongorestore --uri="mongodb://localhost:27017" \
             --dir=/backup/latest/shop \
             --nsInclude="shop.*" \
             --nsTo="${RESTORE_TEST_DB}.*"

# 校验文档数量
SOURCE_COUNT=$(mongosh --quiet --eval "db.orders.countDocuments()" shop)
RESTORE_COUNT=$(mongosh --quiet --eval "db.orders.countDocuments()" "$RESTORE_TEST_DB")

if [ "$SOURCE_COUNT" -eq "$RESTORE_COUNT" ]; then
    echo "验证通过: 文档数量一致 ($SOURCE_COUNT)"
else
    echo "验证失败: 源 $SOURCE_COUNT vs 恢复 $RESTORE_COUNT"
    exit 1
fi

# 清理测试数据库
mongosh --eval "db.dropDatabase()" "$RESTORE_TEST_DB"

4.2 异地灾备

单点备份无法应对区域性灾难(如可用区故障、自然灾害)。应将备份副本同步到地理隔离的远端存储,并建立独立的数据副本集群用于故障切换。Atlas 支持在多个地理区域间配置复制集成员,确保某区域完全不可用时仍能维持读写能力。

# 跨区域复制备份到异地的 MinIO
mc mirror --watch /backup/ local-minio/mongo-backup
mc mirror local-minio/mongo-backup remote-minio-dr/mongo-backup

4.3 合规要求(GDPR 数据保留)

GDPR 等隐私法规要求对个人数据实施严格的保留期限与删除义务。MongoDB 可通过 TTL(Time-To-Live)索引自动过期文档,或在备份层配置基于时间的保留策略。备份中的个人敏感数据需进行匿名化处理,或确保备份文件本身加密存储并限制访问范围。

// TTL 索引:30 天后自动删除日志记录
db.audit_logs.createIndex(
    { "createdAt": 1 },
    { expireAfterSeconds: 2592000 }
);

5. 审计日志与合规

5.1 auditLog 配置

MongoDB Enterprise 和 Atlas 提供审计功能,记录认证、授权、DDL 和管理命令等关键操作。审计日志对合规审计和安全事件追溯至关重要。

# mongod.conf
auditLog:
  destination: file
  format: JSON
  path: /var/log/mongodb/audit.log
  filter: '{ atype: { $in: ["authenticate", "authCheck", "insert", "update", "delete"] } }'

systemLog:
  path: /var/log/mongodb/mongod.log
  destination: file
  logAppend: true
  logRotate: reopen

filter 字段支持 BSON 表达式,可按操作类型、用户、数据库等维度进行细粒度过滤,避免生成过多无关日志。

5.2 日志轮转

审计日志文件可能快速增长,需通过 logRotate 命令或外部工具(如 logrotate)进行定期轮转,防止磁盘耗尽。

# 手动触发日志轮转
mongosh --eval "db.adminCommand({ logRotate: 1 })"

# logrotate 配置 /etc/logrotate.d/mongodb
/var/log/mongodb/*.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    create 0640 mongodb mongodb
    sharedscripts
    postrotate
        kill -SIGUSR1 $(cat /var/run/mongodb/mongod.pid)
    endscript
}

5.3 SIEM 集成

将审计日志和数据库日志实时推送至 SIEM 平台(如 Splunk、Elastic Security、Datadog)可实现集中化安全监控与威胁检测。通过 Filebeat 或 Fluentd 采集日志并标准化为 ECS(Elastic Common Schema)或 CEF(Common Event Format)格式,再投递至 SIEM 进行分析。

# filebeat.yml 示例
filebeat.inputs:
  - type: log
    paths:
      - /var/log/mongodb/audit.log
      - /var/log/mongodb/mongod.log
    json.keys_under_root: true
    json.add_error_key: true

output.elasticsearch:
  hosts: ["https://elasticsearch.internal:9200"]
  index: "mongodb-logs-%{+yyyy.MM.dd}"

processors:
  - add_host_metadata:
      when.not.contains.tags: forwarded
  - add_cloud_metadata: {}

6. 数据加密:静态加密与字段级加密

6.1 Encryption at Rest(静态加密)

静态加密确保存储在磁盘上的数据文件不可被未授权读取,即使物理磁盘被盗或快照泄露也能保护数据。MongoDB Enterprise 提供原生静态加密,使用 AES-256-CBC 或 AES-256-GCM 算法,密钥由本地密钥文件或外部 KMS 管理。

# mongod.conf 静态加密
security:
  enableEncryption: true
  encryptionKeyFile: /etc/mongodb-keyfile
  encryptionCipherMode: AES256-GCM

Linux 系统层面也可通过 LUKS(Linux Unified Key Setup)对 MongoDB 数据卷进行全盘加密,与 MongoDB 应用层加密相比,LUKS 对应用透明但管理粒度更粗。

# LUKS 加密 MongoDB 数据卷
sudo cryptsetup luksFormat /dev/vg0/mongo-data
sudo cryptsetup open /dev/vg0/mongo-data mongo-crypt
sudo mkfs.xfs /dev/mapper/mongo-crypt
sudo mount /dev/mapper/mongo-crypt /var/lib/mongodb

6.2 MongoDB Atlas 加密

Atlas 默认启用云厂商提供的静态加密(AWS EBS 加密 / Azure Disk Encryption / GCP PD encryption),并使用平台托管密钥或客户自管密钥(CMK)进行密匙管理。通过 AWS KMS、Azure Key Vault 或 GCP Cloud KMS 可以将密钥生命周期完全掌控在客户手中,满足合规要求。

6.3 字段级加密(CSFLE)

客户端字段级加密(Client-Side Field Level Encryption, CSFLE)在数据离开应用进程前即完成加密,MongoDB 服务器仅存储密文,无法获知明文内容。这种方式实现了"数据库即服务"场景下的端到端隐私保护。

// Node.js 驱动启用 CSFLE
const { MongoClient, ClientEncryption } = require('mongodb');

const keyVaultNamespace = 'encryption.__keyVault';
const kmsProviders = {
    local: {
        key: Buffer.from('<96-byte-base64-encoded-local-master-key>', 'base64')
    }
};

const schema = {
    "bsonType": "object",
    "properties": {
        "ssn": {
            "encrypt": {
                "bsonType": "string",
                "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"
            }
        },
        "creditCard": {
            "encrypt": {
                "bsonType": "string",
                "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random"
            }
        }
    }
};

const client = new MongoClient(uri, {
    autoEncryption: {
        keyVaultNamespace,
        kmsProviders,
        schemaMap: { 'shop.customers': schema }
    }
});

await client.connect();

Deterministic 算法保证同一明文产生相同密文,支持等值查询;Random 算法每次加密结果不同,安全性更高但不支持查询。CSFLE 需要 MongoDB 4.2+ 以及兼容的驱动版本(Node.js 3.3+、Java 3.11+、Python 3.9+)。

7. 网络安全

7.1 VPC / 防火墙 / 白名单

将 MongoDB 部署在私有子网中,仅通过应用层暴露端口,避免数据库节点直接暴露于公网。配合操作系统防火墙(iptables、firewalld)或云安全组,实施最小权限的端口白名单策略。

# iptables 仅允许应用服务器访问 MongoDB 27017
iptables -A INPUT -p tcp --dport 27017 -s 10.0.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 27017 -j DROP

# firewalld
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address=10.0.1.0/24 port protocol=tcp port=27017 accept'
firewall-cmd --reload

云厂商 Private Link(AWS PrivateLink、Azure Private Link、GCP Private Service Connect)允许 VPC 内资源通过私有 IP 地址访问 MongoDB Atlas 集群,流量不经过公共互联网,消除公网暴露风险。

# AWS CLI 创建 VPC Endpoint 连接 Atlas
aws ec2 create-vpc-endpoint \
  --vpc-id vpc-0a1b2c3d4e5f67890 \
  --service-name com.amazonaws.vpce.us-east-1.vpce-svc-atlasxxxxx \
  --vpc-endpoint-type Interface \
  --subnet-id subnet-0abc123def4567890 \
  --security-group-id sg-0123456789abcdef0

7.3 Atlas IP Access List

MongoDB Atlas 提供 IP 访问列表功能,仅允许来自特定 IP 地址段或安全组的连接请求。

# Atlas CLI 添加 IP 白名单
atlas accessLists create \
  --entry 203.0.113.0/24 \
  --comment "Office Network" \
  --projectId <PROJECT_ID>

# 临时开发访问(72 小时后自动过期)
atlas accessLists create \
  --entry 198.51.100.42/32 \
  --comment "Developer Temp Access" \
  --deleteAfter $(date -v+72H +%Y-%m-%dT%H:%M:%SZ) \
  --projectId <PROJECT_ID>

8. Atlas Security 功能详解

MongoDB Atlas 作为托管数据库服务,在安全方面内置了多项高级功能,简化了运维团队的配置负担。

8.1 Advanced Authentication

Atlas 支持灵活的多因素认证(MFA)与用户访问管理。组织管理员可强制所有团队成员启用 MFA,并通过集成 Okta、Azure AD、Google Workspace 等身份提供商实现 SSO 单点登录。项目级的数据库用户可通过 SCRAM-SHA-256、x.509 证书或联邦身份(AWS IAM / Azure AD / OIDC)进行认证。

# Atlas CLI 创建联邦认证数据库用户
atlas dbusers create \
  --username arn:aws:iam::123456789012:user/db-app \
  --role readWriteAnyDatabase \
  --awsIAMType USER \
  --projectId <PROJECT_ID>

8.2 Database Auditing

Atlas 的数据库审计功能无需手动配置审计过滤器,即可在 Web 控制台或 API 中查看所有数据库操作的完整日志。审计日志最长保留 30 天,并支持以 JSON 格式导出到 S3 或 Splunk。通过查询参数可以按数据库、集合、用户、操作类型进行多维度筛选。

# 下载审计日志存档
atlas logs download \
  --out /var/log/mongodb/atlas-audit.json.gz \
  --projectId <PROJECT_ID> \
  --clusterName production-cluster

8.3 Encryption(加密能力汇总)

Atlas 安全功能涵盖传输加密、静态加密及字段级加密:

层级功能默认状态
传输层TLS 1.2+强制启用,不可关闭
存储层EBS/Azure Disk/GCP PD 加密默认启用
存储层客户自管密钥(CMK)可选配置
应用层字段级加密(CSFLE)应用端配置

Atlas 支持通过 Private Endpoint 和 VPC Peering 实现网络隔离,并允许在集群配置中直接启用 Database Auditing 与 LDAP Authentication,无需手动维护 mongod.conf。结合 Cloud Backup 的连续快照与跨区复制能力,Atlas 为多云环境提供了一站式的安全合规方案。

延伸阅读

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「mongodb」更多文章

  1. 数据生命周期、TTL 与冷热归档
  2. $graphLookup 与层次结构建模
  3. GridFS 与大文件存储实践