Продолжая серию предыдущих статей (Apache, PHP, MySQL), в этой статье мы расскажем о пошаговой установке и конфигурировании Apache 2.0, чтобы снизить риск неавторизованного доступа или успешного взлома в случае применения новой уязвимости, обнаруженной в Apache Web сервере. В результате, можно будет наслаждаться новыми особенностями Apache Web сервера 2.0, не слишком волнуясь о новых ошибках защиты, которые могут представлять серьезную угрозу
Артур МайПри выборе Web сервера, Apache очень часто побеждает своих конкурентов из-за стабильности, высокой производительности, открытого исходного кода и множеством других преимуществ. Сейчас Apache существует в виде двух версий - устойчивая версия 1.3, используемая миллионами пользователей и, с другой стороны, усовершенствованная и перепроектированная версия 2.0.
Хотя новая версия имеет ряд существенных дополнений и особенностей, многие администраторы все еще используют более старую версию 1.3, считая ее более устойчивой и безопасной. Множествофактовпотверждают это. Так как версия 1.3 использовалась миллионами пользователей в течение долгого времени, большинство брешей в защите в этой версии, по всей, было уже обнаружены. В то же самое время версия 2.0 может быть имеет множество пока еще не обнаруженных уязвимостей.
Продолжая серию предыдущих статей (Apache, PHP, MySQL), в этой статье мы расскажем о пошаговой установке и конфигурировании Apache 2.0, чтобы снизить риск неавторизованного доступа или успешного взлома в случае применения новой уязвимости, обнаруженной в Apache Web сервере. В результате, можно будет пользоваться новыми особенностями Apache Web сервера 2.0, не слишком волнуясь о новых ошибках защиты, которые могут представлять серьезную угрозу
Логика этого правила очень проста – если есть программное обеспечение с множеством компонентов, которые включены по умолчанию, то обнаруженная уязвимость защиты только в одном из этих компонентов, может поставить под угрозу целую систему под опасность успешного взлома. С другой стороны, если используются только несколько крайне необходимых компонентов, обнаруженная новая уязвимость защита не обязательно делает программное обеспечение уязвимым – потому что обнаруженная уязвимость может затрагивать компоненты, которые отключены или не установлены. Вероятность успешного взлома в этом случае очевидно намного ниже, чем в случае заданной по умолчанию инсталляции.
Поэтому, перед установкой Apache 2, очень важно знать, какие функциональные возможности мы действительно ожидаем от Web сервера. Это позволит нам подготовить список модулей, которые мы оставим включенными, а остальные будут отключены в процессе установки.
Согласно этому правилу, мы предполагаем, что будут использоваться только следующие основные особенности Apache 2:
Относительно наших предположений защиты, после установки операционной системы она должна быть защищена против удаленных и локальных нападений. Независимо от выбора UNIX/Linux/BSD дистрибутива, очень важно установить только основную операционную систему и удалить любые избыточные пакеты и применять на современном уровне исправления к ядру и всему установленному программному обеспечению.
Также рекомендуют периодически синхронизировать локальное время с доверенным сервером времен, используя часы с сервера времени, которому доверяют, используя Network Time Protocol (NTP), и посылать журналы регистрации удаленному, выделенному регистрационному серверу.
После того, как система подготовлена, мы можем начать устанавливать Apache 2.0. Первым шагом мы должены добавить новую группу и правильного пользовател,я названного Apache. Пример для FreeBSD показан ниже:
pw groupadd apache pw useradd apache -c "Apache Server" -d /dev/null -g apache -s /sbin/nologinДочерние Apache процессы должны выполнятся с привилегиями группы и пользователя apache. вышеупомянутая учетная запись будет выделена Apache Web серверу, это поможет обеспечить разделение привилегий и избежать потенциальных проблем защиты, когда несколько различных процессов выполняются под той же самой учетной записью, например под пользователем nobody.
lynx http://httpd.apache.org/download.cgi <download: httpd-2.0.xx.tar.gz, httpd-2.0.xx.tar.gz.asc, KEYS> gpg --import KEYS gpg httpd-2.0.49.tar.gz.asc gpg: Good signature from "Sander Striker <striker@apache.org>" tar zxvf httpd-2.0.49.tar.gz cd ./httpd-2.0.49/
Имя модуля |
Описания |
core |
Основное ядро Apache, необходимое для инсталляции. |
http_core |
Основное HTTP ядро, необходимое для Apache 2.0 инсталляции. |
prefork |
Модуль мультизадачного режима (MPM), для обеспечения многозадачной работы. |
mod_access |
Обеспечивает управление доступом, основанным на имени хоста клиента, IP-адресе и других характеристиках запроса клиента. Поскольку этот модуль необходим, чтобы использовать директивы "order", "allow" и "deny", он должен оставаться доступным. |
mod_auth |
Требуется для осуществления пользовательской идентификации (базовая HTTP идентификация). |
mod_dir |
Требуется, для поиска и обслуживания каталога с индексными файлами: "index.html", "default.htm", и т.д. |
mod_log_config |
Требуется для регистрации запросов, сделанных на сервер. |
mod_mime |
Требуется для установки набора символов, content encoding, обработчика, content-language, и документов MIME типа. |
./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После того, как Apache установлен, мы должны удостовериться, что используются только следующие модули:
/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
Таким образом, мы должны удалить/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 <IfModule mod_dir.c> DirectoryIndex index.html </IfModule> # ================================================= # HTTP and performance settings # ================================================= Timeout 300 KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 15 <IfModule prefork.c> MinSpareServers 5 MaxSpareServers 10 StartServers 5 MaxClients 150 MaxRequestsPerChild 0 </IfModule> # ================================================= # Access control # ================================================= <Directory /> Options None AllowOverride None Order deny,allow Deny from all </Directory> <Directory "/www/www.ebank.lab"> Order allow,deny Allow from all </Directory> <Directory "/www/www.test.lab"> Order allow,deny Allow from all </Directory> # ================================================= # MIME encoding # ================================================= <IfModule mod_mime.c> TypesConfig /usr/local/apache2/conf/mime.types </IfModule> DefaultType text/plain <IfModule mod_mime.c> 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 </IfModule> # ================================================= # 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 * <VirtualHost *> 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 </VirtualHost> <VirtualHost *> DocumentRoot "/www/www.test.lab" ServerName "www.test.lab" ErrorLog logs/www.test.lab/error_log CustomLog logs/www.test.lab/access_log combined </VirtualHost>По сравнению с заданным по умолчанию файлом конфигурации, были сделаны следующие важные изменения:
mkdir -p /www/www.ebank.lab mkdir -p /www/www.test.lab echo "<html><head><title>eBank.lab</title></head><body>eBank.lab works!</body></html>" > /www/www.ebank.lab/index.html echo "<html><head><title>test.lab</title></head><body>Test.lab works!</body></html>" > /www/www.test.lab/index.html chmod -R 755 /www chown -R root:sys /wwwМы должны также подготовить каталоги для хранения журналов регистраций:
mkdir -p /usr/local/apache2/logs/www.ebank.lab mkdir -p /usr/local/apache2/logs/www.test.lab chmod -R 755 /usr/local/apache2/logs chown -R root:sys /usr/local/apache2/logsНаконец, мы можем попробовать выполнить Apache, и проверить, что все работает должным образом:
/usr/local/apache2/bin/apachectl startЕсли доступен сайт www.ebank.lab через web-браузер, мы можем завершение Apache:
/usr/local/apache2/bin/apachectl stopИ затем перейдем к chroot сервера. Если возникли проблемы, должны быть проанализированы журналы регистрации или команда truss (для BSD и Solaris пользователей) следующим образом:
truss /usr/local/apache2/bin/httpdОбратите внимание, что для Linux пользователей, эквивалентная команда - strace. Анализ данных, представленных командами truss (или strace), могут помочь в решении возникших проблем.
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 системы, нужно добавить следующую строкe к /etc/rc.conf: syslogd_flags="-l /chroot/httpd/dev/log"
Для того, чтобы вступили в силу наши изменения, мы также должны перезапустить syslogd демон с новым параметром:
kill `cat /var/run/syslog.pid` /usr/sbin/syslogd -ss -l /chroot/httpd/dev/logДалее скопируем все необходимые программы, библиотеки и файлы конфигурации в новое дерево каталогов. В случае FreeBSD 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, BSD, Linux и Linux-подобных систем, список требуемых файлов может быть определен, используя команды типа ldd, strace, , truss или strings, как было описанр в предыдущей статье. После того, как сделаны вышеупомянутые шаги, мы должны подготовить базу данных пароля, которая должна присутствовать в chrooted файловой системе. Таким образом, от /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. В других системах может быть достаточно редактировать /chroot/httpd/etc/passwd и /chroot/httpd/etc/shadow файлы. Наконец, мы можем копировать типовое содержание сайта к chrooted среде:
cp -R /www/* /chroot/httpd/www/И проверить корректную работу Apache Web сервера:
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 Вышеупомянутый сценарий должен быть скопирован в каталог, где находятся по умолчанию сценарии запуска. В случае с 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, который позволяет читателям смягчать риск успешного взлома, даже если используется новая уязвимость. Было показано, как установить Apache с минимальным номером модулей, как установить более ограничительную конфигурацию, и как осуществить защиту против большого количества эксплоитов, выполняя Web сервер в chrooted среде, без использования любых программ оболочки. И хотя никакой метод не может предоставить 100% защиты, применяя вышеупомянутые рекомендации, будет намного труднее выполнить нападение против Apache 2.0 по сравнению с заданной по умолчанию инсталляцией.