本文档风哥主要介绍MongoDB权限认证与安全配置,包括MongoDB安全基础概念、认证机制、授权机制、安全规划、认证规划、授权规划、启用认证、用户创建与管理、角色管理、认证实战案例、授权实战案例、安全加固实战等内容,风哥教程参考MongoDB官方文档Security内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 MongoDB安全基础概念
MongoDB的安全包括认证、授权、加密、审计等多个方面。在生产环境中,确保MongoDB的安全性是非常重要的。更多视频教程www.fgedu.net.cn
- 认证(Authentication):验证用户身份的过程
- 授权(Authorization):控制用户对资源的访问权限
- 加密(Encryption):保护数据传输和存储安全
- 审计(Auditing):记录用户操作行为
- 网络安全:限制网络访问,防止未授权访问
1.2 MongoDB认证机制
MongoDB支持多种认证机制,用于验证用户身份:
## 内置认证机制
– **SCRAM(Default):** Salted Challenge Response Authentication Mechanism
– **x.509证书认证:** 使用SSL/TLS证书进行认证
– **LDAP认证:** 通过LDAP服务器进行认证
– **Kerberos认证:** 使用Kerberos进行认证
## 认证数据库
– **admin数据库:** 存储用户信息和角色定义
– **local数据库:** 存储副本集和分片集群的元数据
– **自定义数据库:** 可以在特定数据库中创建用户
## 认证流程
1. 用户提供用户名和密码
2. MongoDB验证用户身份
3. 生成认证令牌
4. 用户使用令牌访问数据库
1.3 MongoDB授权机制
MongoDB使用基于角色的访问控制(RBAC)进行授权:
## 内置角色
– **数据库用户角色:** read, readWrite
– **数据库管理角色:** dbAdmin, dbOwner, userAdmin
– **集群管理角色:** clusterAdmin, clusterManager, clusterMonitor, hostManager
– **备份恢复角色:** backup, restore
– **超级用户角色:** root
– **内部角色:** __system
## 自定义角色
– 基于内置角色创建
– 定义特定的权限
– 应用于特定的数据库
## 权限类型
– **集合级权限:** 对集合的操作权限
– **数据库级权限:** 对数据库的操作权限
– **集群级权限:** 对集群的操作权限
– **系统级权限:** 对系统的操作权限
Part02-生产环境规划与建议
2.1 MongoDB安全规划
在生产环境中,需要进行全面的安全规划:
## 网络安全
– 限制绑定IP地址
– 使用防火墙限制访问
– 启用SSL/TLS加密传输
– 配置网络隔离
## 认证规划
– 启用认证
– 使用强密码策略
– 定期更新密码
– 使用x.509证书(可选)
## 授权规划
– 最小权限原则
– 基于角色的访问控制
– 定期审查权限
– 分离职责
## 审计规划
– 启用审计日志
– 配置审计过滤器
– 定期检查审计日志
– 存储审计日志
## 加密规划
– 传输加密(SSL/TLS)
– 静态加密(可选)
– 密钥管理
– 证书管理
2.2 MongoDB认证规划
MongoDB认证规划的建议:
## 认证机制选择
– **SCRAM:** 默认认证机制,适用于大多数场景
– **x.509:** 适用于需要更高安全性的场景
– **LDAP:** 适用于企业内部已有LDAP系统的场景
– **Kerberos:** 适用于企业内部已有Kerberos系统的场景
## 用户管理
– 创建管理员用户
– 创建应用程序用户
– 创建只读用户
– 创建监控用户
## 密码策略
– 使用强密码
– 定期更新密码
– 密码长度至少8位
– 包含大小写字母、数字和特殊字符
## 认证数据库
– 管理员用户:admin数据库
– 应用程序用户:对应业务数据库
– 监控用户:admin数据库
2.3 MongoDB授权规划
MongoDB授权规划的建议:
## 角色规划
– **超级管理员:** root角色
– **数据库管理员:** dbAdminAnyDatabase角色
– **安全管理员:** userAdminAnyDatabase角色
– **备份管理员:** backup, restore角色
– **监控管理员:** clusterMonitor角色
– **应用程序用户:** readWrite角色
– **只读用户:** read角色
## 权限分配
– 最小权限原则
– 基于业务需求分配权限
– 定期审查权限
– 及时撤销不必要的权限
## 角色继承
– 利用内置角色
– 创建自定义角色
– 合理使用角色继承
– 简化权限管理
## 权限审计
– 定期检查用户权限
– 监控权限变更
– 记录权限操作
– 确保权限合规
Part03-生产环境项目实施方案
3.1 MongoDB启用认证
3.1.1 配置认证
## 修改配置文件
$ cat > /mongodb/conf/mongod.conf << EOF
# mongod.conf
# 安全配置
security:
authorization: enabled
EOF
## 重启MongoDB服务
$ sudo -u mongodb /mongodb/app/bin/mongod --config /mongodb/conf/mongod.conf --shutdown
$ sudo -u mongodb /mongodb/app/bin/mongod --config /mongodb/conf/mongod.conf
3.1.2 创建管理员用户
$ /mongodb/app/bin/mongosh
# 切换到admin数据库
fgedu.net.cn> use admin
# 创建管理员用户
fgedu.net.cn> db.createUser({
… user: “fgedu”,
… pwd: “fgedu123”,
… roles: [ { role: “userAdminAnyDatabase”, db: “admin” }, “readWriteAnyDatabase” ]
… })
# 验证用户创建
fgedu.net.cn> db.getUsers()
3.2 MongoDB用户创建与管理
3.2.1 创建应用程序用户
$ /mongodb/app/bin/mongosh -u fgedu -p fgedu123 –authenticationDatabase admin
# 切换到业务数据库
fgedu.net.cn> use fgedudb
# 创建应用程序用户
fgedu.net.cn> db.createUser({
… user: “fgedu_app”,
… pwd: “fgedu_app123”,
… roles: [ { role: “readWrite”, db: “fgedudb” } ]
… })
# 验证用户创建
fgedu.net.cn> db.getUsers()
3.2.2 创建只读用户
$ /mongodb/app/bin/mongosh -u fgedu -p fgedu123 –authenticationDatabase admin
# 切换到业务数据库
fgedu.net.cn> use fgedudb
# 创建只读用户
fgedu.net.cn> db.createUser({
… user: “fgedu_read”,
… pwd: “fgedu_read123”,
… roles: [ { role: “read”, db: “fgedudb” } ]
… })
# 验证用户创建
fgedu.net.cn> db.getUsers()
3.2.3 用户管理
## 修改用户密码
fgedu.net.cn> db.changeUserPassword(“fgedu_app”, “new_password123”)
## 更新用户角色
fgedu.net.cn> db.updateUser(“fgedu_app”, {
… roles: [ { role: “readWrite”, db: “fgedudb” }, { role: “read”, db: “fgedudb02” } ]
… })
## 删除用户
fgedu.net.cn> db.dropUser(“fgedu_read”)
## 查看用户信息
fgedu.net.cn> db.getUser(“fgedu_app”)
3.3 MongoDB角色管理
3.3.1 创建自定义角色
$ /mongodb/app/bin/mongosh -u fgedu -p fgedu123 –authenticationDatabase admin
# 切换到admin数据库
fgedu.net.cn> use admin
# 创建自定义角色
fgedu.net.cn> db.createRole({
… role: “fgedu_backup_role”,
… privileges: [
… { resource: { db: “*”, collection: “*” }, actions: [ “find”, “listCollections”, “listDatabases” ] },
… { resource: { db: “admin”, collection: “system.users” }, actions: [ “find” ] }
… ],
… roles: [ { role: “backup”, db: “admin” } ]
… })
# 验证角色创建
fgedu.net.cn> db.getRole(“fgedu_backup_role”, { showPrivileges: true })
3.3.2 角色管理
## 更新角色
fgedu.net.cn> db.updateRole(“fgedu_backup_role”, {
… privileges: [
… { resource: { db: “*”, collection: “*” }, actions: [ “find”, “listCollections”, “listDatabases” ] },
… { resource: { db: “admin”, collection: “system.users” }, actions: [ “find” ] },
… { resource: { db: “admin”, collection: “system.version” }, actions: [ “find” ] }
… ],
… roles: [ { role: “backup”, db: “admin” } ]
… })
## 删除角色
fgedu.net.cn> db.dropRole(“fgedu_backup_role”)
## 查看所有角色
fgedu.net.cn> db.getRoles({ showPrivileges: true })
Part04-生产案例与实战讲解
4.1 MongoDB认证实战案例
以下是MongoDB认证的实战案例:
## 环境信息
– MongoDB版本:5.0.13
– 部署模式:单节点
– 操作系统:Oracle Linux 9.3
## 启用认证
### 1. 修改配置文件
$ cat > /mongodb/conf/mongod.conf << EOF
# mongod.conf
storage:
dbPath: /mongodb/fgdata
journal:
enabled: true
systemLog:
destination: file
logAppend: true
path: /mongodb/log/mongod.log
net:
port: 27017
bindIp: 0.0.0.0
processManagement:
fork: true
pidFilePath: /mongodb/app/mongod.pid
security:
authorization: enabled
EOF
### 2. 重启MongoDB服务
$ sudo -u mongodb /mongodb/app/bin/mongod --config /mongodb/conf/mongod.conf --shutdown
$ sudo -u mongodb /mongodb/app/bin/mongod --config /mongodb/conf/mongod.conf
### 3. 创建管理员用户
$ /mongodb/app/bin/mongosh
fgedu.net.cn> use admin
fgedu.net.cn> db.createUser({
… user: “fgedu”,
… pwd: “fgedu123”,
… roles: [ { role: “userAdminAnyDatabase”, db: “admin” }, “readWriteAnyDatabase” ]
… })
### 4. 验证认证
$ /mongodb/app/bin/mongosh
fgedu.net.cn> show dbs
# 应该报错,因为没有认证
$ /mongodb/app/bin/mongosh -u fgedu -p fgedu123 –authenticationDatabase admin
fgedu.net.cn> show dbs
# 应该成功显示数据库列表
4.2 MongoDB授权实战案例
以下是MongoDB授权的实战案例:
## 环境信息
– MongoDB版本:5.0.13
– 部署模式:单节点
– 操作系统:Oracle Linux 9.3
## 创建用户和角色
### 1. 连接MongoDB
$ /mongodb/app/bin/mongosh -u fgedu -p fgedu123 –authenticationDatabase admin
### 2. 创建业务数据库
fgedu.net.cn> use fgedudb
fgedu.net.cn> db.createCollection(“fgedu_collection”)
### 3. 创建应用程序用户
fgedu.net.cn> db.createUser({
… user: “fgedu_app”,
… pwd: “fgedu_app123”,
… roles: [ { role: “readWrite”, db: “fgedudb” } ]
… })
### 4. 创建只读用户
fgedu.net.cn> db.createUser({
… user: “fgedu_read”,
… pwd: “fgedu_read123”,
… roles: [ { role: “read”, db: “fgedudb” } ]
… })
### 5. 验证授权
#### 应用程序用户验证
$ /mongodb/app/bin/mongosh -u fgedu_app -p fgedu_app123 –authenticationDatabase fgedudb
fgedu.net.cn> use fgedudb
fgedu.net.cn> db.fgedu_collection.insertOne({name: “test”, age: 30})
# 应该成功
fgedu.net.cn> db.fgedu_collection.find()
# 应该成功
#### 只读用户验证
$ /mongodb/app/bin/mongosh -u fgedu_read -p fgedu_read123 –authenticationDatabase fgedudb
fgedu.net.cn> use fgedudb
fgedu.net.cn> db.fgedu_collection.find()
# 应该成功
fgedu.net.cn> db.fgedu_collection.insertOne({name: “test2”, age: 25})
# 应该报错,因为没有写权限
4.3 MongoDB安全加固实战
以下是MongoDB安全加固的实战案例:
## 环境信息
– MongoDB版本:5.0.13
– 部署模式:单节点
– 操作系统:Oracle Linux 9.3
## 安全加固措施
### 1. 启用认证
$ cat > /mongodb/conf/mongod.conf << EOF
security:
authorization: enabled
EOF
### 2. 限制网络访问
$ cat > /mongodb/conf/mongod.conf << EOF
net:
bindIp: 127.0.0.1,192.168.1.101
EOF
### 3. 启用SSL/TLS
#### 生成证书
$ openssl req -newkey rsa:2048 -new -x509 -days 365 -nodes -out mongodb-cert.crt -keyout mongodb-cert.key
$ cat mongodb-cert.key mongodb-cert.crt > mongodb.pem
#### 配置SSL/TLS
$ cat > /mongodb/conf/mongod.conf << EOF
net:
ssl:
mode: requireSSL
PEMKeyFile: /mongodb/conf/mongodb.pem
EOF
### 4. 启用审计
$ cat > /mongodb/conf/mongod.conf << EOF
auditLog:
destination: file
format: JSON
path: /mongodb/log/audit.log
EOF
### 5. 配置防火墙
$ sudo firewall-cmd --permanent --add-port=27017/tcp
$ sudo firewall-cmd --reload
### 6. 定期更新密码
$ /mongodb/app/bin/mongosh -u fgedu -p fgedu123 --authenticationDatabase admin
fgedu.net.cn> use admin
fgedu.net.cn> db.changeUserPassword(“fgedu”, “new_password123”)
### 7. 定期审查用户权限
fgedu.net.cn> db.getUsers()
fgedu.net.cn> db.getUser(“fgedu_app”)
Part05-风哥经验总结与分享
5.1 MongoDB安全最佳实践
MongoDB安全的最佳实践建议:
## 网络安全
– 限制绑定IP地址
– 使用防火墙限制访问
– 启用SSL/TLS加密传输
– 配置网络隔离
## 认证与授权
– 启用认证
– 使用强密码策略
– 最小权限原则
– 定期审查用户权限
## 审计与监控
– 启用审计日志
– 配置审计过滤器
– 定期检查审计日志
– 监控异常访问
## 数据安全
– 定期备份数据
– 加密敏感数据
– 保护备份数据
– 测试恢复流程
## 系统安全
– 定期更新MongoDB版本
– 操作系统安全加固
– 限制MongoDB进程权限
– 定期安全扫描
5.2 MongoDB认证最佳实践
MongoDB认证的最佳实践建议:
## 用户管理
– 创建专用的管理员用户
– 为每个应用创建专用用户
– 使用不同的用户角色
– 定期更新密码
## 密码策略
– 使用强密码
– 密码长度至少8位
– 包含大小写字母、数字和特殊字符
– 定期更新密码
## 认证机制
– 使用SCRAM认证(默认)
– 对于高安全场景使用x.509
– 集成企业认证系统(LDAP/Kerberos)
– 定期轮换认证凭据
## 连接安全
– 使用SSL/TLS加密连接
– 验证服务器证书
– 配置客户端证书(可选)
– 限制连接来源
5.3 MongoDB安全故障排查
MongoDB安全故障排查的建议:
## 认证失败
– 检查用户名和密码
– 检查认证数据库
– 检查用户是否存在
– 检查密码是否正确
## 授权失败
– 检查用户角色
– 检查权限是否足够
– 检查操作是否允许
– 检查数据库是否正确
## 连接失败
– 检查网络连接
– 检查防火墙规则
– 检查SSL/TLS配置
– 检查认证配置
## 审计问题
– 检查审计日志配置
– 检查审计过滤器
– 检查日志文件权限
– 检查审计日志大小
## 安全漏洞
– 定期更新MongoDB版本
– 检查安全公告
– 进行安全扫描
– 修复已知漏洞
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
