Права доступа в Linux: chmod, chown и Permission denied
Как Linux проверяет права, как читать вывод ls -l, менять права через chmod и владельца через chown, выставить правильные права сайту и почему 777 — плохая идея. Ubuntu, Debian, AlmaLinux.

Сайт не может сохранить загруженную картинку, скрипт не запускается, программа не читает свой конфиг — и всё это с одной подписью: Permission denied. Почти всегда дело в правах. Чтобы чинить такое за минуту, а не ставить всему подряд 777, нужно понимать, как система решает, кому что можно.
Если сервера ещё нет, VPS на tanaka.host создаётся за минуту с Ubuntu или Debian, а списание идёт по дням — удобно, чтобы просто попробовать.
Как Linux проверяет права
У каждого файла и папки есть владелец и группа. Когда программа обращается к файлу, система смотрит, от чьего имени она работает, и относит её ровно к одной категории: владелец, участник группы файла или «остальные». Проверка идёт строго в этом порядке и останавливается на первом совпадении — владелец с урезанными правами не получит больше оттого, что группе разрешено больше.
Для каждой категории три права: r читать, w писать, x выполнять. Для файла всё очевидно: x нужен скриптам и бинарникам, картинке он ни к чему. Для папки те же буквы значат другое, и здесь чаще всего ошибаются:
| Право | Файл | Папка |
|---|---|---|
r |
читать содержимое | получить список имён файлов |
w |
изменять | создавать и удалять файлы внутри |
x |
запускать | войти в папку и обращаться к файлам внутри |
Без x на папке не поможет даже полное право на сам файл: при открытии uploads/photo.jpg система остановится ещё на uploads.
Права записывают цифрами: r=4, w=2, x=1, сумма даёт права одной категории. Три цифры — владелец, группа, остальные.
| Запись | Смысл | Где используют |
|---|---|---|
644 |
владелец читает и пишет, остальные читают | файлы сайта |
755 |
владельцу всё, остальным чтение и вход | папки, скрипты |
600 |
только владелец | .env, ключи, пароли |
750 |
владельцу всё, группе чтение и вход, остальным ничего | закрытые папки |
Единственное исключение — root: он проверку не проходит вовсе. Поэтому под root «всё работает», а та же программа под www-data натыкается на запрет. Если что-то работает в вашем терминале, но не у сайта — первым делом узнайте, от чьего имени работает сайт.
1. Посмотрите права
ls -la
Разберём строку -rw-r--r-- 1 root root 12 Oct 21 11:55 index.html:
- первый символ — тип:
-файл,dпапка,lсимволическая ссылка; rw-— права владельца;r--— права группы;r--— права остальных;root root— владелец и группа.
Если удобнее цифрами:
stat -c "%a %U:%G %n" *
2. Измените права: chmod
Цифры удобны, когда вы знаете итоговые права целиком, буквы — когда нужно добавить или убрать одно право, не трогая остальные.
# Разрешить запуск скрипта
chmod +x backup.sh
# Файл с паролями доступен только владельцу
chmod 600 .env
# Папка, в которую может войти только владелец и группа
chmod 750 uploads
В буквенной записи u — владелец, g — группа, o — остальные, a — все. + добавляет, - убирает, = задаёт точно.
# Убрать у остальных право на чтение
chmod o-r файл
# То же, что 750
chmod u=rwx,g=rx,o= uploads
-R применяет права рекурсивно ко всему содержимому. Осторожно: он ставит одинаковые права и папкам, и файлам, а им обычно нужны разные.
3. Смените владельца: chown
Через двоеточие — пользователь, затем группа; -R для всего содержимого.
chown -R www-data:www-data /var/www/site
www-data — пользователь, под которым на Ubuntu и Debian работают Nginx и Apache. На AlmaLinux и Rocky это nginx или apache. Если сайт должен сам сохранять файлы, например в uploads, эта папка должна принадлежать ему. Менять владельца может только root — обычному пользователю вернётся Operation not permitted.
4. Правильные права для сайта
Рабочее правило: папкам 755, файлам 644, владелец — пользователь веб-сервера. Две команды find делают это раздельно для папок и файлов:
find /var/www/site -type d -exec chmod 755 {} +
find /var/www/site -type f -exec chmod 644 {} +
Верните права исключениям. После массовой смены
.envс паролем станет читаемым для всех, аbackup.shперестанет запускаться. Сразу послеfindвыполнитеchmod 600 .envиchmod +x backup.shдля всего, что того требует.
Почему не 777
777 разрешает всем пользователям сервера читать, менять и запускать файл. Ошибка Permission denied пропадает, поэтому совет популярен. Но вместе с ошибкой пропадает и защита: взлом любого другого сайта или программы на сервере даёт доступ к вашим файлам, и в страницы можно вписать что угодно. Правильный путь — выяснить, от чьего имени работает программа, и сделать её владельцем нужной папки через chown.
Частые ошибки
Permission denied при запуске скрипта. Нет права x: chmod +x script.sh, запускать как ./script.sh. Или запустить через интерпретатор — bash script.sh — тогда x не нужен.
Права у файла правильные, а ошибка остаётся. Проверьте все папки на пути: каждой нужен x для того пользователя, под которым работает программа. namei -l /полный/путь/к/файлу покажет права каждого уровня.
chown: changing ownership: Operation not permitted. Только root меняет владельца. Выполните через sudo.
Какие права у новых файлов. Их задаёт umask. Обычно 0022, то есть файлы получают 644, папки 755. Посмотреть — командой umask.
Дальше: пользователи в Linux, службы systemd — там пригодится chown для папки с ботом.