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 详情请查看 Red Hat Directory Server Configuration、命令和文件参考中的属性描述
20.10.2. 帐户身份和帐户过期
帐户策略
插件允许您设置:
- 帐户过期:帐户在创建帐户后被禁用一定时间。
- 帐户不活跃:帐户在最后一次成功登录后被禁用了一定时间。这可让您自动禁用未使用的帐户。
禁用的帐户无法再登录。
设置
帐户策略
插件:
- 启用帐户策略插件:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin account-policy enable
- 设置插件配置条目:
# 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"
- 创建插件配置条目:
- 要将 CoS 或角色与帐户策略搭配使用,请将
alwaysRecordLogin
值设置为yes
。这意味着每个条目都有登录时间,即使它没有acctPolicySubentry
属性。 - 将用于帐户策略评估的 primary 属性设置为
stateAttrName
的值。对于帐户不活跃,请使用lastLoginTime
属性。对于简单的帐户过期时间,请使用createTimestamp
属性。 - 您可以在
altStateAttrName
中设置二级属性,该属性会在stateAttrName
中定义的主属性不存在。如果没有指定属性作为替代值,则使用默认值createTimestamp
。警告如果 primary 属性的值被设置为lastLoginTime
,并且altStateAttrName
设置为createTimestamp
,则现有环境中的用户会在帐户没有lastLoginTime
属性时自动锁定,并且createTimestamp
比配置的不活跃周期旧。对于这种情况,请将 alternatives 属性设置为1.1
。这会明确地声明不使用任何属性作为替代方案。下一次登录时,将自动创建lastLoginTime
属性。 - 设置要使用的属性,以显示哪些条目应用了帐户策略(cct
PolicySubentry
)。 - 在帐户策略中设置属性,它用于设置实际超时时间,以秒为单位(
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
- 重启服务器以载入新插件配置:
# dsctl instance_name restart
- 定义帐户策略:
# 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: extensibleObjectobjectClass: accountpolicy
accountInactivityLimit: 2592000
cn: Account Inactivation Policy - 创建服务模板条目的类:
# 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 允许为多个条目可靠地应用和更新帐户策略,并允许将多个策略应用到条目。 - 创建服务定义条目的类。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 来处理正在跟踪的登录信息。
- 启用帐户策略插件:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin account-policy enable
- 创建插件配置条目以记录登录时间:
- 将
alwaysRecordLogin
值设置为 yes,以便每个条目都有登录时间记录。 - 将
lastLoginTime
属性设置为用于帐户策略的属性(stateattrname
)。 - 设置要使用的属性,以显示哪些条目应用了帐户策略(cct
PolicySubentry
)。 - 在帐户策略中设置属性,用于设置实际的超时时间,以秒为单位(
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
- 重启服务器以载入新插件配置:
# 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
指示到时间戳。