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. Пользователи могут войти в каталог, но не могут получить
листинг.
Монтируем в этот каталог свежесозданный раздел. При монтировании не
забываем про ключ nosuid.
Как только место в разделе закончится, мы создадим еще один каталог
/home/www1 и замонтируем туда дополнительный раздел по той же самой
схеме. А случае upgrade системы достаточно будет перемонтировать
разделы без копирования данных.
Создаем пользователя; например, username c первичной группой virtwww
В принципе, вместо прописывания для каждого сервера конфигурации в
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'
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.
Приложение.
* Скрипт для автоматического заведения пользователей.