mongo DB 安全架构
MongoDB 安全架构一览图
- 3A+encrypt
MongoDB 用户认证方式
MongoDB 集群节点认证
- Keyfile:将统一 Keyfile 文件拷贝到不同的节点
Keyfile 就是一个字符串 - X.509: 基于证书的认证模式,推荐不同的节点使用不同的证书
MongoDB 鉴权 – 基于角色的权限机制
- MongoDB 授权基于角色的权限控制,不同的权限的用户对数据库的操作不同
角色的组成
MongoDB 内置角色及权限继承关系
自定义角色
db.createRole( {
role: 'sampleRole',
privileges: [{
resource: {
db: 'sampledb', collection: 'sample'
},
actions: ["update"]
}],
roles: [{
role: 'read',
db: 'sampledb'
}]
} )
db.createUser( {
user: 'sampleUser',
pwd: 'password',
roles: [{role: 'sampleRole', db: 'admin'}]
} )
传输加密
- MongoDB 支持 TLS/SSL 来加密 MongoDB 的所有网络传输(客户端应用和服务器端之间,内部复制集之间)。
TLS/SSL 确保 MongoDB 网络传输仅可由允许的客户端读取
落盘加密
- 生成 master key,用来加密每一个数据库的 key
- 生成每一个数据库的 key,用来加密各自的数据库
- 基于生成的数据库 key 加密各个数据库中的数据
- Key 管理(只针对 master key,数据库 key 保存在数据库内部)
字段级加密
-
单独文档字段通过自身密钥加密
-
数据库只看见密文
-
优势
- 便捷:自动及透明
- 任务分开:(简化基于服务的系统步骤,因为没有服务工程师能够看到纯文本)
- 合规:监管“被遗忘权”
- 快速:最小性能代偿
审计
- 数据库等记录型系统通常使用审计监控数据库相关的一些活动,以及对一些可疑的
操作进行调查 - 本地文件 或 syslog,
- 记录内容:Schema change (DDL),CRUD 操作 (DML),用户认证
审计配置参数举例
-
审计日志记录到 syslog
- –auditDestination syslog
-
审计日志记录写到指定文件
- –auditDestination file --auditFormat JSON --auditPath /path/to/auditLog.json
-
对删表和创建表动作进行审计日志记录
- –auditDestination file --auditFormat JSON --auditPath auditLog.json –
auditFilter '{atype: {$in: [“createCollection”, “dropCollection”]}}’
- –auditDestination file --auditFormat JSON --auditPath auditLog.json –
MongoDB 安全架构总结
安全加固实践
合理配置权限
• 创建管理员
• 使用复杂密码
• 不同用户不同账户
• 应用隔离
• 最小权限原则
启用加密
• 使用 TLS 作为传输协议
• 使用4.2版本的字段级加密对敏感字段加密
• 如有需要,使用企业版进行落盘加密
• 如有需要,使用企业版并启用审计日志
网络和操作系统加固
- 使用专用用户运行 MongoDB
- 不建议在操作系统层使用 root 用户运行 MongoDB
- 限制网络开放度
■ 通过防火墙,iptables 规则控制对 MongoDB 的访问
■ 使用 VPN/VPCs 可以创建一个安全通道,MongoDB 服务不应该直接暴露在互联网上
■ 使用白名单列表限制允许访问的网段
■ 使用 bind_ip 绑定一个具体地址
■ 修改默认监听端口:27017 - 使用安全配置选项运行 MongoDB
■ 如果不需要执行 JavaScript 脚本,使用 --noscripting 禁止脚本执行
■ 如果使用老版本 MongoDB,关闭 http 接口 : net.http.enabled = False net.http.JSONPEnabled = False
■ 如果使用老版本 MongoDB,关闭 Rest API 接口: net.http.RESTInterfaceEnabled = False
Demo
- 方式一: 命令行方式通过 “–auth” 参数
- 方式二: 配置文件方式在 security 下添加 “authorization: enabled”
mongod –-auth –-port 27017 –-dbpath /data/db
mongo
> use admin
> db.createUser({user: "superuser", pwd: "password", roles: [{role: "root", db:
"admin"}]} )
- 安全登录,执行如下命令查看认证机制
mongo -u superuser -p password --authenticationDatabase admin
db.runCommand({getParameter: 1, authenticationMechanisms: 1})
创建应用用户
db.createUser({user: "reader", pwd: "abc123", roles: [{ role:"read", db: "acme" }]})
db.createUser({user: "writer", pwd: "abc123", roles: [{ role:"readWrite", db: "acme" }]})