MongoDB认证Skill mongodb-authentication

这个技能专注于MongoDB数据库的身份验证与安全管理,涵盖SCRAM、X.509证书、LDAP和Kerberos等多种认证方法。内容包括用户创建、角色分配、密码策略、连接安全及最佳实践,帮助开发者和管理员确保MongoDB部署的安全性。关键词:MongoDB、认证、身份验证、SCRAM、X.509、LDAP、用户管理、角色分配、安全部署。

身份认证 0 次安装 0 次浏览 更新于 3/14/2026

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'
)

安全最佳实践

用户管理:

  1. 唯一密码 - 每个用户使用自己的密码
  2. 强密码 - 12+ 字符,复杂
  3. 定期轮换 - 定期更改
  4. 最小权限 - 仅授予必要角色
  5. 分离账户 - 管理员与应用用户分开

生产安全:

  1. 始终启用认证 - --auth 或启用 authorization
  2. 使用网络认证 - 绑定到特定 IP
  3. 启用 TLS/SSL - 加密连接
  4. 定期审计 - 检查用户权限
  5. 禁用默认用户 - 移除访客、测试用户

Atlas 安全:

  1. 启用 SCRAM - 默认方法
  2. 使用强密码 - 优先自动生成
  3. 创建服务账户 - 用于应用程序
  4. 有限角色 - 应用使用 readWrite,而非管理员
  5. 监控活动 - 检查谁访问了什么

避免:

  1. ❌ 共享密码
  2. ❌ 弱密码
  3. ❌ 无认证
  4. ❌ 应用使用管理员凭证
  5. ❌ 代码中硬编码密码

后续步骤

  1. 启用认证 - 在您的 MongoDB 上
  2. 创建管理员用户 - 初始设置
  3. 创建应用用户 - 用于应用程序
  4. 测试连接 - 从应用程序
  5. 设置 TLS - 加密连接
  6. 监控用户 - 谁可以访问什么

通过认证保护您的 MongoDB! 🔐