Права доступа в Unix
| Классы пользователей | владелец (u), группа (g), остальные (o) |
|---|---|
| Базовые права | чтение (r), запись (w), выполнение (x) |
| Специальные биты | setuid, setgid, sticky |
| Запись | символьная (rwxr-xr-x) или восьмеричная (755) |
| Команды | chmod, chown, chgrp, umask, setfacl |
| Суперпользователь | root (UID 0) |
Права доступа в Unix — модель, по которой операционная система решает, кто может читать, изменять и запускать файл. У каждого файла и каталога есть владелец, группа и набор из девяти битов прав: что разрешено владельцу, членам группы и всем остальным. Эта простая схема появилась в первых версиях Unix в начале 1970-х и до сих пор лежит в основе безопасности Linux, macOS и BSD.
Пользователи и группы
Каждый процесс работает от имени пользователя с числовым идентификатором UID и состоит в одной или нескольких группах (GID). Пользователи перечислены в /etc/passwd, группы — в /etc/group. Пользователь root (UID 0) — суперпользователь: проверки прав на него не распространяются. Поэтому повседневная работа ведётся от обычного пользователя, а административные команды запускаются через sudo.
Службы на сервере принято запускать от отдельных непривилегированных пользователей (www-data, postgres), чтобы взлом одной из них не давал доступа ко всей системе.
Базовые права
Вывод ls -l показывает тип и права в первом столбце:
-rwxr-x--- 1 alice devs 4096 ноя 9 10:00 deploy.sh
drwxr-xr-x 2 alice devs 4096 ноя 9 10:00 public
Первый символ — тип (- файл, d каталог, l символическая ссылка), затем три тройки: владелец, группа, остальные.[2] Смысл букв для файлов и каталогов различается:
| Право | Для файла | Для каталога |
|---|---|---|
r (4) |
читать содержимое | получать список имён |
w (2) |
изменять содержимое | создавать, удалять и переименовывать файлы внутри |
x (1) |
запускать как программу | входить (cd) и обращаться к файлам по имени |
Важное следствие: возможность удалить файл определяется правом w на каталог, а не на сам файл. А без x на каталог файлы в нём недоступны, даже если права самих файлов открыты.
Восьмеричная запись
Каждая тройка кодируется цифрой — суммой значений r=4, w=2, x=1:
| Запись | Права | Типичное применение |
|---|---|---|
755 |
rwxr-xr-x |
программы, каталоги |
644 |
rw-r--r-- |
обычные файлы |
700 |
rwx------ |
личный каталог, ~/.ssh |
600 |
rw------- |
закрытые ключи, файлы с паролями |
777 |
rwxrwxrwx |
почти всегда ошибка |
chmod 600 ~/.ssh/id_ed25519 # восьмеричная запись
chmod u+x,go-w script.sh # символьная: добавить x владельцу, убрать w группе и остальным
chmod -R g+rX shared/ # X — выполнение только для каталогов и уже исполняемых файлов
chown alice:devs report.txt # сменить владельца и группу
Клиент SSH откажется использовать закрытый ключ, если права на него слишком открыты, — частая причина ошибок подключения.[1]
Специальные биты
- setuid (4000) — программа запускается с правами владельца файла, а не запустившего пользователя. Так работает
passwd: обычный пользователь меняет свой пароль в файле, доступном только root. Вls -lотображается какsвместоxу владельца. - setgid (2000) — на файле аналогично для группы; на каталоге — новые файлы наследуют группу каталога, что удобно для общих рабочих папок.
- sticky bit (1000) — на каталоге удалять файл может только его владелец. Стоит на
/tmp(права1777, букваt), куда пишут все.
Setuid-программы — излюбленная цель атак на повышение привилегий, поэтому их число в системе стараются сводить к минимуму.
umask
umask — маска, которая убирает права у вновь создаваемых файлов. Программы обычно создают файлы с правами 666 и каталоги с 777, а маска вычитает лишнее: при типичном umask 022 получаются 644 и 755, при 077 — файлы доступны только владельцу.[3]
ACL и capabilities
Классической тройки «владелец, группа, остальные» иногда не хватает — например, чтобы дать доступ к файлу ещё одному конкретному пользователю. Для этого существуют списки контроля доступа (POSIX ACL):[4]
setfacl -m u:bob:r report.txt # разрешить bob чтение
getfacl report.txt # показать ACL
С другой стороны, всемогущество root разбито в Linux на отдельные привилегии (capabilities): например, CAP_NET_BIND_SERVICE позволяет занимать порты ниже 1024 без остальных прав суперпользователя.[5] Capabilities активно используют systemd и контейнерные среды вроде Docker, отбирая у процессов всё лишнее.
Типичные ошибки
chmod -R 777«чтобы заработало» — открывает файлы всем пользователям системы и маскирует настоящую проблему (не тот владелец).- Файлы, созданные через
sudo, принадлежат root, и потом обычный пользователь не может их изменить — нужноchown. - Скрипт без бита
xзапускается только какbash script.sh, а не./script.sh; см. Shell и Bash. - В контейнерах UID процесса и UID владельца смонтированного тома могут не совпадать, отсюда «Permission denied» при вполне разумных правах.