密码策略

适用范围:SQL Server

SQL Server 可以使用 Windows 密码策略机制。 密码策略应用于使用 SQL Server 身份验证的登录名,并且应用于具有密码的包含数据库用户。

对于在 SQL Server 中使用的密码,它可以应用 Windows 中所用的相同复杂性与过期策略。 此功能取决于 NetValidatePasswordPolicy API。

注意

Azure SQL 数据库强制实施密码复杂性。 密码过期和策略实施部分不适用于 Azure SQL 数据库。

有关 Azure SQL 托管实例的密码策略的信息,请参阅 SQL 托管实例常见问题解答

密码复杂性

密码复杂性策略通过增加可能密码的数量来阻止强力攻击。 实施密码复杂性策略时,新密码必须符合以下原则:

  • 密码不得包含用户的帐户名。

  • 密码长度至少为八个字符。

  • 密码包含以下四类字符中的三类:

    • 拉丁文大写字母 (A - Z)

    • 拉丁文小写字母 (a - z)

    • 10 位基本数字 (0-9)

    • 非字母数字字符,如感叹号 (!)、美元符号 ($)、数字符号 (#) 或百分号 (%)。

密码可最长为 128 个字符。 使用的密码应尽可能长,尽可能复杂。

密码过期

密码过期策略用于管理密码的使用期限。 如果 SQL Server 实施密码过期策略,则系统会提醒用户更改旧密码,并会禁用密码已过期的帐户。

策略实施

可为每个 SQL Server 登录名单独配置密码策略实施。 使用 ALTER LOGIN (Transact-SQL) 来配置 SQL Server 登录名的密码策略选项。 配置密码策略实施时,适用以下规则:

  • 如果 CHECK_POLICY 改为 ON,则将出现以下行为:

    • 除非将 CHECK_EXPIRATION 显式设置为 OFF,否则会将其设置为 ON。

    • 用当前的密码哈希值初始化密码历史记录。

    • 还将启用帐户锁定时间, 帐户锁定阈值在此后重置帐户锁定计数器

  • 如果 CHECK_POLICY 改为 OFF,则将出现以下行为:

    • CHECK_EXPIRATION 也设置为 OFF。

    • 清除密码历史记录。

    • lockout_time 的值被重置。

不支持策略选项的某些组合。

  • 如果指定 MUST_CHANGE,则 CHECK_EXPIRATION 和 CHECK_POLICY 必须设置为 ON。 否则,该语句将失败。

  • 如果 CHECK_POLICY 设置为 OFF,则 CHECK_EXPIRATION 不能设置为 ON。 包含此选项组合的 ALTER LOGIN 语句将失败。

  • 设置 CHECK_POLICY = ON 将禁止创建以下类型的密码:

    • 为 NULL 或空

    • 与计算机名或登录名相同

    • 以下任何项:passwordadminadministratorsasysadmin

可以在 Windows 中设置安全策略,也可以从域接收安全策略。 若要查看计算机上的密码策略,请使用本地安全策略 MMC 管理单元 (secpol.msc)。

注意

对于已启用 CHECK_POLICY 的 SQL Server 登录名,如果运行 ALTER LOGIN ,并且在命令中未包括 OLD_PASSWORD 以更改密码,则会忽略“强制实施密码历史记录”。 按设计来说,这是允许密码重置的行为,尽管以前使用过任何密码。 无论是否使用 OLD_PASSWORD,都会执行与 CHECK_POLICY 关联的其他检查,包括长度和复杂性。

检查 SQL 用户密码策略信息

可以使用以下查询查看 SQL Server 中的 SQL 用户密码策略和期满日。 虽然以下查询也适用于 Azure SQL 数据库,但 Azure SQL 数据库中只强制实施密码复杂性。

SELECT name,
    is_policy_checked,
    is_expiration_checked,
    LOGINPROPERTY(name, 'IsMustChange') AS IsMustChange,
    LOGINPROPERTY(name, 'IsLocked') AS IsLocked,
    LOGINPROPERTY(name, 'LockoutTime') AS LockoutTime,
    LOGINPROPERTY(name, 'PasswordLastSetTime') AS PasswordLastSetTime,
    LOGINPROPERTY(name, 'IsExpired') AS IsExpired,
    LOGINPROPERTY(name, 'BadPasswordCount') AS BadPasswordCount,
    LOGINPROPERTY(name, 'BadPasswordTime') AS BadPasswordTime,
    LOGINPROPERTY(name, 'HistoryLength') AS HistoryLength,
    modify_date
FROM sys.sql_logins;

CREATE LOGIN (Transact-SQL)

ALTER LOGIN (Transact-SQL)

CREATE USER (Transact-SQL)

ALTER USER (Transact-SQL)

创建登录名

创建数据库用户