pam_faillock

Материал из ALT Linux Wiki


pam_faillock — PAM-модуль[1], блокирующий возможность аутентификации пользователя (если очень нужно, то даже root'а), на основании заранее определённого количества неудачных попыток входа.

Настройка

Настройка модуля может производиться через редактирование файла /etc/security/faillock.conf:


deny=3
unlock_time=60

Эти же параметры можно передать и непосредственно в pam-файле:


auth        requisite                      pam_faillock.so preauth deny=3 unlock_time=60

Основные параметры:

  • dir — каталог, в котором хранятся пользовательские файлы с записями об ошибках аутентификации (по умолчанию /var/run/faillock;
  • audit — записать в системный журнал имя пользователя, если данного пользователя не существует в системе;
  • silent — не выводить информационные сообщения (не будет уведомлять пользователя о блокировке учётной записи и времени блокировки);
  • no_log_info — не регистрировать информативные сообщения в системном журнале;
  • local_users_only — включение данной опции в файл означает, что модуль будет применяться только для локальных пользователей, существующих в файле /etc/passwd (во избежание возможных проблем с централизованными средствами аутентификации: AD,IdM, LDAP, и т.д, у которых могут быть свои методы ограничения доступа к аутентификации);
  • deny — количество неудачных попыток входа, после которых возможность аутентификации будет заблокирована (по умолчанию 3);
  • fail_interval — интервал времени (в секундах), в течение которого должны произойти последовательные сбои аутентификации для блокировки учетной записи пользователя (по умолчанию 900 — 15 минут);
  • unlock_time — интервал времени (в секундах), в течении которого возможность аутентификации для пользователя, превысившего количество попыток входа, будет заблокирована (по умолчанию 600 — 10 минут);
  • even_deny_root — блокировать учётную запись root так же, как и обычные учетные записи;
  • root_unlock_time — работает аналогично unlock_time. Применяется по отношению к пользователю root, используется совместно с even_deny_root;
  • admin_group — члены группы, указанной в данном параметре, будут обрабатываться этим модулем так же, как и учетная запись root (к ним будут применяться опции even_deny_root и root_unlock_time).

Подробнее об этих и других существующих параметрах детально можно почитать в man faillock.conf[2].

Включение модуля в подсистеме PAM

Использование:

auth ... pam_faillock.so {preauth|authfail|authsucc} [dir=/path/to/tally-directory] [even_deny_root] [deny=n] [fail_interval=n] [unlock_time=n] [root_unlock_time=n] [audit] [silent] [no_log_info]

account ... pam_faillock.so [dir=/path/to/tally-directory] [no_log_info]

Аргумент {preauth|authfail|authsucc} должен быть установлен в соответствии с положением этого экземпляра модуля в стеке PAM:

  • preauth — должен использоваться, если модуль вызывается перед модулями, которые запрашивают учётные данные пользователя, такие как пароль. Модуль проверяет, заблокирован ли пользователь в случае, если в последнее время было аномальное количество неудачных последовательных попыток аутентификации. Этот вызов является необязательным, если используется authsucc;
  • authfail — должен использоваться, если модуль вызывается после сбоя модулей, определяющих результат аутентификации. Если пользователь ещё не заблокирован из-за предыдущих сбоев аутентификации, модуль запишет сбой в соответствующий файл с записями об ошибках;
  • authsucc — должен использоваться, если модуль вызывается после успешного завершения модулей, определяющих результат аутентификации. Если пользователь ещё не заблокирован из-за предыдущих сбоев аутентификации, модуль удалит запись об ошибках в соответствующем файле с записями об ошибках. В противном случае он вернёт ошибку аутентификации. Если этот вызов не выполнен, pam_faillock не будет различать последовательные и непоследовательные неудачные попытки аутентификации. В таком случае необходимо использовать вызов preauth. Из-за сложности настройки стека PAM также можно вызвать pam_faillock в модуле account. В этом случае также должен вызываться preauth.
Примечание: Использование модуля в режиме preauth без параметра silent или с обязательным полем control приводит к утечке информации о существовании или отсутствии учётной записи пользователя в системе, т.к. сбои не регистрируются для неизвестных пользователей. Сообщение о блокировке учётной записи пользователя никогда не отображается для несуществующих учетных записей пользователей, позволяя злоумышленнику сделать вывод, что конкретная учетная запись не существует в системе.


Примеры конфигурации

Ниже рассмотрены примеры включения модуля pam_faillock в файле /etc/pam.d/system-auth-local-only. pam_faillock будет блокировать учётную запись после 4 последовательных неудачных входов в систему в течение 5 минут. Аккаунты будут автоматически разблокированы через 15 минут (по умолчанию).

Модуль вызывается только на этапе auth:

auth            requisite               pam_faillock.so preauth deny=4 unlock_time=300
auth            [success=1 default=bad] pam_tcb.so shadow fork nullok
auth            [default=die]           pam_faillock.so authfail deny=4 unlock_time=300
auth            sufficient              pam_faillock.so authsucc deny=4 unlock_time=300
account         required                pam_tcb.so shadow fork
password        required                pam_passwdqc.so config=/etc/passwdqc.conf
password        required                pam_tcb.so use_authtok shadow fork nullok write_to=tcb
session         required                pam_tcb.so

Вызов preauth сообщает пользователю, что его вход в систему заблокирован модулем, а также отменяет аутентификацию, даже не запрашивая пароль:

kwork login: user
The account is locked due to 3 failed logins.
(4 minutes left to unlock)
Login incorrect

login:

Если убрать вызов preauth, модуль не будет выводить никакой информации о блокировке учётной записи:

kwork login: user
Password:
Login incorrect

login:

Модуль вызывается как на этапе auth, так и на этапе account:

auth            requisite       pam_faillock.so preauth deny=4 unlock_time=300
auth            sufficient      pam_tcb.so shadow fork nullok
auth            [default=die]   pam_faillock.so authfail deny=4 unlock_time=300
account         required        pam_faillock.so
account         required        pam_tcb.so shadow fork
password        required        pam_passwdqc.so config=/etc/passwdqc.conf
password        required        pam_tcb.so use_authtok shadow fork nullok write_to=tcb
session         required        pam_tcb.so

Если убрать вызов pam_faillock.so на этапе account, блокировка пользователя будет выполнена также при непоследовательных ошибках аутентификации.

Утилита faillock

faillock — приложение, которое можно использовать для проверки и изменения содержимого файлов записей об ошибках аутентификации. Утилита позволяет отображать последние неудачные попытки аутентификации пользователя или очищать файлы записей об ошибках аутентификации всех или отдельных пользователей.

Использование:

faillock [--dir <путь к каталогу>] [--user <имя пользователя>] [--reset]

Где:

  • --dir <путь к каталогу> — каталог, в котором хранятся пользовательские файлы с записями об ошибках (по умолчанию /var/run/faillock);
  • --user <имя пользователя> — пользователь, чьи записи об ошибках должны отображаться или очищаться;
  • --reset — сбросить неудачные попытки.

Запуск faillock без аргументов позволяет просмотреть количество неуспешных попыток входа в систему всех пользователей:

# faillock 
test:
When                Type  Source                                           Valid
2023-06-20 09:32:20 TTY   /dev/tty2                                            V
2023-06-20 09:21:39 TTY   /dev/tty2                                            I
2023-06-20 09:21:50 TTY   /dev/tty2                                            I
user:
When                Type  Source                                           Valid
2023-06-20 09:08:16 SVC   sddm                                                 V
2023-06-20 09:08:23 RHOST 192.168.0.107                                        V

Каждая строка содержит одну неудачную попытку входа в систему. Где:

  • When — время попытки входа в систему;
  • Type — тип попытки входа в систему (TTY — вход в систему из оболочки TTY, RHOST — удалённый вход в систему, например, через SSH);
  • Source — источник попытки (для локальных попыток это обычно будет pts/0, для псевдотерминала — 0, а для удаленных попыток — IP-адрес);
  • Valid — отображается либо V (valid), либо I (invalid). Данное значение показывает, засчитывается ли попытка блокировки учетной записи. Например, попытка старше, чем fail_interval, будет помечена как недействительная.

Вывести неудачные попытки входа конкретного пользователя:

# faillock --user user
user:
When                Type  Source                                           Valid
2023-06-20 09:52:49 TTY   /dev/tty2                                            V

Сбросить записи об ошибках указанного пользователя:

# faillock --user user --reset

Сбросить записи об ошибках всех пользователей:

# faillock --reset
Примечание: Разблокировать пользователя также можно, удалив файл, который faillock использует для отслеживания неуспешых попыток входа пользователя:
# ls -l /var/run/faillock/
итого 8
-rw-rw---- 1 test root 192 июн 20 10:16 test
-rw-rw---- 1 user root  64 июн 20 10:16 user


Примечания