Перед вами перевод четвертой статьи Артура Маджа из цикла Шаг-за-Шагом -Безопасность Apache 2. Перевод осуществлен в рамках проекта GFS. Перевел Cobalt.Оригинал статьи на английском можно найти тут.
Несмотря на то, что новая версия имеет намного более улучшеные характеристики,
некоторые люди все еще выбирают версию 1.3, потому что по их мнению эта ветвь
более стабильна. Конечно, в таком мнении есть своя доля истины. Из-за того что
1.3 в течении довольно длительного времени использовалась миллионами пользователей, новые уязвимости найти в ней довольно-таки не просто. В то время, как
2.0 может иметь их в себе довольно много.
В продолжение серии Шаг-за-Шагом (Securing Apache, Securing PHP, and
Securing MySQL)(прим. переводчика: все их переводы имеются на нашем сайте), эта
статья рассказывает как установить и настроить Apache 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.gzcd ./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
©Перевод Cobalt
Перейти к рубрике --> Защита и нападение |