Файлы /etc/passwd и /etc/shadow: структура и работа

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

Разберём, как устроены эти файлы, что означает каждое поле и как правильно с ними работать.

Содержание:

Зачем нужны эти файлы

/etc/passwd — основной файл учётных записей пользователей. Содержит базовую информацию: имя пользователя, UID, домашнюю директорию, оболочку. Исторически хранил и пароли, но это было небезопасно.

/etc/shadow — файл с зашифрованными паролями и политиками срока действия. Появился для повышения безопасности: пароли отделили от публичной информации и ограничили доступ к ним.

Ключевое различие:

  • /etc/passwd — читается всеми пользователями (права 644)
  • /etc/shadow — доступен только root (права 640 или 600)

Это означает, что любой пользователь может узнать список учётных записей в системе, но не может получить доступ к хешам паролей.

Структура файла /etc/passwd

Каждая строка в /etc/passwd описывает одного пользователя и состоит из семи полей, разделённых двоеточием:

username:password:UID:GID:GECOS:home_directory:shell

Просмотр файла

cat /etc/passwd

Пример строки:

john:x:1001:1001:John Smith,Room 404,555-1234:/home/john:/bin/bash

Разбор каждого поля

1. Username (имя пользователя)

Уникальное имя для входа в систему. Максимальная длина — 32 символа.

2. Password (пароль)

В современных системах здесь всегда x или *, что означает: реальный пароль хранится в /etc/shadow.

Возможные значения:

  • x — пароль в /etc/shadow
  • * или ! — учётная запись заблокирована
  • пусто — вход без пароля (крайне небезопасно)

3. UID (User ID)

Числовой идентификатор пользователя. Система использует именно UID, а не имя пользователя.

Стандартные диапазоны:

  • 0 — root (суперпользователь)
  • 1-999 — системные учётные записи
  • 1000+ — обычные пользователи

4. GID (Group ID)

Идентификатор основной группы пользователя. Соответствует записи в файле /etc/group.

5. GECOS (комментарий)

Дополнительная информация о пользователе. Исторически использовалось для совместимости с системой GECOS. Может содержать несколько полей через запятую:

  • Полное имя
  • Номер комнаты/офиса
  • Рабочий телефон
  • Домашний телефон
  • Другая информация

John Smith,Room 404,555-1234

Это поле необязательное и может быть пустым.

6. Home Directory (домашняя директория)

Путь к домашней директории пользователя. При входе в систему пользователь попадает именно сюда.

/home/john

7. Shell (командная оболочка)

Программа, которая запускается при входе пользователя в систему.

Типичные значения:

  • /bin/bash — Bash (самая популярная оболочка)
  • /bin/sh — стандартная оболочка
  • /bin/zsh — Z shell
  • /usr/sbin/nologin — запрещает интерактивный вход
  • /bin/false — также блокирует вход

Примеры записей из реальной системы

Root пользователь:

root:x:0:0:root:/root:/bin/bash

Системный пользователь (демон):

www-dаta:x:33:33:www-dаta:/var/www:/usr/sbin/nologin

Обычный пользователь:

alice:x:1002:1002:Alice Johnson:/home/alice:/bin/bash

Заблокированная учётная запись:

backup:*:1003:1003:Backup User:/backup:/bin/false

Структура файла /etc/shadow

Файл /etc/shadow содержит зашифрованные пароли и связанную с ними информацию о политиках безопасности.

Просмотр файла (требуются права root)

sudo cat /etc/shadow

Каждая строка состоит из девяти полей:

username:password:lastchanged:minimum:maximum:warn:inactive:expire:reserved

Пример строки:

john:$6$rounds=5000$salt$hashedpassword:19000:0:99999:7:30:19500:

Разбор каждого поля

1. Username (имя пользователя)

Совпадает с именем в /etc/passwd. Файлы синхронизированы.

john

2. Password (зашифрованный пароль)

Хеш пароля в специальном формате. Если поле содержит ! или *, пользователь не может войти по паролю.

Формат хеша:

$id$salt$hashed

Где id — алгоритм шифрования:

  • $1$ — MD5 (устарел, небезопасен)
  • $5$ — SHA-256
  • $6$ — SHA-512 (рекомендуется)
  • $y$ — yescrypt (современный)

Специальные значения:

  • ! или * — учётная запись заблокирована
  • !! — пароль ещё не установлен
  • пусто — вход без пароля (опасно)

$6$rounds=5000$salt$hashedpassword

3. Last Changed (дата последней смены пароля)

Количество дней с 1 января 1970 года (Unix epoch) до последней смены пароля.

Чтобы преобразовать в обычную дату:

date -d "1970-01-01 UTC 19000 days"

4. Minimum (минимальный срок)

Минимальное количество дней, которое должно пройти перед сменой пароля. Если 0 — пользователь может менять пароль когда угодно.

0

5. Maximum (максимальный срок)

Максимальное количество дней, в течение которых пароль остаётся действительным. После этого пользователя заставят сменить пароль.

Стандартное значение — 99999 (примерно 273 года, фактически "бесконечно").

99999

6. Warning (предупреждение)

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

7

7. Inactive (период неактивности)

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

Пустое значение означает, что блокировка происходит сразу.

30

8. Expire (дата истечения)

Дата полного истечения учётной записи в днях с 1970 года. После этой даты пользователь не сможет войти независимо от срока действия пароля.

19500

9. Reserved (зарезервировано)

Поле зарезервировано для будущего использования. Обычно пусто.

Практические примеры работы с файлами

Поиск пользователя с конкретным UID

grep ':1001:' /etc/passwd

Список всех обычных пользователей (UID >= 1000)

awk -F: '$3 >= 1000 {print $1}' /etc/passwd

Проверка, существует ли пользователь

grep -q '^username:' /etc/passwd && echo "User exists" || echo "User not found"

Список пользователей с /bin/bash

grep '/bin/bash$' /etc/passwd | cut -d: -f1

Найти пользователей без пароля (небезопасно!)

sudo awk -F: '($2 == "") {print $1}' /etc/shadow

Проверить заблокированные учётные записи

sudo awk -F: '($2 == "!" || $2 == "*") {print $1}' /etc/shadow

Узнать, когда пользователь последний раз менял пароль

sudo chage -l username

Эта команда выведет читаемую информацию из /etc/shadow.

Создание и управление пользователями

Создание пользователя

Базовая команда:

sudo useradd username

С дополнительными параметрами:

sudo useradd -m -d /home/username -s /bin/bash -c "Full Name" username

Параметры:

  • -m — создать домашнюю директорию
  • -d — указать путь к домашней директории
  • -s — указать оболочку
  • -c — комментарий (GECOS)

Альтернатива — useradd с интерактивным режимом:

sudo adduser username

adduser — более дружелюбная обёртка над useradd, которая задаёт вопросы интерактивно.

Установка пароля

sudo passwd username

Система попросит ввести новый пароль дважды.

Изменение информации о пользователе

Изменить GECOS (полное имя):

sudo chfn username

Изменить оболочку:

sudo chsh -s /bin/zsh username

Изменить домашнюю директорию:

sudo usermod -d /new/home/path username

Блокировка и разблокировка учётной записи

Заблокировать:

sudo usermod -L username

Или:

sudo passwd -l username

Это добавит ! перед хешем пароля в /etc/shadow.

Разблокировать:

sudo usermod -U username

Или:

sudo passwd -u username

Удаление пользователя

Только учётная запись:

sudo userdel username

С домашней директорией:

sudo userdel -r username

Опция -r удаляет домашнюю директорию и почтовый ящик пользователя.

Настройка политик паролей

Изменить срок действия пароля

sudo chage -M 90 username

Пароль будет действителен 90 дней.

Установить минимальный период между сменами

sudo chage -m 7 username
sudo chage -m 7 username

Пользователь не сможет менять пароль чаще раза в 7 дней.

Настроить предупреждение

sudo chage -W 14 username

Система начнёт предупреждать за 14 дней до истечения пароля.

Установить дату истечения учётной записи

sudo chage -E 2025-12-31 username

Учётная запись автоматически заблокируется после 31 декабря 2025 года.

Принудительная смена пароля при следующем входе

sudo chage -d 0 username

Или:

sudo passwd -e username

При следующем входе пользователь обязан будет сменить пароль.

Безопасность и лучшие практики

Права доступа к файлам

Проверьте правильные разрешения:

ls -l /etc/passwd /etc/shadow

Должно быть:

-rw-r--r-- 1 root root /etc/passwd
-rw-r----- 1 root shadow /etc/shadow

Если права отличаются, исправьте:

sudo chmod 644 /etc/passwd
sudo chmod 640 /etc/shadow

Резервное копирование

Всегда создавайте резервные копии перед ручным редактированием:

sudo cp /etc/passwd /etc/passwd.backup
sudo cp /etc/shadow /etc/shadow.backup

Прямое редактирование (не рекомендуется)

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

sudo vipw           # безопасное редактирование /etc/passwd
sudo vipw -s        # безопасное редактирование /etc/shadow

Эти команды блокируют файлы во время редактирования и проверяют синтаксис.

Аудит пользователей

Регулярно проверяйте:

Пользователи с UID 0 (должен быть только root):

awk -F: '($3 == 0) {print $1}' /etc/passwd

Пользователи без пароля:

sudo awk -F: '($2 == "") {print $1}' /etc/shadow

Пользователи с оболочкой (потенциальный вход в систему):

grep -v '/nologin\|/false' /etc/passwd | cut -d: -f1

Усиление алгоритма хеширования

Убедитесь, что система использует SHA-512 или yescrypt. Проверьте /etc/login.defs:

grep ENCRYPT_METHOD /etc/login.defs

Должно быть:

ENCRYPT_METHOD SHA512

Или в /etc/pam.d/common-password (Debian/Ubuntu):

password [success=1 default=ignore] pam_unix.so obscure sha512

Связанные файлы

/etc/group

Содержит информацию о группах пользователей:

cat /etc/group

Формат:

groupname:password:GID:user_list

/etc/gshadow

Защищённые пароли для групп (используется редко):

sudo cat /etc/gshadow

/etc/login.defs

Параметры по умолчанию для создания пользователей:

cat /etc/login.defs

Здесь настраиваются:

  • Диапазоны UID/GID
  • Политики паролей
  • Алгоритмы шифрования

/etc/default/useradd

Настройки по умолчанию для команды useradd:

cat /etc/default/useradd

Частые ошибки и их решение

Проблема: после редактирования /etc/passwd не могу войти в систему.

Причина: синтаксическая ошибка в файле.

Решение: загрузитесь в recovery mode, смонтируйте корневой раздел в режиме записи и восстановите из резервной копии:

mount -o remount,rw /
cp /etc/passwd.backup /etc/passwd


Проблема:
 пользователь не может войти, хотя пароль правильный.

Причина: учётная запись заблокирована (! в /etc/shadow) или оболочка /usr/sbin/nologin.

Решение: проверьте и разблокируйте:

sudo passwd -u username
sudo usermod -s /bin/bash username

Проблема: команда passwd не работает для пользователя.

Причина: файл /etc/shadow повреждён или имеет неправильные права.

Решение: проверьте права и владельца:

sudo chmod 640 /etc/shadow
sudo chown root:shadow /etc/shadow

Проблема: пользователь создан, но домашней директории нет.

Причина: useradd без опции -m.

Решение: создайте директорию вручную:

sudo mkdir /home/username
sudo chown username:username /home/username
sudo cp -r /etc/skel/. /home/username/

Миграция пользователей между серверами

Экспорт пользователей

Создайте скрипт для экспорта конкретных пользователей (UID >= 1000):

Экспорт записей из passwd:

awk -F: '$3 >= 1000 && $3 < 65534' /etc/passwd > users.passwd

Экспорт записей из shadow:

sudo awk -F: '$3 >= 1000 && $3 < 65534 {print $1}' /etc/passwd | \
while read user; do sudo grep "^$user:" /etc/shadow; done > users.shadow

Экспорт групп:

awk -F: '$3 >= 1000 && $3 < 65534' /etc/group > users.group

Импорт на новом сервере

Объедините файлы:

sudo cat users.passwd >> /etc/passwd
sudo cat users.shadow >> /etc/shadow
sudo cat users.group >> /etc/group

Создайте домашние директории:

cat users.passwd | cut -d: -f1,6 | while IFS=: read user home; do
    if [ ! -d "$home" ]; then
        sudo mkdir -p "$home"
        sudo chown "$user:$user" "$home"
    fi
done

⚠️ Внимание: убедитесь, что UID/GID не конфликтуют с существующими пользователями.

Заключение

Файлы /etc/passwd и /etc/shadow — основа системы управления пользователями в Linux. Понимание их структуры критически важно для администрирования: от создания учётных записей до настройки политик безопасности и устранения проблем с доступом.

Основные правила работы: никогда не редактируйте эти файлы напрямую без крайней необходимости, используйте специализированные команды (useraddusermodpasswdchage), регулярно проверяйте права доступа к файлам и делайте резервные копии перед любыми изменениями.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *