3、认证机制审计:密码策略审计
认证机制,说白了就是「你怎么证明你是你」。我在做安全审计时,经常跟客户说一句话:认证是安全的第一道门,也是最容易被踹开的那道门。今天咱们就聊聊密码策略、多因素认证、单点登录和生物识别这几个核心审计点。
3.1 密码策略审计
密码策略审计,我习惯从三个维度入手:复杂度、长度、有效期。这三个点看似基础,但我在项目中踩过的坑可不少。
3.1.1 密码复杂度审计
复杂度审计,不是看密码里有没有大小写、数字、特殊字符。而是看策略是否真正生效。举个例子,我见过一个系统,策略配置要求「至少一个大写字母」,但用户输入「Password123!」就能通过——大写字母在开头,这其实很容易被暴力破解。
审计要点:
- 检查密码策略配置是否覆盖所有用户组(管理员、普通用户、服务账户)
- 验证策略是否强制要求至少3类字符组合(大写、小写、数字、特殊字符)
- 确认密码不能包含用户名、连续字符(如"123"、"abc")
我建议用下面这个脚本快速检查AD域控的密码策略:
# 检查域密码策略
Get-ADDefaultDomainPasswordPolicy |
Select-Object ComplexityEnabled,
MinPasswordLength,
MaxPasswordAge,
PasswordHistoryCount
# 检查具体用户的密码属性
Get-ADUser -Filter * -Properties PasswordLastSet, PasswordNeverExpires |
Where-Object {$_.PasswordNeverExpires -eq $true} |
Select-Object Name, PasswordLastSet
3.1.2 密码长度审计
长度问题,我遇到过最离谱的一次:某银行核心系统,密码最长只允许8位。你想想看,8位密码在现在的算力面前,暴力破解也就几分钟的事。
| 密码长度 | 暴力破解时间(8位混合字符) | 审计建议 |
|---|---|---|
| 6位 | 秒级 | ❌ 不通过 |
| 8位 | 小时级 | ⚠️ 最低要求 |
| 12位 | 百年级 | ✅ 推荐 |
| 16位以上 | 不可行 | ✅ 最佳实践 |
避坑指南:我曾经审计过一家公司,密码策略要求12位,但系统底层数据库字段只存了8位。用户输入12位密码,系统自动截断成前8位存储。这种「假合规」比没有策略更危险。
3.1.3 密码有效期审计
有效期这块,我个人的经验是:别一刀切。管理员账户90天更换一次,普通用户180天,服务账户可以更长甚至不设有效期(配合密钥轮换)。
审计时重点关注:
- 是否有密码永不过期的账户(特别是服务账户)
- 密码历史记录是否启用(防止重复使用最近N次密码)
- 强制修改密码的提醒机制是否到位
3.2 多因素认证(MFA)部署核查
MFA现在几乎是标配了。但部署了不等于安全了。我见过太多「为了合规而合规」的MFA部署。
审计MFA,我一般看这几个点:
- 覆盖范围:是否覆盖所有外部访问?管理员账户?特权账户?
- 认证因子组合:是否真正做到了「不同类别」?比如密码+短信验证码,其实都是「你知道的」+「你拥有的」,严格来说不算真正的多因子
- 绕过机制:有没有紧急绕过通道?绕过流程是否经过审批和记录?
小技巧:审计MFA时,可以尝试用「社会工程学」视角。比如打电话给IT支持,声称自己手机丢了,看对方会不会轻易帮你绕过MFA。我做过一次测试,成功率高达40%。
3.3 单点登录(SSO)与联邦身份审计
SSO这东西,用好了是效率神器,用不好就是单点崩溃。我记得有一次审计,客户部署了SSO,但所有应用都信任同一个身份提供者(IdP)。结果IdP挂了,全公司瘫痪。
审计SSO的核心:
- 信任关系:IdP和SP之间的信任是如何建立的?证书是否定期轮换?
- 会话管理:SSO会话超时时间是否合理?是否支持强制登出?
- 属性映射:传递的用户属性是否最小化?有没有泄露敏感信息?
联邦身份审计更复杂一些。我建议重点检查:
- SAML/OIDC断言签名是否强制要求
- NameID格式是否使用持久化标识(避免用邮箱这种可变标识)
- IdP发起的SSO是否做了RelayState校验
# 检查SAML响应签名(Python示例)
import xml.etree.ElementTree as ET
def check_saml_signature(saml_response):
root = ET.fromstring(saml_response)
# 检查是否有Signature元素
signature = root.find('.//{http://www.w3.org/2000/09/xmldsig#}Signature')
if signature is None:
return "❌ 缺少签名,存在篡改风险"
# 检查签名算法强度
algorithm = signature.find('.//{http://www.w3.org/2000/09/xmldsig#}SignatureMethod')
if 'rsa-sha256' not in algorithm.get('Algorithm'):
return "⚠️ 签名算法较弱,建议使用SHA256"
return "✅ 签名检查通过"
3.4 生物识别与证书认证审计
生物识别这两年火得很,但审计时别被「高科技」唬住。我见过一家公司部署了指纹识别,结果发现指纹传感器是淘宝买的几十块钱的货,连活体检测都没有。
生物识别审计要点:
- 活体检测:是否支持?检测算法是否经过独立评估?
- 模板存储:生物特征模板是存储在本地还是云端?是否加密?
- 错误接受率(FAR)和错误拒绝率(FRR):是否有明确的指标和测试报告?
- 备用机制:生物识别失败时,是否有安全的降级方案?
证书认证审计相对成熟,但容易忽略的是证书生命周期管理。我建议审计时检查:
- 证书颁发是否经过严格的身份验证(特别是EV证书)
- 证书吊销列表(CRL)或OCSP是否正常更新
- 私钥存储是否使用HSM或安全密钥库
- 证书到期前是否有自动提醒和续期流程
一句话总结:认证机制审计,不是检查「有没有」,而是检查「好不好用、安不安全、有没有漏洞」。我做了这么多年审计,发现90%的安全事件都出在「以为有了就安全了」这种心态上。