9.6. 设计密码策略

密码策略是一组规则,用于控制在给定系统中使用密码的方式。Directory Server 的密码策略指定密码必须满足的条件,如年龄、长度以及用户是否可以重复使用密码。
以下小节提供有关设计声密码策略的更多信息:

9.6.1. 密码策略的工作方式

目录服务器支持细粒度密码策略,这意味着可在子树和用户级别上定义密码策略。这允许在目录树的任意点定义密码策略:
  • 整个目录。
    这样的策略称为 全局 密码策略。配置并启用后,该策略将应用到 目录中的所有用户,除了启用了本地密码策略的用户条目和那些启用了本地密码策略的用户条目。
    这可以为所有目录用户定义通用、单一密码策略。
  • 目录的特定子树。
    这种策略称为 子树级别本地密码策略。配置并启用后,策略将应用到指定子树下的所有用户。
    在托管环境中,为每个托管公司支持不同的密码策略,而不是对所有托管公司强制执行单个策略。
  • 目录的特定用户。
    此类策略 称为用户级别本地密码策略。配置并启用后,策略只会应用到指定用户。
    这可以为不同的目录用户定义不同的密码策略。例如,指定一些用户每天更改其密码,一些用户每月更改,而所有其他用户每六个月更改一次。
默认情况下,Directory 服务器包含与全局密码策略相关的条目和属性,这意味着将相同的策略应用于所有用户。要为子树或用户设置密码策略,请在子树或用户级别添加额外的条目,并启用 cn=config 条目的 nsslapd-pwpolicy-local 属性。此属性充当交换机,打开和关闭精细密码策略。
您可以使用命令行或 Web 控制台更改密码策略。使用 dsconf pwpolicy 命令更改全局策略和 dsconf localpwp 命令,以更改本地策略。有关设置密码策略的更多信息,请参阅管理指南
注意
之前管理的本地密码策略的 ns-newpwpolicy.pl 脚本已弃用。但是,此脚本在 389-ds-base-legacy-tools 软件包中仍然可用。
在将密码策略条目添加到目录中后,它们决定了 Directory 服务器应强制执行的密码策略的类型(global 或 local)。
当用户尝试绑定到目录时,Directory 服务器会确定是否为用户条目定义并启用本地策略。
  • 要确定是否启用了精细的密码策略,服务器会检查分配给 cn=config 条目的 nsslapd-pwpolicy-local 属性的值(onoff)。如果该值为 off,服务器会忽略子树和用户级别定义的策略,并强制实施全局密码策略。
  • 要确定是否为子树或用户定义了本地策略,服务器会在对应的用户条目中检查 pwdPolicysubentry 属性。如果属性存在,服务器会强制为用户配置本地密码策略。如果缺少 属性,服务器会记录错误消息并强制执行全局密码策略。
然后,服务器会将用户提供的密码与用户的主目录条目中指定的值进行比较,以确保它们匹配。服务器也使用密码策略定义的规则来确保密码在允许用户绑定到目录之前有效。

图 9.3. 密码策略检查过程

密码策略检查过程
除了绑定请求外,如果请求中存在 userPassword 属性(在以下部分中介绍),则密码策略检查也会在添加和修改操作过程中发生。
修改 userPassword 的值检查两个密码策略设置:
  • 激活密码最短期限策略。如果最短期限要求尚未满足,服务器会返回 constraintViolation 错误。密码更新操作失败。
  • 密码历史记录策略已激活。如果 userPassword 的新值位于密码历史记录中,或者它与当前密码相同,则服务器会返回 constraintViolation 错误。密码更新操作失败。
为密码语法添加和修改 userPassword 检查密码策略的值:
  • 激活密码最小长度策略。如果 userPassword 的新值小于所需的最小长度,服务器会返回 constraintViolation 错误。密码更新操作失败。
  • 密码语法检查策略已激活。如果 userPassword 的新值与条目的另一个属性相同,服务器会返回 constraintViolation 错误。密码更新操作失败。

9.6.2. 密码策略属性

以下小节描述了为服务器创建密码策略的属性:
有关如何设置这些属性的说明,请参阅 红帽目录服务器管理指南

9.6.2.1. 最大故障数

这是密码策略中的一个设置,可启用基于密码的帐户锁定。如果用户尝试登录某个次数并失败,那么该帐户会锁定,直到管理员解锁或有选择地通过了一定时间。这在 passwordMaxFailure 参数中设置。
当达到最大失败尝试次数时,在评估时可以通过两种不同的方式计算登录尝试。它可以是硬的限制,在数字达到达到时锁定帐户(n),或仅在超过计数时锁定帐户(n+1)。例如,如果限制为三次失败的尝试,则可以在第三个失败尝试发生时锁定帐户 (n),或在第四次失败尝试时 (n+1) 锁定账户。n+1 行为是 LDAP 服务器的历史行为,因此它被视为旧行为。较新的 LDAP 客户端预期更严格的硬限制。默认情况下,Directory 服务器使用严格的限制(n),但可以在 passwordLegacyPolicy 参数中启用旧行为。

9.6.2.2. 重置后更改密码

Directory Server 密码策略可以指定用户是否必须在第一次登录时或管理员重置密码后更改密码。
管理员设置的默认密码通常遵循公司惯例,如用户最初、用户 ID 或公司名称。如果发现这个惯例,这通常是攻击者试图破坏系统的第一个值。因此,建议用户在管理员重置后更改密码。如果为密码策略配置了这个选项,则即使禁用了用户定义的密码,用户需要更改密码。
如果不需要用户或允许更改自己的密码,则管理员分配的密码不应遵循任何明显的惯例,应该很难发现。
默认配置不需要用户在重置后更改密码。
如需更多信息,请参阅 第 9.6.2.3 节 “用户定义的密码”

9.6.2.3. 用户定义的密码

可以设置密码策略,以允许或不允许用户更改自己的密码。良好的密码是强密码策略的关键。良好的密码不使用微小的词语;在字典、pet 或子代、生日、用户 ID 或任何可方便地发现的用户的其他信息中都可以为密码选择。
好的密码应包括字母、数字和特殊字符的组合。但为了方便起见,用户通常使用容易记住的密码。因此,一些企业选择为用户设置密码,以满足强大密码条件,也不允许用户更改密码。
为用户设置密码有两个缺陷:
  • 它需要大量管理员的时间。
  • 因为管理员指定的密码通常更难以记住,用户更有可能写出密码,从而增加发现的风险。
默认情况下,允许用户定义的密码。

9.6.2.4. 密码过期

密码策略可允许用户无限期地使用相同的密码,或指定在给定时间后过期的密码。通常,使用较长的密码会被发现。但是,如果密码经常过期,用户可能会发现他们无法记住,并有助于使用密码使用密码。常见策略是使密码每 30 到 90 天过期。
即使禁用密码过期时间,服务器也会记住密码过期规格。如果重新启用了密码过期,则密码只在最后一次禁用前设定的时间有效。
例如,如果将密码策略设置为每隔 90 天过期一次,并且禁用密码过期并重新启用密码过期时间,则默认的密码过期持续时间为 90 天。
默认情况下,用户密码永不过期。

9.6.2.5. 过期警告

如果设置了密码过期周期,最好会在其密码过期前向用户发出警告。
当用户绑定到服务器时,Directory 服务器会显示警告。如果启用了密码过期,默认情况下,会在用户的密码过期之前向用户发送一个警告(使用 LDAP 消息),只要用户的客户端应用程序支持此功能。
要发送的密码过期警告的有效范围为从一到 24,855 天。
注意
密码 未过期直到过期警告被发送为止。

9.6.2.6. 宽限期登录限制

过期密码的 宽限期 表示用户仍然可以登录到系统,即使其密码已过期。要允许某些用户使用过期密码登录,请在密码过期后指定允许用户的宽限期尝试次数。
默认情况下不允许使用宽限期。

9.6.2.7. 密码语法检查

密码语法检查 强制使用密码字符串的规则,以便任何密码都必须满足或超过特定条件。所有密码语法检查都可在全局、每个子树或每个用户应用。密码语法检查在 passwordCheckSyntax 属性中设置。
默认密码语法要求最小密码长度为八个字符,且密码中没有使用任何普通词语。微小的词语是存储在 uidcnsn、gedName、gou、nou 或 mail属性中的任何值。
另外,有可能进行其他形式的密码语法强制,为密码语法提供不同的可选类别:
  • 密码中所需的最小字符数(passwordMinLength)
  • 最小数字数,即零到 9 之间的数字(passwordMinDigits)
  • 大写和小写的 ASCII 字母字符数(passwordMinAlphas)
  • 最少大写 ASCII 字母字符数(passwordMinUppers)
  • 最低小写 ASCII 字母数(passwordMinLowers)
  • 最小特殊 ASCII 字符数,如 !@#$ (passwordMinSpecials)
  • 最小 8 位字符数(passwordMin8bit)
  • 可以立即重复同一字符的次数上限,如 aaabbb (passwordMaxRepeats)
  • 每个密码所需的最小字符类别数;类别可以是大写或小写字母、特殊字符、数字或 8 位字符(passwordMinCategories)
  • 目录服务器针对 CrackLib 字典检查密码(passwordDictCheck)
  • 目录服务器检查密码是否包含 palindrome (passwordPalindrome)
  • 目录服务器可防止设置同一类别(passwordMaxClassChars)中连续字符的密码。
  • 目录服务器可防止设置包含某些字符串的密码(passwordBadWords)
  • 目录服务器可防止设置包含管理员定义属性中设置的字符串的密码(passwordUserAttributes)
需要的更多语法类别,其密码越高。
默认情况下禁用密码语法检查。

9.6.2.8. 密码长度

密码策略可能需要用户密码的最短长度。通常,更短的密码更易于破解。密码的良好长度为 8 个字符。这很难破解但很短,用户可以在不写出密码的情况下记住密码。此属性的有效范围值从 2 到 512 个字符。
默认情况下不设置密码长度。

9.6.2.9. password Minimum Age

密码策略可以阻止用户更改指定时间的密码。与 passwordHistory 属性一起使用时,不建议用户使用旧密码。
例如,如果密码最短年龄(passwordMinAge)属性是 2 天,用户可以在单个会话中重复更改其密码。这可以防止它们通过密码历史记录加以利用,以便他们可以重复利用旧密码。
此属性的有效范围值从零到 24,855 天。值为零(0)表示用户可以立即更改密码。

9.6.2.10. 密码历史

目录服务器可以在密码历史记录中存储两个到 24 密码 ;如果密码位于历史记录中,用户也无法将其密码重置为旧密码。这可防止用户重复使用容易记住的一些密码。或者,可以禁用密码历史记录,从而允许用户重复使用密码。
即使密码历史记录已关闭,密码历史记录也仍处于历史记录中,用户在禁用密码历史记录前无法重复使用历史记录中的密码。
默认情况下,服务器不会维护密码历史记录。

9.6.2.11. 密码存储

密码存储方案指定了在目录中存储目录服务器密码的加密类型。Directory 服务器支持几种不同的密码存储方案:
  • salt 的安全哈希算法 (SSHA、SSHA-256、SSHA-384 和 SSHA-512)。这是最安全的密码存储方案,它是默认的。 推荐的 SSHA 方案是 SSHA-256 或 stronger。
  • CLEAR,这意味着没有加密。这是唯一可与 SASL Digest-MD5 一起使用的选项,因此使用 SASL 需要 CLEAR 密码存储方案。
    虽然目录中存储的密码可以通过使用访问控制信息 (ACI) 指令进行保护,但它仍然不是将纯文本密码存储在目录中的最佳选择。
  • 安全散列算法 (SHA、SHA-256、SHA-384 和 SHA-512)。这比 SSHA 更安全。
  • UNIX CRYPT 算法.这个算法提供与 UNIX 密码的兼容性。
  • MD5.这个存储方案比 SSHA 不太安全,但对于需要 MD5 的传统应用程序会包括这个存储方案。
  • salt 的 MD5。这个存储方案比普通 MD5 哈希更安全,但仍然比 SSHA 更安全。此存储方案不包含用于新密码,而是有助于将用户帐户从支持 salt 的 MD5 的目录中迁移。

9.6.2.12. 密码最后修改时间

passwordTrackUpdateTime 属性告知服务器最后一次为条目更新密码的时间戳。密码更改时间本身作为操作属性存储在用户条目 pwdUpdateTime 上(与 modifyTimestamplastModified 操作属性分开)。
默认情况下,不会记录 密码更改时间。

9.6.3. 在复制环境中设计密码策略

在复制环境中强制实施密码和帐户锁定策略,如下所示:
  • 在数据供应商强制密码策略。
  • 在复制设置中的所有服务器上强制使用帐户锁定。
目录中的密码策略信息(如密码年龄)、帐户锁定计数器和过期警告计数器都是复制的。但是,配置信息不存储在本地,且不会被复制。此信息包括密码语法以及密码修改的历史记录。
在复制环境中配置密码策略时,请考虑以下点:
  • 所有副本都发出警告密码过期。此信息保留在每台服务器上,因此,如果用户依次绑定到多个副本,则用户会多次收到相同的警告。此外,如果用户更改密码,则可能需要过些时间,将此信息过滤到副本。如果用户更改密码,然后立即重新绑定,绑定可能会失败,直到副本注册更改为止。
  • 所有服务器上都应该发生相同的绑定行为,包括供应商和副本。始终在每台服务器上创建相同的密码策略配置信息。
  • 在多层次环境中,帐户锁定计数器可能无法按预期工作。