Application: UNIX Posix User Permisions.
Имеем в виду то, что web-ресурсы будут располагаться на отдельном разделе, монтируемом в точке "/var/www". Основной смысл такого подхода в том, чтобы смонтировать хранилище ресурсов с использование произвольной файловой системы со специальными опциями, если это будет необходимо, и иметь возможность прикрепления хранилища к другим ресурсам.
Инсталлируем пакет утилит поддержки XFS (давно уже я неравнодушен к этой файловой системе и успешно применяю в хранилищах самого разного уровня):
# aptitude install xfsprogs
Привожу пример форматирования выделенного под сайты раздела (не в качестве руководства к действию, а как материал для размышлений в заданном направлении):
# mkfs.xfs -b size=4096 -d agcount=256 -l size=128m /dev/vg0/lvwww
Как-то так можно смонтировать наше хранилище сайтов:
# mount -t xfs -o rw,noatime /dev/vg0/lvwww /var/www
В "fstab" монтирование будет выглядеть примерно таким образом:
# Device Mountpoint FStype Options Dump Pass#
/dev/vg0/lvwww /var/www xfs rw,noatime 0 2
/dev/vg0/lvwww /var/www xfs rw,noatime 0 2
Опцию "noatime" устанавливаем для того, чтобы не записывать время последнего доступа к файлам, что может дать некоторый выигрыш в производительности.
Теперь очень важный этап создания структуры хранения данных виртуальных площадок сайтов с назначением соответствующих прав доступа. Рекомендую не двигаться далее до полного понимания изложенного.
Предположим, мы создаем два виртуальных ресурса со своими индивидуальными владельцами. Имеем в виду то, что файлы каждого ресурса принадлежат только владельцу и его группе. Владелец ресурса может писать в файлы, а вот у группы мы такое право заберем. Для того, чтобы web-сервер смог обратится к ресурсам, вводим пользователя, от которого он запущен (в нашем случае это "www-data") в группу каждого из владельцев ресурса не удаляя его из своей ("www-data"):
# groupadd ug1000
# useradd --password user.password --shell /bin/false --home-dir /var/www/u1000 --gid ug1000 u1000
# usermod --append --groups ug1000 www-data
# groupadd ug1001
# useradd --password user.password --shell /bin/false --home-dir /var/www/u1001 --gid ug1001 u1001
# usermod --append --groups ug1001 www-data
# useradd --password user.password --shell /bin/false --home-dir /var/www/u1000 --gid ug1000 u1000
# usermod --append --groups ug1000 www-data
# groupadd ug1001
# useradd --password user.password --shell /bin/false --home-dir /var/www/u1001 --gid ug1001 u1001
# usermod --append --groups ug1001 www-data
Определимся с принципами построения хранилища ресурсов пользователей и защиты файловой системы пользователей от несанкционированного проникновения, чтения и модификации. Создадим файловую структуру следующего вида:
point child (-R)
/var/www: root:rw,root:r
- /u1000: root:rw,ug1000:r
- /tmp: u1000:rw,ug1000:r
- /log: root:rw,ug1000:r
- /home: u1000:rw,ug1000:r
- /www: u1000:rw,ug1000:r
- /u1001: u1001:r,ug1001:r
- /tmp: u1001:rw,ug1001:r
- /log: root:rw,ug1001:r
- /home: u1001:rw,ug1001:r
- /www: u1001:rw,ug1001:r
- /php: root:rw,root:r
- /u1000 root:rw,ug1000:r
- /u1001 root:rw,ug1001:r
/var/www: root:rw,root:r
- /u1000: root:rw,ug1000:r
- /tmp: u1000:rw,ug1000:r
- /log: root:rw,ug1000:r
- /home: u1000:rw,ug1000:r
- /www: u1000:rw,ug1000:r
- /u1001: u1001:r,ug1001:r
- /tmp: u1001:rw,ug1001:r
- /log: root:rw,ug1001:r
- /home: u1001:rw,ug1001:r
- /www: u1001:rw,ug1001:r
- /php: root:rw,root:r
- /u1000 root:rw,ug1000:r
- /u1001 root:rw,ug1001:r
В схеме, приведённой выше, колонка "point" означает права доступа, назначаемые только этому объекту файловой системы, без наследования потомками (применяется для закрепления структуры), а колонка "child" - с наследованием потомками объекта.
Создаем (если она ещё не была создана ранее) корневую директорию для web-ресурсов. Важное условие назначения прав в том, чтобы никто, кроме суперпользователя не мог получить перечень объектов внутри корневой директории web-ресурсов:
# mkdir -p /var/www
# chown root:root /var/www
# chmod go-rw /var/www
# chown root:root /var/www
# chmod go-rw /var/www
Лишаем возможности чтения и записи к ресурсам кого либо, кроме владельца и его группы. В хранилище ресурсов будем оперировать понятиями владельца и группы, никаких других разрешений не допускаем:
# chmod -R o-rw /var/www
Лишаем возможности записи в файлы ресурсов для групп владельцев, это можно будет делать только самим владельцам ресурсов и скриптам, которые будут запущены от имени владельцев ресурсов:
# chmod -R g-w /var/www
Теперь создадим директории ресурсов и определим им соответствующие разрешения:
# mkdir -p /var/www/u1000/www # создаем директорию непосредственно web-ресурса
# mkdir -p /var/www/u1000/tmp # создаем директорию временных файлов
# mkdir -p /var/www/u1000/log # создаем директорию журнальных файлов
# mkdir -p /var/www/u1000/home # создаем директорию пользовательских файлов
# chown root:ug1000 /var/www/u1000 # задаем владельца структуры корневой директории web-ресурса
# chmod -R o-rw /var/www/u1000 # запрещаем доступ всем посторонним
# chmod -R g+w /var/www/u1000/tmp
# chown -R u1000:ug1000 /var/www/u1000/www # задаем владельца и группу web-ресурса
# chown -R u1000:ug1000 /var/www/u1000/tmp # задаем владельца и группу директории временных файлов и сессий
# chown -R root:ug1000 /var/www/u1000/log # задаем владельца и группу директории журнальных файлов
# chown -R u1000:ug1000 /var/www/u1000/home # задаем владельца и группу директории пользовательских файлов
# mkdir -p /var/www/u1001/www
# mkdir -p /var/www/u1001/tmp
# mkdir -p /var/www/u1001/log
# mkdir -p /var/www/u1001/home
# chown root:ug1001 /var/www/u1001
# chmod -R o-rw /var/www/u1001
# chmod -R g+w /var/www/u1001/tmp
# chown -R u1001:ug1001 /var/www/u1001/www
# chown -R u1001:ug1001 /var/www/u1001/tmp
# chown -R root:ug1001 /var/www/u1001/log
# chown -R u1001:ug1001 /var/www/u1001/home
# mkdir -p /var/www/u1000/tmp # создаем директорию временных файлов
# mkdir -p /var/www/u1000/log # создаем директорию журнальных файлов
# mkdir -p /var/www/u1000/home # создаем директорию пользовательских файлов
# chown root:ug1000 /var/www/u1000 # задаем владельца структуры корневой директории web-ресурса
# chmod -R o-rw /var/www/u1000 # запрещаем доступ всем посторонним
# chmod -R g+w /var/www/u1000/tmp
# chown -R u1000:ug1000 /var/www/u1000/www # задаем владельца и группу web-ресурса
# chown -R u1000:ug1000 /var/www/u1000/tmp # задаем владельца и группу директории временных файлов и сессий
# chown -R root:ug1000 /var/www/u1000/log # задаем владельца и группу директории журнальных файлов
# chown -R u1000:ug1000 /var/www/u1000/home # задаем владельца и группу директории пользовательских файлов
# mkdir -p /var/www/u1001/www
# mkdir -p /var/www/u1001/tmp
# mkdir -p /var/www/u1001/log
# mkdir -p /var/www/u1001/home
# chown root:ug1001 /var/www/u1001
# chmod -R o-rw /var/www/u1001
# chmod -R g+w /var/www/u1001/tmp
# chown -R u1001:ug1001 /var/www/u1001/www
# chown -R u1001:ug1001 /var/www/u1001/tmp
# chown -R root:ug1001 /var/www/u1001/log
# chown -R u1001:ug1001 /var/www/u1001/home
Создадим служебные директории для ресурсов, недоступные для записи владельцам ресурса (возможность чтения оставляем для обеспечения функциональности загрузки конфигурационных файлов как сервером Apache, так и PHP-интерпретатором, заускаемым с правами пользователя площадки):
# mkdir -p /var/www/php
# chown root:root /var/www/php
# chmod o-rw /var/www/php
# chmod g-w /var/www/php
# chown root:root /var/www/php
# chmod o-rw /var/www/php
# chmod g-w /var/www/php
Создадим внутри служебной структуры директории, в которых будут располагаться индивидуальные конфигурации интерпретатора пользовательских ресурсов:
# mkdir -p /var/www/php/u1000
# mkdir -p /var/www/php/u1001
# chown -R root:ug1001 /var/www/php/u1001
# chown -R root:ug1002 /var/www/php/u1001
# chmod -R g-r /var/www/php/u1001
# chmod -R g-r /var/www/php/u1002
# mkdir -p /var/www/php/u1001
# chown -R root:ug1001 /var/www/php/u1001
# chown -R root:ug1002 /var/www/php/u1001
# chmod -R g-r /var/www/php/u1001
# chmod -R g-r /var/www/php/u1002
На будущее, если возникнет желание вынести на уровень выделенных площадок полный контроль над загружаемыми PHP-интерпретатором конфигурационными файлами, можно в дополнение создавать директории динамически подключаемых конфигурационных файлов, всё содержимое которых будет присоединятся к конфигурации из файла основного "php.ini":
# mkdir -p /var/www/php/u1000/conf.d
# mkdir -p /var/www/php/u1001/conf.d
# mkdir -p /var/www/php/u1001/conf.d
Не забываем закрыть эти директории от неправомерного доступа аналогично родительской.