外观
MongoDB 密码策略
适用场景
- 生产环境中的MongoDB实例
- 包含敏感数据的数据库
- 遵循合规要求(如PCI DSS、HIPAA等)的环境
- 多用户共享的数据库
密码策略功能
MongoDB企业版提供了完整的密码策略功能,包括:
- 密码复杂度要求:设置密码长度、字符类型要求
- 密码过期时间:设置密码的有效期限
- 密码历史记录:防止重复使用最近使用过的密码
- 账户锁定:多次登录失败后锁定账户
- 密码重置策略:设置密码重置的规则
配置密码策略
企业版密码策略配置
MongoDB企业版通过security.pwdPolicy配置项设置密码策略。
- 修改mongod.conf配置文件
yaml
security:
pwdPolicy:
# 密码最短长度
minimumLength: 12
# 要求至少包含一个大写字母
requireUpperCaseCharacters: true
# 要求至少包含一个小写字母
requireLowerCaseCharacters: true
# 要求至少包含一个数字
requireDigits: true
# 要求至少包含一个特殊字符
requireSpecialCharacters: true
# 特殊字符定义
specialCharacters: "!@#$%^&*()_+-=[]{}|;:,.<>?"
# 密码过期时间(天)
passwordHistory: 5
# 密码历史记录数量
passwordChangeIntervalSeconds: 86400
# 账户锁定阈值
failedLoginAttemptsBeforeLockout: 5
# 账户锁定时间(秒)
lockoutDurationSeconds: 300- 重启mongod服务
bash
# Linux
systemctl restart mongod
# Windows
net stop MongoDB
net start MongoDB- 验证密码策略
javascript
// 连接到MongoDB
db.adminCommand({
getParameter: 1,
pwdPolicy: 1
})社区版密码策略实现
MongoDB社区版没有内置的密码策略功能,但可以通过以下方式实现:
- 应用层密码策略:在应用程序中实现密码复杂度验证
- 自定义身份验证插件:开发自定义身份验证插件实现密码策略
- 外部认证系统:使用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"页面配置密码策略:
- 登录MongoDB Atlas控制台
- 点击"Database Access"
- 点击"Password Policy"
- 设置密码长度、复杂度要求、过期时间等
- 点击"Save"
Atlas会自动将密码策略应用到所有新创建的用户,现有用户在下次修改密码时会应用新的密码策略。
