Если разделитель может появляться внутри полей, то на самом деле это не разделитель. Вместо этого я бы использовал что-то вроде
KEY=$(sed -n '/^key *=/ { s/^key *= *//; p }' file.conf)
: это ищет строки, начинающиеся с ключа
, за которым следует любое количество пробелов и знак =
, удаляет начало строки и печатает его . Как указывает dave_thompson_085 , p
может быть обусловлено s
:
KEY=$(sed -n 's/^key *= *//p' file.conf)
Эквивалентным AWK является
KEY=$(awk '/^key *=/ { sub("^key *= *", ""); print }' file.conf)
, и можно использовать тот же трюк комбинирования:
KEY=$(awk 'sub("^key *= *", "")' file.conf)
Ваша проблема заключается в том, что вы не настроили стек PAM соответствующим образом, в частности, количество пропусков в строках, использующих скобки. Если вы не знакомы с этим обозначением,RTFM pam.conf (5 ), в котором также перечислены скобочные эквиваленты слов «требуется», «достаточно» и т. д.
Раздел аутентификации по умолчанию для RHEL 7 с настроенным sssd выглядит следующим образом:
auth required pam_env.so
auth [default=1 success=ok] pam_localuser.so
auth [success=done ignore=ignore default=die] pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 1000 quiet_success
auth sufficient pam_sss.so forward_pass
auth required pam_deny.so
В строке pam_localuser
указано, что действие по умолчанию — пропустить один модуль (pam_unix
, в данном случае ), но в случае успеха (, т. е. пользователь является локальным ), продолжайте работу в обычном режиме. Это сделано для того, чтобы доменные (не -локальные )пользователи не генерировали неудачную попытку входа в систему с pam_unix
, а вместо этого сразу переходили к sssd(pam_sss
с предварительной проверкой uid >= 1000 ).
Также обратите внимание на настройку default=die в pam_unix
, что означает, что неудачный локальный вход прервет стек аутентификации прямо здесь (и даже не попытаетсяpam_sss
). Точно так же success=done делает то же самое для успешных входов в систему.
Как уже упоминалось, pam_faillock
не применяется к пользователям домена, но если вы используете его для локальных учетных записей и вставляете три вызова вокруг pam_unix
, вам нужно будет изменить pam_localuser
строку на default=4 , так что вход в домен продолжит работать. (При default=1 он пропустит pam_faillock
, но перейдет к pam_unix
, что, очевидно, не удастся для учетных записей домена, и из-за default=die немедленно прервется. Установка по умолчанию = 4 приведет к переходу к pam_succeed_if
, как это было раньше.)
Я не знаком с pam_faillock
, поэтому не могу сказать, правильно ли вызывать его снова после pam_unix
, но если это так, вам также нужно что-то сделать с success=done и default=die on pam_unix
, иначе он никогда не дойдет до pam_faillock
для блокировки/разблокировки учетных записей.
Это сложный стек PAM; вы можете ознакомиться с примерами конфигураций в pam _faillock (8). Убедитесь, что вы случайно не впустили всех в (, надеюсь, pam_deny
в конце позаботится об этом ),и не забудьте настроить все default=N счетчики при добавлении или удалении последующих строк.
TL;DR:[default=1]
означает пропуск одной строки после(pam_unix
в данном случае ). Добавление строк требует корректировки количества.
Это мой пароль -файл авторизации, и он работает нормально:
# Setup PAM Env
auth required pam_env.so
auth required pam_faildelay.so delay=4000000
# Check if Local User, if fail skip to SSSD part
auth [success=ok default=4] pam_localuser.so
# Local User - Load pre-auth, if fail end
auth [success=ok default=2] pam_faillock.so preauth deny=3 unlock_time=604800 fail_interval=900
# Local User - Attempt Auth, if fail end
auth [success=ok default=1] pam_unix.so
# Lcaol User - Sucess, clear lock tally, end
auth [default=done] pam_faillock.so authsucc
# Local User - Fail, update lock tally, end
auth [default=die] pam_faillock.so authfail deny=3 unlock_time=604800 fail_interval=900
# SSSD User - Ensure uid is not system uid
auth requisite pam_succeed_if.so debug uid >= 1000
# SSSD User - Attempt Auth
auth sufficient pam_sss.so
# Catchall - Default result if nothin passes
auth required pam_deny.so
account required pam_faillock.so
account required pam_unix.so
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 1000 quiet
account [default=bad success=ok user_unknown=ignore] pam_sss.so
account required pam_permit.so
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password sufficient pam_sss.so use_authtok
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
-session optional pam_systemd.so
session optional pam_oddjob_mkhomedir.so umask=0077
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
session optional pam_sss.so
Пользователь AD не отображается в выходных данных блокировки после неудачного входа в систему, в отличие от локального пользователя.
ОБНОВЛЕНИЕ :Я добавил несколько комментариев, объясняющих важные шаги в конфигурации PAM. Надеюсь это поможет.