密码管理
恰当的密码管理是现代网络安全的基本支柱之一, 但由于人类天生倾向于创建弱密码、在多个服务中重复使用密码以及以不安全的方式存储密码, 它在大多数组织中仍然是最薄弱的环节之一。 研究表明,超过 80% 的数据泄露涉及被攻破的凭据,无论是通过 使用从其他服务泄露的密码进行的撞库攻击、直接从用户处窃取 凭据的钓鱼攻击,还是针对弱而可预测密码的暴力破解。在企业环境中, 用户需要为内部系统、SaaS 应用、VPN、服务器和管理 账户管理数十个不同的凭据,问题的复杂性呈指数级增长, 不可避免地导致不安全的做法,例如将密码写在便利贴、 未加保护的电子表格上,或在所有系统中重复使用同一个密码。本文提出了一种 全面的企业和个人密码管理方法,涵盖基于证据的复杂度 和轮换策略、企业级密码管理器的实施与选型、迁移到 多因素认证(MFA)的策略、通过速率限制(rate limiting)和 CAPTCHA 防止自动化攻击、通过威胁情报(threat intelligence)服务监控泄露的凭据, 以及对用户进行持续的密码卫生教育,从而针对对手最常利用的 攻击向量之一构建稳健的防御。
密码管理中的挑战
- 弱密码:123456、password、姓名+年份仍然极为常见
- 重复使用:在多个服务中使用同一密码会放大数据泄露的影响
- 不安全的存储:便利贴、电子表格、电子邮件、没有主密码的浏览器
- 密码疲劳:用户需要管理 50-100 多个凭据
- 不安全的共享:通过 Slack、电子邮件、短信共享密码
有效的密码策略
NIST 指南(已更新)
NIST SP 800-63B 建议:
- [OK] 最少 8 个字符(推荐 12+)
- [OK] 允许多达 64+ 个字符
- [OK] 接受包括空格在内的所有字符
- [OK] 不强制要求复杂度(大写字母、符号)
- [OK] 不强制定期轮换(仅在被攻破时)
- [OK] 与泄露密码列表进行核对
- [OK] 允许粘贴(便于使用密码管理器)
- [OK] 提供可视化的强度指示器
- [X] 不使用提示或安全问题
- [X] 不在没有理由的情况下强制定期更改
熵 vs 复杂度
# 复杂但弱的密码(低熵):
P@ssw0rd! # ~28 比特熵
# 可预测,常见模式
# 简单但强的口令短语(高熵):
correct horse battery staple # ~44 比特熵
# 更长,更难预测
# 更好:口令短语 + 符号
correct-horse-battery-staple-2024 # ~52 比特熵
# 易于记忆,难以破解
密码管理器
密码管理器是凭据管理最有效的解决方案,无需记忆即可为每个服务 提供唯一且强壮的密码。
企业级解决方案
- 1Password Business:直观的界面、共享 vault、Travel Mode
- LastPass Enterprise:SSO 集成、集中式策略
- Bitwarden:开源、可自托管选项、合规
- Keeper:Zero-knowledge、合规报告、特权访问
- Dashlane Business:内置 VPN、暗网监控
关键功能
- Zero-knowledge 架构:供应商无法访问密码
- 端到端加密:AES-256 或更高
- SSO 集成:用于企业登录的 SAML、OAuth
- 共享 vault:团队之间的安全共享
- 审计日志:对访问和更改的追踪
- 紧急访问:用于灾难恢复的授权委派
- 合规:SOC 2、ISO 27001、GDPR/LGPD
针对攻击的防护
暴力破解防护
# 按 IP 进行速率限制
- 每分钟最多 5 次尝试
- 渐进式锁定:1min、5min、15min、1hora
- 3 次失败后显示 CAPTCHA
# 账户锁定
- 10 次失败尝试后锁定账户
- 需要重置密码或管理员解锁
- 通过电子邮件/短信通知用户
# IP 黑名单
- 封锁具有攻击模式的 IP
- 与威胁情报源(threat intelligence feeds)集成
- 为已知的企业 IP 设置白名单
撞库攻击防御
- 强制 MFA:使没有第二因素的泄露凭据失效
- 泄露监控:HaveIBeenPwned API、SpyCloud
- 异常检测:来自异常地理位置的登录、新设备
- 机器人检测:reCAPTCHA、行为分析
- 会话管理:登录时使旧会话失效
MFA 的实施
# 按强度排列的 MFA 方法(从最安全到最不安全)
1. Hardware tokens (FIDO2/WebAuthn - YubiKey)
- 抗钓鱼
- 无 SMS/电子邮件拦截
2. Authenticator apps (TOTP)
- Google Authenticator, Microsoft Authenticator
- 离线,比 SMS 更安全
3. Push notifications
- Duo Push, Microsoft Authenticator Push
- 方便但易受 MFA fatigue 影响
4. SMS (如可能则避免)
- SIM swapping attacks
- 可能被拦截
- 聊胜于无,但并不理想
泄露凭据的监控
# HaveIBeenPwned API Integration
import requests
def check_password_breach(password):
# SHA-1 hash
sha1 = hashlib.sha1(password.encode()).hexdigest().upper()
prefix = sha1[:5]
suffix = sha1[5:]
# k-Anonymity: 仅发送前缀
url = f"https://api.pwnedpasswords.com/range/"
response = requests.get(url)
# Check if suffix in results
for line in response.text.split('\n'):
hash_suffix, count = line.split(':')
if hash_suffix == suffix:
return True, int(count)
return False, 0
# 如果密码已被攻破则强制重置
is_pwned, count = check_password_breach(user_password)
if is_pwned:
force_password_reset(user)
notify_user(f"密码出现在 次泄露中")
服务账户与 API 密钥
- 密钥管理(Secrets management):HashiCorp Vault、AWS Secrets Manager
- 自动轮换:使用脚本轮换 API 密钥/密码
- 最小权限:仅授予必要的最小权限
- 审计轨迹:对密钥访问的日志记录
- 过期:带 TTL 的密钥,在离职时撤销
用户教育
- 入职时的强制培训
- 定期的钓鱼演练
- 密码管理器推广活动
- 关于策略的清晰沟通
- 对良好实践的奖励(游戏化)
最终建议
实施强制性的企业密码管理器(1Password、Bitwarden)并配以 集中式策略。启用通用 MFA——为用户使用 TOTP 应用,为管理员使用 hardware tokens。对照 HaveIBeenPwned 监控凭据并主动强制重置。 采用 NIST 策略:长密码且不强制轮换、对照泄露数据库进行核验。 逐步淘汰 SMS MFA,迁移到 TOTP/FIDO2。
