Перед вами перевод четвертой статьи Артура Маджа из цикла Шаг-за-Шагом -
Безопасность 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