Представляю вашему вниманию перевод с английского статьи Артура Маджа. Перевод
осуществлен в рамках проекта GFS. Оригинал статьи находитья
по адресу http://www.securityfocus.com/infocus/1694
Перевел Cobalt.
Эта статья в пошаговом режиме расскажет вам о том как установить и сконфигури-
ровать веб сервер Apache 1.3.x чтобы смягчить или исключить угрозу взлома вашего
сервера, когда в этом продукте будут найдены новые уязвимости.
Функциональнолсть
Перед тем как мы начнем заниматься безопасностью Apache, мы должны определить
какие нам требуются функции от нашего сервера. Разнообразие возможносых
конфигураций Апача делает давольно сложной задачу написания уневерсальной проце-
дуры для защиты сервера во всех случаях. Именно по этому мы будем основываться
на следующей конфигурации:
* Сервер должен быть доступен из интернета, и,
* Только статические HTML страницы будут использоваться
* Сервер будет поддерживать основанный на именах механизм виртуального
хостинга
* Определенные вебстраницы могут быть доступны только со специальных
IP-адресов или определенным пользователям (базавая аутентификация).
* Вебсервер будет логировать все запросы (включая информацию о браузере).
Необходимо подчеркнуть, что приведенная конфигурация на поддерживает PHP,JSP,
CGI и других технологий которые делают возможным интерактивный вебсервис.
Использование этих технологий увеличит угрозу безопасности ваших приложений. Так
даже маленький, несложный сценарий, может радикально уменьшить уровень безопас-
ности вашего сервера. Почему? Во-первых, ASP/CGI приложения могут содержать
уязвимости (например SQL-injkection или Cross-Site-Scripting). Во-вторых,
технологии могут быть опасными сами по себе (например уязвимости в PHP, в Perl
модулях и т.п.). Вот почему я настоятельно рекомендую исполльзовать эти технологии
только тогда, когда без интерактивного режима общения пользователя с сервером
не обойтись.
Предположения Безопасности
Одрим из самвх важных элементов любого компьютерного проекта является определение
предположений безопасности. Это должно быть выполнено перед снабжением проекта.
Для нашего сервера предположения безопасности будут следующими:
* Операционную систему необходимо максимально обезопасить от удаленных
и локальных атак.
* На сервере не должно быть ни каких сервисов кроме HTTP (80/tcp)
* Удаленный доступ к этому серверу должен фильтроваться фаерволом,
который будет блокировать все исходящие соединения и разрешать
входящие только на 80-й порт вебсервера.
* Apache должен быть единственным сервисом в данной системе.
* Только обязательные модуля апача должны быть включены.
* Любые диагностические страницы и автоматическое индексирование директ-
орий должно быть выключено.
* Сервер должен выдавать как можно меньше информации о себе.
* Apache должен быть запущен под уникальными UID/GID, который не
используют другие сервисы в системе.
* Процессы апача должны иметь ограниченный доступ к файловой системе
(chroot) и,
* Не должно присутствовать командных интерпритаторов в в апачевом
окружении chroot (т.к. /bin/sh, /bin/bash и т.п.).
Установка операционной системы
Перед установкой Apache, мы должны выбрать операционную систему под которой он
будет работать. Сдесь у нас давольно большая альтернатива, потому что Apache
может работать практически под всеми ОС. Далее мы будем говорить об установке
Apache на FreeBSD (4.7), однако описаный метод вполне сгодится и для других
Unix/Linux систем. Единственная операционная система на которую я категорически
не рекомендовал бы ставить Apache - это MS Windows. По моему мнению она имеет
довольно-таки ограниченный средства для безопасности сервера.
Первым шагом к безопасному веб серверу является непробиваеммость операционной
системы. Споры о том какая же ОС самая непробиваемая, выходят за рамки этой
статьи. Однако, довольно много документов в Сети описывают этот вопрос. Читатель
может сам поднять подобную дискуссию на одном из форумов.
После того как система установлена и защищена, мы добавим новую группу и
пользователя "apache". Во FreeBSD это делается так:
pw groupadd apache
pw useradd apache -c "Apache Server" -d /dev/null -g apache -s /sbin/nologin
По умолчанию, Apache запущен под правами пользователя nobody (исключая главный
процесс который запущен под root) и группы nogroup. Это может представлять
значительную угрозу безопасности. В случае проникновения, нарушитель может
получить доступ ко всем остальным процессам которые доступны этим UID/GID.
Следовательно, оптимальным решением будет запуск апача под уникальными
пользователем и группой.
Подготовка програм
Следующим шагом будет скачивание последний версии Apache Web Server. Некоторые
опции сервера могут быть включены только на стадии компилирования, поэтому
важно скачать исходный код вместо бинарной версии.
После скачивания софта, мы должны распаковать его. Следующим шагом мы должны
решить, какие модули оставить включенными. Короткое описание всех модулей
можно найти тут: http://httpd.apache.org/docs/mod/
Модуля Apache
Выбор модулей - важнейший шаг на пути к безопасности Apache. Мы будем следовать
следущему правилу: ЧЕМ МЕНЬШЕ,ТЕМ ЛУЧШЕ. Для выполнения требований функциональности
и предположений безопасности, следущие модуля должны быть обязательно включены:
| Имя модуля |
Описание |
| httpd_core |
Ядро Apache. Требуется во всех инсталяциях. |
| mod_access |
Проводит контроль доступа основаный на кленском хосте, IP-адресе, или других характеристиках клиентского запроса. Поскольку этот модуль нужен для использования "order", "allow" и "deny" дериктив, он должен быть включен. |
| mod_auth |
Требуется как инструмент обеспечения пользовательской аутентификации с использованием текстовых фалов (HTTP Базовая Аутентификация), которая определена в функциональном предположении. |
| mod_dir |
Требуется для поиска и использования индексов по умолчанию: "index.html", "default.htm", etc. |
| mod_log_config |
Требуется как инструмент логирования запросов к серверу. |
| mod_mime |
Требуется для установки характеристик сервера, кодировки содержимого, заголовков, языка страниц и MIME типов документов. |
Все остальные модуля апача должны быть отключены. Мы можем без опасения их
выключить т.к. они нам не нужны. Путем отключения ненужных модулей мы можем
избежать потенциального проникновения когда в одном из них найдут новую багу.
Существуют два модуля которые могут быть опаснее остальных: mod_autoindex и
mod_info. Первый из них проводит автоматическую индексацию директорий и включен
по умолчанию. Когда этот модуль запущен, Apach выдает содержимое директории
если в ней нет индексного файла. Второй модуль, mod_info, никогда не должен быть
доступен из Интернет. Потому что он показывает конфигурацию серера.
Следующий вопрос - как скомпилировать модули. Наиболее предпочтительным выбором
кажеться статический метод. Если новые уязвимости будут найдены, мы мождем пере-
компилировать уязвимый модуль, а не все программу. При статической компиляции
мы исключаем необходимость использования модуля mod_so.
Компиляция программы
Во-первых, если присутствуют какие-либо патчи по безопасности, они должны быть
подключены. Потом сервер будет скомпилирован и установлен следующим образом:
./configure --prefix=/usr/local/apache --disable-module=all --server-uid=
apache --server-gid=apache --enable-module=access --enable-module
=log_config --enable-module=dir --enable-module=mime --enable-module=auth
make
su
umask 022
make install
chown -R root:sys /usr/local/apache
Chroot
Следующий шаг заключается в ограничении апачу доступа к файловой системе сервера
Этого можно достигнуть применяя chroot. Технология chroot позволяет создать
новую рутовую директорию, скопировать в нее все файлы демона, и запускать
демон уже из нового окружения. Благодаря этому, демон и все дочерние процессы
будут иметь доступ только к директории chroot.
И так, начнем процесс по созданию виртуальной root директории в папке
/chroot/httpd:
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/apache/bin
mkdir -p /chroot/httpd/usr/local/apache/logs
mkdir -p /chroot/httpd/usr/local/apache/conf
mkdir -p /chroot/httpd/www
Владельцкм всех созданых директорий должен быть root, и права на них необходимо
установить в 0755. Далее, мы создадим специальное устройство /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
Мы должны перестартовать систему или syslogd lдля того чтобы изменения вступили
в силу. О том как создать устройство /chroot/httpd/dev/log в других ОС необходимо
смотреть в man syslogd.
Следующим шагом станет копирование httpd со всеми необходимыми бинарниками и
библиотеками в новое дерево директорий. Для этого надо подготовить список всех
требуемых файлов. Это можно сделать используя следующие команды:
| Команда |
ОС |
Описание |
| ldd |
Все |
Выводит динамические зависимости запускаемых файлов или общих библиотек |
| ktrace/ktruss/kdump |
*BSD |
Включает трассировку ядра и показывает трассировочные данные |
| sotruss |
Solaris |
Трассировка вызова процедур из общих библиотек |
| strace/ltrace |
Linux |
Трассировка системных вызовов и сигналов |
| strings |
Все |
Находит печатную строку в двоичной библиотеке |
| trace |
AIX |
Записи выбраных показателей системы |
| trace (freeware) |
HP-UX <10.20 |
Печатает системные вызовы и трассеровку ядра |
| truss |
FreeBSD, Solaris, AIX 5L, SCO Unixware |
Трассировка системных вызовов и сигналов |
| tusc (freeware) |
HP-UX>11 |
Трассировка системных вызовов и сигналов |
Для примера покажу как использовать ldd, strings и truss:
localhost# ldd /usr/local/apache/bin/httpd
/usr/local/apache/bin/httpd:
libcrypt.so.2 => /usr/lib/libcrypt.so.2 (0x280bd000)
libc.so.4 => /usr/lib/libc.so.4 (0x280d6000)
localhost# strings /usr/local/apache/bin/httpd | grep lib
/usr/libexec/ld-elf.so.1
libcrypt.so.2
libc.so.4
localhost# truss /usr/local/apache/bin/httpd | grep open
(...)
open("/var/run/ld-elf.so.hints",0,00) = 3 (0x3)
open("/usr/lib/libcrypt.so.2",0,027757775370) = 3 (0x3)
open("/usr/lib/libc.so.4",0,027757775370) = 3 (0x3)
open("/etc/spwd.db",0,00) = 3 (0x3)
open("/etc/group",0,0666) = 3 (0x3)
open("/usr/local/apache/conf/httpd.conf",0,0666) = 3 (0x3)
(...)
Приведенные команды применимы не только для Apache, а также для всех библиотек
и бинарников которые требуют для своей работы другие модули. При использовании
FreeBSD вам понадобиться скопировать следующие файлы:
cp /usr/local/apache/bin/httpd /chroot/httpd/usr/local/apache/bin/
cp /var/run/ld-elf.so.hints /chroot/httpd/var/run/
cp /usr/lib/libcrypt.so.2 /chroot/httpd/usr/lib/
cp /usr/lib/libc.so.4 /chroot/httpd/usr/lib/
cp /usr/libexec/ld-elf.so.1 /chroot/httpd/usr/libexec/
Как вы наверно уже догадались, в chroot окружении также должны присутствовать
файлы конфигурации:
cp /etc/hosts /chroot/httpd/etc/
cp /etc/host.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
cp /usr/local/apache/conf/mime.types /chroot/httpd/usr/local/apache/conf/
Примечательно, что из /chroot/httpd/etc/passwords мы можем удалить все строки
кроме "nobody" и "apache". Правда в этом случае надо также удалить все кроме
"apache" и "nogroup" из /chroot/httpd/etc/group. Дальше мы построем базу
паролей:
cd /chroot/httpd/etc
pwd_mkdb -d /chroot/httpd/etc passwords
rm -rf /chroot/httpd/etc/master.passwd
Следующим шагом станет проверка. Если httpd успешно запустился в новом окружении,
то мы скопируем дефолтовый апачевский конфиг и index.html:
cp /usr/local/apache/conf/httpd.conf /chroot/httpd/usr/local/apache/co
nf/
cp /usr/local/apache/htdocs/index.html.en /chroot/httpd/www/index.html
После копирования, вышеуказаных файлов, мы должны изменить DocumentRoot как
показано ниже:
DocumentRoot "/www"
Теперь мы можем попробовать запустить наш сервер:
chroot /chroot/httpd /usr/local/apache/bin/httpd
Если в ходе запуска произошли какие-то проблемы, я рекомендую проанализировать
логи (/chroot/httpd/usr/local/apache/logs). Если же чтение логов не помогает,
можно воспользоваться следующей программой:
truss chroot /chroot/httpd /usr/local/apache/bin/httpd
Она покажет все проблемы возникающие при запуске. После того как будут исключены
все недостатки, можно приступать к конфигурации Apache.
Конфигурация Apache
Первым шагом станет удаление файла /chroot/httpd/usr/local/apache/conf/httpd.conf
и создание нового:
# =================================================
# Базовые настройки
# =================================================
ServerType standalone
ServerRoot "/usr/local/apache"
PidFile /usr/local/apache/logs/httpd.pid
ScoreBoardFile /usr/local/apache/logs/httpd.scoreboard
ResourceConfig /dev/null
AccessConfig /dev/null
# =================================================
# Performance settings
# =================================================
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
MinSpareServers 5
MaxSpareServers 10
StartServers 5
MaxClients 150
MaxRequestsPerChild 0
# =================================================
# Apaches modules
# =================================================
ClearModuleList
AddModule mod_log_config.c
AddModule mod_mime.c
AddModule mod_dir.c
AddModule mod_access.c
AddModule mod_auth.c
# =================================================
# General settings
# =================================================
Port 80
User apache
Group apache
ServerAdmin Webmaster@www.ebank.lab
UseCanonicalName Off
ServerSignature Off
HostnameLookups Off
ServerTokens Prod
DirectoryIndex index.html
DocumentRoot "/www/vhosts"
# =================================================
# 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/apache/conf/mime.types
DefaultType text/plain
AddEncoding x-compress Z
AddEncoding 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/apache/logs/error_log
CustomLog /usr/local/apache/logs/access_log combined
# =================================================
# Virtual hosts
# =================================================
NameVirtualHost *
DocumentRoot "/www/vhosts/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/vhosts/www.test.lab"
ServerName "www.test.lab"
ErrorLog logs/www.test.lab/error_log
CustomLog logs/www.test.lab/access_log combined
Приведенная конфигурация включает только те команды, которые необходимы для
выполнения предположений по безопасности и функциональности. В конфигурации
присутствуют два виртуальных хоста поддерживаемых сервером:
- www.ebank.lab (www.e-bank.lab)
- www.test.lab
Содержимое этих сайтов будет в следущих директориях:
- /chroot/httpd/www/vhosts/www.ebank.lab
- /chroot/httpd/www/vhosts/www.test.lab
Каждый из них ведет свой лог:
- /chroot/httpd/usr/local/apache/logs/www.ebank.lab
- /chroot/httpd/usr/local/apache/logs/www.test.lab
Эти директории должны быть созданы перед запуском апача, иначе он не запустится
корректно. Владелец директорий должен быть root:sys, а права установлены в 0755.
Какие мы изменения внесли в сравнении с дефолтовым конфигом:
* уменьшили кол-во подключеных модулей
* Apache не выдает информацию о его версии
* Процессы апача запускаются под уникальными идентификаторами
* Apache разрешает доступ только к тем директориям, которые указаны
в конфигурационном файле.
* Ведутся более полные логи об HTTP запросах
Финальный Шаг
И наконец мы создадим загрузочный скрипт "apache.sh":
#!/bin/sh
CHROOT=/chroot/httpd/
HTTPD=/usr/local/apache/bin/httpd
PIDFILE=/usr/local/apache/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
Приведенный скрипт необходимо скопировать в правильную директорию, где
содержаться сценарии загрузки. В случае FreeBSD это будет /usr/local/etc/rc.d.
Выводы
Приведенный метод позволяет значительно повысить безопасность сервера.
Благодаря тому, что подключены только самые необходимые модуля, обнаружение
новых уязвимостей в одном из них, не скажется на работе сервера в целом.
Отключеная информация о версии, автоиндекс директорий, и включеный chroot
делают проникновение в систему очень сложным. Окружение chroot само по себе
дает защиту от огромнейшего числа эксплойтов, т.к. в нем нет командных
интерпритаторов.
© Artur Maj
Немного об авторе:
Artur Maj работает главным инженером по разработке програмного обеспечения для
Oracle Corporation в EMEA Mobile, Wireless & Voice Center of Expertise. Он
испытаный консультант по компьютерным системам, поверяющим и потдерживающим
безопасность. Он является автором многих статей и публикаций посвященных
безопасности систем и средствам програмного обеспечения по борьбе со
злоумышленниками.
© перевод Cobalt