1. Введение
Продолжаем прохождение linux! Сразу уточню что статья может обновляться после адекватной критики и уточнений от сообщества Хабра(там где офицально статья была опубликована от opensophy), свежие обновления всегда происходят на opensophy.com, если вы только начинаете изучать линукс или хотите освежить память можете вернуться в прошлую серию рубрики "Учим Linux: Файлы, навигация и поиск". В этой части я попытался расписать довольно кратко т.к. информации и так много и тот же новичок может не сразу все выучить но по комментариям из Хабра я буду создавать что-то вроде чеклиста оперативных вопросов(это если я пропустил что-то из важной информации). Приступим.
Серия рубрик в основном под Ubuntu/Debian
2. Как Linux идентифицирует пользователя
2.1 Username vs UID
Ядро Linux работает исключительно с числами. UID (User Identifier) — числовой идентификатор пользователя (обычно 32-битный). Имя пользователя (username) — лишь человекочитаемый псевдоним, который инструменты вроде ls или ps подставляют при выводе, обращаясь к /etc/passwd.
⚠️ Если удалить пользователя и создать нового с тем же именем, но другим UID — новый пользователь не получит доступ к старым файлам. Права привязаны к UID, а не к имени.(А ВОТ ЕСЛИ ВЫ ПРИВЯЖЕТЕ к UID ТО ПОЛУЧИТ ДОСТУП К СТАРЫМ ФАЙЛАМ. Вроде очевидно но учитывайте этот момент)
2.2 Основные атрибуты пользователя
| Атрибут |
Описание |
Пример |
| username |
Имя для входа и отображения |
deployer |
| UID |
Числовой идентификатор |
1001 |
| GID |
Первичная группа |
1001 |
| home |
Домашний каталог |
/home/deployer |
| shell |
Интерактивная оболочка |
/bin/bash |
| GECOS |
Комментарий (имя, телефон, ...) |
Ivan Petrov,, |
2.3 Быстрая диагностика
Первое, что можно сделать при входе на незнакомый сервер — проверить себя:
# Полная информация: uid, gid, все группы
id
# uid=1001(deployer) gid=1001(deployer) groups=1001(deployer),27(sudo),998(docker)
# Только UID / GID
id -u
id -g
# Только имя пользователя
whoami
# Полная запись из /etc/passwd
getent passwd deployer
# deployer:x:1001:1001:Deploy Bot,,:/home/deployer:/bin/bash
# Группа
getent group docker
# docker:x:998:deployer,ci
✅ getent предпочтительнее прямого чтения /etc/passwd, потому что он учитывает LDAP, NIS и другие NSS-источники — корректно работает в корпоративной среде.
3. Модель доступа: пользователь → система
3.1 «Всё есть файл»
Каждый объект в Linux — файл, директория, устройство, сокет — имеет владельца (owner) и группу (group). Это метаданные хранятся прямо в inode.
ls -la /var/log/nginx/
# drwxr-xr-x 2 root adm 4096 Mar 26 09:00 .
# -rw-r----- 1 www-data adm 187234 Mar 26 10:41 access.log
# -rw-r----- 1 www-data adm 1204 Mar 26 07:22 error.log
#
# Структура строки:
# тип+права links owner group size дата имя
3.2 Упрощённая модель проверки прав
процесс (UID/GID) → owner? → group? → others
Ядро идёт слева направо и останавливается на первом совпадении. Если UID процесса совпадает с owner файла — применяются только права owner, права group уже не проверяются.
ℹ️ Подробный разбор битов rwx, SUID/SGID/Sticky bit и ACL — в следующей статье «Права доступа».
4. Виды пользователей
4.1 Диапазоны UID
| Диапазон |
Тип |
0 |
root — суперпользователь. Обходит большинство проверок прав доступа, но не все |
1–999 |
Системные пользователи — сервисы и демоны. Без интерактивного входа. |
1000+ |
Обычные пользователи — реальные люди. useradd назначает UID ≥ 1000. |
65534 |
nobody — минимальное доверие. NFS, sshd, sandbox-изоляция. |
Диапазоны настраиваются в /etc/login.defs:
UID_MIN 1000
UID_MAX 60000
SYS_UID_MIN 201
SYS_UID_MAX 999
CREATE_HOME yes
PASS_MIN_LEN 8
(обычно: системные <1000, обычные ≥1000)
4.2 Системные пользователи и nologin
Сервисы типа nginx, postgres, redis работают от имени собственного системного пользователя. У таких пользователей в качестве shell прописан /usr/sbin/nologin или /bin/false — интерактивный вход заблокирован.
# Посмотреть системных пользователей (UID < 1000)
awk -F: '$3 < 1000 && $3 > 0 {print $1, $3, $7}' /etc/passwd
# Специфические просмотры(для инструментов и др.)
# daemon 1 /usr/sbin/nologin
# www-data 33 /usr/sbin/nologin
# postgres 117 /bin/bash ← исключение: нужен для psql
# nginx 998 /sbin/nologin
4.3 root и nobody — крайности спектра
root (UID 0) — полный контроль над системой. Ядро не проверяет права доступа. Может монтировать ФС, загружать модули ядра, убивать любые процессы, читать любые файлы. При компрометации — полная потеря системы.
nobody (UID 65534) — минимальные привилегии. Не владеет ни одним файлом. Используется как «безопасный» контекст для untrusted-кода: NFS-маппинг, CGI-процессы, sandbox-изоляция.
nobody = 65534 — не всегда (может быть nfsnobody / UID может отличаться)
5. Группы
5.1 Зачем нужны группы
Группы — механизм коллективного доступа. Вместо раздачи прав каждому пользователю индивидуально, достаточно добавить нужных людей в группу и выдать права группе. Классический пример: группа docker открывает доступ к сокету Docker без sudo.
5.2 Первичная и дополнительные группы
| Тип |
Хранится в |
Назначение |
| Primary (GID) |
/etc/passwd, поле 4 |
GID новых создаваемых файлов. Одна на пользователя. |
| Supplementary |
/etc/group |
Дополнительные права. Ограничение зависит от системы (обычно десятки тысяч). |
5.3 Проверка членства
# Все группы текущего пользователя
groups
# deployer sudo docker adm
# То же с GID
id
# uid=1001(deployer) gid=1001(deployer) groups=1001(deployer),27(sudo),998(docker)
# Группы конкретного пользователя
groups maria
# Все члены группы docker
getent group docker
# docker:x:998:deployer,maria,ci-bot
6. Где хранится информация
6.1 /etc/passwd — реестр пользователей
Читаемый всеми файл. Пароля здесь нет — поле пароля содержит x, хеш находится в /etc/shadow.
deployer : x : 1001 : 1001 : Deploy Bot,, : /home/deployer : /bin/bash
1 2 3 4 5 6 7
| Поле |
Содержимое |
| 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.
6.2 /etc/shadow — хеши паролей
Доступен только root (и группе shadow). Содержит хеш пароля с солью и параметры устаревания.
deployer:$6$rounds=5000$xPwF...$kE9...hash...:19800:0:99999:7:::
| Поле |
Описание |
$6$... |
$6$ = SHA-512. Далее: rounds, salt, хеш. $y$ = yescrypt (современный.) |
19800 |
Дата последней смены (дни с 1970-01-01) |
0 |
Мин. дней до следующей смены |
99999 |
Макс. срок действия (99999 ≈ никогда) |
7 |
Предупреждение за N дней до истечения |
! или * |
Заблокированный аккаунт |
Можно еще уточнить что формат хеша в /etc/shadow зависит от системы и настроек тк y используется не везде(следует уточнять в зависимости от ОС)
6.3 /etc/group
docker : x : 998 : deployer,ci-bot
1 2 3 4
| Поле |
Содержимое |
| 1 |
Название группы |
| 2 |
Пароль группы (всегда x) |
| 3 |
GID |
| 4 |
Список supplementary-пользователей |
6.4 /etc/gshadow
Хеши паролей групп и список администраторов групп. Нужен ~редко — актуален при использовании newgrp с паролем.
6.5 Безопасное редактирование
🚨 Никогда не редактируй /etc/passwd, /etc/shadow, /etc/group напрямую через nano или vim. При параллельном изменении возможна гонка условий и повреждение файла.
vipw # редактировать /etc/passwd (с блокировкой и валидацией)
vipw -s # редактировать /etc/shadow
vigr # редактировать /etc/group
vigr -s # редактировать /etc/gshadow
# После ручного редактирования — проверить целостность
pwck # проверка /etc/passwd и /etc/shadow
grpck # проверка /etc/group и /etc/gshadow
7. Создание пользователей
7.1 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 |
# Создать обычного пользователя с home и bash
useradd -m -s /bin/bash ivan
# Пользователь для CI/CD — без home, с nologin
useradd -r -s /usr/sbin/nologin -c "CI Bot" ci-bot
# Разработчик с несколькими группами
useradd -m -s /bin/bash -G sudo,docker,adm -c "Maria Ivanova" maria
# Сервисный пользователь с нестандартным home
useradd -r -m -d /var/lib/prometheus -s /usr/sbin/nologin prometheus
7.2 Установка пароля
# Интерактивно (запросит дважды)
passwd ivan
# В скриптах — через chpasswd
echo 'ivan:secretpass' | chpasswd
# Сгенерировать случайный пароль
NEW_PASS=$(openssl rand -base64 16)
echo "ivan:${NEW_PASS}" | chpasswd
echo "Пароль: ${NEW_PASS}" # сохрани в менеджер!
# Принудить сменить пароль при первом входе
passwd -e ivan
7.3 Что происходит под капотом при useradd -m
- Запись в
/etc/passwd
- Запись в
/etc/shadow (заблокирована до установки пароля)
- Запись в
/etc/group (создаётся одноимённая primary-группа)
mkdir /home/username
cp -r /etc/skel/* /home/username
chown -R user:user /home/username
8. Окружение пользователя
8.1 /etc/skel — шаблонные файлы
При создании пользователя с флагом -m содержимое /etc/skel копируется в home. Удобный механизм для стандартизации окружения.
ls -la /etc/skel/
# .bash_logout .bashrc .profile
# Добавить корпоративный .gitconfig для всех новых пользователей
cat > /etc/skel/.gitconfig <<'EOF'
[core]
autocrlf = input
editor = vim
[pull]
rebase = true
EOF
8.2 Глобальные настройки
| Файл |
Описание |
/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) |
9. umask — права по умолчанию
umask — маска, вычитаемая из максимальных прав при создании файлов и директорий. Максимум для файлов — 666, для директорий — 777.
# Посмотреть текущую маску
umask
# 0022
# Расчёт: файл 666 & ~022 = 644 (rw-r--r--)
# дирек 777 & ~022 = 755 (rwxr-xr-x)
touch test.txt && ls -l test.txt
# -rw-r--r-- 1 deployer deployer 0 Mar 26 12:00 test.txt
# Поменять для текущей сессии
umask 027 # файлы: 640, директории: 750
# Глобально — в /etc/login.defs:
# UMASK 022
# Для PAM — в /etc/pam.d/common-session:
# session optional pam_umask.so umask=002
ℹ️ umask работает как побитовая маска исключения: 666 & ~022 = 644. Простое вычитание при нестандартных значениях даст неверный результат.
10. Изменение пользователей
10.1 usermod
# Изменить логин-шелл
usermod -s /bin/zsh ivan
# Переименовать пользователя
usermod -l ivan-petrov ivan
# Изменить домашний каталог (с перемещением файлов)
usermod -d /home/ivan-petrov -m ivan-petrov
# Установить дату истечения
usermod -e 2025-12-31 contractor
# Сменить первичную группу
usermod -g developers ivan-petrov
# Добавить в дополнительную группу
usermod -aG docker ivan-petrov # -a ОБЯЗАТЕЛЕН!
🚨 Флаг -G без -a заменяет все дополнительные группы. Пользователь потеряет все группы, включая sudo. Всегда используй -aG.
10.2 chsh — смена оболочки
# Интерактивно (сам пользователь может сменить свою оболочку)
chsh
# New shell [/bin/bash]: /bin/zsh
# Неинтерактивно (только root)
chsh -s /bin/fish ivan
# Доступные оболочки — только из /etc/shells
cat /etc/shells
10.3 Блокировка и разблокировка
# Заблокировать (ставит ! перед хешем в shadow)
passwd -l ivan
usermod -L ivan # эквивалент
# Разблокировать
passwd -u ivan
usermod -U ivan
# Проверить статус пароля
passwd -S ivan
# ivan L 03/26/2026 0 99999 7 -1
# ^ L=Locked, P=Password set, NP=No Password
⚠️ Блокировка через passwd -l запрещает вход по паролю, но не блокирует SSH по ключу. Для полной блокировки: дополнительно usermod -s /usr/sbin/nologin ivan или usermod -e 1 ivan.
11. Удаление пользователей
11.1 userdel
# Удалить пользователя (home НЕ удаляется)
userdel ivan
# Удалить вместе с home-каталогом и почтовым ящиком
userdel -r ivan
# Предварительно сохранить данные
tar -czf /backup/ivan-$(date +%F).tar.gz /home/ivan
userdel -r ivan
11.2 Риски при удалении
| Риск |
Последствие |
Защита |
| Потеря данных |
Файлы в 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 |
# Найти «осиротевшие» файлы
find / -nouser -nogroup -ls 2>/dev/null
12. Управление группами
12.1 groupadd / groupmod / groupdel
# Создать группу
groupadd developers
groupadd -g 5000 infra # с явным GID
groupadd -r appservice # системная группа
# Переименовать
groupmod -n backend developers
# Изменить GID (осторожно: файлы со старым GID станут orphaned)
groupmod -g 5100 backend
# Удалить
groupdel backend
12.2 Добавление пользователя в группу
# Правильно: -aG (append + Groups)
usermod -aG docker ivan
# Сразу в несколько групп
usermod -aG docker,sudo,adm maria
⚠️ Изменения вступают в силу только при следующем входе. Для немедленного применения в текущей сессии:
newgrp docker # запускает subshell с активной группой docker
# или
exec su -l $USER # перезапускает логин-сессию без выхода
12.3 Проверка
getent group docker
# docker:x:998:deployer,maria,ci-bot
id maria
groups maria
13. Привилегии: su vs sudo
13.1 su — переключение пользователя
su запускает новый шелл от имени другого пользователя, используя его пароль.
# Переключиться на root без загрузки окружения
su
# Переключиться на root с полным login shell (рекомендуется)
su -
su -l root
# Переключиться на другого пользователя
su - maria
# Выполнить одну команду
su -c "whoami; id" - maria
Разница su vs su -:
su — переключает UID, но сохраняет PATH и переменные текущего пользователя
su - — полный login shell: новый PATH, HOME, SHELL, выполняется ~/.profile целевого пользователя
⚠️ На Ubuntu по умолчанию у root нет пароля. Используем sudo -i или sudo su - вместо su.
13.2 sudo — точечное делегирование прав
sudo выполняет одну команду с повышенными привилегиями, авторизуясь паролем самого пользователя и логируя каждое действие.
# Выполнить команду от root
sudo apt update
# Получить root-шелл (login shell)
sudo -i
# Получить root-шелл (non-login)
sudo -s
# Выполнить от имени другого пользователя
sudo -u www-data id
# Посмотреть, что тебе разрешено
sudo -l
# Повторить последнюю команду с sudo
sudo !!
# Аудит: все sudo-действия
grep sudo /var/log/auth.log | tail -20
13.3 Настройка /etc/sudoers
🚨 Редактировать только через visudo. Синтаксическая ошибка без visudo заблокирует весь sudo на системе.
visudo
Синтаксис строки: КТО ОТКУДА=(ОТ_КОГО) [NOPASSWD:] ЧТО
# Группа sudo — полные права со своим паролем
%sudo ALL=(ALL:ALL) ALL
# Конкретный пользователь — только restart nginx без пароля
deployer ALL=(root) NOPASSWD: /usr/sbin/service nginx restart
# CI-бот — только docker
ci-bot ALL=(root) NOPASSWD: /usr/bin/docker
# Запретить конкретную команду для группы
%developers ALL=(ALL) ALL, !/usr/sbin/visudo
Модульная организация через /etc/sudoers.d/:
visudo -f /etc/sudoers.d/ci-bot
# Содержимое:
# ci-bot ALL=(root) NOPASSWD: /usr/bin/docker pull *, /usr/bin/docker run *
# Права файла обязательно 0440
chmod 0440 /etc/sudoers.d/ci-bot
13.4 su vs sudo — когда что использовать
| Критерий |
su |
sudo ✓ |
| Авторизация |
Пароль целевого пользователя |
Свой пароль |
| Аудит |
Нет гранулярного лога |
Полный лог в syslog |
| Гранулярность |
Полная смена identity |
Конкретные команды с NOPASSWD |
| Автоматизация |
Неудобно |
Удобно: NOPASSWD для скриптов |
| Когда применять |
Длительная сессия под другим пользователем |
Production-серверы, разовые привилегированные операции |
Шпаргалка
Диагностика
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 # удалить
groupname # активировать группу в текущей сессии
Безопасное редактирование системных файлов
visudo # /etc/sudoers
vipw # /etc/passwd
vipw -s # /etc/shadow
vigr # /etc/group
pwck && grpck # проверить целостность