本文档风哥主要介绍MongoDB安全管理与认证相关知识,包括MongoDB安全管理的概念、认证方法、授权模型、安全规划、认证规划、安全最佳实践、实现方法以及生产案例等内容,风哥教程参考MongoDB官方文档Security内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 MongoDB安全管理的概念
MongoDB安全管理是指保护MongoDB数据库系统免受未授权访问、数据泄露、数据篡改等安全威胁的一系列措施和策略。MongoDB安全管理包括认证、授权、加密、审计等多个方面,是确保数据库安全的重要组成部分。更多视频教程www.fgedu.net.cn
- 认证:验证用户身份
- 授权:控制用户权限
- 加密:保护数据传输和存储
- 审计:记录数据库操作
- 网络安全:控制网络访问
- 漏洞管理:及时修复安全漏洞
1.2 MongoDB认证方法
MongoDB支持以下认证方法:
# 1. SCRAM认证
– SCRAM-SHA-1:使用SHA-1哈希算法
– SCRAM-SHA-256:使用SHA-256哈希算法(推荐)
– 是MongoDB 3.0+的默认认证方法
– 安全可靠,支持密码哈希存储
# 2. X.509证书认证
– 使用X.509证书进行身份验证
– 适合企业级安全要求
– 支持双向TLS/SSL认证
# 3. LDAP认证
– 通过LDAP服务器进行身份验证
– 适合已有LDAP基础设施的企业
– 支持集成企业身份管理系统
# 4. Kerberos认证
– 使用Kerberos协议进行身份验证
– 适合已有Kerberos基础设施的企业
– 支持单点登录
# 5. 用户名密码认证
– 简单的用户名和密码认证
– 是最基本的认证方法
– 适合小型部署
1.3 MongoDB授权模型
MongoDB授权模型基于角色的访问控制(RBAC),通过为用户分配角色来控制其对数据库资源的访问权限。MongoDB内置了多种角色,同时支持自定义角色。
# 1. 内置角色
– 数据库用户角色:read, readWrite
– 数据库管理角色:dbAdmin, dbOwner, userAdmin
– 集群管理角色:clusterAdmin, clusterManager, clusterMonitor, hostManager
– 备份恢复角色:backup, restore
– 所有数据库角色:readAnyDatabase, readWriteAnyDatabase, userAdminAnyDatabase, dbAdminAnyDatabase
– 超级用户角色:root
# 2. 自定义角色
– 可以基于内置角色创建自定义角色
– 可以定义更细粒度的权限
– 适合特定业务需求
# 3. 权限类型
– 读权限:查询数据
– 写权限:插入、更新、删除数据
– 管理权限:创建索引、集合等
– 管理用户权限:创建、修改用户
– 集群管理权限:管理集群配置
Part02-生产环境规划与建议
2.1 MongoDB安全规划
MongoDB安全规划要点:
# 1. 安全风险评估
– 识别潜在的安全威胁
– 评估数据敏感性
– 确定安全合规要求
# 2. 安全架构设计
– 网络隔离:使用防火墙隔离MongoDB服务器
– 加密传输:启用TLS/SSL
– 加密存储:使用存储级加密
– 访问控制:实施最小权限原则
# 3. 认证授权规划
– 选择合适的认证方法
– 设计角色和权限体系
– 制定用户管理策略
# 4. 审计与监控
– 启用审计日志
– 监控安全事件
– 定期安全检查
# 5. 应急响应
– 制定安全事件响应计划
– 定期演练
– 备份恢复策略
# 6. 合规性
– 满足行业合规要求(如PCI DSS、HIPAA等)
– 定期合规性检查
– 文档化安全措施
2.2 MongoDB认证规划
MongoDB认证规划要点:
- 认证方法选择:根据安全需求和基础设施选择合适的认证方法
- 用户管理:建立用户创建、修改、删除的流程
- 密码策略:制定密码强度要求和定期更换策略
- 证书管理:如果使用X.509认证,建立证书颁发和管理流程
- 集成企业身份系统:如果使用LDAP或Kerberos,确保与企业身份系统集成
2.3 MongoDB安全最佳实践
MongoDB安全最佳实践:
- 启用认证:始终启用认证,避免无密码访问
- 使用强密码:设置强密码策略,定期更换密码
- 最小权限原则:为用户分配最小必要的权限
- 启用TLS/SSL:加密数据传输
- 网络隔离:限制MongoDB服务器的网络访问
- 定期审计:启用审计日志,定期检查安全事件
- 备份数据:定期备份数据,确保数据安全
- 更新版本:及时更新MongoDB版本,修复安全漏洞
- 监控安全事件:设置安全事件告警
- 文档化安全策略:记录安全配置和策略
Part03-生产环境项目实施方案
3.1 MongoDB安全实现
3.1.1 启用认证
# 1. 创建管理员用户
# 首先以无认证模式启动MongoDB
$ mongosh
fgedudb> use admin
fgedudb> db.createUser({
user: “admin”,
pwd: “admin123”,
roles: [ { role: “root”, db: “admin” } ]
})
# 2. 重启MongoDB并启用认证
# 修改MongoDB配置文件
$ vi /mongodb/app/mongodb.conf
security:
authorization: enabled
# 重启MongoDB服务
$ systemctl restart mongodb
# 3. 验证认证是否启用
$ mongosh –username admin –password admin123 –authenticationDatabase admin
fgedudb> db.runCommand({ connectionStatus: 1 })
3.1.2 启用TLS/SSL
# 1. 生成证书
$ openssl req -newkey rsa:2048 -new -x509 -days 365 -nodes -out mongodb.pem -keyout mongodb.key
# 2. 修改MongoDB配置文件
$ vi /mongodb/app/mongodb.conf
net:
port: 27017
bindIp: 0.0.0.0
tls:
mode: requireTLS
certificateKeyFile: /mongodb/app/mongodb.pem
# 3. 重启MongoDB服务
$ systemctl restart mongodb
# 4. 使用TLS连接
$ mongosh –username admin –password admin123 –authenticationDatabase admin –tls
3.2 MongoDB认证实现
3.2.1 创建用户
# 1. 创建数据库用户
fgedudb> use fgedudb
fgedudb> db.createUser({
user: “fgedu”,
pwd: “fgedu123”,
roles: [ { role: “readWrite”, db: “fgedudb” } ]
})
# 2. 创建只读用户
fgedudb> use fgedudb
fgedudb> db.createUser({
user: “fgedu_read”,
pwd: “fgedu_read123”,
roles: [ { role: “read”, db: “fgedudb” } ]
})
# 3. 创建管理员用户
fgedudb> use admin
fgedudb> db.createUser({
user: “fgedu_admin”,
pwd: “fgedu_admin123”,
roles: [
{ role: “userAdminAnyDatabase”, db: “admin” },
{ role: “dbAdminAnyDatabase”, db: “admin” }
]
})
3.2.2 管理用户
# 1. 查看用户
fgedudb> use fgedudb
fgedudb> db.getUsers()
# 2. 修改用户密码
fgedudb> use fgedudb
fgedudb> db.changeUserPassword(“fgedu”, “new_password123”)
# 3. 修改用户角色
fgedudb> use fgedudb
fgedudb> db.updateUser(“fgedu”, {
roles: [ { role: “readWrite”, db: “fgedudb” }, { role: “read”, db: “fgedudb01” } ]
})
# 4. 删除用户
fgedudb> use fgedudb
fgedudb> db.dropUser(“fgedu_read”)
3.3 MongoDB授权实现
3.3.1 创建自定义角色
# 1. 创建自定义角色
fgedudb> use fgedudb
fgedudb> db.createRole({
role: “fgedu_writer”,
privileges: [
{ resource: { db: “fgedudb”, collection: “” }, actions: [ “find”, “insert”, “update”, “delete” ] },
{ resource: { db: “fgedudb”, collection: “system.js” }, actions: [ “find” ] }
],
roles: []
})
# 2. 为用户分配自定义角色
fgedudb> use fgedudb
fgedudb> db.updateUser(“fgedu”, {
roles: [ { role: “fgedu_writer”, db: “fgedudb” } ]
})
# 3. 查看角色权限
fgedudb> use fgedudb
fgedudb> db.getRole(“fgedu_writer”, { showPrivileges: true })
3.3.2 权限管理
# 1. 查看用户权限
fgedudb> use fgedudb
fgedudb> db.getUser(“fgedu”, { showPrivileges: true })
# 2. 测试权限
fgedudb> use fgedudb
fgedudb> db.runCommand({ connectionStatus: 1, showPrivileges: true })
# 3. 限制集合访问
fgedudb> use fgedudb
fgedudb> db.createRole({
role: “fgedu_collection_reader”,
privileges: [
{ resource: { db: “fgedudb”, collection: “fgedu_users” }, actions: [ “find” ] }
],
roles: []
})
Part04-生产案例与实战讲解
4.1 MongoDB安全案例一:启用认证
4.1.1 需求分析
需要为MongoDB启用认证,确保只有授权用户才能访问数据库。
4.1.2 解决方案
# 1. 环境准备
# MongoDB版本:4.4+
# 操作系统:Oracle Linux 9.3
# 2. 步骤一:创建管理员用户
# 以无认证模式启动MongoDB
$ mongosh
fgedudb> use admin
fgedudb> db.createUser({
user: “admin”,
pwd: “admin123”,
roles: [ { role: “root”, db: “admin” } ]
})
# 3. 步骤二:修改配置文件
$ vi /mongodb/app/mongodb.conf
security:
authorization: enabled
# 4. 步骤三:重启MongoDB服务
$ systemctl restart mongodb
# 5. 步骤四:验证认证
$ mongosh –username admin –password admin123 –authenticationDatabase admin
fgedudb> db.runCommand({ connectionStatus: 1 })
# 6. 步骤五:创建应用用户
fgedudb> use fgedudb
fgedudb> db.createUser({
user: “fgedu”,
pwd: “fgedu123”,
roles: [ { role: “readWrite”, db: “fgedudb” } ]
})
# 7. 步骤六:测试应用用户
$ mongosh –username fgedu –password fgedu123 –authenticationDatabase fgedudb
fgedudb> use fgedudb
fgedudb> db.fgedu_users.insertOne({ name: “fgedu01”, email: “fgedu01@fgedu.net.cn” })
fgedudb> db.fgedu_users.find()
4.2 MongoDB安全案例二:角色管理
4.2.1 需求分析
需要为不同用户分配不同的角色和权限,确保最小权限原则。
4.2.2 解决方案
# 1. 环境准备
# 已启用认证的MongoDB实例
# 2. 步骤一:创建角色
fgedudb> use fgedudb
fgedudb> db.createRole({
role: “fgedu_app_role”,
privileges: [
{ resource: { db: “fgedudb”, collection: “fgedu_users” }, actions: [ “find”, “insert”, “update”, “delete” ] },
{ resource: { db: “fgedudb”, collection: “fgedu_orders” }, actions: [ “find”, “insert” ] },
{ resource: { db: “fgedudb”, collection: “fgedu_products” }, actions: [ “find” ] }
],
roles: []
})
# 3. 步骤二:创建只读角色
fgedudb> use fgedudb
fgedudb> db.createRole({
role: “fgedu_readonly_role”,
privileges: [
{ resource: { db: “fgedudb”, collection: “” }, actions: [ “find” ] }
],
roles: []
})
# 4. 步骤三:创建用户并分配角色
fgedudb> use fgedudb
fgedudb> db.createUser({
user: “fgedu_app”,
pwd: “fgedu_app123”,
roles: [ { role: “fgedu_app_role”, db: “fgedudb” } ]
})
fgedudb> use fgedudb
fgedudb> db.createUser({
user: “fgedu_report”,
pwd: “fgedu_report123”,
roles: [ { role: “fgedu_readonly_role”, db: “fgedudb” } ]
})
# 5. 步骤四:测试用户权限
# 测试应用用户
$ mongosh –username fgedu_app –password fgedu_app123 –authenticationDatabase fgedudb
fgedudb> use fgedudb
fgedudb> db.fgedu_users.insertOne({ name: “fgedu02”, email: “fgedu02@fgedu.net.cn” }) // 成功
fgedudb> db.fgedu_products.find() // 成功
fgedudb> db.fgedu_products.insertOne({ name: “Product 1”, price: 100 }) // 失败,无权限
# 测试只读用户
$ mongosh –username fgedu_report –password fgedu_report123 –authenticationDatabase fgedudb
fgedudb> use fgedudb
fgedudb> db.fgedu_users.find() // 成功
fgedudb> db.fgedu_users.insertOne({ name: “fgedu03”, email: “fgedu03@fgedu.net.cn” }) // 失败,无权限
4.3 MongoDB安全案例三:网络安全
4.3.1 需求分析
需要加强MongoDB的网络安全,限制网络访问,防止未授权访问。
4.3.2 解决方案
# 1. 环境准备
# MongoDB实例
# 防火墙
# 2. 步骤一:配置bindIp
$ vi /mongodb/app/mongodb.conf
net:
port: 27017
bindIp: 127.0.0.1,192.168.1.100 // 只允许指定IP访问
# 3. 步骤二:配置防火墙
$ firewall-cmd –permanent –add-rich-rule=’rule family=”ipv4″ source address=”192.168.1.0/24″ port protocol=”tcp” port=”27017″ accept’
$ firewall-cmd –reload
# 4. 步骤三:启用TLS/SSL
# 生成证书
$ openssl req -newkey rsa:2048 -new -x509 -days 365 -nodes -out mongodb.pem -keyout mongodb.key
# 修改配置文件
$ vi /mongodb/app/mongodb.conf
net:
port: 27017
bindIp: 127.0.0.1,192.168.1.100
tls:
mode: requireTLS
certificateKeyFile: /mongodb/app/mongodb.pem
# 5. 步骤四:重启MongoDB服务
$ systemctl restart mongodb
# 6. 步骤五:测试网络访问
# 从允许的IP访问
$ mongosh –username fgedu –password fgedu123 –authenticationDatabase fgedudb –host 192.168.1.100 –tls
# 从禁止的IP访问
$ mongosh –username fgedu –password fgedu123 –authenticationDatabase fgedudb –host 192.168.1.200 // 连接失败
Part05-风哥经验总结与分享
5.1 MongoDB安全技巧
MongoDB安全技巧:
- 启用认证:始终启用认证,避免无密码访问
- 使用强密码:设置强密码策略,定期更换密码
- 最小权限原则:为用户分配最小必要的权限
- 启用TLS/SSL:加密数据传输
- 网络隔离:限制MongoDB服务器的网络访问
- 定期审计:启用审计日志,定期检查安全事件
- 备份数据:定期备份数据,确保数据安全
- 更新版本:及时更新MongoDB版本,修复安全漏洞
- 监控安全事件:设置安全事件告警
- 文档化安全策略:记录安全配置和策略
5.2 MongoDB认证技巧
MongoDB认证技巧:
- 选择合适的认证方法:根据安全需求和基础设施选择合适的认证方法
- 使用SCRAM-SHA-256:推荐使用SCRAM-SHA-256认证方法,安全性更高
- 集成企业身份系统:如果企业已有LDAP或Kerberos基础设施,考虑集成
- 定期更换密码:制定密码更换策略,定期更新用户密码
- 使用X.509证书:对于高安全要求的场景,使用X.509证书认证
- 管理用户生命周期:及时删除不再需要的用户
- 使用连接字符串:在应用程序中使用安全的连接字符串
- 避免硬编码密码:不要在代码中硬编码密码,使用环境变量或配置文件
5.3 MongoDB安全监控
MongoDB安全监控建议:
- 启用审计日志:记录所有数据库操作,便于安全审计
- 监控认证失败:设置认证失败告警,及时发现暴力破解尝试
- 监控权限变更:监控用户和角色的权限变更
- 监控网络访问:监控异常的网络访问模式
- 使用MongoDB Atlas:如果使用MongoDB Atlas,利用其安全监控工具
- 定期安全扫描:使用安全扫描工具检查MongoDB实例的安全配置
- 漏洞管理:及时了解和修复MongoDB的安全漏洞
- 安全事件响应:制定安全事件响应计划,定期演练
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
