The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Запуск apache 2.0 в chroot окружении. (apache security chroot linux bsd solaris)


<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>
Ключевые слова: apache, security, chroot, linux, bsd, solaris,  (найти похожие документы)
From: Артур Май Newsgroups: http://www.securitylab.ru/ Date: Mon, 20 Sep 2004 18:21:07 +0000 (UTC) Subject: Запуск apache 2.0 в chroot окружении. Оригинал перевода: http://www.securitylab.ru/46288.html Англоязычный первоисточник: http://www.securityfocus.com/infocus/1786 Защищаем Apache 2. Шаг за шагом Артур Май При выборе 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: 1. Обрабатываться будут только статические HMTL страницы. 2. Сервер должен поддерживать механизм виртуального хостинга. 3. Доступ к некоторым Web страницам может быть ограничен по IP адресам или пользователям (basic authentication). 4. Сервер должен регистрировать все Web запросы (включая информацию о web браузере). Обратите внимание, что вышеупомянутые функциональные возможности не поддерживают CGI сценарии, SSL протокол или другие полезные особенности Apache сервера. Это сделано так, потому что главная цель статьи состоит в том, чтобы представить общий метод защиты Apache 2.0, не сосредотачиваясь на специфическом выполнении. Если есть потребность в дополнительных функциональных возможностях, читатели могут использовать представленное решение как отправную точку, и расширить его, включая дополнительные модули, например mod_ssl, mod_cgi и тд. Предположения защиты Чтобы обеспечить наиболее возможный уровень защиты, и в то же самое время сделать это решение переносимым среди различных Linux/BSD систем, мы будем использовать следующие уровни защиты: 1. Операционная система * операционная система должна быть укреплена в максимально возможной степени; все ненужные компоненты должны быть удалены из системы. * Операционная система не должна позволять выполнять программы на стеке (если поддерживается). * Все ненужные сетевые службы должны быть заблокированы. * Число SUID/SGID файлов должно быть минимизировано. 2. Apache web server * Включены быть только абсолютно необходимые модули Apache; остальное должно быть заблокировано в процессе компиляции * Должны быть выключены все диагностические web-страницы и автоматическая служба индексации каталога. * Cервер должен раскрыть наименьшее количество количества информации о себе насколько возможно - политика запутывания. Хотя это - не реальный уровень защиты, его применение делает возможные проникновения трудно осуществимыми. * Web сервер должен выполнятся под выделенным UID/GID, который не используется другими системными процессами. * Apache процесс должен иметь ограниченный доступ к файловой системе (chrooting). * В Apache chrooted среде не должно присутствовать никаких программных оболочек (/bin/sh, /bin/csh и т.п.) - это позволяет намного усложнить процесс выполнения вредоносного кода. Установка операционной системы Прежде всего, мы должны выбрать операционную систему, на которой будет выполняться Web сервер. Основная часть этой статьи описывает защиту Apache на FreeBSD (5.1), однако читатели могут свободно использовать их любимую Unix, BSD, Linux или Linux-подобную операционную систему. Относительно наших предположений защиты, после установки операционной системы она должна быть защищена против удаленных и локальных нападений. Независимо от выбора 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. Загрузка программного обеспечения Далее, нам необходимо загрузить последнюю версию Apache Web сервера из Web сайта Apache. Так как мы хотим отключить ненужные модули в процессе компиляции, очень важно загрузить исходный код Apache. Также важно проверить загруженное программное обеспечение против PGP сигнатуры, чтобы удостовериться, что загруженная версия немодифицирована. 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/ Выбор Apache модулей После того, как распакован исходный код Apache, мы должны выбрать, какие модули останутся, и какие должны быть удалены. Краткое описание всех модулей, доступных в Apache 2.0, могут быть найдены в http://httpd.apache.org/docs-2.0/mod/ . Выполняя функциональные возможности и требования защиты, принятые в начале этой статьи, мы компилируем только следующие модули: 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 типа. Так как мы хотим использовать только минимальное число модулей, мы компилируем все модули статически. Благодаря этому, мы устраним возможность применения уязвимости еще в одном модуле - mod_so. Компилирование и установка программного обеспечения В этом шаге мы конфигурируем, компилируем, и устанавливаем Apache Web сервер следующим образом: ./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 Конфигурирование Apache Перед первым запуском Apache, мы должны изменить файл конфигурации Apache. Мы должны сделать это, потому что заданный по умолчанию файл конфигурации использует модули, которые мы отключили, и без модификаций Apache не будет выполнятся. Таким образом, мы должны удалить/usr/local/apache2/conf/httpd.conf файл и создать новый httpd.conf в его месте, со следующим содержанием: # ================================================= # Basic settings # ================================================= Listen 0.0.0.0:80 User apache Group apache ServerAdmin [email protected] 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> По сравнению с заданным по умолчанию файлом конфигурации, были сделаны следующие важные изменения: * Уменьшено до минимума число допускаемых модулей * Процессы Apache (кроме root процесса) установлены, чтобы выполнятся с уникальными привилегиями пользователя/группы. * Apache раскрывает наименьшее количество информации о себе насколько это возможно. * Установлены более ограниченные права доступа к содержанию сайта. Согласно нашим требованиям, вышеупомянутая конфигурация предполагает, что есть два виртуальных хоста, поддержавшие Apache: * www.ebank.lab (псевдоним: www.e-bank.lab) * www.test.lab Содержание вышеупомянутых виртуальных хостов физически хранятся под /www каталогом, поэтому перед запуском Apache, мы также должны создать соответствующие каталоги с типовыми web-страницами: 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), могут помочь в решении возникших проблем. Chrooting сервера Далее, ограничим доступ Apache процесса к файловой системе. Техника chrooting подробно описана в предыдущей статье, поэтому в этом пункте мы просто создадим структуру директорий для нашего нового Apache: 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 Заключительные шаги Если теперь ваш Apache работает должным образом, нам осталось создать сценарий, который запустит Apache во время начальной загрузки системы. Для этого может использоваться следующий сценарий: #!/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 по сравнению с заданной по умолчанию инсталляцией.

<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>

Обсуждение [ RSS ]
  • 1.1, MAN (??), 22:08, 11/10/2006 [ответить]  
  • +/
    Большое спасибо! Очень пригодилась эта статья!
    Попал на сайт поисковиком.
     
  • 1.2, Василий (??), 11:35, 10/01/2007 [ответить]  
  • +/
    Хорошая статья! Но я использую Apache только для внутрених нужд. Мне суперзащита не нужна.
    Статью сохраню - может пригодиться! Спасибо!

    Bodro

     
  • 1.3, 1117 (??), 13:47, 12/05/2007 [ответить]  
  • +/
    статья "*****" - класса ,
    чтоб у автора не болели руки !!!!
    спасибо!!!!
     
  • 1.4, crazy8 (?), 20:47, 27/05/2007 [ответить]  
  • +/
    Под 6-ой версией FreeBSD апаче не будет стартовать, если все сделать по статье. Апач будет вываливаться с ошибкой:
    Operation not supported: apr_proc_detach failed
    Насколько я понял, в 6-ой фре пояивлась такая штука как devfs, то есть файловая система для устройств. По умолчанию она смонтирована в /dev. То есть, в /chroot/httpd/dev файлы устройств уже устройствами не считаются. Поэтому, чтобы чрут заработал в 6-ой, надо сделать:
    mount_devfs devfs /chroot/httpd/dev
    /sbin/devfs -m /chroot/httpd/dev rule apply hide
    /sbin/devfs -m /chroot/httpd/dev rule apply null unhide
     
  • 1.5, crazy8 (?), 20:55, 27/05/2007 [ответить]  
  • +/
    ТОЧНЕЕ:
    /sbin/devfs -m /chroot/httpd/dev rule apply hide
    /sbin/devfs -m /chroot/httpd/dev rule apply path null unhide
     
  • 1.6, Deniska (??), 11:48, 26/06/2008 [ответить]  
  • +/
    Статейка старенькая, но на нее достаточно часто натыкаешься.
    С 7й версии во FreeBSD убрали mount_devfs, вместо нее используем mount -t.
    mount -t devfs devfs /chroot/httpd/dev
     
     
  • 2.7, alex (??), 07:11, 27/04/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >Статейка старенькая, но на нее достаточно часто натыкаешься.
    >С 7й версии во FreeBSD убрали mount_devfs, вместо нее используем mount -t.
    >mount -t devfs devfs /chroot/httpd/dev

    Deniska - респект, долго с "Operation not supported apr_proc_detach failed" бился, пока на Ваш коммент не натолкнулся.


     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру