Linux(Ubuntu 与 CentOS)389-ds 的 LDAP 客户端 - 密码策略

Linux(Ubuntu 与 CentOS)389-ds 的 LDAP 客户端 - 密码策略

Ubuntu 12.04 服务器上的 389-ds 已启动并运行。已启用Fine-grained password policiesUser must change password after reset用于整个树。随后创建了测试用户。

从 CentOS 客户端登录:提示用户更改密码:You are required to change your password immediately.

从 Ubuntu 客户端登录:用户登录,无提示

将 CentOS 客户端配置文件复制到 Ubuntu 客户端,确切地说是 /etc/pam_ldap.conf(在 Ubuntu 上是 /etc/ldap.conf)、/etc/nslcd.conf、/etc/openldap/ldap.conf(在 Ubuntu 上是 /etc/ldap/ldap.conf)——没有成功。

两个客户端均已成功验证,并且都可以更改用户密码。

所有登录都是终端登录,不涉及 GUI。

两个客户端上均有 PAM:

  1. 乌本图:

    • /etc/pam.d/通用帐户

      帐户 [成功=2 new_authtok_reqd=done 默认=忽略]
      pam_unix.so 帐户 [成功=1 默认=忽略] pam_ldap.so 帐户必备 pam_deny.so 帐户必需
      pam_permit.so

    • /etc/pam.d/common-auth

      身份验证 [成功 = 2 默认 = 忽略] pam_unix.so nullok_secure 身份验证 [成功 = 1 默认 = 忽略] pam_ldap.so use_first_pass 身份验证
      必备 pam_deny.so 身份验证必需 pam_permit.so 身份验证可选
      pam_cap.so

    • /etc/pam.d/通用密码

      密码 [success=2 default=ignore] pam_unix.so 模糊 sha512 密码 [success=1 user_unknown=ignore default=die]
      pam_ldap.so try_first_pass 密码必需
      pam_deny.so 密码必需
      pam_permit.so 密码可选 pam_gnome_keyring.so

  2. CentOS

    • /etc/pam.d/系统身份验证-ac

      #%PAM-1.0 身份验证需要 pam_env.so 身份验证足够 pam_fprintd.so 身份验证足够 pam_unix.so nullok try_first_pass 身份验证必备 pam_succeed_if.so uid >= 500 quiet 身份验证足够 pam_ldap.so use_first_pass 身份验证
      需要 pam_deny.so

      帐户需要 pam_unix.so broken_shadow 帐户
      足够 pam_localuser.so 帐户足够
      pam_succeed_if.so uid < 500 安静帐户 [default=bad success=ok user_unknown=ignore] pam_ldap.so 帐户需要
      pam_permit.so

      密码必需 pam_cracklib.so try_first_pass retry=3 类型= 密码足够 pam_unix.so sha512 shadow nullok try_first_pass use_authtok 密码足够 pam_ldap.so use_authtok 密码需要 pam_deny.so

      会话可选 pam_keyinit.so 撤销会话必需
      pam_limits.so 会话可选 pam_mkhomedir.so 会话
      [成功 = 1 默认 = 忽略] pam_succeed_if.so 服务在 crond 安静 use_uid 会话必需 pam_unix.so 会话可选
      pam_ldap.so

    • /etc/pam.d/passwd-身份验证

      #%PAM-1.0 身份验证需要 pam_env.so 身份验证足够 pam_unix.so nullok try_first_pass 身份验证必备
      pam_succeed_if.so uid >= 500 quiet 身份验证足够
      pam_ldap.so use_first_pass 身份验证需要 pam_deny.so

      帐户需要 pam_unix.so broken_shadow 帐户
      足够 pam_localuser.so 帐户足够
      pam_succeed_if.so uid < 500 安静帐户 [default=bad success=ok user_unknown=ignore] pam_ldap.so 帐户需要
      pam_permit.so

      密码必需 pam_cracklib.so try_first_pass retry=3 类型= 密码足够 pam_unix.so sha512 shadow nullok try_first_pass use_authtok 密码足够 pam_ldap.so use_authtok 密码需要 pam_deny.so

      会话可选 pam_keyinit.so 撤销会话必需
      pam_limits.so 会话可选 pam_mkhomedir.so 会话
      [成功 = 1 默认 = 忽略] pam_succeed_if.so 服务在 crond 安静 use_uid 会话必需 pam_unix.so 会话可选
      pam_ldap.so

一个区别是,在 Ubuntu 上我没有安装 cracklib。我计划稍后再安装,现在我只是在测试。

我想知道如果 Ubuntu LDAP 客户端加入 Windows AD,它如何从中接收密码过期通知。应该是类似的东西,但我搞不懂。

如何让 Ubuntu 客户端遵守密码策略?为什么我You are required to change your password immediately.在登录时看不到提示,而同样的配置在 CentOS 上也可以用?

谢谢你!

节日快乐!

答案1

我在 Ubuntu 上使用 389-ds 进行工作项目时遇到了完全相同的问题。

我不确定是否要从 CentOS 复制配置 — — 我手边没有盒子。

但当我查阅并阅读 PAM 时,我发现这一切都在文件中/etc/pam.d/通用帐户

pam_unix.so 位于 pam_ldap.so 之上,并且它还有 [success=2 default=ignore],这意味着如果成功则跳过接下来的两个规则,对于其他任何规则,忽略该行。

现在,由于 LDAP 帐户是有效的 UNIX 帐户,因为我们将 ldap 添加到/etc/nsswitch.conf,该规则将返回成功并且 pam_ldap.so 模块将永远不会运行。

为了解决这个问题,我的/etc/pam.d/通用帐户现在看起来像这样:

# here are the per-package modules (the "Primary" block)
account [success=1 default=bad]  pam_succeed_if.so user ingroup auth-access quiet
account [success=reset default=bad]  pam_succeed_if.so uid <= 500 quiet
account [success=2 user_unknown=ignore default=ok]      pam_ldap.so
account [success=1 new_authtok_reqd=done default=ignore]        pam_unix.so
# here's the fallback if no module succeeds
account requisite                       pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
account required                        pam_permit.so
# and here are more per-package modules (the "Additional" block)
# end of pam-auth-update config

如您所见,我还在其中添加了一些规则,仅允许 LDAP 组“auth-access”中的用户或 UID 低于 500 的系统用户被视为有效帐户。

稍微解释一下:

我们达到了第一条规则

account [success=1 default=bad]  pam_succeed_if.so user ingroup auth-access quiet

如果用户在该组中,则执行成功,如果是这样,我们跳过下一行,因为我们知道这将失败(他们是有效的 LDAP 用户,因此他们的系统 UID 不会低于 500) - 如果不成功,则返回失败(糟糕)。

如果没有跳过,则执行下一条规则

account [success=reset default=bad]  pam_succeed_if.so uid <= 500 quiet

因此,如果此操作成功(因为 UID 低于 500),请重置上述模块设置的失败值,因为它们将不属于该 LDAP 组的一部分。

最重要的部分

account [success=2 user_unknown=ignore default=ok]      pam_ldap.so

检查 LDAP 服务器的帐户状态 - 如果成功,我们就知道 LDAP 用户是有效的 UNIX 用户,因此继续并跳过接下来的两行(将我们带到 pam_permit.so 并让用户登录)。如果 LDAP 服务器不知道该用户,请忽略此行并转到下一行 - 对于所有其他状态,“ok”表示可以按原样传递这些返回代码,这将传递诸如密码过期等信息。

进而:

account [success=1 new_authtok_reqd=done default=ignore]        pam_unix.so

如果符合此规则,则我们不是有效的 LDAP 用户,因此请检查我们是否是有效的系统用户 - 如果成功,则跳过下一行(将我们带到 pam_permit.so)。否则,忽略,这将带我们到 pam_deny.so。

希望这有助于进一步解释 - 如果我不太容易理解的话,对我有帮助的文档是:http://uw714doc.sco.com/en/SEC_pam/pam-4.html

问候,iamacarpet

相关内容