Как хранятся пароли пользователей в Linux?

«Как хранятся пароли пользователей в Linux?» — вопрос из категории Linux, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В современных дистрибутивах Linux хэши паролей пользователей хранятся в защищённом файле /etc/shadow. Раньше они находились в /etc/passwd, но это было небезопасно, так как файл должен быть читаемым для всех.

Формат записи в /etc/shadow: Каждая строка соответствует одному пользователю и имеет поля, разделённые двоеточиями ::

username:$y$j9T$8S7zqBVDN3uGcFbQcLbTx/$N4WgYVpLz6Hk5rE8vJ2qCx1m3s4d5f6h7i8j9k0l:19215:0:99999:7:::

Разберём ключевые поля:

  1. username: Имя пользователя.
  2. Хэш пароля: $y$j9T$8S7zqBVDN3uGcFbQcLbTx/$N4WgYVpLz6Hk5rE8vJ2qCx1m3s4d5f6h7i8j9k0l
    • $y$ — идентификатор алгоритма (здесь y означает yescrypt, современный алгоритм. Также встречаются 6 — SHA-512, 5 — SHA-256, 1 — MD5).
    • j9T — соль (salt), случайная строка, уникальная для каждого пароля.
    • Далее идёт собственно хэш, полученный в результате криптографической функции от пароля, соли и, возможно, количества раундов.
  3. 19215: Дата последнего изменения пароля (количество дней с 1 января 1970).
  4. 0: Минимальный срок действия пароля (дней до возможной смены).
  5. 99999: Максимальный срок действия пароля (дней до обязательной смены).
  6. 7: Количество дней для предупреждения об истечении срока.

Практический пример создания хэша:

# Генерация хэша с алгоритмом yescrypt (используется по умолчанию в новых системах)
openssl passwd -6 -salt "MyRandomSalt" "MySecretPassword"
# Или с помощью утилиты, которая использует системный алгоритм:
mkpasswd -m sha-512crypt --salt="MyRandomSalt" "MySecretPassword"

Важно для DevOps: При автоматическом создании пользователей (через Ansible, Puppet) мы задаём пароль именно в таком захэшированном виде, а не в открытом. Файл /etc/shadow имеет права 640 и принадлежит root:shadow, что предотвращает его чтение обычными пользователями.