外观
SQLServer 密码策略
密码策略概述
密码策略是 SQL Server 安全性的重要组成部分,通过实施强密码策略,可以有效防止未经授权的访问和密码破解攻击。SQL Server 支持两种密码策略机制:
- Windows 密码策略:依赖于 Windows 操作系统的密码策略,适用于 Windows 身份验证
- SQL Server 密码策略:SQL Server 自身实现的密码策略,适用于 SQL Server 身份验证
版本差异支持
| SQL Server 版本 | 密码策略支持情况 | 主要功能差异 |
|---|---|---|
| 2000 及更早版本 | 有限支持 | - 仅支持基本密码复杂性 - 无密码过期和锁定策略 - 无密码历史记录 |
| 2005-2008 R2 | 基础支持 | - 支持 Windows 密码策略集成 - 支持密码复杂性、过期和历史记录 - 有限的锁定策略支持 |
| 2012-2016 | 完整支持 | - 完整的 Windows 密码策略集成 - 支持登录锁定策略 - 增强的密码复杂性检查 |
| 2017-2022 | 增强支持 | - 与 Azure AD 集成支持 - 增强的安全审计功能 - 支持多因素身份验证 - 更精细的密码策略控制 |
| Azure SQL Database | 云优化支持 | - 基于 Azure AD 或 SQL 密码策略 - 自动密码策略强制执行 - 增强的安全监控和警报 |
Windows 密码策略
当使用 Windows 身份验证时,SQL Server 完全依赖于 Windows 操作系统的密码策略。Windows 密码策略包括密码复杂性、密码过期、密码历史记录和账户锁定等设置。
Windows 密码策略配置方法
本地安全策略配置
- 运行
secpol.msc打开本地安全策略 - 导航到 "账户策略" → "密码策略"
- 配置以下核心设置:
- 密码必须符合复杂性要求:启用
- 密码长度最小值:建议 12 个字符
- 密码最长使用期限:建议 90-180 天
- 密码最短使用期限:建议 1-7 天
- 强制密码历史:建议 24 个
- 用可还原的加密来存储密码:禁用
组策略配置
- 运行
gpedit.msc打开组策略编辑器 - 导航到 "计算机配置" → "Windows 设置" → "安全设置" → "账户策略" → "密码策略"
- 配置与本地安全策略相同的设置
- 链接组策略到相关的组织单位 (OU)
生产建议
- 对于域环境,优先使用组策略统一管理密码策略
- 定期审查密码策略的有效性和合规性
- 结合使用账户锁定策略,防止暴力破解攻击
- 对管理员账户实施更严格的密码策略
SQL Server 密码策略
当使用 SQL Server 身份验证时,SQL Server 可以应用 Windows 密码策略或自定义密码策略。从 SQL Server 2005 开始,SQL Server 支持将 Windows 密码策略集成到 SQL Server 登录名中。
SQL Server 密码策略核心选项
| 选项 | 描述 | 版本要求 |
|---|---|---|
| CHECK_POLICY | 启用/禁用 Windows 密码策略集成 | SQL Server 2005+ |
| CHECK_EXPIRATION | 启用/禁用密码过期策略 | SQL Server 2005+ |
| CHECK_POLICY + Windows 账户锁定策略 | 启用/禁用登录锁定 | SQL Server 2012+ |
| PASSWORD_HISTORY | 控制密码历史记录 | 依赖 Windows 密码策略 |
配置 SQL Server 密码策略
启用密码策略示例
sql
-- 创建新的 SQL Server 登录名并启用完整密码策略
CREATE LOGIN [ApplicationUser]
WITH PASSWORD = 'StrongP@ssw0rd2024!',
CHECK_EXPIRATION = ON,
CHECK_POLICY = ON;
-- 修改现有登录名启用密码策略
ALTER LOGIN [OldLogin]
WITH CHECK_EXPIRATION = ON,
CHECK_POLICY = ON;特殊场景配置
sql
-- 创建服务账户登录名,禁用密码过期(适用于不需要定期更换密码的服务)
CREATE LOGIN [SqlServiceAcct]
WITH PASSWORD = 'ServiceP@ssw0rd!',
CHECK_EXPIRATION = OFF,
CHECK_POLICY = ON; -- 仍启用密码复杂性检查
-- 创建临时测试登录名,完全禁用密码策略(仅用于测试环境)
CREATE LOGIN [TestUser]
WITH PASSWORD = 'test123',
CHECK_EXPIRATION = OFF,
CHECK_POLICY = OFF;查看密码策略状态
sql
-- 查看所有 SQL Server 登录名的密码策略配置
SELECT
name AS login_name,
is_policy_checked AS password_policy_enabled,
is_expiration_checked AS password_expiration_enabled,
create_date,
modify_date,
is_disabled,
type_desc
FROM sys.sql_logins;生产场景最佳实践
1. 不同环境的密码策略配置
| 环境类型 | 密码复杂性 | 密码过期 | 账户锁定阈值 | 备注 |
|---|---|---|---|---|
| 开发环境 | 中(8字符) | 180天 | 10次 | 相对宽松,提高开发效率 |
| 测试环境 | 高(10字符) | 120天 | 8次 | 接近生产环境,用于测试 |
| 生产环境 | 高(12字符) | 90天 | 5次 | 严格策略,保护生产数据 |
| 敏感生产环境 | 极高(15字符) | 60天 | 3次 | 适用于金融、医疗等行业 |
2. 密码策略实施步骤
步骤1:评估当前环境
sql
-- 审计现有 SQL Server 登录名的密码策略状态
SELECT
name,
is_policy_checked,
is_expiration_checked,
CASE
WHEN is_policy_checked = 0 THEN '密码策略未启用'
WHEN is_expiration_checked = 0 THEN '密码过期未启用'
ELSE '密码策略完整'
END AS policy_status
FROM sys.sql_logins
WHERE type = 'S'; -- 仅检查 SQL 登录名步骤2:制定迁移计划
- 对现有登录名进行分类(管理员、应用程序、服务账户等)
- 确定优先级:先处理高特权账户,再处理普通账户
- 制定密码重置时间表,避免集中过期
- 通知相关用户和应用程序所有者
步骤3:分阶段实施
- 第一阶段:为所有管理员账户启用密码策略
- 第二阶段:为所有应用程序账户启用密码策略
- 第三阶段:为服务账户启用密码策略(根据实际情况决定是否启用密码过期)
- 第四阶段:监控和优化密码策略
3. 密码策略监控与审计
监控登录失败尝试
sql
-- 使用扩展事件监控登录失败
CREATE EVENT SESSION [PasswordPolicyMonitoring] ON SERVER
ADD EVENT sqlserver.login_failed(
ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.nt_username,sqlserver.session_id,sqlserver.sql_text)
)
ADD TARGET package0.event_file(SET filename=N'C:\SQLAudit\PasswordPolicyMonitoring.xel')
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=ON);
GO
-- 启动事件会话
ALTER EVENT SESSION [PasswordPolicyMonitoring] ON SERVER STATE = START;
GO定期审计密码策略合规性
sql
-- 生成密码策略合规性报告
SELECT
'不符合密码策略' AS report_type,
name AS non_compliant_login,
'密码策略未启用' AS reason
FROM sys.sql_logins
WHERE type = 'S' AND is_policy_checked = 0
UNION ALL
SELECT
'不符合密码策略' AS report_type,
name AS non_compliant_login,
'密码过期未启用' AS reason
FROM sys.sql_logins
WHERE type = 'S' AND is_expiration_checked = 0;密码策略故障排除
1. 常见问题及解决方案
| 问题症状 | 可能原因 | 解决方案 |
|---|---|---|
| 无法创建符合密码策略的登录名 | 密码不符合复杂性要求 | 确保密码包含大小写字母、数字和特殊字符,长度符合要求 |
| 登录名频繁过期 | 密码过期策略设置过短 | 调整密码过期期限,建议 90-180 天 |
| 登录名被锁定 | 登录失败次数超过阈值 | 使用 ALTER LOGIN ... UNLOCK 解锁,或等待自动解锁 |
| 应用程序连接失败 | 应用程序账户密码过期 | 重置密码并更新应用程序连接字符串,考虑使用托管身份 |
2. 重置过期或锁定的登录名
sql
-- 重置过期密码
ALTER LOGIN [ExpiredLogin] WITH PASSWORD = 'NewStrongP@ssw0rd!';
-- 解锁被锁定的登录名
ALTER LOGIN [LockedLogin] WITH PASSWORD = 'NewStrongP@ssw0rd!' UNLOCK;
-- 同时重置密码和解锁
ALTER LOGIN [ProblemLogin] WITH PASSWORD = 'NewStrongP@ssw0rd!' UNLOCK;常见问题 (FAQ)
如何查看 SQL Server 登录密码的过期时间?
SQL Server 不直接存储密码过期时间,但可以通过以下方式估算:
sql
SELECT
name,
modify_date AS last_password_change,
DATEADD(day, 90, modify_date) AS estimated_expiration_date -- 假设 90 天过期
FROM sys.sql_logins
WHERE type = 'S';密码策略对性能有影响吗?
密码策略对 SQL Server 性能的影响可以忽略不计。密码验证只在登录时执行,不会影响正常的数据库操作。
如何处理大量 SQL 登录名的密码过期问题?
- 批量重置密码:使用 PowerShell 脚本批量更新登录名密码
- 使用服务主体:对于应用程序,考虑使用 Azure AD 服务主体或托管身份
- 延长过期期限:根据业务需求,适当延长密码过期期限
- 优先使用 Windows 身份验证:减少 SQL 登录名的数量
如何为服务账户配置合适的密码策略?
对于服务账户,建议:
- 启用密码复杂性检查(CHECK_POLICY = ON)
- 禁用密码过期(CHECK_EXPIRATION = OFF),避免服务中断
- 使用强密码,定期手动更新
- 考虑使用托管身份或 gMSA(组托管服务账户)
如何在 Azure SQL Database 中配置密码策略?
Azure SQL Database 中的密码策略配置:
- 对于 SQL 登录名:支持密码复杂性和过期,通过 CREATE/ALTER LOGIN 配置
- 对于 Azure AD 登录名:使用 Azure AD 密码策略
- 账户锁定:由 Azure 平台管理,无需手动配置
- 建议:结合使用 Azure AD 身份验证和多因素身份验证
如何启用 SQL Server 登录名的锁定策略?
要启用 SQL Server 登录名的锁定策略:
- 在 Windows 本地安全策略或组策略中配置 "账户锁定阈值"
- 在 SQL Server 登录名上启用 CHECK_POLICY = ON
- SQL Server 将自动应用 Windows 账户锁定策略
密码策略会影响 Windows 登录名吗?
对于 Windows 登录名,SQL Server 完全依赖于 Windows 操作系统的密码策略,不直接应用 SQL Server 密码策略。Windows 登录名的密码策略由 Windows 本地安全策略或组策略控制。
如何教育用户使用强密码?
- 提供密码创建指南,包括长度、复杂性要求
- 建议使用密码管理器
- 培训用户识别钓鱼攻击
- 提醒用户不要共享密码
- 演示弱密码的危害
如何审计密码策略的合规性?
- 使用 SQL Server 审计功能记录登录活动
- 使用扩展事件监控登录失败尝试
- 定期生成密码策略合规性报告
- 结合 Azure Monitor 或其他监控工具进行持续监控
- 进行定期安全审计和渗透测试
如何处理密码策略与应用程序的兼容性问题?
- 评估应用程序的密码策略支持情况
- 对于旧应用程序,考虑使用代理账户或服务层
- 与应用程序开发人员合作,更新应用程序以支持强密码
- 考虑使用应用程序网关或中间件处理身份验证
总结
密码策略是 SQL Server 安全性的基础组成部分,通过实施强密码策略,可以有效防止未经授权的访问和密码破解攻击。不同版本的 SQL Server 对密码策略的支持程度不同,DBA 应根据实际环境和业务需求选择合适的密码策略配置。
在实施密码策略时,建议遵循以下核心原则:
- 分阶段实施:从高特权账户开始,逐步扩展到所有账户
- 差异化策略:根据环境类型和账户重要性,配置不同的密码策略
- 定期审查和更新:根据安全威胁的变化,定期调整密码策略
- 结合多因素身份验证:对于高特权账户,启用多因素身份验证,提高安全性
- 持续监控和审计:监控登录活动,及时发现异常情况
- 用户教育:培训用户使用强密码,提高整体安全意识
通过正确实施和管理密码策略,企业可以构建安全、可靠的身份验证体系,保护 SQL Server 数据库免受未授权访问和安全威胁。
