Skip to content

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 密码策略配置方法

本地安全策略配置

  1. 运行 secpol.msc 打开本地安全策略
  2. 导航到 "账户策略" → "密码策略"
  3. 配置以下核心设置:
    • 密码必须符合复杂性要求:启用
    • 密码长度最小值:建议 12 个字符
    • 密码最长使用期限:建议 90-180 天
    • 密码最短使用期限:建议 1-7 天
    • 强制密码历史:建议 24 个
    • 用可还原的加密来存储密码:禁用

组策略配置

  1. 运行 gpedit.msc 打开组策略编辑器
  2. 导航到 "计算机配置" → "Windows 设置" → "安全设置" → "账户策略" → "密码策略"
  3. 配置与本地安全策略相同的设置
  4. 链接组策略到相关的组织单位 (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:分阶段实施

  1. 第一阶段:为所有管理员账户启用密码策略
  2. 第二阶段:为所有应用程序账户启用密码策略
  3. 第三阶段:为服务账户启用密码策略(根据实际情况决定是否启用密码过期)
  4. 第四阶段:监控和优化密码策略

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 登录名的密码过期问题?

  1. 批量重置密码:使用 PowerShell 脚本批量更新登录名密码
  2. 使用服务主体:对于应用程序,考虑使用 Azure AD 服务主体或托管身份
  3. 延长过期期限:根据业务需求,适当延长密码过期期限
  4. 优先使用 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 登录名的锁定策略:

  1. 在 Windows 本地安全策略或组策略中配置 "账户锁定阈值"
  2. 在 SQL Server 登录名上启用 CHECK_POLICY = ON
  3. SQL Server 将自动应用 Windows 账户锁定策略

密码策略会影响 Windows 登录名吗?

对于 Windows 登录名,SQL Server 完全依赖于 Windows 操作系统的密码策略,不直接应用 SQL Server 密码策略。Windows 登录名的密码策略由 Windows 本地安全策略或组策略控制。

如何教育用户使用强密码?

  1. 提供密码创建指南,包括长度、复杂性要求
  2. 建议使用密码管理器
  3. 培训用户识别钓鱼攻击
  4. 提醒用户不要共享密码
  5. 演示弱密码的危害

如何审计密码策略的合规性?

  1. 使用 SQL Server 审计功能记录登录活动
  2. 使用扩展事件监控登录失败尝试
  3. 定期生成密码策略合规性报告
  4. 结合 Azure Monitor 或其他监控工具进行持续监控
  5. 进行定期安全审计和渗透测试

如何处理密码策略与应用程序的兼容性问题?

  1. 评估应用程序的密码策略支持情况
  2. 对于旧应用程序,考虑使用代理账户或服务层
  3. 与应用程序开发人员合作,更新应用程序以支持强密码
  4. 考虑使用应用程序网关或中间件处理身份验证

总结

密码策略是 SQL Server 安全性的基础组成部分,通过实施强密码策略,可以有效防止未经授权的访问和密码破解攻击。不同版本的 SQL Server 对密码策略的支持程度不同,DBA 应根据实际环境和业务需求选择合适的密码策略配置。

在实施密码策略时,建议遵循以下核心原则:

  1. 分阶段实施:从高特权账户开始,逐步扩展到所有账户
  2. 差异化策略:根据环境类型和账户重要性,配置不同的密码策略
  3. 定期审查和更新:根据安全威胁的变化,定期调整密码策略
  4. 结合多因素身份验证:对于高特权账户,启用多因素身份验证,提高安全性
  5. 持续监控和审计:监控登录活动,及时发现异常情况
  6. 用户教育:培训用户使用强密码,提高整体安全意识

通过正确实施和管理密码策略,企业可以构建安全、可靠的身份验证体系,保护 SQL Server 数据库免受未授权访问和安全威胁。