Базовые понятия: пользователи, группы и зачем ими управлять
Ядро Linux не работает с именами. Ему нужны числа: UID процесса и GID группы, к которой этот процесс относится. Имена вроде alice или docker существуют для людей, а система сопоставляет их с числами через /etc/passwd и /etc/group. При каждом обращении к файлу или сокету ядро сверяет числовой владелец с правами процесса, поэтому любое изменение учётной записи сразу влияет на доступ к данным и службам.
Все задачи сводятся к трём операциям: создать запись, изменить её, удалить. За создание отвечает useradd (в Debian и Ubuntu есть ещё adduser), за изменение - usermod, за удаление - userdel. Дополняют набор passwd, chage и gpasswd. Права администратора выдаются через sudo, который читает правила из /etc/sudoers и каталога /etc/sudoers.d.
Группы экономят время: вместо выдачи доступа каждому сотруднику отдельно вы добавляете человека в группу, а права настраиваете один раз для всей группы. Формат прав, маски и списки ACL разобраны в руководстве по правам доступа в Linux.
Типы пользователей: системные и обычные
Системные учётные записи обслуживают службы, а не людей. Nginx работает от www-data, PostgreSQL от postgres, задачи без привилегий часто выполняются от nobody. Такие записи создаются с флагом useradd -r и получают UID из младшего диапазона: 1-999 в Debian и Ubuntu, 1-499 в RHEL, CentOS и производных. Домашний каталог им обычно не нужен, а оболочка указывается как /usr/sbin/nologin, чтобы вход в систему был закрыт.
Обычные пользователи получают UID от 1000 (в Debian и Ubuntu) или от 500 (в RHEL). У них есть домашний каталог в /home, интерактивная оболочка и пароль. Границы заданы в /etc/login.defs параметрами UID_MIN и UID_MAX, поэтому в нестандартных сборках значения отличаются. Проверить текущие: grep -E '^UID_(MIN|MAX)' /etc/login.defs.
| Параметр | Системный пользователь | Обычный пользователь |
|---|---|---|
| UID | 1-999 (Debian/Ubuntu), 1-499 (RHEL/CentOS) | от 1000 или от 500 |
| Домашний каталог | как правило отсутствует | /home/имя |
| Оболочка | /usr/sbin/nologin или /bin/false | /bin/bash и другие из /etc/shells |
| Флаг создания | useradd -r | useradd -m |
| Интерактивный вход | запрещён | разрешён |
Основная и дополнительные группы: в чём разница
У пользователя ровно одна основная группа, её GID записан в четвёртом поле /etc/passwd. Эта группа становится владельцем новых файлов, которые создаёт пользователь. Дополнительные группы перечислены в /etc/group и дают доступ к чужим ресурсам, при этом основную группу не меняют.
Пример: у пользователя deploy основная группа deploy с GID 1005, а дополнительные - docker и www-data. Файл, созданный deploy, получит владельца deploy:deploy, но обратиться к сокету Docker он сможет только за счёт членства в группе docker.
Основную группу меняют редко, обычно при переименовании пользователя. Дополнительные группы меняют постоянно, и здесь критичен один флаг, разобранный ниже.
Создание пользователя: useradd и adduser
useradd ничего не спрашивает и по умолчанию не создаёт домашний каталог: все параметры передаются флагами. adduser в Debian и Ubuntu задаёт вопросы и выполняет больше шагов автоматически. В RHEL, CentOS, AlmaLinux и Rocky Linux команда adduser - символическая ссылка на useradd, интерактивного режима там нет.
useradd: низкоуровневое создание пользователя
Синтаксис: useradd [опции] имя. Основные флаги:
- -m - создать домашний каталог и скопировать в него содержимое /etc/skel;
- -s - оболочка входа, например /bin/bash или /bin/zsh;
- -c - комментарий, он попадает в поле GECOS;
- -G - дополнительные группы через запятую;
- -g - основная группа по имени или GID;
- -u - конкретный UID;
- -d - путь к домашнему каталогу;
- -r - создать системного пользователя;
- -e - дата закрытия учётной записи в формате YYYY-MM-DD.
Рабочий пример: useradd -m -s /bin/bash -c 'Deploy User' -G docker deploy. Команда создаёт пользователя deploy с каталогом /home/deploy, оболочкой bash и членством в группе docker. Пароль задаётся отдельно: passwd deploy. Без пароля запись появится, но войти по нему будет нельзя.
adduser: интерактивное создание в Debian/Ubuntu
Команда adduser alice последовательно запросит пароль, полное имя и необязательные сведения, затем создаст домашний каталог, скопирует /etc/skel, назначит одноимённую основную группу и добавит записи в /etc/passwd и /etc/shadow. Оболочкой по умолчанию станет /bin/bash.
Системный пользователь для службы создаётся так: adduser --system --group --no-create-home myservice. Ключ --system выбирает UID из системного диапазона, --group создаёт одноимённую группу, --no-create-home оставляет систему без домашнего каталога. Проверка результата: id myservice.
В Debian и Ubuntu adduser - отдельный скрипт на Perl со своими ключами (--disabled-password, --gecos, --shell). В RHEL, CentOS, AlmaLinux и Rocky Linux такого скрипта нет: adduser вызывает useradd и принимает только его флаги.
Типичные ошибки при создании пользователя
- Забыли -m. Домашнего каталога нет, вход завершается сообщением о невозможности перейти в /home/имя. Решение: создать каталог и назначить владельца командой chown имя:имя /home/имя либо повторить usermod -m -d /home/имя имя.
- Указали несуществующую оболочку. useradd не проверяет её наличие, а вход после этого не работает. Сверяйтесь со списком в /etc/shells.
- Не задали пароль. Учётная запись без хэша в /etc/shadow блокирована: для системного пользователя это норма, для человека - нет.
- Занятый UID. useradd предупредит, но запись создаст, и два пользователя получат доступ к одним файлам. Проверка: getent passwd 1500 или id -u имя.
- Имя с заглавными буквами или точкой. При включённой проверке NAME_REGEX в /etc/login.defs команда откажется работать. Используйте строчные латинские буквы, цифры и дефис.
Изменение параметров пользователя: usermod и passwd
usermod правит существующую запись. Часть изменений требует, чтобы пользователь не был в системе: иначе утилита предупредит, что он работает, и завершится с ошибкой. Проверить сеансы помогает команда who или ps -u имя.
Смена пароля и управление сроком действия
passwd alice меняет пароль. Пользователь может сменить свой пароль сам, root задаёт пароль любому без знания старого. Служебные ключи: passwd -l alice блокирует вход по паролю, passwd -u alice снимает блокировку, passwd -S alice показывает состояние записи и дату последней смены.
Сроки действия настраивает chage. chage -l alice выводит текущую политику, chage -M 90 alice задаёт максимум 90 дней, chage -m 7 alice требует менять пароль не чаще раза в неделю, chage -W 14 alice включает предупреждение за 14 дней, chage -E 2027-01-31 alice закрывает учётную запись в указанную дату. Значения хранятся в полях 4-8 файла /etc/shadow, и всё можно задать одной командой: chage -M 90 -W 14 -E 2027-01-31 alice.
Изменение оболочки, домашней директории и имени
usermod -s /bin/zsh alice меняет оболочку. Перед этим убедитесь, что путь есть в /etc/shells: иначе часть служб, например FTP или SSH с проверкой оболочки, откажет во входе.
usermod -d /home/newhome -m alice переносит домашний каталог вместе с содержимым. Флаг -m обязателен: без него путь в /etc/passwd изменится, а файлы останутся на старом месте, и пользователь потеряет к ним доступ. Если каталог уже перенесён вручную, применяйте usermod -d без -m.
usermod -l newname oldname переименовывает пользователя. Домашний каталог и почтовый ящик при этом не переименовываются. Группу с прежним именем правят отдельно: groupmod -n newname oldname. Оба действия выполняются за один шаг: usermod -l newname -d /home/newname -m oldname.
Смена UID делается командой usermod -u 2000 alice. После неё нужно исправить владельца файлов во всех каталогах, где они есть: find / -user 1001 -exec chown -h 2000 {} +. Иначе файлы останутся с числовым владельцем.
Блокировка и разблокировка учётной записи
usermod -L alice блокирует пароль, добавляя восклицательный знак перед хэшем в /etc/shadow. usermod -U alice снимает блокировку. Те же действия выполняют passwd -l и passwd -u.
Блокировка пароля не закрывает доступ по SSH-ключу: пользователь с ключом в ~/.ssh/authorized_keys продолжит входить. Чтобы закрыть доступ полностью, замените оболочку командой usermod -s /usr/sbin/nologin alice, при необходимости завершите сеансы через pkill -KILL -u alice и добавьте DenyUsers alice в /etc/ssh/sshd_config. Безопасный вход по ключам и отключение парольной аутентификации разобраны в руководстве по аутентификации и безопасному доступу в Linux.
Добавление пользователя в группу и управление членством
Членство в группе проверяется при каждом обращении к ресурсу, поэтому группа - самый дешёвый способ выдать доступ нескольким людям сразу. Ошибка в списке групп стоит дорого: пользователь либо теряет права, либо получает лишние.
Команда usermod -aG: безопасное добавление
Синтаксис: usermod -aG группа пользователь. Пример: usermod -aG docker deploy. Флаг -a означает «добавить», -G задаёт список дополнительных групп. Без -a команда usermod -G docker deploy перезапишет набор: пользователь останется только в docker и потеряет все прочие группы, включая sudo.
Перед изменением сохраните текущее состояние: id -nG deploy > /tmp/deploy_groups.txt. Добавить сразу несколько групп: usermod -aG docker,www-data deploy.
Альтернатива для одной группы: gpasswd -a deploy docker. Она не затрагивает другие группы и удобна в скриптах.
С группой docker нужна отдельная осторожность: членство в ней открывает доступ к сокету /var/run/docker.sock, а через него можно смонтировать каталог хоста в контейнер и получить права root на машине. Как ограничить этот риск, разобрано в материале про права доступа Docker-контейнеров.
Проверка членства в группах
- id alice - UID, GID и полный список групп;
- groups alice - только имена групп;
- id -nG alice - имена групп одной строкой;
- getent group docker - состав группы docker и её GID;
- getent passwd alice - запись из /etc/passwd или из центрального каталога, если подключены LDAP и SSSD.
Изменения в /etc/group не подхватываются открытыми сеансами. Пользователю нужно выйти и войти снова либо выполнить newgrp docker в текущей оболочке: команда подменяет основную группу и действует только внутри неё.
Удаление пользователя из группы
gpasswd -d alice docker убирает alice из группы docker и не затрагивает остальные. Второй способ - usermod -G с полным перечнем оставшихся групп, например usermod -G sudo,video alice. Вариант рискованный: пропустите группу в списке, и пользователь её лишится.
Правка /etc/group вручную возможна, но требует аккуратности. Файл открывают через vigr: он блокирует его от одновременных изменений и проверяет результат. При прямом редактировании легко получить дубликат записи или потерять часть членов группы.
Удаление пользователя: userdel и очистка данных
Перед удалением выясните, чем владеет пользователь и какие процессы от него запущены. Проверка занимает минуту и защищает от потери данных и сбоев служб.
userdel без флагов: что остаётся
userdel alice удаляет запись из /etc/passwd, /etc/shadow и /etc/group, а в части сборок также из /etc/subuid и /etc/subgid. Домашний каталог /home/alice и почтовый ящик /var/mail/alice остаются на диске.
Файлы пользователя становятся «осиротевшими»: в выводе ls -l вместо имени владельца появляется число. Это удобно, когда данные нужно сохранить и передать другому сотруднику, но опасно, если каталог забудут: он останется доступным по прежним правам.
userdel -r: полное удаление с домашней директорией
userdel -r alice удаляет запись, домашний каталог и почтовый ящик. За пределами /home ничего не стирается: файлы в /var/www, /opt, /srv и /tmp останутся, а задания в crontab пользователя обычно снимаются вместе с записью.
Если пользователь ещё работает, userdel откажется удалять запись: сначала завершите сеансы или выполните pkill -KILL -u alice. Проверить процессы заранее: ps -u alice. Найти файлы вне домашнего каталога: find / -xdev -user alice -not -path '/home/alice/*' 2>/dev/null.
Группа, оставшаяся после пользователя, удаляется командой groupdel alice, если она больше никому не нужна и не используется как основная.
Типичные ошибки при удалении
- userdel -r без резервной копии. Сначала архив: tar czf /backup/alice-2026.tar.gz /home/alice.
- Удаление системного пользователя, от которого зависит служба. Учётные записи mysql или postgres нужны процессам, и потеря владельца файлов данных ломает запуск. Сверьтесь с документацией пакета.
- Удаление пользователя, владеющего файлами в /etc или /var. Это нарушает работу системы. Проверьте: find /etc /var -user alice.
- Повторное использование освободившегося UID. Новая запись получит доступ к старым файлам. Следите за диапазоном UID или смените владельца файлов заранее.
Настройка sudo: выдача прав и правила безопасности
sudo запускает команду от имени другого пользователя, по умолчанию root, и проверяет правила в /etc/sudoers и в файлах каталога /etc/sudoers.d. Файл /etc/sudoers нельзя редактировать напрямую: ошибка в синтаксисе оставит вас без административного доступа.
Добавление пользователя в группу sudo или wheel
В Debian и Ubuntu права выдаёт группа sudo: usermod -aG sudo alice. В RHEL, CentOS, Fedora и производных используется группа wheel: usermod -aG wheel alice. После добавления пользователь должен выйти и войти снова.
Проверить применение прав: sudo -l -U alice. Команда покажет список разрешённых и запрещённых команд. В /etc/sudoers при этом должны быть строки вида %sudo ALL=(ALL:ALL) ALL или %wheel ALL=(ALL) ALL. Членство в такой группе даёт полный доступ root, поэтому в продакшене его выдают ограниченному кругу сотрудников.
Создание отдельного файла в /etc/sudoers.d/
Точные правила удобнее держать в отдельном файле. Пример: разрешим alice перезапускать nginx без пароля. Создайте файл /etc/sudoers.d/alice с содержимым alice ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx и откройте его командой visudo -f /etc/sudoers.d/alice, которая проверяет синтаксис перед сохранением.
Требования к файлам в этом каталоге: права 0440 через chmod 440, владелец root:root, отсутствие точки в имени. Файл с точкой sudo проигнорирует с предупреждением в системном логе. Каталог /etc/sudoers.d подключается директивой #includedir в /etc/sudoers, файлы читаются в алфавитном порядке.
Проверить все файлы разом: visudo -c. Команда выведет синтаксические ошибки с указанием файла и строки. В компаниях с десятками серверов правила удобнее выдавать не по пользователям, а по ролям: группа devops управляет сервисами, группа backup читает только логи. Как связать такие роли с группами каталога, описано в руководстве по RBAC через группы LDAP.
Синтаксис sudoers и типичные ошибки
Формат правила: пользователь хост=(от_кого:группы) команды. Запись alice ALL=(ALL:ALL) ALL разрешает всё с любого хоста. Ключ NOPASSWD: перед списком команд отключает запрос пароля. Несколько правил перечисляются через запятую, запрет задаётся восклицательным знаком: /usr/bin/apt, !/usr/bin/apt remove.
- Правка /etc/sudoers обычным редактором. Любая опечатка ломает sudo. Только visudo.
- Неверные права на файл в /etc/sudoers.d. sudo молча пропустит файл или откажется работать.
- NOPASSWD: ALL для всех команд. Это убирает второй фактор и превращает утечку сеанса в полный доступ root.
- Порядок правил. Более широкое правило, стоящее выше, срабатывает раньше узкого запрета.
Если sudo сломан, файл исправляют из-под root через su - или консоль восстановления. Надёжный приём: держать открытым второй терминал с выполненной командой sudo -i, пока меняете правила.
Структура файлов /etc/passwd, /etc/shadow и /etc/group
Три файла описывают учётные записи: /etc/passwd хранит пользователей, /etc/shadow - пароли и политику их действия, /etc/group - группы. Первый и третий читают все, второй доступен только root, поэтому хэши паролей недоступны обычным процессам.
/etc/passwd: поля и примеры
Строка alice:x:1001:1001:Alice Smith,,,:/home/alice:/bin/bash состоит из семи полей, разделённых двоеточием:
| Поле | Значение | Смысл |
|---|---|---|
| 1 | alice | имя пользователя |
| 2 | x | признак того, что хэш пароля лежит в /etc/shadow; пустое поле означает вход без пароля |
| 3 | 1001 | UID |
| 4 | 1001 | GID основной группы |
| 5 | Alice Smith,,, | GECOS: полное имя, кабинет, телефоны, прочие сведения |
| 6 | /home/alice | домашний каталог |
| 7 | /bin/bash | оболочка входа |
Оболочка /usr/sbin/nologin или /bin/false закрывает интерактивный вход. Пользователи с такими оболочками обслуживают службы. Проверить конкретную запись: getent passwd alice. Найти всех, кто может войти: grep -vE 'nologin|false$' /etc/passwd.
/etc/shadow: хранение паролей и политики
Строка alice:$6$...:19800:0:90:14:7:30:20000: содержит девять полей: имя, хэш пароля, дата последней смены в днях от 1 января 1970, минимальный срок между сменами, максимальный срок, дни предупреждения, дни неактивности после истечения, дата закрытия учётной записи и зарезервированное поле.
Признаки блокировки: хэш начинается с восклицательного знака или звёздочки. Именно такой символ добавляет usermod -L. Пустое поле пароля означает вход без пароля, что недопустимо для учётной записи с доступом к командной оболочке.
Править файл вручную можно только через vipw -s: утилита блокирует его и проверяет формат. После правки сроков сверьтесь с chage -l alice, значения должны совпасть.
/etc/group: членство и GID
Строка docker:x:999:alice,bob состоит из четырёх полей: имя группы, признак пароля (сегодня почти всегда x), GID и список пользователей через запятую. Основная группа пользователя в этом файле не указана: она определяется полем GID в /etc/passwd, и добавлять туда пользователя повторно не нужно.
Проверка состава: getent group docker. Все группы пользователя: id -nG alice. Правка: vigr, который так же блокирует файл и проверяет формат.
Типичные ошибки и как их избежать
Три ошибки встречаются в практике чаще остальных и каждая способна надолго лишить доступа к серверу.
Потеря групп при usermod -G
Команда usermod -G docker alice оставит alice только в docker. Если она была в sudo, права администратора исчезнут. Перед сменой групп сохраните состояние: id -nG alice > /tmp/alice_groups.txt, после правки сверьте результат командой id alice. Когда нужно добавить группу, всегда используйте -aG.
Опасность редактирования sudoers без visudo
/etc/sudoers читается целиком при каждом вызове sudo, и одна лишняя запятая или незакрытая кавычка делает команду нерабочей для всех. Используйте visudo и visudo -f для файлов в /etc/sudoers.d, результат проверяйте через visudo -c. Запасной вход: su - с паролем root или консоль виртуальной машины.
Проверьте, что у root есть рабочий пароль или доступ через консоль, а строка с NOPASSWD не выдана слишком широкой группе. Блокировка root и единственного администратора означает потерю управления сервером.
Удаление пользователя без резервной копии
Последовательность безопасного удаления:
- Проверить процессы: ps -u alice.
- Найти файлы вне домашнего каталога: find / -xdev -user alice 2>/dev/null.
- Сделать архив: tar czf /backup/alice-2026.tar.gz /home/alice.
- Снять задания из cron и at, если они есть.
- Выполнить userdel -r alice.
- Убедиться, что UID не занят новой записью: getent passwd 1001.
Чек-лист и итоги
Сводка команд по типовым задачам администратора:
- Создать обычного пользователя: useradd -m -s /bin/bash -G docker deploy, затем passwd deploy.
- Создать пользователя интерактивно в Debian и Ubuntu: adduser alice.
- Создать системного пользователя: adduser --system --group --no-create-home myservice или useradd -r -s /usr/sbin/nologin myservice.
- Добавить в дополнительную группу: usermod -aG docker deploy.
- Выдать права sudo: usermod -aG sudo alice в Debian и Ubuntu, usermod -aG wheel alice в RHEL и CentOS.
- Сменить пароль и настроить срок: passwd alice, chage -M 90 -W 14 alice.
- Заблокировать вход: usermod -L alice и usermod -s /usr/sbin/nologin alice.
- Удалить из группы: gpasswd -d alice docker.
- Удалить пользователя вместе с данными: userdel -r alice.
- Проверить результат: id alice, sudo -l -U alice, getent group docker.
Правила, которые экономят время и нервы: всегда -aG при добавлении группы, только visudo при правке sudo, резервная копия перед userdel -r, проверка id до и после изменений. Учитывайте различия дистрибутивов: группа sudo против wheel, adduser как скрипт против символической ссылки на useradd, границы системных UID 1000 в Debian и Ubuntu против 500 в RHEL и CentOS.