Skip to content

MongoDB 密码策略

适用场景

  • 生产环境中的MongoDB实例
  • 包含敏感数据的数据库
  • 遵循合规要求(如PCI DSS、HIPAA等)的环境
  • 多用户共享的数据库

密码策略功能

MongoDB企业版提供了完整的密码策略功能,包括:

  1. 密码复杂度要求:设置密码长度、字符类型要求
  2. 密码过期时间:设置密码的有效期限
  3. 密码历史记录:防止重复使用最近使用过的密码
  4. 账户锁定:多次登录失败后锁定账户
  5. 密码重置策略:设置密码重置的规则

配置密码策略

企业版密码策略配置

MongoDB企业版通过security.pwdPolicy配置项设置密码策略。

  1. 修改mongod.conf配置文件
yaml
security:
  pwdPolicy:
    # 密码最短长度
    minimumLength: 12
    # 要求至少包含一个大写字母
    requireUpperCaseCharacters: true
    # 要求至少包含一个小写字母
    requireLowerCaseCharacters: true
    # 要求至少包含一个数字
    requireDigits: true
    # 要求至少包含一个特殊字符
    requireSpecialCharacters: true
    # 特殊字符定义
    specialCharacters: "!@#$%^&*()_+-=[]{}|;:,.<>?"
    # 密码过期时间(天)
    passwordHistory: 5
    # 密码历史记录数量
    passwordChangeIntervalSeconds: 86400
    # 账户锁定阈值
    failedLoginAttemptsBeforeLockout: 5
    # 账户锁定时间(秒)
    lockoutDurationSeconds: 300
  1. 重启mongod服务
bash
# Linux
systemctl restart mongod

# Windows
net stop MongoDB
net start MongoDB
  1. 验证密码策略
javascript
// 连接到MongoDB
db.adminCommand({
  getParameter: 1,
  pwdPolicy: 1
})

社区版密码策略实现

MongoDB社区版没有内置的密码策略功能,但可以通过以下方式实现:

  1. 应用层密码策略:在应用程序中实现密码复杂度验证
  2. 自定义身份验证插件:开发自定义身份验证插件实现密码策略
  3. 外部认证系统:使用LDAP、Kerberos等外部认证系统,利用其密码策略

密码策略最佳实践

密码复杂度要求

  • 密码长度:至少12个字符,推荐16个字符以上
  • 字符类型:要求包含大写字母、小写字母、数字和特殊字符
  • 避免常见密码:禁止使用常见密码(如"password"、"123456"等)
  • 禁止使用用户名相关密码:禁止使用用户名、邮箱或其变体作为密码

密码过期与轮换

  • 密码过期时间:根据安全要求设置,一般为90天
  • 定期轮换:鼓励用户定期主动更换密码,即使未到过期时间
  • 管理员密码:管理员密码应该更频繁地轮换(如30天)
  • 密码重置通知:在密码过期前发送通知提醒用户

密码历史记录

  • 历史记录数量:保存最近5-10个密码
  • 防止密码复用:禁止用户使用最近使用过的密码
  • 密码差异要求:新密码与旧密码应有一定差异(如至少3个字符不同)

账户锁定策略

  • 失败尝试次数:设置为5-10次
  • 锁定时间:设置为5-15分钟
  • 锁定通知:当账户被锁定时,向管理员发送通知
  • 管理员解锁:提供管理员手动解锁账户的功能

密码存储安全

  • 使用安全的哈希算法:MongoDB 4.0+使用bcrypt算法存储密码哈希
  • 禁止明文存储密码:永远不要在配置文件、脚本或日志中明文存储密码
  • 使用密钥管理系统:对于自动化脚本中的密码,使用密钥管理系统(如AWS KMS、HashiCorp Vault)

密码策略管理

创建用户时应用密码策略

javascript
// 创建用户时自动应用密码策略
db.createUser({
  user: "appUser",
  pwd: "StrongPass123!",
  roles: [{ role: "readWrite", db: "appDB" }]
})

修改用户密码

javascript
// 修改用户密码
db.changeUserPassword("appUser", "NewStrongPass456!")

// 使用db.updateUser修改密码
db.updateUser("appUser", {
  pwd: "NewStrongPass456!"
})

重置用户密码

javascript
// 管理员重置用户密码
db.adminCommand({
  resetUserPassword: "appUser",
  pwd: "TemporaryPass789!"
})

查看用户密码状态

javascript
// 查看用户信息,包括密码修改时间
db.getUser("appUser", {
  showCredentials: true
})

合规要求

PCI DSS要求

  • 密码长度至少7个字符
  • 包含字母和数字的组合
  • 密码每90天更换一次
  • 禁止使用最近4个密码
  • 失败登录尝试5次后锁定账户

HIPAA要求

  • 实施强密码策略
  • 定期更换密码
  • 限制登录尝试次数
  • 保护密码存储

GDPR要求

  • 确保数据安全,包括使用强密码
  • 定期审查和更新安全措施
  • 记录安全事件,包括密码相关事件

密码策略监控与审计

监控密码相关事件

  • 登录失败事件:监控多次登录失败的情况
  • 密码修改事件:记录密码修改的时间和用户
  • 账户锁定事件:监控账户锁定情况
  • 密码过期事件:跟踪即将过期的密码

审计日志配置

yaml
# mongod.conf
security:
  authorization: enabled
  auditLog:
    destination: file
    format: JSON
    path: /var/log/mongodb/audit.log
    filter: '{ "atype": { "$in": [ "authCheck", "createUser", "updateUser", "changePassword", "dropUser" ] } }'

定期审查

  • 每季度审查密码策略的有效性
  • 分析登录失败日志,调整账户锁定策略
  • 根据安全威胁形势更新密码复杂度要求
  • 检查密码过期情况,确保用户及时更换密码

常见问题(FAQ)

Q1: MongoDB社区版是否支持密码策略?

A1: MongoDB社区版没有内置的密码策略功能,但可以通过应用层验证、自定义认证插件或外部认证系统实现密码策略。企业版提供了完整的密码策略功能。

Q2: 如何在现有MongoDB实例上启用密码策略?

A2: 对于企业版,可以通过修改mongod.conf配置文件,添加security.pwdPolicy配置项,然后重启mongod服务来启用密码策略。对于社区版,需要通过其他方式实现。

Q3: 密码策略会影响现有用户吗?

A3: 启用密码策略后,现有用户的密码不会立即受到影响,但在下次修改密码时会应用新的密码策略。建议在启用密码策略后,要求所有用户更新密码。

Q4: 如何处理忘记密码的情况?

A4: 管理员可以使用db.changeUserPassword()或db.updateUser()命令重置用户密码。对于忘记密码的管理员账户,可以通过启动mongod时禁用认证,然后重置密码。

Q5: 密码策略的最佳实践是什么?

A5: 密码策略的最佳实践包括:

  • 密码长度至少12个字符
  • 要求包含大写字母、小写字母、数字和特殊字符
  • 密码每90天更换一次
  • 保存最近5-10个密码历史记录
  • 5次登录失败后锁定账户
  • 定期审查和更新密码策略

Q6: 如何防止密码泄露?

A6: 防止密码泄露的措施包括:

  • 实施强密码策略
  • 使用HTTPS/TLS加密传输密码
  • 定期更换密码
  • 禁止在日志、配置文件中明文存储密码
  • 使用密钥管理系统管理密码
  • 限制密码的访问权限

Q7: 如何处理密码过期的用户?

A7: 对于密码过期的用户,可以:

  • 提前发送密码过期通知
  • 允许用户在线重置密码
  • 管理员手动重置密码
  • 设置宽限期,允许用户在密码过期后一段时间内登录并修改密码

Q8: 密码策略会影响性能吗?

A8: 密码策略的实施对MongoDB性能的影响非常小。密码验证和哈希计算的开销可以忽略不计,不会对数据库的整体性能产生明显影响。

Q9: 如何测试密码策略的有效性?

A9: 可以通过以下方式测试密码策略:

  • 尝试创建不符合密码策略的用户,验证是否被拒绝
  • 尝试使用弱密码修改现有用户密码,验证是否被拒绝
  • 测试多次登录失败后是否锁定账户
  • 测试密码过期后是否需要更换密码

Q10: 如何在MongoDB Atlas中配置密码策略?

A10: MongoDB Atlas通过"Database Access"页面配置密码策略:

  1. 登录MongoDB Atlas控制台
  2. 点击"Database Access"
  3. 点击"Password Policy"
  4. 设置密码长度、复杂度要求、过期时间等
  5. 点击"Save"

Atlas会自动将密码策略应用到所有新创建的用户,现有用户在下次修改密码时会应用新的密码策略。