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

Часто, как только в скриптах php-сайта обнаруживается уязвимость, злоумышленники пытаются модифицировать коды сайта для своих целей. Чаще всего заливают удаленный интерфейс управления, типа файлового менеджера с возможностью читать базы данных и вводить произвольные команды, или модифицируют страницы сайта чтобы отдавать посетителям вредоносный код. Иногда такие модификации сложно обнаружить и они существуют на сайте долгое время нанося ущерб. Для того, чтобы этому помешать сделана система упрвления правами файлов.

Ежедневно после резервного копирования запускается скрипт, который модифицирует права доступа к файлам. Он устанавливает на все файлы сайтов права по умолчанию: разрешает чтение и запрещает запись для php и web-сервера. Также он читает секции *_directories файла INFO каждого сайта, и делает следующее:

  1. Для директорий в writable_directories, development_directories и cache_directories разрешает права на запись для php и web-сервера.
  2. Для директорий в writable_directories в конфигурации nginx запрещает выполнение php-кода.
  3. Для директорий в disabled_directories и cache_directories в конфигурации nginx запрещает http-доступ.

В disabled_directories надо заносить директории, которые не должны быть доступны пользователям сайта по HTTP. Это могут быть директории с include-файлами, например.

В writable_directories надо занести все директории, куда посетители загружают файлы или куда сервер сохраняет промежуточные файлы. Это обычно директории с названиями типа uploads. Даже если пользователь загрузит на сайт вредоносный код, он не сможет его запустить. Все содержимое таких директорий будет доступно по сети, включая php-файлы.

В cache_directories надо занести все директории, куда пользователи могут загружать файлы а php имеет права на запись, но которые не должны быть доступны пользователям по HTTP.

В development_directories заносить директории следует только временно. Это может потребоваться, например, когда какой-нибудь стороний скрипт устанавливается с помощью сложного инсталлятора. Можно позволить ему это сделать внеся директорию в development_directories, и убрав ее оттуда после инсталляции.

Для того, чтобы изменения вступили в силу немедленно можно запустить через ssh команду sudo /root/bin/update_permissions all (для всех сайтов на площадке) или sudo /root/bin/update_permissions site.ru для одного сайта site.ru. Скрипт может работать несколько минут, особенно если запускается для нескольких больших сайтов. В время работы скрипта сайты должны продолжнать работать, но может на несколько секунд отсутствовать доступ на запись и доступ для разработчиков, так что лучше запускать его когда на сайтах мало посетителей.

Директории с кодом и данными можно размещать не в директории www, а на уровень выше, в директории сайта (обычно называется /home/username/sitename; в ней находятся директории log, www, и сам файл INFO). В отличии от директории www туда отсутствует HTTP-доступ. Права на файлы и директории в ней устанавливаются так же, как и в директории www. Указывайте директории в файле INFO в виде ../directory. Эти директории (за исключением директорий log и tmp) будут бакапироваться так же, как и файлы в директории www.