Лаборатория кодера

Справочник · Терминал и система

Права файлов в Linux: chmod, chown, umask

Как читать строку rwxr-xr-x, переводить права в цифры, менять владельца и почему каталогу нужен бит x. Плюс setuid, sticky bit и типичные ошибки.

Обновлено · 6 мин чтения

У каждого файла в Linux есть владелец, группа и три набора прав: для владельца, для группы и для всех остальных. Почти все проблемы вида «Permission denied» решаются, если понимать, как читается эта схема.

Как читать вывод ls -l

text
-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---4r--
1--x5r-x
2-w-6rw-
3-wx7rwx

Самые частые сочетания:

ПраваСтрокаГде применяется
644rw-r--r--обычные файлы: код, конфиги, страницы сайта
600rw-------секреты: закрытые SSH-ключи, .env, файлы с паролями
755rwxr-xr-xкаталоги и исполняемые скрипты
700rwx------личный каталог, например ~/.ssh
750rwxr-x---каталог, который должна читать группа сервиса
640rw-r-----конфиг с секретом, который читает сервис из группы
777rwxrwxrwxпочти никогда: писать может любой пользователь системы

chmod: меняем права

bash
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:

bash
find site/ -type d -exec chmod 755 {} +
find site/ -type f -exec chmod 644 {} +

chown и chgrp: меняем владельца

bash
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Новый файлНовый каталогКогда
022644755обычная настройка большинства систем
002664775общая работа в группе
077600700максимально закрыто, только владелец
bash
umask           # показать текущее значение
umask 077       # для текущей оболочки

Чтобы настройка сохранилась, её прописывают в ~/.bashrc или, для служб systemd, в параметре UMask= юнита.

Специальные биты

БитЦифраКак выглядитЧто делает
setuid4000rwsr-xr-xпрограмма выполняется с правами владельца файла
setgid2000rwxr-sr-xна каталоге: новые файлы получают группу каталога
sticky1000rwxrwxrwtв каталоге удалить файл может только его владелец

Примеры из жизни: /usr/bin/passwd имеет setuid, чтобы обычный пользователь мог сменить свой пароль в файле, доступном только root. У /tmp стоит sticky bit: писать туда могут все, но удалять чужие файлы нельзя.

setgid на общем каталоге проекта удобен для командной работы:

bash
sudo chgrp devs /srv/project
sudo chmod 2775 /srv/project   # rwxrwsr-x

Теперь все новые файлы внутри будут принадлежать группе devs, а не основной группе создателя.

Частые ошибки и как их разобрать

  • SSH не принимает ключ. Клиент и сервер проверяют права: ~/.ssh должен быть 700, закрытый ключ 600, authorized_keys 600, а домашний каталог не должен быть доступен на запись группе и остальным. Подробнее в статье про 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, когда трёх наборов мало

Если доступ нужен конкретному пользователю, а менять группу нельзя, помогают списки доступа:

bash
setfacl -m u:alice:rX report/      # дать alice чтение
getfacl report/                    # посмотреть все записи
setfacl -x u:alice report/         # убрать запись

Наличие ACL видно по знаку + в конце строки прав: drwxr-x---+.