Пользователи и права

Users / Permissions — раздел Linux об учётных записях, группах, правах доступа к файлам, повышении привилегий и ACL.

Linux — многопользовательская система. У каждого пользователя есть имя и числовой идентификатор UID, у каждой группы — имя и GID. Процессы выполняются от имени пользователя и групп, а ядро проверяет их права при обращении к объектам.

Проверить текущего пользователя, UID и группы:

whoami
id
id alice
groups alice

root — суперпользователь с UID 0. Системные пользователи обычно создаются для служб, обычные — для интерактивной работы.


Пользователи и группы

useradd: создание пользователя

Создать пользователя с домашним каталогом и Bash:

sudo useradd -m -s /bin/bash alice
sudo passwd alice

На некоторых системах useradd alice не создаёт домашний каталог. Команда adduser, если она доступна, обычно предоставляет интерактивную оболочку над системными средствами.

Основные параметры:

Параметр Назначение
-m Создать домашний каталог
-d PATH Указать домашний каталог
-s SHELL Назначить оболочку
-u UID Задать UID
-g GROUP Указать основную группу
-G G1,G2 Указать дополнительные группы
-c TEXT Добавить комментарий, например полное имя
-e DATE Указать дату окончания действия учётной записи
-r Создать системного пользователя

Пример:

sudo useradd -m -c "Alice Smith" -s /bin/bash \
  -G developers,docker alice

Параметры по умолчанию зависят от дистрибутива:

useradd -D
cat /etc/default/useradd
cat /etc/login.defs

usermod: изменение пользователя

Изменить оболочку:

sudo usermod -s /bin/zsh alice

Добавить пользователя в дополнительную группу:

sudo usermod -aG developers alice

Комбинация -aG важна: -a добавляет группу, сохраняя текущее членство. Без -a параметр -G заменяет весь список дополнительных групп:

# Осторожно: остальные дополнительные группы будут удалены
sudo usermod -G developers alice

Переименовать пользователя и затем перенести домашний каталог:

sudo usermod -l newname oldname
sudo usermod -d /home/newname -m newname

Заблокировать и разблокировать пароль:

sudo usermod -L alice
sudo usermod -U alice

Блокировка пароля не завершает уже открытые сеансы и может не запрещать другие способы входа, например по SSH-ключу.

groupadd: создание группы

sudo groupadd developers
sudo groupadd -g 1500 auditors

Добавить или удалить пользователя из дополнительной группы:

sudo usermod -aG developers alice
sudo gpasswd -a alice developers
sudo gpasswd -d alice developers

У пользователя есть одна основная группа и дополнительные группы. Основной GID хранится в /etc/passwd, дополнительное членство — обычно в /etc/group.

После изменения групп нужно заново войти в систему. Уже запущенный сеанс может сохранить старый список групп. Временную оболочку с другой основной группой запускает:

newgrp developers

/etc/passwd, /etc/shadow, /etc/group

Локальные учётные записи описываются системными файлами. При использовании LDAP и других внешних каталогов надёжнее обращаться через getent, поскольку он учитывает настройки NSS:

getent passwd alice
getent group developers

/etc/passwd

Пример строки:

alice:x:1001:1001:Alice Smith:/home/alice:/bin/bash
Поле Значение
alice Имя пользователя
x Хеш пароля вынесен в /etc/shadow
1001 UID
1001 GID основной группы
Alice Smith Комментарий GECOS
/home/alice Домашний каталог
/bin/bash Оболочка

Системным пользователям часто назначают /usr/sbin/nologin или /bin/false, чтобы запретить обычный интерактивный вход.

Не рекомендуется редактировать файл напрямую. Для безопасного ручного редактирования применяется:

sudo vipw

/etc/shadow

Файл содержит хеши паролей и параметры срока их действия. Обычно он доступен только root и уполномоченным процессам.

alice:$y$j9T$...:20000:0:99999:7:::

Поля после имени содержат хеш, дату последней смены, минимальный и максимальный срок, период предупреждения, неактивность и дату окончания учётной записи. ! или * в поле хеша обычно блокирует вход по паролю.

Проверить и настроить срок действия:

sudo chage -l alice
sudo chage -M 90 -W 14 alice
sudo chage -E 2027-12-31 alice

Безопасное ручное редактирование:

sudo vipw -s

Содержимое /etc/shadow нельзя публиковать: хеши могут использоваться для офлайн-подбора паролей.

/etc/group

developers:x:1002:alice,bob
Поле Значение
developers Имя группы
x Поле пароля группы обычно не используется
1002 GID
alice,bob Дополнительные участники

Пользователь с этой группой в качестве основной может отсутствовать в списке участников: его GID указан в /etc/passwd.

getent group developers
sudo vigr
sudo pwck
sudo grpck

Файлы хранят числовые UID и GID, а не имена. После удаления учётной записи принадлежащие ей файлы сохранят старый UID. Это нужно учитывать, прежде чем идентификатор будет повторно использован.


Права доступа rwx

ls -l file.txt

Пример:

-rw-r----- 1 alice developers 2048 Sep 4 12:00 file.txt

Разбор режима:

- rw- r-- ---
│  │   │   └─ остальные: нет прав
│  │   └───── группа: чтение
│  └───────── владелец: чтение и запись
└──────────── обычный файл

Первый символ показывает тип: - — файл, d — каталог, l — символическая ссылка. Следующие девять символов — права владельца (u), группы (g) и остальных (o). a означает все категории.

Значение прав для файла

Право Значение
r Читать содержимое
w Изменять содержимое
x Запускать как программу

Значение прав для каталога

Право Значение
r Получать список имён
w Создавать, удалять и переименовывать записи
x Проходить каталог и обращаться к объектам по имени

Удаление файла контролируется прежде всего правами w и x на родительский каталог, а не правом w самого файла.

Упрощённый порядок проверки: если UID совпал с владельцем, применяются только права владельца; иначе при членстве в группе файла — групповые права; иначе — права остальных. Эти три набора не объединяются. ACL дополняют модель.


chmod: числовой и символьный режим

Числовая форма

Право Число
r 4
w 2
x 1

Сумма задаётся отдельно для владельца, группы и остальных:

Число Режим
0 ---
1 --x
2 -w-
3 -wx
4 r--
5 r-x
6 rw-
7 rwx
chmod 644 file.txt       # rw-r--r--
chmod 600 secret.txt     # rw-------
chmod 755 script.sh      # rwxr-xr-x
chmod 750 private-tool   # rwxr-x---

Символьная форма

Операторы: + добавляет, - удаляет, = устанавливает точный набор.

chmod u+x script.sh
chmod go-w file.txt
chmod g+rw file.txt
chmod u=rw file.txt
chmod u=rwx,g=rx,o= script.sh
chmod g=u file.txt

Заглавная X добавляет выполнение каталогам и файлам, у которых оно уже было разрешено хотя бы одной категории:

chmod -R a+X project/

Не следует без проверки применять chmod -R 755: обычные документы тоже станут исполняемыми. Разделить режимы можно так:

find project -type d -exec chmod 755 {} +
find project -type f -exec chmod 644 {} +

chown и chgrp

Изменить владельца:

sudo chown alice file.txt

Изменить владельца и группу или только группу:

sudo chown alice:developers file.txt
sudo chown :developers file.txt
sudo chgrp developers file.txt

Рекурсивное изменение:

sudo chown -R alice:developers project/
sudo chgrp -R developers project/

Рекурсивные команды опасны при ошибке в пути. Перед выполнением проверьте pwd, ls -ld и аргументы. Поведение с символическими ссылками зависит от параметров команды; его следует сверять через man chown.


SUID, SGID и sticky bit

Бит Число Назначение
SUID 4 Эффективный UID владельца при запуске файла
SGID 2 Эффективный GID при запуске; наследование группы каталогом
sticky 1 Ограничение удаления чужих записей в общем каталоге

Специальная цифра записывается перед обычным режимом.

SUID

sudo chmod u+s program
sudo chmod 4755 program

Результат:

-rwsr-xr-x

При запуске подходящего исполняемого файла процесс получает эффективный UID владельца. SUID на программе владельца root опасен: уязвимость может привести к повышению привилегий. На сценариях SUID обычно игнорируется, а параметр монтирования nosuid отключает его действие.

Найти SUID-файлы в одной файловой системе:

sudo find / -xdev -type f -perm -4000 -ls

SGID

Для исполняемого файла:

sudo chmod g+s program
sudo chmod 2755 program
-rwxr-sr-x

Для совместного каталога:

sudo chown root:developers /srv/project
sudo chmod 2775 /srv/project
drwxrwsr-x

Новые объекты в таком каталоге обычно наследуют его группу. Конечные права зависят также от umask, ACL и приложения.

Sticky bit

sudo chmod +t /srv/shared
sudo chmod 1777 /srv/shared
drwxrwxrwt

В таком каталоге удалить или переименовать запись обычно может владелец записи, владелец каталога или привилегированный пользователь. Классический пример — /tmp. Sticky bit не запрещает чтение данных.

Заглавные S и T означают, что специальный бит установлен, но соответствующий x отсутствует.

Удаление специальных битов:

chmod u-s program
chmod g-s program
chmod -t directory

sudo и /etc/sudoers

sudo запускает разрешённую команду от имени другого пользователя, обычно root.

sudo systemctl restart nginx
sudo -u postgres psql
sudo -l
sudo -i
sudo -s

Для одной операции безопаснее sudo команда, чем продолжительная работа в root-оболочке.

Команда ниже часто не работает, поскольку перенаправление выполняет текущая оболочка:

sudo echo "value" > /etc/example.conf

Используйте tee:

printf '%s\n' 'value' | sudo tee /etc/example.conf >/dev/null
printf '%s\n' 'value' | sudo tee -a /etc/example.conf >/dev/null

Файл /etc/sudoers

Главный файл правил — /etc/sudoers, дополнительные правила часто находятся в /etc/sudoers.d/. Редактировать их нужно через visudo, который проверяет синтаксис:

sudo visudo
sudo visudo -f /etc/sudoers.d/deploy
sudo visudo -c

Упрощённый формат:

пользователь хост=(целевой_пользователь:группа) команды

Полный доступ пользователю и группе:

alice ALL=(ALL:ALL) ALL
%sysadmins ALL=(ALL:ALL) ALL

Разрешить только конкретную команду:

deploy ALL=(root) /usr/bin/systemctl restart myapp.service

Без запроса пароля:

deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart myapp.service

NOPASSWD следует применять только к минимально необходимым командам. Интерпретаторы, редакторы и программы, способные запустить внешнюю команду или изменить системные файлы, могут фактически дать полноценный root-доступ.

Пример псевдонима:

User_Alias WEBADMINS = alice, bob
Cmnd_Alias WEB_SERVICE = /usr/bin/systemctl restart nginx.service, \
                         /usr/bin/systemctl reload nginx.service
WEBADMINS ALL=(root) WEB_SERVICE

Файлам в /etc/sudoers.d/ обычно назначают владельца root и режим 0440:

sudo chown root:root /etc/sudoers.d/deploy
sudo chmod 0440 /etc/sudoers.d/deploy

После изменений проверьте правила в отдельном рабочем административном сеансе:

sudo visudo -c
sudo -l -U alice

su: переключение пользователя

su                    # перейти к root без полной login-среды
su -                  # login-среда root
su alice              # переключиться на alice
su - alice            # полноценная login-среда alice
su - alice -c 'id'    # выполнить одну команду

su alice сохраняет значительную часть текущего окружения и текущий каталог. su - alice имитирует вход: переходит в домашний каталог и формирует окружение пользователя.

Типичное различие: su запрашивает пароль целевого пользователя, а sudo — пароль текущего. Точное поведение определяется PAM и настройками системы. sudo удобнее для точечных полномочий и аудита; su - USER — когда действительно требуется пользовательский сеанс.


ACL: дополнительные права

Классические права содержат только владельца, одну группу и остальных. ACL добавляют правила для отдельных пользователей и групп.

Основные команды:

getfacl file.txt
setfacl -m u:bob:r-- file.txt

Пример вывода:

# owner: alice
# group: developers
user::rw-
user:bob:r--
group::r--
mask::r--
other::---

Расширенная ACL обычно отмечается + в выводе ls -l:

-rw-r-----+ 1 alice developers 2048 Sep 4 12:00 file.txt

Добавить или удалить записи:

setfacl -m u:bob:rw- report.txt
setfacl -m g:auditors:r-- report.txt
setfacl -x u:bob report.txt
setfacl -b report.txt       # удалить расширенную ACL

ACL по умолчанию

Default ACL каталога наследуется новыми объектами:

setfacl -m d:g:developers:rwx /srv/project
setfacl -m d:o::--- /srv/project
getfacl /srv/project

Маска ограничивает эффективные права. Например, при user:bob:rwx и mask::r-- пользователь фактически получит только чтение. Изменить маску:

setfacl -m m::rw- report.txt

chmod может изменить маску ACL, поэтому после его применения проверяйте результат через getfacl.

Рекурсивная настройка с безопасной заглавной X:

setfacl -R -m g:developers:rwX project/

Сохранение и восстановление ACL:

getfacl -R project > project.acl
setfacl --restore=project.acl

Пример общего каталога

Создадим каталог, доступный участникам группы webteam:

sudo groupadd webteam
sudo usermod -aG webteam alice
sudo usermod -aG webteam bob
sudo mkdir -p /srv/web-project
sudo chown root:webteam /srv/web-project
sudo chmod 2770 /srv/web-project

SGID обеспечивает наследование группы. Default ACL задаёт права новых объектов:

sudo setfacl -m g:webteam:rwx /srv/web-project
sudo setfacl -m d:u::rwx /srv/web-project
sudo setfacl -m d:g::rwx /srv/web-project
sudo setfacl -m d:g:webteam:rwx /srv/web-project
sudo setfacl -m d:m::rwx /srv/web-project
sudo setfacl -m d:o::--- /srv/web-project

Проверка:

ls -ld /srv/web-project
getfacl /srv/web-project

Диагностика доступа

Проверить пользователя, группы и объект:

id alice
stat /srv/project/report.txt
getfacl /srv/project/report.txt

Проверить каждый каталог пути — отсутствие x у одного из родителей блокирует доступ:

namei -l /srv/project/report.txt

Проверить доступ именно от имени пользователя:

sudo -u alice test -r report.txt && echo readable
sudo -u alice test -w report.txt && echo writable
sudo -u alice test -x script.sh && echo executable

Проверить монтирование:

findmnt -T report.txt

Параметры ro, noexec, nosuid, а также SELinux, AppArmor, контейнеры и атрибут immutable могут ограничивать действия независимо от видимых rwx и ACL.


Краткая памятка

# Пользователи и группы
sudo useradd -m -s /bin/bash alice
sudo passwd alice
sudo groupadd developers
sudo usermod -aG developers alice
id alice

# Права и владельцы
chmod 640 file.txt
chmod u+x script.sh
sudo chown alice:developers file.txt
sudo chgrp developers file.txt

# Специальные биты
chmod 4755 program       # SUID
chmod 2775 shared/       # SGID каталога
chmod 1777 public-temp/  # sticky bit

# Повышение и смена пользователя
sudo -l
sudo command
sudo -u alice command
sudo visudo
su - alice

# ACL
getfacl file.txt
setfacl -m u:bob:r-- file.txt
setfacl -m g:developers:rw- file.txt
setfacl -x u:bob file.txt
setfacl -b file.txt

Главные правила безопасности: не использовать 777 без необходимости, не ставить SUID на непроверенные программы, редактировать sudoers только через visudo, применять принцип минимальных привилегий и проверять путь перед рекурсивными chmod, chown и setfacl.