Почти каждый, кто сталкивался с ошибкой «Не удалось создать каталог» при обновлении плагина, находил в интернете совет «поставьте права 777 на всё». Ошибка исчезает, обновление проходит, и человек забывает об этом. А через несколько месяцев на сайте появляется вредоносный код, причём злоумышленнику даже не пришлось взламывать админку: ему хватило того, что любой процесс на сервере мог записывать в любой файл сайта. Права доступа — одна из тех тем, которые кажутся сугубо техническими, но напрямую влияют на безопасность. Разберёмся, как они устроены и какие значения правильные.
Как устроены права в Linux
Подавляющее большинство сайтов работает на серверах под управлением Linux. Здесь у каждого файла и каталога есть владелец, группа и набор разрешений для трёх категорий: владельца, участников группы и всех остальных. Для каждой категории определены три действия:
- чтение — для файла это возможность увидеть содержимое, для каталога — получить список файлов в нём;
- запись — изменение файла или создание и удаление файлов в каталоге;
- выполнение — запуск файла как программы, а для каталога — возможность в него войти.
В числовой записи каждое действие имеет вес: чтение — 4, запись — 2, выполнение — 1. Сумма весов даёт цифру для категории, а три цифры подряд — полную запись прав. Так, 6 означает чтение и запись, 5 — чтение и выполнение, 7 — всё сразу. Запись 644 расшифровывается так: владелец читает и пишет, группа и все остальные только читают.
Какие права нужны файлам сайта
Для типичного сайта на PHP, в том числе на WordPress, базовая схема выглядит так:
| Объект | Рекомендуемые права | Смысл |
|---|---|---|
| Обычные файлы (PHP, CSS, JS, изображения) | 644 | Владелец может изменять, веб-сервер — читать |
| Каталоги | 755 | Владелец может создавать файлы, остальные — входить и читать список |
| Файл конфигурации с паролем от базы данных | 600 или 640 | Читать может только владелец или владелец и группа веб-сервера |
| Каталог загрузок | 755, владелец — пользователь, от имени которого работает PHP | CMS может сохранять загруженные изображения |
| Файлы конфигурации веб-сервера в каталоге сайта | 644 | Веб-сервер читает, изменения — только владельцем |
Эти значения — отправная точка, а не догма. Точная настройка зависит от того, от имени какого пользователя работают веб-сервер и PHP на конкретном хостинге. Именно здесь возникает больше всего путаницы.
Владелец важнее цифр
Права 644 означают, что писать в файл может только владелец. Но кто этот владелец? На хорошо настроенном виртуальном хостинге PHP работает от имени вашего пользователя, и тогда всё просто: файлы принадлежат вам, CMS может их обновлять, соседи по серверу доступа не имеют. На VPS, который настраивали вручную, бывает иначе: файлы загружены по SFTP от имени одного пользователя, а PHP работает от имени другого. В итоге CMS не может обновиться, и возникает соблазн «решить» проблему правами 777.
Правильное решение — не расширять права, а привести в порядок владельцев. Есть два распространённых подхода:
- PHP работает от имени владельца сайта. Для каждого сайта на сервере создаётся отдельный пользователь, и процессы PHP запускаются от его имени. Это удобно: обновления работают из админки, а сайты изолированы друг от друга.
- Строгое разделение. Файлы принадлежат одному пользователю, PHP работает от другого и имеет право записи только в каталог загрузок и кеша. Обновления выполняются не из админки, а через командную строку или систему развёртывания. Это безопаснее: даже если злоумышленник найдёт уязвимость в плагине, он не сможет изменить код сайта.
Для большинства небольших сайтов компаний мы рекомендуем первый вариант с изоляцией каждого сайта под отдельным пользователем. Второй подход хорош для проектов, где обновления выполняет разработчик по регламенту и никто не устанавливает плагины из админки.
Особые случаи: кеш, логи и временные файлы
Некоторым каталогам действительно нужна запись со стороны CMS: кеш страниц, миниатюры изображений, журналы ошибок, временные файлы при импорте товаров. Это нормально, но доступ на запись стоит давать именно этим каталогам, а не всему сайту. Хорошая практика — сразу после установки плагина кеширования или импорта проверить, какие папки он создал и с какими правами. Некоторые расширения при установке выставляют избыточные права «для надёжности», и их приходится исправлять вручную. Если каталог нужен только для записи и чтения служебных данных, в нём тоже стоит запретить выполнение скриптов.
Почему 777 — это плохо
Права 777 означают, что любой пользователь системы может читать, изменять и выполнять файл. На виртуальном хостинге, где на одном сервере размещаются сотни сайтов, это может означать, что взломанный сайт соседа способен записать код в ваш. Даже на выделенном сервере любой процесс, включая заражённый скрипт, получает возможность модифицировать все файлы сайта. Многие хостинги вообще запрещают исполнение PHP-файлов с такими правами и выдают ошибку — и это правильно.
Если вы видите на своём сайте каталоги или файлы с правами 777, это повод для проверки. Нередко именно через такие каталоги — кеш, загрузки, временные папки — злоумышленники размещают бэкдоры.
Дополнительные меры защиты
Права доступа — только часть картины. Несколько смежных настроек заметно усиливают защиту:
- Запретите выполнение PHP в каталоге загрузок средствами веб-сервера. Там должны лежать изображения и документы, и любой PHP-скрипт в этой папке — почти наверняка вредонос.
- Закройте прямой доступ из браузера к служебным файлам: конфигурации, журналам, резервным копиям, файлам системы контроля версий.
- Не храните резервные копии и дампы базы данных в публичном каталоге сайта: их могут скачать.
- Отключите в CMS встроенный редактор файлов, чтобы изменения кода нельзя было внести из панели администратора.
- Используйте SFTP или SSH вместо обычного FTP, который передаёт пароль открытым текстом.
Как проверить права на своём сайте
Если у вас есть доступ по SSH, специалист проверит права всех файлов за пару минут одной командой поиска с фильтром по правам. В панели хостинга права можно увидеть в файловом менеджере — обычно они отображаются в отдельной колонке. Обратите внимание на файлы с правами записи для группы или всех, на каталоги с правами 777, на конфигурационный файл CMS и на необычных владельцев отдельных файлов.
Будьте осторожны с массовым изменением прав. Неаккуратная команда, применённая ко всем файлам рекурсивно, может сломать работу сайта: например, если выставить каталогам права 644, веб-сервер не сможет в них войти, и сайт перестанет открываться. Перед любыми массовыми изменениями сделайте резервную копию.
Типичные ошибки, которые мы встречаем
Принимая сайты на обслуживание, мы раз за разом видим одни и те же проблемы: весь сайт с правами 777 «чтобы работали обновления», файл конфигурации, доступный на чтение всем пользователям сервера, архив с полной копией сайта прямо в корне, доступный для скачивания по прямой ссылке, и каталог загрузок, в котором спокойно выполняются PHP-скрипты. Каждая из этих ошибок по отдельности может стать причиной взлома.
Вывод
Правильные права доступа — недорогая, но очень эффективная мера защиты. Обычным файлам достаточно 644, каталогам — 755, файлу конфигурации — ещё более строгих значений. Важнее самих цифр — правильные владельцы файлов и изоляция сайтов друг от друга. Никогда не решайте проблемы с обновлениями правами 777, запретите выполнение скриптов в каталоге загрузок и не храните копии в публичной папке. Если вы не уверены, как настроен ваш сервер, наши специалисты проведут аудит и настройку в рамках администрирования, а при переезде на новый хостинг всё будет выставлено правильно сразу — подробнее в разделе о переносе сайтов.