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

> Модель разграничения доступа к файлам в Unix и Linux — владелец, группа и остальные, права на чтение, запись и выполнение, а также setuid, sticky bit, umask и ACL.

Источник: https://llmdocs.ru/wiki/unix-permissions/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Классы пользователей**: владелец (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](https://llmdocs.ru/wiki/linux.md), macOS и BSD.

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

Каждый процесс работает от имени пользователя с числовым идентификатором **UID** и состоит в одной или нескольких группах (**GID**). Пользователи перечислены в `/etc/passwd`, группы — в `/etc/group`. Пользователь **root** (UID 0) — суперпользователь: проверки прав на него не распространяются. Поэтому повседневная работа ведётся от обычного пользователя, а административные команды запускаются через `sudo`.

Службы на сервере принято запускать от отдельных непривилегированных пользователей (`www-data`, `postgres`), чтобы взлом одной из них не давал доступа ко всей системе.

## Базовые права

Вывод `ls -l` показывает тип и права в первом столбце:

```text
-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` | почти всегда ошибка |

```bash
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](https://llmdocs.ru/wiki/ssh.md) откажется использовать закрытый ключ, если права на него слишком открыты, — частая причина ошибок подключения.[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]

```bash
setfacl -m u:bob:r report.txt    # разрешить bob чтение
getfacl report.txt               # показать ACL
```

С другой стороны, всемогущество root разбито в Linux на отдельные **привилегии** (*capabilities*): например, `CAP_NET_BIND_SERVICE` позволяет занимать порты ниже 1024 без остальных прав суперпользователя.[5] Capabilities активно используют [systemd](https://llmdocs.ru/wiki/systemd.md) и контейнерные среды вроде [Docker](https://llmdocs.ru/wiki/docker.md), отбирая у процессов всё лишнее.

## Типичные ошибки

- `chmod -R 777` «чтобы заработало» — открывает файлы всем пользователям системы и маскирует настоящую проблему (не тот владелец).
- Файлы, созданные через `sudo`, принадлежат root, и потом обычный пользователь не может их изменить — нужно `chown`.
- Скрипт без бита `x` запускается только как `bash script.sh`, а не `./script.sh`; см. [Shell и Bash](https://llmdocs.ru/wiki/shell-bash.md).
- В контейнерах UID процесса и UID владельца смонтированного тома могут не совпадать, отсюда «Permission denied» при вполне разумных правах.

## См. также

- [Linux](https://llmdocs.ru/wiki/linux.md)
- [Процессы и сигналы](https://llmdocs.ru/wiki/processes-signals.md)
- [SSH](https://llmdocs.ru/wiki/ssh.md)
- [Файловая система Unix (FHS)](https://llmdocs.ru/wiki/fhs.md)

## Источники

1. [chmod(1) — Linux manual page](https://man7.org/linux/man-pages/man1/chmod.1.html)
2. [inode(7) — Linux manual page (file type and mode)](https://man7.org/linux/man-pages/man7/inode.7.html)
3. [umask(2) — Linux manual page](https://man7.org/linux/man-pages/man2/umask.2.html)
4. [acl(5) — Linux manual page](https://man7.org/linux/man-pages/man5/acl.5.html)
5. [capabilities(7) — Linux manual page](https://man7.org/linux/man-pages/man7/capabilities.7.html)
