UMGUM.COM 

Файловая структура ( Формируем файловую структуру хранения ресурсов виртуальных площадок сайтов. )

26 марта 2010  (обновлено 15 августа 2016)

Эта публикация отнесена в архив. Она неактуальна.
Ресурс по следующей ссылке является преемником: Web сервис на базе "Nginx", PHP-FPM, "NodeJS", "MySQL", "MongoDB", "Memcached", "mSMTP", "inCron", LXC и "Supervisord".

OS: Linux Debian Lenny/Squeeze.
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

Опцию "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

Определимся с принципами построения хранилища ресурсов пользователей и защиты файловой системы пользователей от несанкционированного проникновения, чтения и модификации. Создадим файловую структуру следующего вида:

                        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

В схеме, приведённой выше, колонка "point" означает права доступа, назначаемые только этому объекту файловой системы, без наследования потомками (применяется для закрепления структуры), а колонка "child" - с наследованием потомками объекта.

Создаем (если она ещё не была создана ранее) корневую директорию для web-ресурсов. Важное условие назначения прав в том, чтобы никто, кроме суперпользователя не мог получить перечень объектов внутри корневой директории web-ресурсов:

# mkdir -p /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

Создадим служебные директории для ресурсов, недоступные для записи владельцам ресурса (возможность чтения оставляем для обеспечения функциональности загрузки конфигурационных файлов как сервером 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

Создадим внутри служебной структуры директории, в которых будут располагаться индивидуальные конфигурации интерпретатора пользовательских ресурсов:

# 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

На будущее, если возникнет желание вынести на уровень выделенных площадок полный контроль над загружаемыми PHP-интерпретатором конфигурационными файлами, можно в дополнение создавать директории динамически подключаемых конфигурационных файлов, всё содержимое которых будет присоединятся к конфигурации из файла основного "php.ini":

# mkdir -p /var/www/php/u1000/conf.d
# mkdir -p /var/www/php/u1001/conf.d

Не забываем закрыть эти директории от неправомерного доступа аналогично родительской.


Заметки и комментарии к публикации:


Оставьте свой комментарий ( выразите мнение относительно публикации, поделитесь дополнительными сведениями или укажите на ошибку )