Недавно я столкнулся с проблемой, что приложение, выполняющее аутентификацию PAM, зависало до 20 секунд, прежде чем сообщать, была ли аутентификация PAM успешной или нет. Другие приложения, выполняющие аутентификацию PAM через точно такой же набор модулей PAM (идентичные файлы в /etc/pam.d
!) не было такой проблемы.
После некоторых исследований я обнаружил, что разница в том, что это одно приложение устанавливало PAM_RHOST
к значению до выполнения аутентификации, тогда как другие приложения этого не делали. Я также обнаружил, что проблема не возникнет, если машина не будет подключена к какой-либо сети. В конце концов, все сводилось к неправильным настройкам DNS на машине. По-видимому, какой-то поиск DNS зависал, и исправление настройки DNS также устранило проблему.
Что я не совсем понимаю во всем этом, так это то, кто в первую очередь запускает этот поиск DNS? Ни один из модулей PAM, которые я использовал, никогда не запускает поиск DNS, и сам PAM также, похоже, не запускает его в своем коде. Незнание, откуда происходит поиск, сводит меня с ума!
Что ж, после обширного поиска в большом количестве исходного кода я наконец нашел причину этого поиска.
Если вы посмотрите исходный код PAM, особенно файл pam_audit.c
, то есть функция с именем _pam_audit_writelog(...)
и внутри этой функции выполняется следующий вызов:
rc = audit_log_acct_message (audit_fd, type, NULL, buf,
(retval != PAM_USER_UNKNOWN && pamh->user) ? pamh->user : "?",
-1, pamh->rhost, NULL, pamh->tty, retval == PAM_SUCCESS );
pamh->rhost
это хранилище для PAM_RHOST
пункт. Важно то, что следующий аргумент после pamh->rhost
на самом деле NULL
.
Это функция Linux Auditing Framework, и функциональная сигнатура рассматриваемой функции:
int audit_log_acct_message(int audit_fd, int type, const char *pgname,
const char *op, const char *name, unsigned int id,
const char *host, const char *addr, const char *tty, int result)
Итак, как видите, host
дается функции, но addr
является NULL
. В этом случае эта функция попытается разрешить host
через разрешение DNS, чтобы получить недостающий адрес.
Таким образом, если программа использует PAM и программа устанавливает PAM_RHOST
элемента, PAM будет косвенно запускать поиск DNS через структуру аудита. Поскольку все это происходит синхронно, неправильно настроенная настройка DNS (например, несколько недоступных DNS-серверов и / или множество поисковых доменов) может привести к зависанию аутентификации PAM на некоторое время, прежде чем поиск DNS окончательно завершится с ошибкой, но эта ошибка игнорируется ( поиск - лучший способ), а логин сохраняется без адреса; таким образом, сбой поиска также не влияет на аутентификацию PAM.