В этой статье мы шаг за шагом расскажем, как правильно устанавливать и конфигурировать Apache 1.3.x Web сервер, для того чтобы смягчить или избежать возможность успешного взлома, в случае обнаружения новой уязвимости в этом популярном Web сервере.
В этой статье мы шаг за шагом расскажем, как правильно устанавливать и конфигурировать Apache 1.3.x Web сервер, для того чтобы смягчить или избежать возможность успешного взлома, в случае обнаружения новой уязвимости в этом популярном Web сервере.
Функциональные возможности:
Прежде чем защищать Apache, нужно определить функциональные возможности, ожидаемые от сервера. Разнообразие в использовании Apache делает трудным написание универсальной процедуры для защиты сервера в каждом отдельном случае. Именно поэтому в этой статье мы будем базироваться на следующих функциональных возможностях:
Стоит подчеркнуть, что вышеупомянутая модель не поддерживает PHP, JSP, CGI и любые другие технологии, которые позволяют взаимодействовать с Web службами. Использование таких технологий может представлять большую угрозу защите, так даже маленький, неприметный сценарий может радикально уменьшить уровень защиты сервера. Почему? Прежде всего, PHP/CGI приложения могут содержать уязвимость защиты (например, SQL инъекцию или межсайтовый скриптинг). Во вторых, опасна сама технология (уязвимость в PHP, Perl модулях и т.д.). Именно поэтому настоятельно рекомендуется использовать такие технологии только в тех случаях, когда взаимодействие с Web-cайтом абсолютно необходимо.
Предложения по защите.
Одним из наиболее важных элементов каждого компьютерного проекта является спецификация предложений по защите. Она должна быть выполнено прежде, чем проект осуществлен. Предложения по защите для нашего Web-сервера следующие:
Никакие программы-оболочки не должны присутствовать в chrooted среде Apache (/bin/sh,/bin/csh и т.д.).
Перед установкой Apache мы должны выбрать операционную систему, на которой будет установлен сервер. У нас имеется широкий выбор, потому что Apache может компилироваться и устанавливаться почти каждой операционной системе. В оставшейся части статьи мы расскажем, как защитить Web-сервер Apache на FreeBSD (4.7). Описанные методы можно применить в большинстве UNIX/Linux систем. Единственная операционная система, которую не рекомендуется использовать - MS Windows - главным образом из-за ограниченных возможностей поддержки Apache.
Первый шаг в защите Web-сервера укрепляет операционную систему. Обсуждение укрепления операционной системы - вне возможностей этой статьи.
После того, как система установлена и укреплена, мы должны добавить новую группу, а пользователя назвать "apache". (пример от FreeBSD):
pw groupadd apache
pw useradd apache -c "Apache Server" -d /dev/null -g apache -s /sbin/nologin
По умолчанию, процессы Apache выполняются с привилегиями пользователя nobody (кроме главного процесса, который выполняется с привилегиями root) и GID группы nogroup. Это может создать существенную угрозу защите. В случае успешного прорыва вторгшийся может получить доступ ко всем другим процессам, которые выполняются под тем же самым UID/GID. Следовательно, оптимальное решение состоит в том, чтобы выполнить Apache под UID/GID уникального пользователя/группы, специализированного под это программное обеспечение.
Подготовка программного обеспечения
Следующий шаг заключается в загрузке самой последней версии Web-сервера Apache http://httpd.Apache.org/. Некоторые из параметров Apache доступны только во время компиляции, таким образом, важно загрузить исходный код вместо двоичной версии.
После загрузки программного обеспечения, мы должны его распаковать. Затем мы должны решить, какие модули оставить доступными. Краткое описание всех модулей, доступных в самой последней версии Apache 1.3.x (1.3.27) можно найти в http://httpd.Apache.org/docs/mod/.
Модули Apache
Выбор модулей - один из наиболее важных шагов защиты Apache. Нужно действовать в соответствии с правилом: чем меньше, тем лучше. Для выполнения функциональных возможностей и предложений по защите, следующие модули должны остаться доступными:
Название модуля |
Описание |
httpd_core |
Особенности ядра Apache, требуются при каждой установке Apache |
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 типа. |
Все другие модули Apache должны быть отключены. Мы можем их безопасно отключать, главным образом потому, что они нам не нужны. Отключая ненужные модули, мы можем избежать потенциального взлома, когда была найдена новая уязвимость защиты в одном из них.
Также стоит обратить внимание на то, что два из модулей Apache могут быть наиболее опасны, чем другие: mod_autoindex и mod_info. Первый модуль обеспечивает автоматическую индексацию каталогов, и доступен по умолчанию. Этот модуль удобен для проверки выполнения Apache на сервере (например, http://server_name/icons/) и получения содержимого каталогов Web-сервера, когда в них отсутствуют индексные файлы. Второй модуль, mod_info, никогда не должен быть доступен из Internet, главным образом потому он показывает конфигурацию Apache сервера.
Следующий вопрос - как правильно скомпилировать модули. Лучше использовать статический метод. Если найдена новая уязвимость в Apache, мы вероятно повторно скомпилируем не только уязвимые модули, но и всю программу. Выбирая статический метод, мы устраняем потребность в еще одном модуле - 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 Сhrooting сервера
Сhrooting сервера
Следующий шаг должен ограничить доступ Apache к процессам файловой системы. Мы можем достигнуть этого, используя chrooting httpd демона. Вообще, средства методики chrooting, создают новую структуру корневого каталога, перемещая в него все файлы демона, и выполняя демон в этой новой среде. Благодаря этому, демон (и все дочерние процессы) будет иметь доступ только к новой структуре каталога.
Мы запустим этот процесс, создавая новую структуру корневого каталога из /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
Владельцем всех каталогов должен быть корневой каталог, а права доступа должны быть установлены в 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 демон непосредственно для вступления в силу сделанных изменений. Для создания устройства /chroot/httpd/dev/log на других операционных системах, нужно смотреть справочное руководство (man syslogd).
В следующем шаге мы должны скопировать главную httpd программу в новое дерево каталога со всеми необходимыми кодами и библиотеками. Для осуществления этого, мы должны подготовить список всех требуемых файлов. Мы можем сделать такой список, используя следующие команды (их присутствие зависит от особенностей операционной системы):
Команда |
Принадлежность |
Описание |
idd |
Все |
Показывает динамические отношения исполняемых файлов или общедоступных библиотек. |
ktrace/ktruss/kdump |
*BSD |
Разрешает трассировку процессов ядра . Отображает данные трассировки адра. |
sotruss |
Solaris |
Трассирует вызовы процедур совместно используемых библиотек |
strace/ltrace |
Linux |
Отслеживает системные вызовы и сигналы. |
strings |
Все |
Находит печатаемые строки в двоичных файлах. |
trace |
AIX |
Осуществляет запись выбранных системных событий. |
trace (freeware) |
HP-UX <10.20 |
Отображает системные вызовы и трассировку kernal процессов. |
truss |
FreeBSD, Solaris, AIX 5L, SCO Unixware |
Отслеживает системные вызовы и сигналы. |
tusc (freeware) |
HP-UX>11 |
Отслеживает системные вызовы и процессы, вызванные из 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) (...)
Вышеупомянутые команды должны применяться не только для httpd программ, но также и для всех библиотек и исходников (библиотеки часто требуют других библиотек). В случае 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/
Используя truss команду, мы можем обнаружить, что следующие файлы конфигурации должны присутствовать в chrooted среде:
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 сервера в новой chrooted среде. Для этого, мы должны скопировать файл apache конфигурации и index.html:
cp /usr/local/apache/conf/httpd.conf /chroot/httpd/usr/local/apache/conf/ cp /usr/local/apache/htdocs/index.html.en /chroot/httpd/www/index.html
После копирования вышеупомянутых файлов, мы должны изменить директиву DocumentRoot так, как представлено ниже (в /chroot/ httpd/ usr/ local/ apache/ conf/ htt pd.conf):
DocumentRoot "/www"
Затем, мы можем пробовать запустить сервер:
chroot /chroot/httpd /usr/local/apache/bin/httpd
Если возникают какие либо проблемы, рекомендуется точно анализировать логи Apache (/chroot/httpd/usr/local/apache/logs). Также может использоваться следующая команда:
truss chroot /chroot/httpd /usr/local/apache/bin/httpd
Truss программа должна показать причину проблемы. После устранения любых возможных ошибок, мы можем конфигурировать Apache сервер.
Конфигурирование Apache
Сначала должен быть удален /chroot/httpd/usr/local/apache/conf/httpd.conf файл и создан новый на его месте, с следующим содержимым:
# ================================================= # Basic settings # ================================================= 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 # ================================================= # Apache's 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 <IfModule mod_dir.c> DirectoryIndex index.html</IfModule> DocumentRoot "/www/vhosts" # ================================================= # Access control # ================================================= <Directory> Options None AllowOverride None Order deny,allow Deny from all</Directory> <Directory "/www/vhosts/www.ebank.lab"> Order allow,deny Allow from all</Directory> <Directory "/www/vhosts/www.test.lab"> Order allow,deny Allow from all</Directory> # ================================================= # MIME encoding # ================================================= <IfModule mod_mime.c> TypesConfig /usr/local/apache/conf/mime.types</IfModule> DefaultType text/plain <IfModule mod_mime.c> AddEncoding x-compress Z AddEncoding 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/apache/logs/error_log CustomLog /usr/local/apache/logs/access_log combined # ================================================= # Virtual hosts # ================================================= NameVirtualHost * <VirtualHost *> 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 </VirtualHost> <VirtualHost *> 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 </VirtualHost>
Вышеупомянутая конфигурация включает в себя только те команды, которые необходимы для сделанных предложений по защите и функциональным возможностям. В представленной конфигурации присутствуют два виртуальных хоста, поддерживаемые Web-сервером:
- /chroot/httpd/www/vhosts/www.ebank.lab
- /chroot/httpd/usr/local/apache/logs/www.ebank.lab
- /chroot/httpd/usr/local/apache/logs/www.test.lab
Вышеупомянутые каталоги должны быть созданы перед первым запуском Apache - иначе он не будет правильно выполняться. Владельцем вышеупомянутых каталогов должен быть root:sys, и права доступа должны быть установлены к 0755.
По сравнению с базовым файлом конфигурации Apache, были сделаны следующие изменения:
Финальные шаги
В конце, мы должны создать запускающий сценарий "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
Вышеупомянутый сценарий должен быть скопирован в надлежащий каталог (зависит от специфической UNIX системы), где по умолчанию содержаться сценарии запуска. В случае FreeBSD это - каталог/usr/local/etc/rc.d.
Выводы
Вышеупомянутый метод позволяет достигнуть более высокого уровня защиты Web сервера Apache, чем тот, который предлагается в заданной по умолчанию инсталляции.
Благодаря активации только абсолютно необходимых модулей Apache, обнаружение новой уязвимости в любом из них не должно указывать, на то, что сервер уязвим. Сокрытие номера версии Apache, отключение службы индексации каталогов, изменение корневой директории и ограниченная конфигурация затрудняют успешный взлом. сhrooted среда имеет также еще одно важное преимущество - устойчивость к большому количеству эксплойтов, главным образом из-за недостатка оболочки (/bin/sh,/bin/csh и т.д.). Даже если вторгшийся сможет выполнять произвольные команды системы, выход из chrooted среды будет настоящей проблемой.
Одно найти легче, чем другое. Спойлер: это не темная материя