Защищаем apache 1.3 в FreeBSD. Процессы с привилегиями пользователя.

В этой статье я рассмотрю решения, которые позволяют процессам apache 1.3 выполняться от имени пользователя, которому принадлежит виртуалхост. Архитектура apache 1.3 предполагает только prefork схему, поэтому все описанные ниже решения работают примерно одинаково: в системе запускается некоторое количество процессов apache. При получении запроса он передается одному из бездействующих процессов, процесс определяет на какой виртуалхост пришел запрос и какому пользователю принадлежит этот виртуалхост, после чего процесс suid’ится в пользователя/группу, которым принадлежит виртуалхост. Вся последующая обработка запроса происходит уже от имени пользователя/группы, которым принадлежит виртуалхост.

1. suexec
2. suphp
3. dklab
4. производительность


1. suexec

Описание:

suexec позволяет выполнять CGI скрипты от пользователя, которому принадлежит виртуалхост.

Установка suexec в FreeBSD:

В /etc/make.conf добавить:

.if ${.CURDIR} == /usr/ports/www/apache13
WITH_APACHE_SUEXEC=yes
APACHE_SUEXEC_DOCROOT= /home
.endif

В “APACHE_SUEXEC_DOCROOT” следует задавать директорию в которой располагаются пользователи и их DocumentRoot директории.

После этого:

# cd /usr/ports/www/apache13
# make install clean

Конфигурирование:

В описание виртуалхоста добавить:

User example
Group example

Преимущества:

+ CGI скрипты работают от имени пользователя.

Недостатки:

- От имени пользователя будут выполняться только CGI скрипты. Скрипты PHP, запущенные под mod_php будут продолжать выполняться от имени веб-сервера.


2. suphp

Описание:

suphp – это DSO-модуль (Dynamic Shared Object) для apache. Позволяет выполнять PHP скрипты от пользователя, которому принадлежит виртуалхост.

Установка suphp в FreeBSD:

# cd /usr/ports/www/suphp
# make install clean

Конфигурирование:

в httpd.conf:

LoadModule suphp_module libexec/apache/mod_suphp.so
AddModule mod_suphp.c
suPHP_Engine on
suPHP_AddHandler x-httpd-php
AddType application/x-httpd-php .php
AddHandler x-httpd-php .php

в описании виртуалхоста:

suPHP_UserGroup example example

Преимущества:

+ PHP cкрипты работают от имени пользователя.

Недостатки:

- От имени пользователя будут выполняться только PHP скрипты. CGI скрипты будут продолжать выполняться от имени веб-сервера.
- PHP скрипты запускаются при помощи php-cgi, что лишает возможности использовать mod_php со всеми его преимуществами в плане производительности.


3. dklab apache

Описание:

dklab apache – это apache 1.3.34 c набором патчей от Дмитрия Котерова. Подробную информацию можно получить по адресу: http://dklab.ru/lib/dklab_apache/

Установка dklab apache в FreeBSD:

Можно скачать порт, распаковать в /usr/ports/www/dklab-apache, затем собрать порт:

# cd /usr/ports/www/dklab-apache
# make install clean

Либо можно скачать готовые пакеты и установить при помощи pkg_add:
http://woland.pl.ua/upload/dklab-apache-i386.tbz
http://woland.pl.ua/upload/dklab-apache-amd64.tbz

Конфигурирование:

В описание виртуалхоста добавляем:

User example
Group example

Преимущества:

+ Удобство конфигурирования. Не требуется конфигурировать отдельно suexec и suphp, достаточно директив User/Group в описании виртуалхоста.

Недостатки:

- Процесс выполняется от имени пользователя даже при обработке запроса на статический файл, что негативно сказывается на общей производительности.


4. производительность

Для тестирования производительности использовались 3 файла.
Первый – статический HTML файл с текстом “Hello world!”.
Второй – PHP скрипт:

<? phpinfo() ?>

Третий – CGI скрипт:

#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
print "Hello world!";

Каждый файл запрашивался 50.000 раз в 50 потоков (“ab -c 50 -n 50000 …”). Засекалось время в секундах за которое полностью выполнится тест.

Время выполнения теста (в сек.):

HTML PHP CGI
apache 1.3.41 5 22 152
apache 1.3.41 с suexec - - 229
apache 1.3.41 с suphp - 388 -
dklab apache 395 293 497

Стоит отметить, что тест синтетический и показывает не то, чтобы реальные цифры производительности, а скорее сколько времени требуется apache‘у для того, чтобы переключить пользователя от которого работает процесс. К примеру, dklab apache c mod_php на реальной живой системе показал всего лишь ~7-10% разницу в потреблении ресурсов CPU по сравнению с mod_php на обычном apache.

Отрисовываем в cacti трафик виртуальных хостов apache.

cacti-apache Есть один модуль для apache, называется mod_watch. Модуль предназначен для сбора данных о трафике сгенерированном и/или потребленном виртуальными хостами. Разработчик, правда, решил прекратить поддержку модуля, о чем сообщает на своем сайте, но к счастью мне удалось найти в сети исходники этого модуля для apache 1.3, 2.0 и 2.2. Процесс установки модуля я опишу для каждой версии отдельно. Итак, поехали.

mod_watch для Apache 1.3:
Качаем mod_watch для apache 1.3
Распаковываем архив и собираем модуль:

# tar zxf mod_watch_apache13.tgz
# cd mod_watch_apache13
# make build-dynamic

Собранный модуль помещаем в директорию с модулями apache (пример для FreeBSD, для других ОС замените путь на соответствующий Вашему случаю):

# cp mod_watch.so /usr/local/libexec/apache/

Включаем модуль в httpd.conf:

LoadModule watch_module      libexec/apache/mod_watch.so
AddModule mod_watch.c

В конфигурации виртуального хоста добавляем:

<Location /watch-info>
    SetHandler watch-info
</Location>

Перезапускаем apache:

# apachectl restart

Проверяем работоспособность, заходим браузером на http://example.com/watch-info. Если всё получилось Вы должны увидеть что-то вроде:

example.com 44 0 3575639 362 113 5 0.000 11403376 9534280

mod_watch для Apache 2.0:
Качаем mod_watch для apache 2.0
Распаковываем архив и собираем модуль:

# tar zxf mod_watch_apache20.tgz
# cd mod_watch_apache20
# make -f Makefile.dso build

Собранный модуль помещаем в директорию с модулями apache (пример для FreeBSD, для других ОС замените путь на соответствующий Вашему случаю):

# cp .libs/mod_watch.so /usr/local/libexec/apache2/

Включаем модуль в httpd.conf:

LoadModule watch_module       libexec/apache2/mod_watch.so

В конфигурации виртуального хоста добавляем:

<Location /watch-info>
    SetHandler watch-info
</Location>

Перезапускаем apache:

# apachectl restart

Проверяем работоспособность, заходим браузером на http://example.com/watch-info. Если всё получилось Вы должны увидеть что-то вроде:

example.com 44 0 3575639 362 113 5 0.000 11403376 9534280

mod_watch для Apache 2.2:
Качаем mod_watch для apache 2.2
Распаковываем архив и собираем модуль:

# tar zxf mod_watch_apache22.tgz
# cd mod_watch_apache22
# make -f Makefile.dso build

Собранный модуль помещаем в директорию с модулями apache (пример для FreeBSD, для других ОС замените путь на соответствующий Вашему случаю):

# cp .libs/mod_watch.so /usr/local/libexec/apache22/

Включаем модуль в httpd.conf:

LoadModule watch_module       libexec/apache22/mod_watch.so

В конфигурации виртуального хоста добавляем:

<Location /watch-info>
    SetHandler watch-info
</Location>

Перезапускаем apache:

# apachectl restart

Проверяем работоспособность, заходим браузером на http://example.com/watch-info. Если всё получилось Вы должны увидеть что-то вроде:

example.com 44 0 3575639 362 113 5 0.000 11403376 9534280

настройка Cacti:
Качаем mod_watch для cacti. Файл mod_watch_cacti.pl необходимо положить в директорию /your_path/cacti/scripts/ и сделать:

chmod +x mod_watch_cacti.pl

Файл cacti_graph_template_modwatch_traffic.xml импортируем в cacti, для этого заходим браузером по адресу, где расположен cacti, и в меню выбираем пункт “Import Templates”. Далее создадим график, в меню выбираем “New Graphs”, на появившейся странице в выпадающем меню “Create:” выбираем “ModWatch – Traffic”, нажимаем кнопку “create”, заполняем требуемые поля, создаем график. Всё. Через 15-20 минут на графике отобразятся первые данные.

Apache. Установка и настройка.

apache web server

Для работы DSPAM WebUI, PostfixAdmin и web-интерфейса RoundCube нам потребуется web-сервер с поддержкой suexec и MySQL аутентификации (для DSPAM WebUI), и поддержкой PHP (для RoundCube и PostfixAdmin). В качестве web-сервера мы будем использовать apache 1.3, собранный с поддержкой suexec и модули к нему: mod_auth_mysql_another и mod_php. Использование apache версии 1.3 связано исключительно с личной привычкой, которая выработалась на основании рекомендаций человека имеющего опыт работы с высоко нагруженными системами. По большому счету в данной задаче без разницы какую версию использовать, при желании можно использовать и ветку 2.х, но просто так сложилось, что 1.3 мне ближе, о ней и пойдет речь.

Приступим к установке apache с поддержкой suexec. Включим поддержку suexec и ограничим ее деревом каталогов, где будут находится скрипты. Для этого добавим в /etc/make.conf:

WITH_APACHE_SUEXEC=yes
APACHE_SUEXEC_DOCROOT=/home

Собираем порт:

# cd /usr/ports/www/apache13
# make install clean

Устанавливаем mod_auth_mysql_another:

# cd /usr/ports/www/mod_auth_mysql_another
# make install clean

Устанавливаем mod_php:

# cd /usr/ports/lang/php5
# make config

Отмечаем требуемые опции:

[X] CLI        Build CLI version
[X] CGI        Build CGI version
[X] APACHE     Build Apache module
[Х] SUHOSIN    Enable Suhosin protection system (not for jails)

И собираем порт:

# make install clean

Теперь соберем некоторые расширения PHP, которые понадобятся нашим web-интерфейсам:

# cd /usr/ports/lang/php5-extensions
# make config

Отмечаем следующие опции:

[X] IMAP        IMAP support
[X] MBSTRING    multibyte string support
[X] MYSQL       MySQL database support
[X] SESSION     session support

Собираем порт:

# make install clean

Разрешаем запуск apache, для этого добавляем в /etc/rc.conf:

apache_enable="YES"

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

# mkdir /usr/local/etc/apache/vhosts

Теперь можно заняться конфигурированием apache. Редактируем файл /usr/local/etc/apache/httpd.conf:

#
# Раздел 1: Общие настройки
#
ServerType standalone
ServerRoot "/usr/local"
PidFile /var/run/httpd.pid
ScoreBoardFile /var/run/httpd.scoreboard
Timeout 300
KeepAlive Off
MinSpareServers 5
MaxSpareServers 10
StartServers 5
MaxClients 150
MaxRequestsPerChild 100

# Модули. Лишние модули закоментированы.
# Если они Вам потребуются - можете раскоментировать.
LoadModule config_log_module  libexec/apache/mod_log_config.so
LoadModule mime_module        libexec/apache/mod_mime.so
LoadModule dir_module         libexec/apache/mod_dir.so
LoadModule cgi_module         libexec/apache/mod_cgi.so
LoadModule access_module      libexec/apache/mod_access.so
LoadModule auth_module        libexec/apache/mod_auth.so
LoadModule unique_id_module   libexec/apache/mod_unique_id.so
LoadModule mysql_auth_module  libexec/apache/mod_auth_mysql.so
LoadModule php5_module        libexec/apache/libphp5.so
#LoadModule mmap_static_module libexec/apache/mod_mmap_static.so
#LoadModule vhost_alias_module libexec/apache/mod_vhost_alias.so
#LoadModule env_module         libexec/apache/mod_env.so
#LoadModule mime_magic_module  libexec/apache/mod_mime_magic.so
#LoadModule negotiation_module libexec/apache/mod_negotiation.so
#LoadModule status_module      libexec/apache/mod_status.so
#LoadModule info_module        libexec/apache/mod_info.so
#LoadModule includes_module    libexec/apache/mod_include.so
#LoadModule autoindex_module   libexec/apache/mod_autoindex.so
#LoadModule asis_module        libexec/apache/mod_asis.so
#LoadModule imap_module        libexec/apache/mod_imap.so
#LoadModule action_module      libexec/apache/mod_actions.so
#LoadModule speling_module     libexec/apache/mod_speling.so
#LoadModule userdir_module     libexec/apache/mod_userdir.so
#LoadModule alias_module       libexec/apache/mod_alias.so
#LoadModule rewrite_module     libexec/apache/mod_rewrite.so
#LoadModule anon_auth_module   libexec/apache/mod_auth_anon.so
#LoadModule db_auth_module     libexec/apache/mod_auth_db.so
#LoadModule digest_module      libexec/apache/mod_digest.so
#LoadModule proxy_module       libexec/apache/libproxy.so
#LoadModule cern_meta_module   libexec/apache/mod_cern_meta.so
#LoadModule expires_module     libexec/apache/mod_expires.so
#LoadModule headers_module     libexec/apache/mod_headers.so
#LoadModule usertrack_module   libexec/apache/mod_usertrack.so
#LoadModule log_forensic_module libexec/apache/mod_log_forensic.so
#LoadModule setenvif_module    libexec/apache/mod_setenvif.so

ClearModuleList
AddModule mod_log_config.c
AddModule mod_mime.c
AddModule mod_dir.c
AddModule mod_cgi.c
AddModule mod_access.c
AddModule mod_auth.c
AddModule mod_unique_id.c
AddModule mod_so.c
AddModule mod_auth_mysql.c
AddModule mod_php5.c
#AddModule mod_mmap_static.c
#AddModule mod_vhost_alias.c
#AddModule mod_env.c
#AddModule mod_mime_magic.c
#AddModule mod_negotiation.c
#AddModule mod_status.c
#AddModule mod_info.c
#AddModule mod_include.c
#AddModule mod_autoindex.c
#AddModule mod_asis.c
#AddModule mod_imap.c
#AddModule mod_actions.c
#AddModule mod_speling.c
#AddModule mod_userdir.c
#AddModule mod_alias.c
#AddModule mod_rewrite.c
#AddModule mod_auth_anon.c
#AddModule mod_auth_db.c
#AddModule mod_digest.c
#AddModule mod_proxy.c
#AddModule mod_cern_meta.c
#AddModule mod_expires.c
#AddModule mod_headers.c
#AddModule mod_usertrack.c
#AddModule mod_log_forensic.c
#AddModule mod_setenvif.c

#
# Раздел 2: Настройки по-умолчанию для главного хоста и вирт. хостов.
#
Port 80
User www
Group www
ServerAdmin admin@example.com
DocumentRoot "/usr/local/www/data"
<Directory />
    Options FollowSymLinks
    AllowOverride All
</Directory>
DirectoryIndex index.html index.php index.cgi
AccessFileName .htaccess
<Files ~ "^.ht">
    Order allow,deny
    Deny from all
    Satisfy All
</Files>
UseCanonicalName On
TypesConfig /usr/local/etc/apache/mime.types
DefaultType text/plain
HostnameLookups Off
ServerSignature On
ErrorLog /var/log/httpd-error.log

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
AddType application/x-tar .tgz
AddEncoding x-compress .Z
AddEncoding x-gzip .gz .tgz
AddHandler cgi-script .cgi

LogLevel warn
LogFormat "%h %l %u %t "%r" %>;s %b "%{Referer}i" "%{User-Agent}i"" combined
LogFormat "%h %l %u %t "%r" %>;s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
CustomLog /var/log/httpd-access.log combined

#
# Раздел 3: Виртуальные хосты
#
NameVirtualHost *:80
Include /usr/local/etc/apache/vhosts/*.conf
Rambler's Top100