Назад | Перейти на главную страницу

Как найти все способы блокировки учетной записи пользователя Unix

Иногда я оказываюсь в ситуации, когда в недостаточно обслуживаемой системе есть заблокированная учетная запись. Проблема в том, что существует множество способов заблокировать учетную запись, каждый из которых имеет собственный метод разблокировки.

Дело не в том, что учетная запись заблокирована неправильно, просто неожиданно, но найти правильную блокировку для сброса сложно.

Моя последняя атака на эту проблему была в системе SUSE, и оказалось, что срок действия пароля истек (который изначально не был известен, потому что попытки входа в систему были не через систему, которая обеспечивала такую ​​обратную связь), а затем также заблокирован из-за неудачных попыток входа в систему.

Есть ли где-нибудь список всех возможных блокировок учетных записей и способы их отключения? Я намерен сделать так, чтобы фактические неисправности, такие как проблемы с доступом к домашнему каталогу, поврежденные библиотеки PAM и т. Д., Выходили за рамки этого вопроса.

Ты можешь использовать passwd чтобы собрать некоторую информацию, например если аккаунт заблокирован

passwd -S user
user LK 2012-11-06 0 99999 7 -1 (Password locked.) (CentOS)
user L 01/22/2013 0 99999 7 -1 (Ubuntu)

В chage утилита предоставит информацию о различных таймерах в учетной записи, например если пароль еще не истек

chage -l user
Last password change                                    : Nov 12, 2012
Password expires                                        : never
Password inactive                                       : never
Account expires                                         : never
Minimum number of days between password change          : 0
Maximum number of days between password change          : 99999
Number of days of warning before password expires       : 7

для просроченного пароля

chage -l user
Last password change                                    : password must be changed
Password expires                                        : password must be changed
Password inactive                                       : password must be changed
Account expires                                         : never
Minimum number of days between password change          : 0
Maximum number of days between password change          : 22
Number of days of warning before password expires       : 33

В passwd и chage утилиты также перечисляют многие блокировки учетных записей.

Ты можешь использовать getent извлекать информацию непосредственно из соответствующей базы данных для изучения

getent passwd user
user:x:505:505::/home/passtest:/sbin/nologin  <-- denied login
getent shadow user
user:!!:0:0:22:33:44::   <-- this is locked

В общем: нет.

Ответ Иэна - хорошее резюме того, как запрашивать системы устаревания паролей, но упустил все виды вещей. Например:

  • Кто-то пытается войти через ssh, может быть запрещено директивами в sshd конфигурация.
  • Система может быть настроена так, чтобы разрешать вход в систему только членам определенной сетевой группы.
  • Местный PAM конфигурация может потребовать явного членства в группе для входа в систему или может разрешить только определенный список пользователей.
  • То, что выглядит как заблокированная учетная запись, может обернуться проблемами доступа к домашнему каталогу.
  • Кто-то мог создать /etc/nologin, который для некоторых приложений (например, ssh) заблокирует всех пользователей.

Другими словами, есть много способов заблокировать учетную запись, которые не имеют ничего общего с passwd файл. Лучше всего проверить /var/log/secure или соответствующий для распространения местный аналог.

В дополнение к вышесказанному, passwd chage и getent, есть также pam_tally2

Если количество неудачных попыток входа в систему превышает допустимый предел (установленный в /etc/pam.d/password-auth), вам придется сделать pam_tally2 --user=foo --reset прежде чем они смогут снова войти в систему.

Следующий скрипт даст вам краткое описание всех пользователей и их статус (заблокирован или нет).

cat /etc/passwd | cut -d : -f 1 | awk '{ system("passwd -S " $0) }'