20.10. 配置基于时间的帐户锁定策略

除了锁定帐户进行失败的身份验证尝试外,另一种定义帐户锁定策略的方法是将其基于帐户不活跃或帐户年龄。帐户策略插件使用 相对 时间设置来确定是否应该锁定帐户。
注意
角色或服务类可用于根据 绝对 帐户时间在激活帐户中使用。例如,可以创建 CoS,以激活在特定日期之前创建的每个帐户。
帐户策略插件需要三个配置条目:
  • 插件本身的配置条目。这会设置用于该服务器上配置的所有帐户策略的全局值。
  • 帐户策略配置条目。此条目位于用户目录中,基本上是一个模板,它被引用并应用到用户帐户条目。
  • 应用帐户策略条目的条目。用户帐户可以直接引用帐户策略,或者 CoS 或角色可用于自动将帐户策略应用到一组用户帐户。
    注意
    通过 acctPolicySubentry 属性应用帐户策略。虽然此属性可以直接添加到用户帐户,但此属性是单值 - 这意味着只能将一个帐户策略应用到该帐户。
    在大多数情况下可能会很正常。但是,一个机构可能有意创建两个帐户策略,一个用于帐户不活跃,然后根据年龄进行帐户过期。
    使用 CoS 应用帐户策略,允许将多个帐户策略用于帐户。

20.10.1. 帐户策略插件语法

帐户策略插件本身只有两个配置属性:
  • nsslapd-pluginEnabled,它设定插件是否启用或禁用。此属性默认为 off
  • nsslapd-pluginarg0,指向插件配置目录的 DN。配置条目通常是插件本身的子条目,如 cn=config,cn=Account Policy Plugin,cn=plugins,cn=config
在以前的版本中,帐户策略在两个部分定义:
  • nsslapd-pluginarg0 属性中标识的插件配置条目。这会为插件设置全局配置,用于识别帐户策略配置条目和管理用户帐户条目。这些设置适用于服务器。
    配置条目属性在 Red Hat Directory Server Configuration, Command, Command, and File Reference 中的 Account Policy Plug-in Attributes 部分中进行了描述。
  • 帐户策略配置条目。这类似于模板条目,它为帐户策略设置特定值。用户帐户 - 直接或通过 CoS 条目 - 引用此帐户策略条目。
    下表中描述了帐户策略和用户条目属性:

    表 20.2. 帐户策略条目和用户条目属性

    属性 定义 配置或用户条目
    accountpolicy (对象类) 为在activation 或 expiration 策略中的帐户定义模板条目。 配置
    accountInactivityLimit (attribute) 在帐户被锁定前,设置帐户最后一次登录时间(以秒为单位)的时间(以秒为单位)。 配置
    acctPolicySubentry (attribute) 标识属于帐户策略的任何条目(特别是帐户锁定策略)。此属性的值指向应用到该条目的帐户策略的 DN。 User
    createTimestamp (operational 属性) 包含最初创建的日期和时间。 User
    lastLoginTime (operational 属性) 包含给定帐户向目录进行身份验证的时间戳。 User

20.10.2. 帐户身份和帐户过期

帐户策略 插件允许您设置:
  • 帐户过期:帐户在创建帐户后被禁用一定时间。
  • 帐户不活跃:帐户在最后一次成功登录后被禁用了一定时间。这可让您自动禁用未使用的帐户。
禁用的帐户无法再登录。
设置 帐户策略 插件:
  1. 启用帐户策略插件:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin account-policy enable
  2. 设置插件配置条目:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin account-policy set --config-entry="cn=config,cn=Account Policy Plugin,cn=plugins,cn=config"
  3. 创建插件配置条目:
    • 要将 CoS 或角色与帐户策略搭配使用,请将 alwaysRecordLogin 值设置为 yes。这意味着每个条目都有登录时间,即使它没有 acctPolicySubentry 属性。
    • 将用于帐户策略评估的 primary 属性设置为 stateAttrName 的值。对于帐户不活跃,请使用 lastLoginTime 属性。对于简单的帐户过期时间,请使用 createTimestamp 属性。
    • 您可以在 altStateAttrName 中设置二级属性,该属性会在 stateAttrName 中定义的主属性不存在。如果没有指定属性作为替代值,则使用默认值 createTimestamp
      警告
      如果 primary 属性的值被设置为 lastLoginTime,并且 altStateAttrName 设置为 createTimestamp,则现有环境中的用户会在帐户没有 lastLoginTime 属性时自动锁定,并且 createTimestamp 比配置的不活跃周期旧。
      对于这种情况,请将 alternatives 属性设置为 1.1。这会明确地声明不使用任何属性作为替代方案。下一次登录时,将自动创建 lastLoginTime 属性。
    • 设置要使用的属性,以显示哪些条目应用了帐户策略(cctPolicySubentry)。
    • 在帐户策略中设置属性,它用于设置实际超时时间,以秒为单位(accountInactivityLimit)。
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin account-policy config-entry set "cn=config,cn=Account Policy Plugin,cn=plugins,cn=config" --always-record-login yes --state-attr lastLoginTime --alt-state-attr 1.1 --spec-attr acctPolicySubentry --limit-attr accountInactivityLimit
  4. 重启服务器以载入新插件配置:
    # dsctl instance_name restart
  5. 定义帐户策略:
    # ldapadd -a -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    
    dn: cn=Account Inactivation Policy,dc=example,dc=com
    
    objectClass: top
    objectClass: ldapsubentry
    objectClass: extensibleObject
    objectClass: accountpolicy
    accountInactivityLimit: 2592000
    cn: Account Inactivation Policy
  6. 创建服务模板条目的类:
    # ldapadd -a -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    
    dn: cn=TempltCoS,dc=example,dc=com
    
    objectClass: top
    objectClass: ldapsubentry
    objectClass: extensibleObject
    objectClass: cosTemplate
    acctPolicySubentry: cn=Account Inactivation Policy,dc=example,dc=com
    帐户策略可以直接在用户条目上定义,而不使用 CoS。但是,使用 CoS 允许为多个条目可靠地应用和更新帐户策略,并允许将多个策略应用到条目。
  7. 创建服务定义条目的类。CoS 的受管条目是帐户策略属性,acctPolicySubentry。这个示例将 CoS 应用到整个目录树:
    # ldapadd -a -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    
    dn: cn=DefnCoS,dc=example,dc=com
    
    objectClass: top
    objectClass: ldapsubentry
    objectclass: cosSuperDefinition
    objectclass: cosPointerDefinition
    cosTemplateDn: cn=TempltCoS,dc=example,dc=com
    cosAttribute: acctPolicySubentry default operational-default

20.10.3. 禁用帐户在密码过期后保留时间挂载

目录服务器允许您配置一个帐户策略,该策略在密码过期后禁用帐户一定时间。禁用帐户无法再登录。
要设置此配置,请按照 第 20.10.2 节 “帐户身份和帐户过期” 中的步骤操作。但是,在配置插件配置条目时,使用以下设置:
dn: cn=config,cn=Account Policy Plugin,cn=plugins,cn=config

objectClass: top
objectClass: extensibleObject
cn: config
alwaysrecordlogin: yes
stateAttrName: non_existent_attribute
altStateAttrName: passwordExpirationTime
specattrname: acctPolicySubentry
limitattrname: accountInactivityLimit
此配置在 stateAttrName 参数中使用 dummy 值。因此,只有 altStateAttrName 参数中设置的 passwordExpirationTime 属性才会用于计算帐户何时过期。
要额外记录用户条目的 lastLoginTime 属性中最后一次成功登录的时间,请设置:
dn: cn=config,cn=Account Policy Plugin,cn=plugins,cn=config

alwaysRecordLoginAttr: lastLoginTime
使用这个配置,如果用户的 passwordExpirationTime 属性和 accountInactivityLimit 参数的值中设定的时间总和,则会自动禁用帐户。使用这个配置,如果用户的 passwordExpirationTime 属性中的值和 accountInactivityLimit 参数中的值总和超过时间,则会自动禁用帐户,因为 alwaysRecordLoginAttr 属性上次更新。

20.10.4. 在不设置锁定策略的情况下跟踪登录时间

也可以使用帐户策略插件来跟踪用户登录时间,而无需 设置过期时间或不活跃的时间。在这种情况下,帐户策略插件用于将 lastLoginTime 属性添加到用户条目,但不需要设置其他策略规则。
在这种情况下,将帐户策略插件设置为正常,以跟踪登录时间。但是,不要创建 CoS 来处理正在跟踪的登录信息。
  1. 启用帐户策略插件:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin account-policy enable
  2. 创建插件配置条目以记录登录时间:
    • alwaysRecordLogin 值设置为 yes,以便每个条目都有登录时间记录。
    • lastLoginTime 属性设置为用于帐户策略的属性(stateattrname)。
    • 设置要使用的属性,以显示哪些条目应用了帐户策略(cctPolicySubentry)。
    • 在帐户策略中设置属性,用于设置实际的超时时间,以秒为单位(accountInactivityLimit)。
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin account-policy config-entry set "cn=config,cn=Account Policy Plugin,cn=plugins,cn=config" --always-record-login yes --state-attr lastLoginTime --alt-state-attr createTimestamp --spec-attr acctPolicySubentry --limit-attr accountInactivityLimit
  3. 重启服务器以载入新插件配置:
    # dsctl instance_name restart

20.10.5. 解锁不活动帐户

如果帐户因为达到不活跃限制而被锁定,您可以使用以下方法之一重新激活它:
  • 使用 dsidm 工具:
    # dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" account unlock "uid=example"
  • 通过将 lastLoginTime 属性重置为当前时间戳来手动:
    # ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    
    dn: uid=example,ou=people,dc=example,dc=com
    changetype: modify
    replace: lastLoginTime
    lastLoginTime: 20210901000000Z
    lastLoginTime 属性将其值存储在 GMT/UTC 时间(Zulu 时区),由附加的 Z 指示到时间戳。