Безопасная установка Apache2: Шаг-за-Шагом

 Перед вами перевод четвертой статьи Артура Маджа из цикла Шаг-за-Шагом -
Безопасность Apache 2. Перевод осуществлен в рамках проекта GFS. Перевел Cobalt.
Оригинал статьи на английском можно найти тут:
http://www.securityfocus.com/infocus/1786

В случае выбора вебсервера, Apache имеет ряд приимуществ перед конкурентами.
Среди них стабильность и открытый исходный код. Но вот выбрать версию сервера,
далеко не так просто. С одной стороны, наилучшим решением кажется использование
самой популярной версии используемой миллионами потребителей - 1.3, но с другой,
может стоит воспользоваться улучшеной 2.0 ?

Несмотря на то что новая версия имеет на много более улучшеные характеристики,
некоторые люди все еще выбирают версию 1.3, потому что по их мнению эта ветвь
более стабильна. Конечно в таком мнении есть своя доля истины. Из-за того что
1.3 в течении довольно длительного времени использовалась миллионами пользовате-
лей, новые уязвимости найти в ней довольно-таки не просто. В то время, как
2.0 может иметь их в себе довольно много.

В продолжение серии Шаг-за-Шагом (Securing Apache, Securing PHP, and
Securing MySQL)(прим. переводчика: все их переводы имеются на нашем сайте), эта
статья рассказывает как установить и настроить Apachw 2.0 с наименьшим риском
второжения в случае обнаружения новых уязвимостей в этом програмном продукте.
Таким образом, вы сможете насладиться новыми характеристиками Apache не
тревожась о своей безопасности, будь эта угроза мнимой, или реальной.

Функциональные требования

В мире безопасности есть несколько золотых правил, которые всегда должны
выполняться. Одно из этих правил состоит в том, что только обсолютно необхолдимые
части софта должны быть использованы. Все остальные компоненты должны быть
задисэйблены, сделаны труднодоступными или даже неустановлеными вовсе.

Логика стоящая за таким правилом довольно проста - если будет установлен софт
имеющий много дополнительных компонентов, то обнаружение уязвимости в одном из
них, ставит под угрозу атаки всю систему. С другой стороны, если будут включены
только самые необходимые компоненты, в случае обнаружения нового бага, не будет
гарантии что все ПО уязвимо - потому что найденый баг может затрагивать
неподключенные или неустановленные компоненты. Вероятность взлома в этом случае
очевидно меньше чем при дефолтовой установке.

И так, перед установкой Apache 2.0, очень важно знать, какие конкретно функцио-
нальные возможности от него потребуются. Это поможет составить список необходи-
мых модулей.

Изходя из вышеописанного правила, мы будем применять самую основную конфигура-
цию сервера:

* Только статические HTML страницы будут на сервере.
* Сервер должен потдерживать виртуальные хосты.
* Доступ к некоторым страницам будет разрешен только с определенных IP
или определенным пользователям (базовая аутентификация)
* Сервер должен вести логи всех запросов (включая информацию о браузере)

Как вы наверно заметили, приведенная конфигкрация не потдерживает CGI скриптов,
SSL протокола или других расширеных функций апача. Это потому что главная
цель данной статьи заключается в том чтобы показать метод защиты апача, не
отвлекаясь на практические элементы. Если же понадобится дополнительная функцио-
нальность, читатель может использовать приведенное решение как точку отсчета,
наращивая дополнительные модуля, например, mod_ssl, mod_cgi или другие.

Требования безопасности

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

Сетевое окружение
* Вебсервер будет защищен фаерволом; правила которого будут разрешать
входящий трафик на 80/tcp и весь исходящий HTTP трафик. За исключением
некоторох ICMP сообщений (таких как source-quench, time-exceed,
parameter-problem, destination-unreachable), все остальные пакеты должны
блокироваться.
* Должна использоваться система обнаружения вторжения. Также необходимо
контролировать логи апача.

Опреационная система
* Операционная система должна быть как можно более защищенной; все
неиспользуемые компоненты должны быть удалены.
* Если потдерживается такая возможность, то ОС недолжна позволять выполнять
программы в стеке.
* Все неиспользуемые сетевые сервисы должны быть отключены.
* Количство SUID/SGID файлов должно быть минимальным.

Вебсервер Apache
* Только обсалютно необходимые модуля должны быть включены; остальные
должны быть отключены.
* Все диагностические вебстраницы и автоматическая индексация директорий
должны быть отключены.
* Сервер по возможности должен показывать как можно меньшее кол-во
информации о себе. Это покрайне мере затруднит злоумышлиннику его
задачу.
* Веб сервер должен быть запущен под выделенным UID/GID, неиспользуемыми
никакими другими процессами.
* Процессы апача, должны иметь ограниченный доступ к системе (chrooting)
* В чрутовом окружении апача, недолжно быть никаких командных оболочек
(/bin/sh, /bin/bash) -- это сделает затруднительным процесс использо-
вания эксплойтов.

Установка Опреационной Системы

Первым и самым важным шагом, будут выбор ОС под которой будет запущен вебсервер.
Далее будет рассказано как защитить Apache на FreeBSD (5.1), но читатель
свободен в выборе любой Unix-like системы.

В соответствии с нашими требованиями безопасности, после установки операционная
система должна бать защищена от удаленных и локальных атак. В случае выбора
UNIX/Linux/BSD дистрибутивов, довольно легко установить только ядро, и минимальный
набор необходимых компонентов. Установить последние патчи на ядро и ПО тоже не
должно составить ни какого труда.

Также рекомендуется переодически синхронизировать системные часы с сервером
времени используя Network Time Protocol (NTP), и отсылать логи на удаленный
выделеный сервер.

После того как система подготовлена, мы можем приступить к установке Apache 2.0
Первым шагом будет создание выделенных UID/GID. Для примера на FreeBSD это
делается так:

pw groupadd apache
pw useradd apache -c "Apache Server" -d /dev/null -g apache -s /sbin/nologin

Дочерние процессы апача будут запускаться под правами пользователя и группы
apache. Выделение отдельного акаунта под Apache проведет разделение прав, и
защитит нас от возможных проблем безопасности, когда разные процессы запускаются
под одним аккаунтом (например nobody).

Скачивание софта

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

lynx http://httpd.apache.org/download.cgi

gpg --import KEYS
gpg httpd-2.0.49.tar.gz.asc
gpg: Good signature from "Sander Striker "
tar zxvf httpd-2.0.49.tar.gz
cd ./httpd-2.0.49/

Выбор модулей Apache

После того как Apache скачен и рапакован, мы должны выбрать какие модуля будут
включены, а какие удалены. Краткое описание всех модулей Apache 2.0 вы можете
найти на http://httpd.apache.org/docs-2.0/mod/

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

core - Ядро Apache. Требуется в любом случае.

http_core - Ядро http. Требуется для Apache 2.0.

prefork - Multi-Processing Module (MPM) обеспечивает многозадачность. Может
быть заменен другими модулями т.к. worker , threadpool etc. MPM
требуется для Apache 2.0.

mod_access - Контролирует доступ основываясь на клиентсокм hostname, IP или
других характеристиках клиентского запроса. Поэтому что этот модуль
нужен для потдержки "order", "allow" и "deny" директивы, он должен
быть включен.

mod_auth - Требуется как инструмент для аутентификации пользователей с исполь-
зованием текстовых файлов(HTTP Basic Authentication), как определено
в функциональных требованиях.

mod_dir - Требуется для поиска и использования индексных файлов: "index.html",
"default.htm", etc.

mod_log_config - Требуется для возможности настройки логгинга.

mod_mime - Требуется для установки характеристик, кодировки контента, заголовка,
языка, и MIME типов документов.

В виду того что мы хотим включить только минимальное число модулей, мы
скомпилируем их статически. Благодаря этому, мы исключим возможность обнаружения
уязвимостей в модуле mod_so.

Компиляция и установка софта

Теперь мы нвстроим, соберем и установим вебсервер Apache:

./configure
--prefix=/usr/local/apache2
--with-mpm=prefork
--disable-charset-lite
--disable-include
--disable-env
--disable-setenvif
--disable-status
--disable-autoindex
--disable-asis
--disable-cgi
--disable-negotiation
--disable-imap
--disable-actions
--disable-userdir
--disable-alias
--disable-so
make
su
umask 022
make install
chown -R root:sys /usr/local/apache2

После установки, мы должны убедиться что только необходимые модуля включены:

/usr/local/apache2/bin/httpd -l
Compiled in modules:
core.c
mod_access.c
mod_auth.c
mod_log_config.c
prefork.c
http_core.c
mod_mime.c
mod_dir.c

Настройка Apache

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

Итак, нам надо удалять старый /usr/local/apache2/conf/httpd.conf, и создать
новый httpd.conf, поместив в него следущее:

# =================================================
# Basic settings
# =================================================
Listen 0.0.0.0:80
User apache
Group apache
ServerAdmin webmaster@www.ebank.lab
UseCanonicalName Off
ServerSignature Off
HostnameLookups Off
ServerTokens Prod
ServerRoot "/usr/local/apache2"
DocumentRoot "/www"
PidFile /usr/local/apache2/logs/httpd.pid
ScoreBoardFile /usr/local/apache2/logs/httpd.scoreboard

DirectoryIndex index.html


# =================================================
# HTTP and performance settings
# =================================================
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15

MinSpareServers 5
MaxSpareServers 10
StartServers 5
MaxClients 150
MaxRequestsPerChild 0


# =================================================
# Access control
# =================================================

Options None
AllowOverride None
Order deny,allow
Deny from all


Order allow,deny
Allow from all


Order allow,deny
Allow from all


# =================================================
# MIME encoding
# =================================================

TypesConfig /usr/local/apache2/conf/mime.types

DefaultType text/plain

AddEncoding x-compress .Z
AddEncoding x-gzip .gz .tgz
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
AddType application/x-tar .tgz


# =================================================
# Logs
# =================================================
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
ErrorLog /usr/local/apache2/logs/error_log
CustomLog /usr/local/apache2/logs/access_log combined

# =================================================
# Virtual hosts
# =================================================
NameVirtualHost *

DocumentRoot "/www/www.ebank.lab"
ServerName "www.ebank.lab"
ServerAlias "www.e-bank.lab"
ErrorLog logs/www.ebank.lab/error_log
CustomLog logs/www.ebank.lab/access_log combined


DocumentRoot "/www/www.test.lab"
ServerName "www.test.lab"
ErrorLog logs/www.test.lab/error_log
CustomLog logs/www.test.lab/access_log combined


Можно заметить следущие отличия от файла по умолчанию:

* Количество подключеных модулей сведено к минимуму.
* Процесы Apache настроены на запуск под выделенными UID/GID
* Информация о сервере сведена к минимуму.
* Установлены более жесткие права доступа к серверу.

Как было заявлено в наших требованиях функцианальности, было создано два
виртуальных хоста:

* www.ebank.lab (alias: www.e-bank.lab)
* www.test.lab

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

mkdir -p /www/www.ebank.lab
mkdir -p /www/www.test.lab
echo "eBank.lab
works!" > /www/www.ebank.lab/index.html
echo "Test.lab
works!" > /www/www.test.lab/index.html
chmod -R 755 /www
chown -R root:sys /www

Наконец, мы можем запустить Apache и протестировать его рабочие св-ва:

/usr/local/apache2/bin/apachectl start

Если созданые сайты доступны из браузера, ожно его остановить

/usr/local/apache2/bin/apachectl stop

и начать процесс чрутинга. Если же что-то не работает, проанализируйте лог файлы,
или запустите truss (или strace):

truss /usr/local/apache2/bin/httpd

Замечу, что для пользователей Linux, необходимо запускать stace. Проанализировав
вывод этих команд можно понять и устранить причину неисправности.

Чрутинг Сервера

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

mkdir -p /chroot/httpd/dev
mkdir -p /chroot/httpd/etc
mkdir -p /chroot/httpd/var/run
mkdir -p /chroot/httpd/usr/lib
mkdir -p /chroot/httpd/usr/libexec
mkdir -p /chroot/httpd/usr/local/apache2/bin
mkdir -p /chroot/httpd/usr/local/apache2/lib
mkdir -p /chroot/httpd/usr/local/apache2/logs/www.ebank.lab
mkdir -p /chroot/httpd/usr/local/apache2/logs/www.test.lab
mkdir -p /chroot/httpd/usr/local/apache2/conf
mkdir -p /chroot/httpd/usr/local/lib
mkdir -p /chroot/httpd/www

Владельцем директорий будет root, и всем остальным будет запрещено что-либо
менять в этом дереве:

chown -R root:sys /chroot/httpd
chmod -R 0755 /chroot/httpd

Дальше, мы создадим специальное уст-во /dev/null:

ls -al /dev/null
crw-rw-rw- 1 root wheel 2, 2 Mar 14 12:53 /dev/null
mknod /chroot/httpd/dev/null c 2 2
chown root:sys /chroot/httpd/dev/null
chmod 666 /chroot/httpd/dev/null

Также нам надо создать устройство /chroot/httpd/dev/log чтобы наш сервер мог
работать. В случае FreeBSD надо добавить следущую строку к /etc/rc.conf:

syslogd_flags="-l /chroot/httpd/dev/log"

Для того чтобы внесенные изменения вступили в силу, надо перестартовать
syslog демон с новыми параметрами:

kill `cat /var/run/syslog.pid`
/usr/sbin/syslogd -ss -l /chroot/httpd/dev/log

Следующим шагом станет копирование необходимых программ, библиотек и конфигов
в новое дерево директорий. Для FreeBDS 5.1 список будет таким:

cp /usr/local/apache2/bin/httpd /chroot/httpd/usr/local/apache2/bin/
cp /usr/local/apache2/lib/libaprutil-0.so.9 /chroot/httpd/usr/local/apache2/lib/
cp /usr/local/apache2/lib/libapr-0.so.9 /chroot/httpd/usr/local/apache2/lib/
cp /usr/local/apache2/conf/mime.types /chroot/httpd/usr/local/apache2/conf/
cp /usr/local/apache2/conf/httpd.conf /chroot/httpd/usr/local/apache2/conf/
cp /usr/local/lib/libexpat.so.4 /chroot/httpd/usr/local/lib/
cp /usr/lib/libc.so.5 /chroot/httpd/usr/lib/
cp /usr/lib/libcrypt.so.2 /chroot/httpd/usr/lib/
cp /usr/lib/libm.so.2 /chroot/httpd/usr/lib/
cp /usr/libexec/ld-elf.so.1 /chroot/httpd/usr/libexec/
cp /var/run/ld-elf.so.hints /chroot/httpd/var/run/
cp /etc/hosts /chroot/httpd/etc/
cp /etc/nsswitch.conf /chroot/httpd/etc/
cp /etc/resolv.conf /chroot/httpd/etc/
cp /etc/group /chroot/httpd/etc/
cp /etc/master.passwd /chroot/httpd/etc/passwords

Для других UNIX-like систем, список требуемых файлов можно составить используя
такие команды как ldd, strace, truss или strings как это описано в предыдущей
статье.

После того как это все сделано, нам надо подготовить базу паролей. Для этого
из /chroot/httpd/etc/passwords и /chroot/httpd/etc/group мы должны удалить
все строки за исключением содержащих apache. Теперь построим базу:

cd /chroot/httpd/etc
pwd_mkdb -d /chroot/httpd/etc passwords
rm -rf /chroot/httpd/etc/master.passwd

Приведенные команды применимы к FreeBSD Для других систем может быть достаточно
только отредактировать файлы.

Наконец, нам надо скопировать вебсайты: cp -R /www/* /chroot/httpd/www/
и протестировать коректность запуска апача в новом окружении.

chroot /chroot/httpd /usr/local/apache2/bin/httpd

Завершающие шаги

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

#!/bin/sh
CHROOT=/chroot/httpd
HTTPD=/usr/local/apache2/bin/httpd
PIDFILE=/usr/local/apache2/logs/httpd.pid

echo -n " apache"

case "$1" in
start)
/usr/sbin/chroot $CHROOT $HTTPD
;;
stop)
kill `cat ${CHROOT}/${PIDFILE}`
;;
*)
echo ""
echo "Usage: `basename $0` {start|stop}" >&2
exit 64
;;
esac

exit 0

Назовите его apache.sh и поместите в директорию со сценариями загрузки вашей
ОС. Для FreeBSD это будет /usr/local/etc/rc.d/. Права на этот файл надо поставить
такие:

chown root:sys /usr/local/etc/rc.d/apache.sh
chmod 711 /usr/local/etc/rc.d/apache.sh

Заключение

Главная цель данной статьи помочь читателю снизить риск проникновения при
использовании Apache 2.0, когда в нем будут найдены новые уязвимости. Было
показано как установить апач с минимальным кол-вом модулей, как настроить
все более защищенно, и как добится снижения вероятности угроз, перенеся
серверп в чрутовое окружение. И хоть ни какой из методов не может гарантировать
100% безопасности, описаный метод дает максимальную защиту от злоумышленников.

© Artur Maj

13.07.2006 © перевод Cobalt