Любой вход в систему, любой процесс и каждый файл привязаны к учётной записи. Администратор постоянно заводит новых пользователей, объединяет их в группы, ставит сроки на пароли и разбирается, почему кто-то не может войти. В этом уроке мы разберём, в каких файлах физически хранятся аккаунты, какие поля там лежат, и какими утилитами всё это создавать и менять, не трогая файлы руками. Это база, на которой стоит вся модель прав доступа.

Как это работает
Linux не хранит пользователей в какой-то базе данных - это обычные текстовые файлы, разделённые двоеточиями. Главный из них - /etc/passwd. Несмотря на имя, паролей там давно нет. Каждая строка - один аккаунт из семи полей: имя входа, символ x (заглушка вместо пароля), числовой UID, основной GID, поле GECOS (полное имя и комментарии), домашний каталог и оболочка входа. Файл читают все программы, поэтому хеши пароля держать в нём небезопасно.
Сами хеши и правила старения вынесены в /etc/shadow, который читает только root. Тут девять полей: имя, хеш пароля, день последней смены, минимальный и максимальный срок жизни пароля, окно предупреждения, льготный период после истечения, дата отключения аккаунта и резервное поле. Даты считаются в днях от 1 января 1970 года. Если в поле хеша стоит ! или *, войти по паролю нельзя - аккаунт заблокирован или служебный.
Группы устроены так же. /etc/group хранит имя группы, GID и список дополнительных участников. Основная группа пользователя прописана в passwd, а в group человек попадает только как дополнительный член. Парный закрытый файл /etc/gshadow держит пароли групп и список администраторов группы - на практике им почти не пользуются.
Числа UID и GID распределяют по диапазонам. UID 0 - всегда root. Дальше идут системные учётки для служб (на современных системах это примерно 1-999), а живым людям выдают UID от 1000 и выше. Эти границы заданы в /etc/login.defs (UID_MIN, UID_MAX) и одинаковы по смыслу в Debian и RHEL, хотя числа служебного диапазона могут отличаться.
Когда заводишь пользователя, система копирует ему заготовку домашнего каталога из /etc/skel - туда кладут стандартные .bashrc, .profile и прочее, что должно быть у каждого нового человека. Меняешь skel - меняется стартовый набор для всех будущих аккаунтов.
Команды и примеры
Создание пользователя. Низкоуровневая утилита useradd одинакова в обоих семействах, но ведёт себя по умолчанию по-разному, поэтому ключи лучше указывать явно.
Код: Выделить всё
sudo useradd -m -s /bin/bash -c "Anna Ivanova" anna
# -m создать домашний каталог и скопировать /etc/skel
# -s оболочка входа, -c поле GECOS
sudo passwd anna # задать пароль (без него вход заблокирован)
Изменение и удаление:
Код: Выделить всё
sudo usermod -aG docker,wheel anna # ДОБАВИТЬ в доп.группы (-a обязателен!)
sudo usermod -L anna # заблокировать вход по паролю
sudo usermod -s /usr/sbin/nologin anna # запретить интерактивный вход
sudo userdel -r anna # удалить вместе с домашним каталогом
Код: Выделить всё
sudo groupadd -g 1500 devs # создать группу с конкретным GID
sudo groupmod -n developers devs # переименовать группу
sudo gpasswd -a anna devs # добавить участника (альтернатива usermod)
sudo groupdel devs # удалить (нельзя, если это чья-то основная)
Код: Выделить всё
chage -l anna # показать все сроки по аккаунту
sudo chage -M 90 -W 7 anna # макс. срок 90 дней, предупреждать за 7
sudo chage -E 2026-12-31 anna # дата отключения учётки
sudo passwd -e anna # заставить сменить пароль при следующем входе
Код: Выделить всё
id anna # uid=1001(anna) gid=1001(anna) groups=...
getent passwd anna # строка из passwd (или из каталога)
getent group docker # кто входит в группу
Частые грабли
- usermod -G без -a стирает все прежние дополнительные группы и оставляет только указанные. Чтобы ДОБАВИТЬ, всегда пиши -aG. Классическая ошибка, после которой человек теряет sudo.
- Изменения в группах подхватываются только при новом входе. Добавил себя в docker - выйди и зайди заново (или newgrp), в текущей сессии группы старые.
- Правка /etc/passwd и /etc/shadow обычным редактором без vipw/vigr опасна: нет блокировки от одновременной записи и проверки синтаксиса. Одна лишняя двоеточная колонка - и вход ломается.
- userdel без -r оставляет домашний каталог и файлы, а их владелец теперь - голый UID. Новый пользователь с тем же UID нечаянно унаследует чужие файлы.
- Путают -L/-U (usermod) и -l/-u (passwd) для блокировки. И то и другое ставит ! перед хешем, но запомни флаги, чтобы не разблокировать вместо блокировки.
- Меняют /etc/skel и ждут, что у существующих пользователей появятся новые файлы. skel копируется только в момент создания аккаунта, задним числом не применяется.
- Создай пользователя test с домашним каталогом и оболочкой bash, задай ему пароль.
- Посмотри его строки в /etc/passwd и /etc/shadow (через sudo) и разбери все поля по столбцам.
- Создай группу project и добавь в неё test через usermod -aG, проверь результат командой id.
- Командой chage -l test посмотри текущие сроки, затем поставь максимальный срок пароля 60 дней.
- Заставь test сменить пароль при следующем входе и проверь, что поле даты в shadow обнулилось.
- Сравни вывод getent passwd test и id test - что показывает каждая команда.
- Удали пользователя вместе с домашним каталогом и убедись, что строки в passwd и shadow исчезли.
- Сколько полей в строке /etc/passwd и что означает символ x во втором поле?
- Почему хеши паролей хранят в /etc/shadow, а не в /etc/passwd, и кто может его читать?
- Чем отличается основная группа пользователя от дополнительной и где каждая прописана?
- Какой ключ usermod нужен, чтобы добавить пользователя в группу, не потеряв прежние?
- Что делает userdel -r и чем опасно удаление без него?
- В чём разница между командами id и getent при просмотре учётной записи?