В основе системы аутентификации 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. Понимание их структуры критически важно для администрирования: от создания учётных записей до настройки политик безопасности и устранения проблем с доступом.
Основные правила работы: никогда не редактируйте эти файлы напрямую без крайней необходимости, используйте специализированные команды (useradd, usermod, passwd, chage), регулярно проверяйте права доступа к файлам и делайте резервные копии перед любыми изменениями.
Эти простые меры предосторожности защитят вашу систему от случайных ошибок и несанкционированного доступа.