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

Материал из llmdocs — справочник разработчика
Права доступа в 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» при вполне разумных правах.

См. также

Источники

  1. chmod(1) — Linux manual page
  2. inode(7) — Linux manual page (file type and mode)
  3. umask(2) — Linux manual page
  4. acl(5) — Linux manual page
  5. capabilities(7) — Linux manual page