Справочник · Терминал и система
Права файлов в Linux: chmod, chown, umask
Как читать строку rwxr-xr-x, переводить права в цифры, менять владельца и почему каталогу нужен бит x. Плюс setuid, sticky bit и типичные ошибки.
У каждого файла в Linux есть владелец, группа и три набора прав: для владельца, для группы и для всех остальных. Почти все проблемы вида «Permission denied» решаются, если понимать, как читается эта схема.
Как читать вывод ls -l
-rwxr-x--- 1 deploy www-data 4096 окт 2 10:15 run.sh
│└┬┘└┬┘└┬┘ └─┬──┘ └──┬───┘
│ │ │ │ │ └ группа
│ │ │ │ └ владелец
│ │ │ └ остальные: --- ничего
│ │ └ группа: r-x чтение и выполнение
│ └ владелец: rwx всё
└ тип: - файл, d каталог, l ссылка| Буква | Для файла | Для каталога |
|---|---|---|
r | читать содержимое | видеть список имён внутри |
w | менять содержимое | создавать, удалять и переименовывать файлы внутри |
x | запускать как программу | входить в каталог и обращаться к файлам по имени |
Важная деталь: удалить файл можно, если есть право w на каталог, в котором он лежит. Права на сам файл при этом не важны.
Цифровая запись
Каждый набор прав кодируется одной восьмеричной цифрой: r = 4, w = 2, x = 1, значения складываются.
| Цифра | Права | Цифра | Права |
|---|---|---|---|
| 0 | --- | 4 | r-- |
| 1 | --x | 5 | r-x |
| 2 | -w- | 6 | rw- |
| 3 | -wx | 7 | rwx |
Самые частые сочетания:
| Права | Строка | Где применяется |
|---|---|---|
644 | rw-r--r-- | обычные файлы: код, конфиги, страницы сайта |
600 | rw------- | секреты: закрытые SSH-ключи, .env, файлы с паролями |
755 | rwxr-xr-x | каталоги и исполняемые скрипты |
700 | rwx------ | личный каталог, например ~/.ssh |
750 | rwxr-x--- | каталог, который должна читать группа сервиса |
640 | rw-r----- | конфиг с секретом, который читает сервис из группы |
777 | rwxrwxrwx | почти никогда: писать может любой пользователь системы |
chmod: меняем права
chmod 644 index.html # цифрами
chmod 600 ~/.ssh/id_ed25519
chmod +x deploy.sh # добавить выполнение всем
chmod u+x,g-w file # владельцу добавить x, группе убрать w
chmod o= secret.txt # остальным не оставить ничего
chmod -R g+rX shared/ # рекурсивно: группе чтение, и x только каталогамБуквенная запись: u владелец, g группа, o остальные, a все; + добавить, - убрать, = задать точно.
Разные права для файлов и каталогов в одном дереве удобнее всего ставить через find:
find site/ -type d -exec chmod 755 {} +
find site/ -type f -exec chmod 644 {} +chown и chgrp: меняем владельца
sudo chown deploy file # сменить владельца
sudo chown deploy:www-data file # владельца и группу
sudo chown :www-data file # только группу
sudo chown -R deploy:deploy /srv/app
sudo chgrp www-data file # то же, что chown :www-dataМенять владельца может только root. Обычный пользователь может сменить группу своего файла, но только на ту, в которой состоит сам.
Группы пользователя показывает id или groups. Добавить пользователя в группу: sudo usermod -aG docker alice. Ключ -a важен: без него пользователь будет удалён из остальных дополнительных групп. Новая группа начинает действовать после повторного входа в систему.
umask: права новых файлов
Когда программа создаёт файл, она обычно запрашивает права 666 для файлов и 777 для каталогов. Из них вычитаются биты, указанные в umask.
| umask | Новый файл | Новый каталог | Когда |
|---|---|---|---|
022 | 644 | 755 | обычная настройка большинства систем |
002 | 664 | 775 | общая работа в группе |
077 | 600 | 700 | максимально закрыто, только владелец |
umask # показать текущее значение
umask 077 # для текущей оболочкиЧтобы настройка сохранилась, её прописывают в ~/.bashrc или, для служб systemd, в параметре UMask= юнита.
Специальные биты
| Бит | Цифра | Как выглядит | Что делает |
|---|---|---|---|
| setuid | 4000 | rwsr-xr-x | программа выполняется с правами владельца файла |
| setgid | 2000 | rwxr-sr-x | на каталоге: новые файлы получают группу каталога |
| sticky | 1000 | rwxrwxrwt | в каталоге удалить файл может только его владелец |
Примеры из жизни: /usr/bin/passwd имеет setuid, чтобы обычный пользователь мог сменить свой пароль в файле, доступном только root. У /tmp стоит sticky bit: писать туда могут все, но удалять чужие файлы нельзя.
setgid на общем каталоге проекта удобен для командной работы:
sudo chgrp devs /srv/project
sudo chmod 2775 /srv/project # rwxrwsr-xТеперь все новые файлы внутри будут принадлежать группе devs, а не основной группе создателя.
Частые ошибки и как их разобрать
- SSH не принимает ключ. Клиент и сервер проверяют права:
~/.sshдолжен быть700, закрытый ключ600,authorized_keys600, а домашний каталог не должен быть доступен на запись группе и остальным. Подробнее в статье про SSH-ключи. - Скрипт пишет «Permission denied». Нет бита
x:chmod +x script.sh. Либо файловая система смонтирована сnoexec, тогда запускайте черезbash script.sh. - Веб-сервер отдаёт 403. Процессу сервера нужен
xна каждом каталоге пути до файла иrна сам файл. Проверить весь путь сразу можно командойnamei -l /var/www/site/index.html. - Всё сделали 777, и стало работать. Это не решение: найдите, от какого пользователя работает процесс (
ps -o user= -p PID), и дайте права именно ему через владельца или группу.
ACL, когда трёх наборов мало
Если доступ нужен конкретному пользователю, а менять группу нельзя, помогают списки доступа:
setfacl -m u:alice:rX report/ # дать alice чтение
getfacl report/ # посмотреть все записи
setfacl -x u:alice report/ # убрать записьНаличие ACL видно по знаку + в конце строки прав: drwxr-x---+.