Линукс
Linux: Пользователи и группы
Вторая часть серии о Linux для DevOps и DevSecOps — разбираем, как устроены пользователи и группы, UID/GID, /etc/passwd и shadow, sudo, безопасность и реальные сценарии администрирования.
Введение
Это вторая часть серии о Linux для DevOps и DevSecOps. В прошлой части мы разобрали файловую систему, навигацию и поиск — если вы только начинаете изучать Linux или хотите освежить память, загляните в «Linux: Файлы, навигация и поиск». В этой части я попытался расписать довольно кратко, т.к. информации и так много и тот же новичок может не сразу всё выучить. Приступаем.
Как Linux идентифицирует пользователя
Username vs UID
Ядро Linux работает исключительно с числами. UID (User Identifier) — числовой идентификатор пользователя (обычно 32-битный). Имя пользователя (username) — лишь человекочитаемый псевдоним, который инструменты вроде ls или ps подставляют при выводе, обращаясь к /etc/passwd.
Если удалить пользователя и создать нового с тем же именем, но другим UID — новый пользователь не получит доступ к старым файлам. Права привязаны к UID, а не к имени. А вот если вы привяжете к тому же UID — получит доступ к старым файлам. Вроде очевидно, но учитывайте этот момент.
Основные атрибуты пользователя
| Атрибут | Описание | Пример |
|---|---|---|
| username | Имя для входа и отображения | deployer |
| UID | Числовой идентификатор | 1001 |
| GID | Первичная группа | 1001 |
| home | Домашний каталог | /home/deployer |
| shell | Интерактивная оболочка | /bin/bash |
| GECOS | Комментарий (имя, телефон, …) | Ivan Petrov,, |
Быстрая диагностика
Первое, что можно сделать при входе на незнакомый сервер — проверить себя:
getentпредпочтительнее прямого чтения/etc/passwd, потому что он учитывает LDAP, NIS и другие NSS-источники — корректно работает в корпоративной среде.
Модель доступа: пользователь → система
«Всё есть файл»
Каждый объект в Linux — файл, директория, устройство, сокет — имеет владельца (owner) и группу (group). Это метаданные хранятся прямо в inode.
Упрощённая модель проверки прав
Ядро идёт слева направо и останавливается на первом совпадении. Если UID процесса совпадает с owner файла — применяются только права owner, права group уже не проверяются.
Подробный разбор битов
rwx, SUID/SGID/Sticky bit и ACL — в следующей статье «Права доступа».
Виды пользователей
Диапазоны UID
| Диапазон | Тип |
|---|---|
0 | root — суперпользователь. Обходит большинство проверок прав доступа, но не все |
1–999 | Системные пользователи — сервисы и демоны. Без интерактивного входа. |
1000+ | Обычные пользователи — реальные люди. useradd назначает UID ≥ 1000. |
65534 | nobody — минимальное доверие. NFS, sshd, sandbox-изоляция. |
Диапазоны настраиваются в /etc/login.defs:
(обычно: системные <1000, обычные ≥1000)
Системные пользователи и nologin
Сервисы типа nginx, postgres, redis работают от имени собственного системного пользователя. У таких пользователей в качестве shell прописан /usr/sbin/nologin или /bin/false — интерактивный вход заблокирован.
root и nobody — крайности спектра
root (UID 0) — полный контроль над системой. Ядро не проверяет права доступа. Может монтировать ФС, загружать модули ядра, убивать любые процессы, читать любые файлы. При компрометации — полная потеря системы.
nobody (UID 65534) — минимальные привилегии. Не владеет ни одним файлом. Используется как «безопасный» контекст для untrusted-кода: NFS-маппинг, CGI-процессы, sandbox-изоляция.
nobody = 65534 — не всегда (может быть nfsnobody / UID может отличаться)
Группы
Зачем нужны группы
Группы — механизм коллективного доступа. Вместо раздачи прав каждому пользователю индивидуально, достаточно добавить нужных людей в группу и выдать права группе. Классический пример: группа docker открывает доступ к сокету Docker без sudo.
Первичная и дополнительные группы
| Тип | Хранится в | Назначение |
|---|---|---|
| Primary (GID) | /etc/passwd, поле 4 | GID новых создаваемых файлов. Одна на пользователя. |
| Supplementary | /etc/group | Дополнительные права. Ограничение зависит от системы (обычно десятки тысяч). |
Проверка членства
Где хранится информация
/etc/passwd — реестр пользователей
Читаемый всеми файл. Пароля здесь нет — поле пароля содержит x, хеш находится в /etc/shadow.
| Поле | Содержимое |
|---|---|
| 1 | Username |
| 2 | Пароль — всегда x, хеш в shadow |
| 3 | UID |
| 4 | GID (первичная группа) |
| 5 | GECOS — комментарий (имя, телефон, …) |
| 6 | Домашний каталог |
| 7 | Логин-шелл |
По поводу
x: когда-то давно пароль мог храниться здесь в зашифрованном виде, но такая концепция не была признана безопасной.
Раньше хеш пароля реально хранился прямо в /etc/passwd. Файл был:
- читаем всеми — потому что нужен для работы системы (UID → username)
В итоге любой пользователь мог читать хеши и пытаться их брутфорсить офлайн. Поэтому позже была введена система shadow passwords: поле пароля в /etc/passwd заменили на x, а сами хеши перенесли в защищённый файл /etc/shadow, доступный только root.
/etc/shadow — хеши паролей
Доступен только root (и группе shadow). Содержит хеш пароля с солью и параметры устаревания.
| Поле | Описание |
|---|---|
$6$... | $6$ = SHA-512. Далее: rounds, salt, хеш. $y$ = yescrypt (современный.) |
19800 | Дата последней смены (дни с 1970-01-01) |
0 | Мин. дней до следующей смены |
99999 | Макс. срок действия (99999 ≈ никогда) |
7 | Предупреждение за N дней до истечения |
! или * | Заблокированный аккаунт |
Можно еще уточнить что формат хеша в /etc/shadow зависит от системы и настроек тк $y$ используется не везде(следует уточнять в зависимости от ОС)
/etc/group
| Поле | Содержимое |
|---|---|
| 1 | Название группы |
| 2 | Пароль группы (всегда x) |
| 3 | GID |
| 4 | Список supplementary-пользователей |
/etc/gshadow
Хеши паролей групп и список администраторов групп. Нужен ~редко — актуален при использовании newgrp с паролем.
Безопасное редактирование
Никогда не редактируйте
/etc/passwd,/etc/shadow,/etc/groupнапрямую через nano или vim. При параллельном изменении возможна гонка условий и повреждение файла.
Создание пользователей
useradd — параметры
| Ключ | Описание | Пример |
|---|---|---|
-m | Создать домашний каталог | -m |
-s | Логин-шелл | -s /bin/bash |
-G | Дополнительные группы (через запятую) | -G sudo,docker |
-g | Первичная группа (GID или имя) | -g www-data |
-u | Явно задать UID | -u 1500 |
-c | Комментарий (GECOS) | -c "Ivan Petrov" |
-d | Путь к home (если не стандартный) | -d /opt/service |
-e | Дата истечения аккаунта (YYYY-MM-DD) | -e 2025-12-31 |
-r | Системный пользователь (UID из sys-диапазона) | -r |
-b | Базовый каталог (вместо /home) | -b /srv |
-k | Каталог-шаблон вместо /etc/skel | -k /opt/skel |
-f | Дней неактивности после устаревания пароля до блокировки | -f 7 |
Установка пароля
Что происходит под капотом при useradd -m
- Запись в
/etc/passwd - Запись в
/etc/shadow(заблокирована до установки пароля) - Запись в
/etc/group(создаётся одноимённая primary-группа) mkdir /home/usernamecp -r /etc/skel/* /home/usernamechown -R user:user /home/username
Окружение пользователя
/etc/skel — шаблонные файлы
При создании пользователя с флагом -m содержимое /etc/skel копируется в home. Удобный механизм для стандартизации окружения.
Глобальные настройки
| Файл | Описание |
|---|---|
/etc/default/useradd | Дефолты для useradd: GROUP, HOME, SHELL, SKEL, INACTIVE |
/etc/login.defs | Диапазоны UID/GID, политика паролей, umask, HOME_MODE |
/etc/profile | Env-переменные для всех пользователей при логин-сессии |
/etc/profile.d/*.sh | Модульные скрипты из /etc/profile (предпочтительный способ) |
/etc/bash.bashrc | Глобальный bashrc для интерактивных шеллов (Debian/Ubuntu) |
umask — права по умолчанию
umask — маска, вычитаемая из максимальных прав при создании файлов и директорий. Максимум для файлов — 666, для директорий — 777.
ℹ️
umaskработает как побитовая маска исключения:666 & ~022 = 644. Простое вычитание при нестандартных значениях даст неверный результат.
Изменение пользователей
usermod
Флаг
-Gбез-aзаменяет все дополнительные группы. Пользователь потеряет все группы, включаяsudo. Всегда используй-aG.
chsh — смена оболочки
Блокировка и разблокировка
️ Блокировка через
passwd -lзапрещает вход по паролю, но не блокирует SSH по ключу. Для полной блокировки: дополнительноusermod -s /usr/sbin/nologin ivanилиusermod -e 1 ivan.
Удаление пользователей
userdel
Риски при удалении
| Риск | Последствие | Защита |
|---|---|---|
| Потеря данных | Файлы в home безвозвратно удалены | Бэкап перед userdel -r |
| Orphaned files | Файлы вне home с UID без пользователя | find / -nouser до/после |
| UID reuse | Новый пользователь получает тот же UID → старые файлы | Явно задавать UID через -u |
| Запущенные сессии | userdel упадёт: «user is currently logged in» | pkill -u ivan && userdel -r ivan |
Управление группами
groupadd / groupmod / groupdel
Добавление пользователя в группу
️ Изменения вступают в силу только при следующем входе. Для немедленного применения в текущей сессии:
Проверка
Привилегии: su vs sudo
su — переключение пользователя
su запускает новый шелл от имени другого пользователя, используя его пароль.
Разница su vs su -:
su— переключает UID, но сохраняет PATH и переменные текущего пользователяsu -— полный login shell: новый PATH, HOME, SHELL, выполняется~/.profileцелевого пользователя
️ На Ubuntu по умолчанию у root нет пароля. Используем
sudo -iилиsudo su -вместоsu.
sudo — точечное делегирование прав
sudo выполняет одну команду с повышенными привилегиями, авторизуясь паролем самого пользователя и логируя каждое действие.
Настройка /etc/sudoers
Редактировать только через
visudo. Синтаксическая ошибка без visudo заблокирует весь sudo на системе.
Синтаксис строки: КТО ОТКУДА=(ОТ_КОГО) [NOPASSWD:] ЧТО
Модульная организация через /etc/sudoers.d/:
su vs sudo — когда что использовать
| Критерий | su | sudo |
|---|---|---|
| Авторизация | Пароль целевого пользователя | Свой пароль |
| Аудит | Нет гранулярного лога | Полный лог в syslog |
| Гранулярность | Полная смена identity | Конкретные команды с NOPASSWD |
| Автоматизация | Неудобно | Удобно: NOPASSWD для скриптов |
| Когда применять | Длительная сессия под другим пользователем | Production-серверы, разовые привилегированные операции |
Заключение
Мы разобрали как Linux идентифицирует пользователей через UID и GID, какие бывают виды пользователей и групп, где хранится информация о них, как создавать, изменять и удалять пользователей, и чем отличаются su и sudo. Это фундамент для понимания прав доступа, которые мы разберём в следующей части серии.
Ниже — шпаргалка по всем командам из статьи.
Шпаргалка
Диагностика
| Команда | Описание |
|---|---|
id | uid/gid/groups текущего пользователя |
whoami | имя текущего пользователя |
id username | uid/gid/groups указанного пользователя |
groups username | группы пользователя |
getent passwd username | запись из passwd (учитывает LDAP) |
getent group groupname | запись о группе |
passwd -S username | статус пароля |
last | история входов |
w | кто сейчас залогинен |
Управление пользователями
| Команда | Описание |
|---|---|
useradd -m -s /bin/bash -G sudo user | создать пользователя |
passwd user | установить пароль |
usermod -aG group user | добавить в группу |
usermod -L / -U user | блокировать / разблокировать |
userdel -r user | удалить с home |
Управление группами
| Команда | Описание |
|---|---|
groupadd groupname | создать группу |
groupmod -n newname oldname | переименовать |
groupdel groupname | удалить |
newgrp groupname | активировать группу в текущей сессии |
Безопасное редактирование системных файлов
| Команда | Описание |
|---|---|
visudo | /etc/sudoers |
vipw | /etc/passwd |
vipw -s | /etc/shadow |
vigr | /etc/group |
pwck && grpck | проверить целостность |
