name: mongodb-authentication version: “2.1.0” description: 掌握 MongoDB 认证方法,包括 SCRAM、X.509 证书、LDAP 和 Kerberos。学习用户创建、角色分配和安全 MongoDB 部署。 sasmp_version: “1.3.0” bonded_agent: 06-mongodb-security-administration bond_type: PRIMARY_BOND
生产级技能配置
capabilities:
- scram-authentication
- x509-certificates
- ldap-integration
- user-management
- role-assignment
input_validation: required_context: - auth_method - environment optional_context: - existing_users - ldap_config - certificate_chain
output_format: user_config: object connection_string: string verification_steps: array security_checklist: array
error_handling: common_errors: - code: AUTH001 condition: “认证失败” recovery: “验证用户名、密码、authSource 数据库” - code: AUTH002 condition: “用户未找到” recovery: “检查用户在正确的 authenticationDatabase 中是否存在” - code: AUTH003 condition: “密码策略违规” recovery: “确保密码满足复杂性要求”
prerequisites: mongodb_version: “4.0+” required_knowledge: - mongodb-basics - user-management security_requirements: - “mongod 以 --auth 启动或启用 authorization”
testing: unit_test_template: | // 验证认证 const client = new MongoClient(uri, { auth: { username, password } }) await client.connect() const status = await client.db(‘admin’).command({ connectionStatus: 1 }) expect(status.authInfo.authenticatedUsers[0].user).toBe(username)
MongoDB 认证
通过适当认证保护您的 MongoDB。
快速开始
启用认证
# 以认证模式启动 MongoDB
mongod --auth --dbpath /data/db
# 或在配置文件 (mongod.conf) 中
security:
authorization: enabled
创建管理员用户
// 首先无认证连接本地服务器
const mongo = new MongoClient('mongodb://localhost:27017')
const admin = mongo.db('admin')
// 创建管理员用户
await admin.command({
createUser: 'admin',
pwd: 'securepassword', // 或使用 passwordPrompt()
roles: ['root']
})
// 现在重启 mongod --auth
认证方法
SCRAM(盐化挑战响应)
// 默认,基于密码的认证
// 连接字符串
mongodb://username:password@localhost:27017/database
// 带选项
mongodb://username:password@localhost:27017/database?authSource=admin
// 创建 SCRAM 用户
db.createUser({
user: 'appuser',
pwd: 'password123',
roles: ['readWrite']
})
X.509 证书
// 企业级证书认证
// 创建证书用户(外部认证数据库)
db.getSiblingDB('$external').createUser({
user: 'CN=client,OU=Engineering,O=Company',
roles: ['readWrite']
})
// 客户端使用证书连接
mongodb://USERNAME@cluster.mongodb.net/?authMechanism=MONGODB-X509&tlsCertificateKeyFile=/path/to/client.pem
LDAP
// 企业目录集成
// 创建 LDAP 用户(外部认证数据库)
db.getSiblingDB('$external').createUser({
user: 'ldapuser',
roles: ['readWrite']
})
// 在 mongod.conf 中配置 LDAP
security:
ldap:
servers: 'ldap.example.com'
authzQueryTemplate: 'dc=example,dc=com??sub?(uid={0})'
bindQueryUser: 'cn=admin,dc=example,dc=com'
bindQueryPassword: 'password'
用户管理
创建用户
// 基本用户
db.createUser({
user: 'username',
pwd: 'password',
roles: ['readWrite']
})
// 多角色
db.createUser({
user: 'dbadmin',
pwd: 'password',
roles: [
{ role: 'dbAdmin', db: 'myapp' },
{ role: 'readWrite', db: 'myapp' }
]
})
// 交互式密码提示
db.createUser({
user: 'username',
pwd: passwordPrompt(),
roles: ['readWrite']
})
列出用户
// 显示当前数据库中所有用户
db.getUsers()
// 显示特定用户
db.getUser('username')
更新用户密码
// 更改密码
db.changeUserPassword('username', 'newpassword')
// 或
db.updateUser('username', {
pwd: 'newpassword'
})
移除用户
db.dropUser('username')
内置角色
数据库用户角色
'read' → 只读访问
'readWrite' → 读写访问
// 授予角色
db.grantRolesToUser('username', ['read'])
数据库管理员角色
'dbAdmin' → 数据库管理
'dbOwner' → 全数据库访问
'userAdmin' → 用户管理
// 示例
db.createUser({
user: 'dbadmin',
pwd: 'password',
roles: ['dbAdmin', 'userAdmin']
})
集群管理员角色
'clusterAdmin' → 全集群访问
'clusterManager' → 集群管理
'clusterMonitor' → 只读监控
// 集群角色
db.getSiblingDB('admin').createUser({
user: 'clusteradmin',
pwd: 'password',
roles: ['clusterAdmin']
})
所有内置角色
管理员: root, dbAdmin, userAdmin, clusterAdmin
读: read
写: readWrite
备份: backup, restore
监控: clusterMonitor, serverStatus, monitoring
自定义角色
创建自定义角色
// 创建自定义 'reportViewer' 角色
db.createRole({
role: 'reportViewer',
privileges: [
{
resource: { db: 'reporting', collection: '' },
actions: ['find']
}
],
roles: []
})
// 分配给用户
db.grantRolesToUser('analyst', [
{ role: 'reportViewer', db: 'admin' }
])
权限结构
{
resource: {
db: 'myapp', // 数据库('' = 所有数据库)
collection: 'users' // 集合('' = 所有集合)
},
actions: [
'find', // 查询文档
'insert', // 插入文档
'update', // 更新文档
'remove', // 删除文档
'createIndex', // 索引管理
'dropIndex'
]
}
密码策略
强密码
// 生产环境要求:
// ✅ 最少 12 字符
// ✅ 混合大写、小写、数字、符号
// ✅ 无字典词
// ✅ 不与用户名相关
// 示例强密码
// P@ssw0rd2024!MongoDB
// 不要使用
// password, 123456, monkey, qwerty, password123
密码轮换
// 定期更改密码
// 服务账户每月
// 普通用户每季度
// 更新密码
db.changeUserPassword('username', 'newpassword')
// 检查用户详情
db.getUser('username')
带认证的连接
MongoDB Shell
# 带认证连接
mongosh --username admin --password --authenticationDatabase admin mongodb://localhost:27017
# 或使用连接字符串
mongosh 'mongodb://admin:password@localhost:27017/?authSource=admin'
Node.js 驱动
const MongoClient = require('mongodb').MongoClient
// 选项 1: 连接字符串
const client = new MongoClient(
'mongodb://username:password@localhost:27017/database?authSource=admin'
)
// 选项 2: 使用 encodeURIComponent 处理特殊字符
const user = encodeURIComponent('user@example.com')
const pass = encodeURIComponent('pass!@#$%')
const client = new MongoClient(
`mongodb://${user}:${pass}@localhost:27017/database?authSource=admin`
)
// 选项 3: 认证选项
const client = new MongoClient('mongodb://localhost:27017', {
auth: {
username: 'admin',
password: 'password'
},
authSource: 'admin'
})
Python PyMongo
from pymongo import MongoClient
# 连接字符串
client = MongoClient('mongodb://username:password@localhost:27017/database?authSource=admin')
# 或带选项
client = MongoClient(
'mongodb://localhost:27017',
username='username',
password='password',
authSource='admin'
)
安全最佳实践
✅ 用户管理:
- 唯一密码 - 每个用户使用自己的密码
- 强密码 - 12+ 字符,复杂
- 定期轮换 - 定期更改
- 最小权限 - 仅授予必要角色
- 分离账户 - 管理员与应用用户分开
✅ 生产安全:
- 始终启用认证 - --auth 或启用 authorization
- 使用网络认证 - 绑定到特定 IP
- 启用 TLS/SSL - 加密连接
- 定期审计 - 检查用户权限
- 禁用默认用户 - 移除访客、测试用户
✅ Atlas 安全:
- 启用 SCRAM - 默认方法
- 使用强密码 - 优先自动生成
- 创建服务账户 - 用于应用程序
- 有限角色 - 应用使用 readWrite,而非管理员
- 监控活动 - 检查谁访问了什么
❌ 避免:
- ❌ 共享密码
- ❌ 弱密码
- ❌ 无认证
- ❌ 应用使用管理员凭证
- ❌ 代码中硬编码密码
后续步骤
- 启用认证 - 在您的 MongoDB 上
- 创建管理员用户 - 初始设置
- 创建应用用户 - 用于应用程序
- 测试连接 - 从应用程序
- 设置 TLS - 加密连接
- 监控用户 - 谁可以访问什么
通过认证保护您的 MongoDB! 🔐