在 RHEL7 服务器中,我必须实现两个密码策略,它们可以描述为 PAM pam_pwquality 模块的参数:
- 密码要求 pam_pwquality.so try_first_pass local_users_only minlen=14
- 密码要求 pam_pwquality.so try_first_pass local_users_only dcredit=0 ucredit=0 ocredit=0 lcredit=0 minclass=3 maxsequence=1
此外,默认的 RHEL 7 PAM 配置已经包含 pam_pwquality 的以下条目:
- 密码要求 pam_pwquality.so try_first_pass local_users_only retry=3
我的要求是将条目 3 的密码策略应用于所有用户,并将密码策略应用于名为 group1 和 group2 的两个不同的本地用户组。
为了满足这些要求,我在 /etc/pam.d/password-auth-ac 和 /etc/pam.d/system-auth-ac 中的默认 pam_pwquality 条目(在本问题中名为 3.)之后添加了以下代码:
password requisite pam_pwquality.so try_first_pass local_users_only minlen=14 # Default RHEL7 pam_pwquality.so entry
#BEGIN PWPOLICY 1
password [success=1 default=ignore] pam_succeed_if.so user notingroup group1
password requisite pam_pwquality.so try_first_pass local_users_only minlen=14 use_authtok
#END PWPOLICY 1
#BEGIN PWPOLICY 2
password [success=1 default=ignore] pam_succeed_if.so user notingroup group2
password requisite pam_pwquality.so try_first_pass local_users_only dcredit=0 ucredit=0 ocredit=0 lcredit=0 minclass=3 maxsequence=1 use_authtok
#END PWPOLICY 2
此配置按预期工作,但它的缺点是,当用户(包括 group1 和 group2)更改密码时,需要重复多次,如下例所示:
[test@rhel7 ~]$ passwd
Changing password for user test.
Changing password for test.
(current) UNIX password:
New password:
Retype new password:
Retype new password:
Retype new password:
passwd: all authentication tokens updated successfully.
我的最后两个 pam_pwquality 条目中包含的选项“use_authtok”似乎被忽略了。
您知道这个配置有什么问题或者其他实现这些要求的方法吗?
答案1
这里的问题有两个方面:
pam_pwquality
旨在明确提示密码验证pam_get_authtok_verify
,并且use_authtok
仅适用于pam_get_authtok_noverify
。- PAM 按顺序沿堆栈向下工作,因此所有用户都会在第一行触发默认策略,并且我相信您的
pam_succeed_if
跳过并不像您想象的那样工作。
我认为您可能想要反转顺序并添加和使用括号语法来实现您想要的效果:
### Policy Group 1
# If the user is in group 1, do nothing (and run the next module),
# otherwise skip to Group 2
password [success=ignore default=1] pam_succeed_if.so user ingroup group1
# If this module succeeds skip 3 modules: the two for Group 2
# and 1 for the default entry, otherwise fail the stack immediately.
# "die" matches the "requisite" in your original policy. If "required" is
# intended, change this to "bad"
password [success=3 default=die] pam_pwquality.so try_first_pass local_users_only minlen=14
### Policy Group 2
# If the user is in group 2, do nothing (and run the next module),
# otherwise skip to the default entry
password [success=ignore default=1] pam_succeed_if.so user ingroup group2
# Similar to Group 1, except we only need to skip the default module entry on success
password [success=1 default=die] pam_pwquality.so try_first_pass local_users_only dcredit=0 ucredit=0 ocredit=0 lcredit=0 minclass=3 maxsequence=1
### Default RHEL7 pam_pwquality.so entry
password requisite pam_pwquality.so try_first_pass local_users_only minlen=14
### This should be replaced with the stack responsible for managing passwords, if not the RHEL7 default
password sufficient pam_unix.so try_first_pass use_authtok nullok sha512 shadow
在我看来,第 1 组的策略和默认策略之间似乎没有任何区别。假设这不是故意的,我相信如果您确实需要所有 3 个策略都不同,上述方法应该可以奏效。
另外:此解决方案假设 group1 和 group2 成员身份是互斥的。如果某人同时属于两个组,则 group1 优先。