Права доступа в Linux: chmod, chown и Permission denied

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

9 октября 2026 г.·4 мин чтения·chmod, chown, permissions, linux

Сайт не может сохранить загруженную картинку, скрипт не запускается, программа не читает свой конфиг — и всё это с одной подписью: 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 для папки с ботом.