На сервере RHEL7 мне нужно реализовать две политики паролей, которые можно описать как параметры модуля PAM pam_pwquality:
Кроме того, конфигурация PAM RHEL 7 по умолчанию уже содержит следующую запись pam_pwquality:
У меня есть требования применить политику паролей входа 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.
Параметр «use_authtok», включенный в мои последние две записи pam_pwquality, кажется, игнорируется.
Знаете ли вы, что не так в этой конфигурации или других методах реализации этих требований?
Проблема здесь двоякая:
pam_pwquality
предназначен для явного запроса проверки пароля с помощью pam_get_authtok_verify
, и use_authtok
относится только к pam_get_authtok_noverify
. 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 является взаимоисключающим. Если кто-то входит в обе группы, приоритет имеет группа 1.