pam_cracklib 正确报告错误密码,但 pam_unix 模块仍然会更改密码

pam_cracklib 正确报告错误密码,但 pam_unix 模块仍然会更改密码

我目前正在尝试使用,pam_cracklib根据我的 debug.log ,它确实失败了,但即使它被设置为password requisite我的 PAM 配置文件中的一个条目,它仍然会进入pam_unix允许更改密码的下一个模块。为什么它允许更改密码?

我正在通过 执行登录驱动程序应用程序sudo,这是我所知道的唯一验证方法。

这是我的 PAM 配置文件(名为/etc/pam.d/validate):

auth  required    pam_env.so
auth  required    pam_tally.so onerr=fail deny=3
auth  sufficient  pam_unix.so nullok try_first_pass 
auth  requisite   pam_succeed_if.so uid >= 500 quiet
auth  required    pam_deny.so

account  required    pam_unix.so
account  required    pam_tally.so
account  sufficient  pam_succeed_if.so uid < 500 quiet
account  required    pam_permit.so

password requisite   pam_cracklib.so debug retry=3 minlen=14 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1
password sufficient  pam_unix.so md5 shadow nullok try_first_pass use_authtok
password required    pam_deny.so

session  optional    pam_keyinit.so revoke
session  required    pam_limits.so
session  [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session  required    pam_unix.so

我使我的用户密码无效,强迫他们更改密码:

# chage -d 0 <user>

sudo当我使用我的生成运行自定义应用程序时,会/var/log/debug.log出现以下情况。

pam_unix(validate:account): expired password for user mike (root enforced)
pam_cracklib(validate:chauthtok): bad password: it is WAY too short
pam_unix(validate:chauthtok): password changed for mike

答案1

这是因为sudo以 root 身份运行您的命令。

如果你检查,man pam_cracklib你会看到以下内容

   enforce_for_root
       The module will return error on failed check also if the user
       changing the password is root. This option is off by default which
       means that just the message about the failed check is printed but
       root can change the password anyway. Note that root is not asked
       for an old password so the checks that compare the old and new
       password are not performed.

所以你需要做的是改变你的pam_cracklib.so台词说

password requisite   pam_cracklib.so debug retry=3 minlen=14 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1 enforce_for_root

查看了 pam_cracklib.so 源代码后,它在第 804 行执行以下操作(无论如何在 Fedora 20 上)

  if (getuid() || options.enforce_for_root || (flags & PAM_CHANGE_EXPIRED_AUTHTOK))

因此,它会检查调用者的真实 UID,并根据真实 UID 是否为 0 来强制更改。

因此,您只需设置二进制文件的 UID 并确保 root 拥有它,然后它将能够更改密码并强制执行 cracklib 决定。设置二进制文件的 UID 只会将有效 UID 设置为 0,而不是真实的 UID。

相关内容