Настройка apache 1.3.X для массового виртуального вебхостинга. (apache vhost virtual web)
Ключевые слова: apache, vhost, virtual, web, (найти похожие документы)
From: Шетухин Андрей Владимирович <http://stellar.df.ru.>
Date: Mon, 16 Dec 2007 14:31:37 +0000 (UTC)
Subject: Настройка apache 1.3.X для массового виртуального вебхостинга.
Оригинал: http://reki.ru/massvirthosting.html
Теория
Для создания полноценного сервера вебхостинга необходимо выполнить как
минимум следующие условия:
1) Безопасность.
2) Расширяемость.
3) Легкость в администрировании.
4) Простота в использовании клиентами.
Соответственно план действий будет следующим:
I. Настройка системы аутентификации пользователей.
II. Создание необходимой файловой структуры и установка прав доступа.
III. Установка квот для пользователей.
IV. Сборка и настройка http сервера. Сборка и настройка ftp сервера.
V. Запуск и тестирование системы.
I. Минимальный аудит безопасности системы.
Отключаем возможность просмотра других процессов для всех, кроме рута.
В файл /etc/sysctl.conf вставляем строчки:
security.bsd.see_other_uids=0 # Для FreeBSD 5.X
kern.ps_showallprocs=0 # Для FreeBSD 4.X
Создаем класс russianwww в /etc/login.conf и прописываем лимиты и
переменные окружения для русификации.
Читаем hier(7). На разных OS он выглядит по-разному (что естественно),
однако в большинстве случаев по поводу каталога /home (/usr/home)
написано, что именно здесь должны располагаться домашние каталоги
пользователей. Не в /var/www, как это сделано в RedHat, и не в /www,
/usr/local/www, как это делается во FreeBSD/OpenBSD.
Для упрощения администрирования устанавливаем пакет pam_pgsql (в нем
тоже есть ошибки, но они устраняются патчем). Все пароли пользователей
будут храниться с базе. Тип криптования пароля может быть
произвольным, главное - избежать хранения его в открытом виде.
cd /usr/ports/security/pam-pgsql
make install
Из-за гомерического количества критических ошибок заменяем sendmail на
qmail. Это - один из немногих, если не единственный случай, когда
оправданно использование qmail.
Устанавливаем права на каталоги. Единого правила здесь нет, но общий
принцип следующий: пользователь не должен иметь доступа к тому, что он
не будет использовать.
Создаем отдельный раздел и включаем для него поддержку квот. Как это
сделать, описано в системном руководстве.
Cоздаем группу virtwww и вносим пользователя www в эту группу.
pw groupadd virtwww
pw groupmod virtwww -M www
Права на каталог /home должны быть 0711, чтобы нельзя было получить
список файлов/каталогов внутри.
Создаем каталог /home/www с правами доступа 0710 и владельцем
www:virtwww. Пользователи могут войти в каталог, но не могут получить
листинг.
mkdir /home/www
chmod 0710 /home/www
chown www:virtwww /home/www
Монтируем в этот каталог свежесозданный раздел. При монтировании не
забываем про ключ nosuid.
Как только место в разделе закончится, мы создадим еще один каталог
/home/www1 и замонтируем туда дополнительный раздел по той же самой
схеме. А случае upgrade системы достаточно будет перемонтировать
разделы без копирования данных.
Создаем пользователя; например, username c первичной группой virtwww
pw useradd username -g virtwww -d /home/www/username -s /usr/local/bin/bash -L russianwww -m
chmod 0750 /home/www/username
chown username:www /home/www/username
В каталог username может войти только пользователь www (от которого
будет запущен apache) + сам владелец.
Устанавливаем квоту для пользователя.
Создаем структуру домашнего каталога для пользователя.
mkdir -p /home/www/username/public_html/cgi
chmod -R 0750 /home/www/username/public_html/cgi
chown -R username:virtwww /home/www/username/public_html
Здесь владелец может делать что угодно.
Создаем каталог для лог-файлов. Строго говоря, лог-файлы следует
хранить в отдельном разделе, во избежание переполнения /var.
mkdir -p /var/log/apache/www
chmod -R 0711 /var/log/apache/www
chown -R 0:0 /var/log/apache
Создаем каталог для лог-файлов пользователя
mkdir /var/log/apache/www/username
chmod 0700 /var/log/apache/www/username
chown username:virtwww /var/log/apache/www/username
Лог-файлы могут читаться только владельцем. Apache пишет в лог всегда
от рута.
Даем пользователю доступ к лог-файлам
ln -s /var/log/apache/username /home/www/username/logs
Настраиваем ротацию логов. Это можно сделать при помощи newsyslog.conf
(5), либо ротатором логов Apache.
Конфигурируем Apache и ftp сервер.
Установка apache с поддержкой suexec
Как обычно, все приложения устанавливаем из портов.
Для правильной работы suexec необходимо установить следующие
переменные окружения:
setenv WITH_APACHE_SUEXEC yes
setenv APACHE_SUEXEC_DOCROOT /home
setenv APACHE_SUEXEC_LOG /var/log/apache/suexec_log
Устанавливам apache.
cd /usr/ports/www/apache13
make install
make clean
Правим httpd.conf
CustomLog /var/log/apache/access_log combined
ErrorLog /var/log/apache/error_log
AddHandler cgi-script .cgi .pl
AddType text/html .shtml
AddHandler server-parsed .shtml
<Directory /home/*/*/public_html>
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec +ExecCGI
AllowOverride All
</Directory>
<Directory /home/*/*/public_html/cgi>
Options -Indexes
AllowOverride All
</Directory>
NameVirtualHost a.b.c.d:80
<VirtualHost a.b.c.d:80>
ServerName www.mysite.ru
ServerAlias mysite.ru
DocumentRoot /home/www/username/public_html
ScriptAlias /cgi /home/www/username/public_html/cgi
ServerAdmin email@user.ru
ErrorLog /var/log/apache/www/username/error_log
CustomLog /var/log/apache/www/username/error_log combined
User username
Group virtwww
</VirtualHost>
В принципе, вместо прописывания для каждого сервера конфигурации в
httpd.conf можно использовать модуль mod_vhost_alias. Документация для
него доступна на сайте http://httpd.apache.org.
Устанавливаем ftp сервер.
В данный момент одним из самых безопасных сверверов является
pure-ftpd. К тому же, этот ftp сервер имеет возможность создания
виртуальных пользователей. В целях повышения безопасности пароль для
захода пользователя по ftp должен быть отличным от пароля для захода
через ssh.
cd /usr/ports/ftp/pure-ftpd
setenv WITH_PGSQL=1
setenv WITH_PRIVSEP=1
make install
Конфигурируем postgresql для хранения базы паролей.
Запуcкаем шелл psql от суперпользователя PostgreSQL:
psql -U pgsql template1
Создаем пользователя и базу данных для хранения паролей:
Добро пожаловать в psql 7.3.4 - Интерактивный Терминал PostgreSQL.
Наберите: \copyright для условий распространения
\h для подсказки по SQL командам
\? для подсказки по внутренним slash-командам (\команда)
\g или ";" для завершения и выполнения запроса
\q для выхода
template1=# CREATE USER passwdmanager WITH ENCRYPTED PASSWORD 'njExk29sjJH' NOC
REATEDB NOCREATEUSER;
CREATE USER
template1=# CREATE DATABASE passwdmanager WITH ENCODING='KOI8' OWNER=passwdmanager;
CREATE DATABASE
passwdmanager=# \c passwdmanager passwdmanager
Вы теперь подсоединены к базе данных passwdmanager как пользователь passwdmanager.
passwdmanager=> CREATE TABLE userinfo (
passwdmanager(> login varchar(16) NOT NULL,
passwdmanager(> systempassword varchar(32) NOT NULL,
passwdmanager(> ftp_uid int NOT NULL CHECK (ftp_uid > 1000),
passwdmanager(> ftp_gid int NOT NULL CHECK (ftp_uid > 1000),
passwdmanager(> ftp_quota_files int NOT NULL,
passwdmanager(> ftp_quota_size int NOT NULL,
passwdmanager(> ftp_home_dir varchar(255) NOT NULL,
passwdmanager(> ftp_ul_ratio int NOT NULL DEFAULT 0,
passwdmanager(> ftp_dl_ratio int NOT NULL DEFAULT 0,
passwdmanager(> ftp_ul_bandwith int NOT NULL DEFAULT 0,
passwdmanager(> ftp_dl_bandwith int NOT NULL DEFAULT 0,
passwdmanager(> ftp_password varchar(32) NOT NULL,
passwdmanager(> CONSTRAINT userinfo_p_key PRIMARY KEY(login)
passwdmanager(> );
NOTICE: CREATE TABLE / PRIMARY KEY создаст неявный индекс 'userinfo_p_key' для таблицы 'userinfo'
CREATE TABLE
passwdmanager=> INSERT INTO userinfo (login, ftp_uid, ftp_gid, ftp_quota_files,
passwdmanager(> ftp_quota_size, ftp_home_dir, ftp_ul_ratio,
passwdmanager(> ftp_dl_ratio, ftp_ul_bandwith, ftp_dl_bandwith,
passwdmanager(> ftp_password)
passwdmanager-> VALUES ('stellar', 1002, 1002, 10000,
passwdmanager(> 1000000, '/home/www/stellar', 0,
passwdmanager(> 0, 0, 0,
passwdmanager(> 'XXXXXXXXXXXXXXXX');
INSERT 298773 1
Настраиваем pureftpd-pgsql.conf
PGSQLServer a.b.c.d
PGSQLPort 5432
PGSQLUser passwdmanager
PGSQLPassword njExk29sjJH
PGSQLDatabase passwdmanager
PGSQLCrypt md5
PGSQLGetPW SELECT ftp_password FROM userinfo WHERE login='\L'
PGSQLGetUID SELECT ftp_uid FROM userinfo WHERE login='\L'
PGSQLGetGID SELECT ftp_gid FROM userinfo WHERE login='\L'
PGSQLGetDir SELECT ftp_home_dir FROM userinfo WHERE login='\L'
PGSQLGetQTAFS SELECT ftp_quota_files FROM userinfo WHERE login='\L'
PGSQLGetQTASZ SELECT ftp_quota_size FROM userinfo WHERE login='\L'
PGSQLGetRatioUL SELECT ftp_ul_ratio FROM users WHERE login='\L'
PGSQLGetRatioDL SELECT ftp_dl_ratio FROM users WHERE login='\L'
PGSQLGetBandwidthUL SELECT ftp_ul_bandwith FROM users WHERE login='\L'
PGSQLGetBandwidthDL SELECT ftp_dl_bandwith FROM users WHERE login='\L'
Настраиваем pure-ftpd.conf
PGSQLConfigFile /usr/local/etc/pureftpd-pgsql.conf
Запускаем и тестируем
# /usr/local/sbin/pure-config.pl /usr/local/etc/pure-ftpd.conf
Running: /usr/local/sbin/pure-ftpd -A -c50 -B -C8 -D -fftp -H -I15
-lpgsql:/usr/local/etc/pureftpd-pgsql.conf
-L2000:8 -m4 -s -U133:022 -u100 -w -k99 -Z
zedd!stellar:~$ ftp localhost
Trying ::1...
Trying 127.0.0.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 13:53. Server port: 21.
220 You will be disconnected after 15 minutes of inactivity.
Name (localhost:stellar):
331 User stellar OK. Password required
Password:
230-User stellar has group access to: stellar
230-This server supports FXP transfers
230-OK. Current restricted directory is /
230-0 files used (0%) - authorized: 10000 files
230 0 Kbytes used (0%) - authorized: 1024 Kb
Remote system type is UNIX.
Using binary mode to transfer files.
Заключение.
Разумеется, это не все действия, необходимые для настройки безопасного
массового вебхостинга. И конечно это не единственный метод. Однако
действуя подобно тому, как описано здесь, можно создать простой в
администрации, удобный для клиентов и безопасный вебхостинг.
Остается только добавить, что подобная схема успешно применяется с
2001 года на хостинговых площадках http://www.bizoppstats.com,
http://www.akmosoft.com.
Приложение.
* Скрипт для автоматического заведения пользователей.
© 2004 stellar. При воспроизведении материала поставьте ссылку на http://stellar.df.ru.