Перейти к содержимому

Права на файлы: chmod и chown

Что значат rwx и цифры 644, 755, 600, как поменять права и владельца, как разложить права на файлы сайта и чем опасен chmod 777.

Содержание

У каждого файла в Linux есть владелец, группа и три набора прав: для владельца, для группы и для всех остальных. Посмотреть их — ls -l:

$ ls -l
-rw-r--r-- 1 ubuntu www-data 1520 Oct 12 10:15 index.php
drwxr-xr-x 3 ubuntu www-data 4096 Oct 12 10:15 uploads

Первый знак — тип: - файл, d папка, l ссылка. Дальше три тройки букв: права владельца (ubuntu), группы (www-data) и всех остальных.

БукваУ файлаУ папки
rчитатьвидеть список файлов
wизменятьсоздавать, удалять и переименовывать файлы внутри
xзапускатьвходить в папку и открывать файлы в ней

Обратите внимание на x у папки: без него не открыть ни один файл внутри, даже если у самого файла права есть.

Цифры: 644, 755, 600

Каждой букве соответствует число: r = 4, w = 2, x = 1. Их сумма — права одной тройки: 7 = rwx, 6 = rw-, 5 = r-x, 4 = r--, 0 = ---. Три цифры подряд — владелец, группа, остальные.

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

chmod: поменять права

chmod 644 index.php
chmod 755 deploy.sh
chmod 600 ~/.ssh/id_ed25519

Буквами удобнее, когда нужно добавить или убрать одно право, не трогая остальные. u — владелец, g — группа, o — остальные, a — все:

chmod +x deploy.sh        # разрешить запуск
chmod g+w uploads         # группе — запись
chmod o-rwx config.php    # остальным — ничего

Ключ -R меняет права у папки со всем содержимым. Но chmod -R 755 сделает исполняемыми и все файлы, а папкам и файлам нужны разные права. Разведите их так:

find /var/www/example.ru -type d -exec chmod 755 {} +
find /var/www/example.ru -type f -exec chmod 644 {} +

Или одной командой: chmod -R u=rwX,go=rX /var/www/example.ru. Большая X даёт запуск только папкам и тем файлам, которые уже были исполняемыми.

chown: сменить владельца

Отдать файл другому пользователю может только администратор, поэтому — через sudo:

sudo chown ubuntu index.php                  # владелец
sudo chown ubuntu:www-data index.php         # владелец и группа
sudo chown -R www-data:www-data uploads      # папка со всем содержимым

Права на файлы сайта

Веб-сервер и PHP работают от своего пользователя: в Ubuntu и Debian это www-data, в AlmaLinux у nginx — nginx, у PHP-FPM — apache. Проверить у себя: ps -eo user,comm | grep -E 'nginx|php|apache|httpd'.

Надёжная схема — файлы сайта принадлежат вам, а не веб-серверу. Тогда PHP может их только читать, а писать — лишь в папки, куда сайт складывает загрузки и кэш:

sudo chown -R ubuntu:ubuntu /var/www/example.ru
find /var/www/example.ru -type d -exec chmod 755 {} +
find /var/www/example.ru -type f -exec chmod 644 {} +
sudo chown -R www-data:www-data /var/www/example.ru/wp-content/uploads

Если сайт взломают через уязвимость, злоумышленник получит права PHP — и не сможет переписать код сайта. Цена — обновлять движок придётся по SSH, а не кнопкой в админке: для обновлений из админки PHP нужна запись во все файлы.

Почему не 777

Права 777 разрешают изменять файл кому угодно на сервере — любой программе, от любого пользователя. Обычно их ставят, когда «ничего не работает, а с 777 заработало». Но на деле у файла просто не тот владелец, и правильное лечение — chown, а не 777.

Бывает и наоборот: часть программ отказывается работать со слишком открытыми файлами. Например, SSH не примет ключ, если папка ~/.ssh или файл authorized_keys доступны на запись другим, — в журнале будет bad ownership or modes. Правильные права: chmod 700 ~/.ssh и chmod 600 ~/.ssh/authorized_keys.

Permission denied, хотя права верные

  • Нет x на одной из папок по пути. namei -l /var/www/example.ru/index.php покажет права на каждом шаге — от корня до файла.
  • AlmaLinux: мешает SELinux — у файла не та метка. Как исправить — в справочнике AlmaLinux.
  • Скрипт не запускается с ошибкой bad interpreter и ^M в конце — файл сохранён в Windows: Файлы из Windows: окончания строк.

Права на хостинге с cPanel — в отдельной статье: Права на файлы и папки, CGI-скрипты.

Не нашли ответ? Напишите в поддержку — подскажем.