Как я писал ранее все пароли пользователей, зашифрованные лежат в файле /etc/shadow. Доступ к этому фалу имеет только root.

sudo ls -la /etc/shadow
----------. 1 root root 943 Nov  2 15:36 /etc/shadow

/etc/shadow

Рассмотрим подробнее строку из этого файла.

/etc/shadow line

  1. Имя пользователя
  2. Зашифрованный пароль
  3. День, когда пароль последний раз был изменён. Для того чтобы перевести в наши дни надо добавить эти дни к дате 01.01.1970
  4. Минимальное время в днях которое должно пройти от последней смены пароля для возможности очередной смены пароля
  5. Срок действия пароля
  6. Период уведомлений о необходимости смены пароля. Отнимается от даты смена пароля
  7. Период неактивности пользователя, по истечении которого пользователь будет заблокирован
  8. Период в днях после которого аккаунт заблокируется. Отсчет идёт опять-таки от 01.01.1970
  9. Пустое поле для будущих изысканий RedHat

Формат зашифрованного пароля

Зашифрованный пароль, разбитый на части:

$6 $6q63QkCry59G3VG5 $s.O.Lmx5c.ynqHkuWAqiWfCXnvluw85NKkVjJUeQfTP8M8wecl.wTixpCqqoGoIJfA7lgF2fpDkGjVECgAPr90

Получается, что строка состоит из 3 частей, разделённых знаком $.

  1. Обозначает какой алгоритм хэширования применен. Номер 6 означает что это SHA-512, который используется по умолчанию в RHEL 8. Номер 1 означает MD5, а 5 - SHA-256.
  2. Соль (sault), которая используется для декодирования пароля. Генерируется рандомно.
  3. Хэш пароля пользователя. Хэш и незашифрованный пароль объединяются для создания хэша пароля.

Суть объединения соли с паролем пользователя заключается в защите хэша от всяких переборов пароля по хэшу. Т.е. если у вас пароль 123456 то хэш этого пароля легко найти в интернете, но если у вас добавляется еще моль к этому паролю то найти его уже гораздо сложнее.

Верификация пароля

Когда пользователь пытается залогиниться система проверяет наличие записи для него в файле /etc/shadow, потом объединяет соль с паролем, который ввёл пользователь и шифрует его используя установленный алгоритм. И если полученный результат аналогичен хэшу в файле значит пользователь ввёл правильный пароль и может авторизоваться в ОС. Этот метод позволяет определить, что пользователь вводит правильный или не правильный пароль без хранения пароля в открытом виде.

Устаревание пароля

Мы уже косвенно затрагивали эту тему в ранних статьях и теперь рассмотрим это подробнее. Управление временем жизни пароля осуществляется через команду chage. На картинке ниже рассмотрим весь цикл жизни пароля с опциями для chage.

password aging

Например, мы хотим, чтобы пароль пользователя был активен 60 дней, при этом уведомление о смене должно выводиться за 7 дней до истечения пароля, и также выставим время неактивности после окончания срока действия пароля для блокировки неактивного пользователя в 30 дней.

sudo chage -m 0 -M 60 -W 7 -I 30 user20
sudo chage -l user20
Last password change                                    : Nov 02, 2021
Password expires                                        : Jan 01, 2022
Password inactive                                       : Jan 31, 2022
Account expires                                         : never
Minimum number of days between password change          : 0
Maximum number of days between password change          : 60
Number of days of warning before password expires       : 7

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

sudo chage -d 0 user20
sudo chage -l user20
Last password change                                    : password must be changed
Password expires                                        : password must be changed
Password inactive                                       : password must be changed

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

date -d '+20 days' +%F
sudo chage -E 2021-11-23 user20
sudo chage -l user20
Account expires                                         : Nov 23, 2021

Глобальные настройки пароля

Конечно если у вас по 20-30 пользователей очень проблематично каждому выставлять руками политику паролей. Поэтому существует файл /etc/login.defs в котором вы можете задать политику паролей для всех пользователей в ОС. Важное замечание политику будут подхватывать только пользователи, созданные после редактирования этого файла. Старым пользователям придётся менять руками командой chage.

  • PASS_MAX_DAYS - максимальное время жизни пароля
  • PASS_MIN_DAYS - минимальное время жизни пароля
  • PASS_MIN_LEN - минимальное количество символов в пароле
  • PASS_WARN_AGE - время уведомления перед истечением пароля

Блокировка пользователя

Для того чтобы заблокировать пользователя можно воспользоваться командой usermod о которой мы уже говорили тут. Для блокировки используется опция -L, а для разблокировки - -U.

sudo usermod -L user20
sudo usermod -U user20