Как создать свой хостинг "с нуля" - Система каталогов пользователей

ОГЛАВЛЕНИЕ


Система каталогов пользователей

Как уже было описано в предыдущей статье, пользователи виртуального хостинга размещаются на отдельном разделе /home в каталоге www. Если с течением времени место в /home/www закончится, мы сможем установить в сервер дополнительный физический диск и смонтировать его в /home/www1. При этом общая схема работы хостинга не изменится и дополнительная настройка не понадобится.

Для того чтобы пользователи не имели доступа к "чужим" даныым необходимо правильно выставить права и владельцев каталогов. Такая настройка - очень важный момент, поэтому остановимся на ней подробнее.

Итак, пользователи не должны иметь доступ к каталогам друг друга, но при этом надо позаботиться о доступности этих данных вебсерверу. К счастью, механизм UNIX permissions позволяет решить эту проблему: мы создадим специальную группу в которую будут входить пользователи вебхостинга и пользователь, от которого запущен вебсервер Apache

pw groupadd virtwww -M www 

Создаем каталоги:

mkdir -p /home/www 
chown root:wheel /home/www

Права на каталог /home/www должны быть 0711, чтобы нельзя было получить список файлов/каталогов внутри. Пользователи могут войти в каталог, но не могут получить листинг.

Создаем пользователя нашего вебхостинга:

pw useradd u00001 -g virtwww -d /home/www/u00001 -s /usr/local/bin/bash -L russianwww -m 
pw groupadd u00001 -M u00001

Таким образом, каждый пользователь имеет две группы: первичную - virtwww и дополнительную, совпадающую по имени с именем пользователя.

Устанавливаем права на домашний каталог пользователя:

chmod 04710 /home/www/u00001 
chown u00001:www /home/www/u00001

При таких правах на каталог никто кроме пользователя u00001 и вебсервера не будет иметь доступа к данным пользователя, а созданные внутри файлы и каталоги будут наследовать ID и GID владельца.

Для хранения лог-файлов мы выберем каталог /var/log/apache.

Именно здесь нам потребуется введенная дополнительно группа у пользователя хостинга: при помощи нее мы выдадим права на просмотр лог-файлов.

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

mkdir -p /var/log/apache
chmod 0711 /var/log/apache
chown root:wheel /var/log/apache

mkdir /var/log/apache/u00001
chmod 0750 /var/log/apache/u00001
chown root:u00001 /var/log/apache/u00001

Теперь осталось расписать процедуру заведения виртуального хоста для пользователя. Сделаем это на примере сайта example.ru:

1) Создаем каталоги

mkdir -p /home/www/u00001/example.ru/{www,cgi,tmp}

chown -R u00001:virtwww /home/www/u00001/example.ru
chmod -R 04770 /home/www/u00001/example.ru
chmod 0710 /home/www/u00001/example.ru/cgi

mkdir /var/log/apache/u00001/example.ru
chmod 0750 /var/log/apache/u00001/example.ru

2) Прописываем конфигурацию для Apache

<VirtualHost 127.0.0.1:80>
        ServerName example.ru
        ServerAlias www.example.ru

        DocumentRoot /home/www/u00001/example.ru/www
        ScriptAlias  /cgi /home/www/u00001/example.ru/cgi

        ErrorLog     /var/log/apache/u00001/example.ru/error_log
        TransferLog  /var/log/apache/u00001/example.ru/access_log

        php_admin_value upload_tmp_dir /home/www/u00001/example.ru/tmp
        php_admin_value doc_root       /home/www/u00001/example.ru
        php_admin_value user_dir       www
        php_admin_value open_basedir   /home/www/u00001:/usr/local/share/smarty:/usr/local/share/pear
        php_admin_value session.save_path "0;0660;/home/www/u00001/example.ru/tmp"

        User u00001
        Group virtwww
</VirtualHost>

Обратите внимание на значение переменной session.save_path. В ней требуется указать права 0660.

3) Проверяем конфигурацию Apache:

/usr/local/sbin/apachectl configtest 
Syntax OK

4) Перезапускаем Apache и проверяем работу системы:

/usr/local/sbin/apachectl restart

echo "<? phpinfo(); ?>" > /home/www/u00001/example.ru/www/test.php
fetch http://example.ru/test.html

test.php                                         34 kB   13 MBps

rm /home/www/u00001/example.ru/www/test.php

5) Заводим FTP доступ для пользвателя Поскольку всех FTP пользователей мы храним в БД, вся процедура создания доступа по FTP сводится к созданию ровно одной записи:

INSERT INTO ftp.ftpusers 
VALUES('u00001', 'topsecret', '1001', '1000', '/home/www/u00001', 0, 1, '');

где 1001 - UID пользователя, а 1000 - GID группы virtwww Проверяем доступ по FTP:

ftp localhost

Trying ::1...
Connected to localhost.
220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
220-You are user number 1 of 50 allowed.
220-Local time is now 01:58. Server port: 21.
220-This is a private system - No anonymous login
220 You will be disconnected after 15 minutes of inactivity.
Name (localhost:stellar): u00001
331 User u00001 OK. Password required
Password:
230-User u00001 has group access to:  u00001   virtwww
230 OK. Current restricted directory is /
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> quit
221-Goodbye. You uploaded 0 and downloaded 0 kbytes.
221 Logout.

Для автоматизации создания пользователей можно воспользоваться скриптом, доступным по адресу http://www.reki.ru/products/webhosting/addftpuser