<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Миха &#187; Веб</title>
	<atom:link href="http://saygak.com/post/category/webserver/feed" rel="self" type="application/rss+xml" />
	<link>http://saygak.com</link>
	<description></description>
	<lastBuildDate>Thu, 26 Apr 2012 18:54:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Я думал токо у нас такие тупаки на дорогах!</title>
		<link>http://saygak.com/post/841</link>
		<comments>http://saygak.com/post/841#comments</comments>
		<pubDate>Fri, 30 Jul 2010 19:57:21 +0000</pubDate>
		<dc:creator>Michael Saygak</dc:creator>
				<category><![CDATA[Веб]]></category>
		<category><![CDATA[Ссылки]]></category>
		<category><![CDATA[велосипед]]></category>
		<category><![CDATA[видео]]></category>

		<guid isPermaLink="false">http://saygak.com/post/841</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:d14adeb0-4c23-45c4-ba6b-b3c188bba86e" class="wlWriterEditableSmartContent">
<div><object width="533" height="445"><param name="movie" value="http://www.youtube.com/v/OcsZxUDWCXg&amp;hl=en"></param><embed src="http://www.youtube.com/v/OcsZxUDWCXg&amp;hl=en" type="application/x-shockwave-flash" width="533" height="445"></embed></object></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://saygak.com/post/841/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>horde</title>
		<link>http://saygak.com/post/77</link>
		<comments>http://saygak.com/post/77#comments</comments>
		<pubDate>Thu, 18 Jan 2007 12:39:32 +0000</pubDate>
		<dc:creator>Michael Saygak</dc:creator>
				<category><![CDATA[Веб]]></category>

		<guid isPermaLink="false">http://saygak.com/post/77</guid>
		<description><![CDATA[XML библиотеки: /usr/ports/textproc/libxml2 make install cd /usr/ports/textproc/libxslt make install Выкачиваем и собираем библиотеку imap для php cd /usr/ports/mail/imap-uw make fetch cd cd dist/ mkdir imap cd imap/ tar -zxf /usr/ports/distfiles/imap-2004c1.tar.Z cd imap-2004c1/ make bsf SSLTYPE=none cd c-client/ cp c-client.a libc-client.a Пересобираем php и apache cd ~/dist/www rm -rf php-4.4.4 rm -rf apache_1.3.37 tar -zxf php-4.4.4.tar.gz [...]]]></description>
			<content:encoded><![CDATA[<p>XML библиотеки:<br />
/usr/ports/textproc/libxml2<br />
make install<br />
<span id="more-77"></span></p>
<p>cd /usr/ports/textproc/libxslt<br />
make install</p>
<p>Выкачиваем и собираем библиотеку imap для php<br />
cd /usr/ports/mail/imap-uw<br />
make fetch<br />
cd<br />
cd dist/<br />
mkdir imap<br />
cd imap/<br />
tar -zxf /usr/ports/distfiles/imap-2004c1.tar.Z<br />
cd imap-2004c1/<br />
make bsf SSLTYPE=none<br />
cd c-client/<br />
cp c-client.a libc-client.a</p>
<p>Пересобираем php и apache<br />
cd ~/dist/www<br />
rm -rf php-4.4.4<br />
rm -rf apache_1.3.37<br />
tar -zxf php-4.4.4.tar.gz<br />
tar -zxf apache_1.3.37.tar.gz</p>
<p>cd apache_1.3.37 &#038;&#038; ./configure</p>
<p>cd ../php-4.4.4<br />
./configure &#8212;with-freetype-dir=/usr/local/include/freetype2 &#8212;with-mysql=/usr/local/mysql &#8212;with-apache=../apache_1.3.37  &#8212;with-gettext &#8212;enable-mod_charset &#8212;with-zlib  &#8212;with-gd  &#8212;with-jpeg-dir=/usr/local/include &#8212;with-dom &#8212;with-dom-xslt &#8212;with-iconv &#8212;with-imap=../../imap/imap-2004c1<br />
make<br />
make install</p>
<p>cd ../apache_1.3.37<br />
./configure &#8212;prefix=/usr/local/apache &#8212;activate-module=src/modules/php4/libphp4.a &#8212;disable-module=all &#8212;server-uid=www &#8212;server-gid=www  &#8212;enable-module=vhost_alias &#8212;enable-module=env &#8212;enable-module=log_config &#8212;enable-module=log_referer &#8212;enable-module=mime &#8212;enable-module=negotiation &#8212;enable-module=status &#8212;enable-module=include &#8212;enable-module=autoindex &#8212;enable-module=dir &#8212;enable-module=cgi &#8212;enable-module=asis &#8212;enable-module=imap &#8212;enable-module=actions &#8212;enable-module=userdir &#8212;enable-module=alias &#8212;enable-module=rewrite &#8212;enable-module=access &#8212;enable-module=php4 &#8212;enable-module=auth &#8212;enable-module=setenvif &#8212;enable-suexec &#8212;suexec-caller=www &#8212;suexec-docroot=/home/www/virtual2 &#8212;suexec-logfile=/usr/local/apache/logs/suexec.log &#8212;suexec-uidmin=5000 &#8212;suexec-gidmin=5000<br />
make</p>
<p>killall httpd<br />
cp  ./src/httpd /usr/local/chroot/usr/local/apache/bin/<br />
cp ./src/support/suexec /usr/local/chroot/usr/local/apache/bin/<br />
chmod u+s /usr/local/chroot/usr/local/apache/bin/suexec<br />
cp /usr/lib/libpam.so.2 /usr/local/chroot/usr/local/lib/<br />
cp /usr/local/lib/libxslt.so.2 /usr/local/chroot/usr/local/lib/<br />
cp /usr/local/lib/libxml2.so /usr/local/chroot/usr/local/lib/</p>
<p>chroot /usr/local/chroot/ /usr/local/apache/bin/httpd -t<br />
chroot /usr/local/chroot/ /usr/local/apache/bin/httpd</p>
<p>http://noc.smarthost.kiev.ua/info.php</p>
<p>bash-2.05b# /usr/local/apache/bin/httpd -l<br />
Compiled-in modules:<br />
  http_core.c<br />
  mod_vhost_alias.c<br />
  mod_env.c<br />
  mod_log_config.c<br />
  mod_log_referer.c<br />
  mod_mime.c<br />
  mod_negotiation.c<br />
  mod_status.c<br />
  mod_include.c<br />
  mod_autoindex.c<br />
  mod_dir.c<br />
  mod_cgi.c<br />
  mod_asis.c<br />
  mod_imap.c<br />
  mod_actions.c<br />
  mod_userdir.c<br />
  mod_alias.c<br />
  mod_rewrite.c<br />
  mod_access.c<br />
  mod_auth.c<br />
  mod_setenvif.c<br />
  mod_php4.c<br />
suexec: enabled; valid wrapper /usr/local/apache/bin/suexec</p>
<p>1.  gunzip -c apache_1.3.x.tar.gz | tar xf -<br />
2.  cd apache_1.3.x<br />
3.  ./configure<br />
4.  cd ..</p>
<p>5.  gunzip -c php-4.x.y.tar.gz | tar xf -<br />
6.  cd php-4.x.y<br />
7.  ./configure &#8212;with-mysql &#8212;with-apache=../apache_1.3.x<br />
8.  make<br />
9.  make install</p>
<p>10. cd ../apache_1.3.x</p>
<p>11. ./configure &#8212;prefix=/www &#8212;activate-module=src/modules/php4/libphp4.a<br />
    (The above line is correct! Yes, we know libphp4.a does not exist at this<br />
    stage. It isn&#8217;t supposed to. It will be created.)</p>
<p>12. make<br />
    (you should now have an httpd binary which you can copy to your Apache bin<br />
dir if<br />
    is is your first install then you need to &#171;make install&#187; as well)</p>
<p>13. cd ../php-4.x.y<br />
14. cp php.ini-dist /usr/local/lib/php.ini</p>
<p>15. You can edit /usr/local/lib/php.ini file to set PHP options.<br />
    Edit your httpd.conf or srm.conf file and add:<br />
    AddType application/x-httpd-php .php</p>
<p>long utf8_mime2text (SIZEDTEXT *src,SIZEDTEXT *dst,long flags);</p>
<p>&#8212;<br />
Best regards,<br />
Michael Saygak<br />
DO, IS Department<br />
Cell: +380 50 330 5592<br />
E-mail: MSaygak@umc.com.ua</p>
]]></content:encoded>
			<wfw:commentRss>http://saygak.com/post/77/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>apache+php</title>
		<link>http://saygak.com/post/76</link>
		<comments>http://saygak.com/post/76#comments</comments>
		<pubDate>Thu, 18 Jan 2007 12:38:58 +0000</pubDate>
		<dc:creator>Michael Saygak</dc:creator>
				<category><![CDATA[Веб]]></category>

		<guid isPermaLink="false">http://saygak.com/post/76</guid>
		<description><![CDATA[/usr/ports/textproc/libxml2 libxml2-2.6.26.tar.bz2 cd /usr/ports/textproc/libxslt ===> Registering installation for libxslt-1.1.17 ftp://ftp.cac.washington.edu/imap/ make bsf SSLTYPE=none ee c-client/LDFLAGS rm -ldl make bsf SSLTYPE=none /usr/ports/mail/imap-uw make install -DWITHOUT_SSL rm -rf php-4.4.4 rm -rf apache_1.3.37 tar -zxf php-4.4.4.tar.gz tar -zxf apache_1.3.37.tar.gz cd apache_1.3.37 &#038;&#038; ./configure cd ../php-4.4.4 ./configure &#8212;with-freetype-dir=/usr/local/include/freetype2 &#8212;with-mysql=/usr/local/mysql &#8212;with-apache=../apache_1.3.37 &#8212;with-gettext &#8212;enable-mod_charset &#8212;with-zlib &#8212;with-gd &#8212;with-jpeg-dir=/usr/local/include &#8212;with-dom &#8212;with-dom-xslt &#8212;with-iconv &#8212;with-imap=../imap-2006c1 [...]]]></description>
			<content:encoded><![CDATA[<p>/usr/ports/textproc/libxml2<br />
libxml2-2.6.26.tar.bz2<br />
<span id="more-76"></span><br />
cd /usr/ports/textproc/libxslt<br />
===>   Registering installation for libxslt-1.1.17</p>
<p>ftp://ftp.cac.washington.edu/imap/<br />
make bsf SSLTYPE=none<br />
ee c-client/LDFLAGS<br />
rm -ldl<br />
make bsf SSLTYPE=none</p>
<p>/usr/ports/mail/imap-uw<br />
make install -DWITHOUT_SSL</p>
<p>rm -rf php-4.4.4<br />
rm -rf apache_1.3.37<br />
tar -zxf php-4.4.4.tar.gz<br />
tar -zxf apache_1.3.37.tar.gz</p>
<p>cd apache_1.3.37 &#038;&#038; ./configure</p>
<p>cd ../php-4.4.4<br />
./configure &#8212;with-freetype-dir=/usr/local/include/freetype2 &#8212;with-mysql=/usr/local/mysql &#8212;with-apache=../apache_1.3.37  &#8212;with-gettext &#8212;enable-mod_charset &#8212;with-zlib  &#8212;with-gd  &#8212;with-jpeg-dir=/usr/local/include &#8212;with-dom &#8212;with-dom-xslt &#8212;with-iconv &#8212;with-imap=../imap-2006c1<br />
make<br />
make install</p>
<p>cd ../apache_1.3.37<br />
./configure &#8212;prefix=/usr/local/apache &#8212;activate-module=src/modules/php4/libphp4.a &#8212;disable-module=all &#8212;server-uid=apache &#8212;server-gid=www  &#8212;enable-module=vhost_alias &#8212;enable-module=env &#8212;enable-module=log_config &#8212;enable-module=log_referer &#8212;enable-module=mime &#8212;enable-module=negotiation &#8212;enable-module=status &#8212;enable-module=include &#8212;enable-module=autoindex &#8212;enable-module=dir &#8212;enable-module=cgi &#8212;enable-module=asis &#8212;enable-module=imap &#8212;enable-module=actions &#8212;enable-module=userdir &#8212;enable-module=alias &#8212;enable-module=rewrite &#8212;enable-module=access &#8212;enable-module=php4 &#8212;enable-module=auth &#8212;enable-module=setenvif &#8212;enable-suexec &#8212;suexec-caller=apache &#8212;suexec-docroot=/home/www/virtual &#8212;suexec-logfile=/usr/local/apache/logs/suexec.log &#8212;suexec-uidmin=5000 &#8212;suexec-gidmin=5000<br />
make</p>
<p>killall httpd<br />
cp  ./src/httpd /usr/local/chroot/usr/local/apache/bin/<br />
cp ./src/support/suexec /usr/local/chroot/usr/local/apache/bin/<br />
chmod u+s /usr/local/chroot/usr/local/apache/bin/suexec</p>
<p>chroot /usr/local/chroot/ /usr/local/apache/bin/httpd -t<br />
chroot /usr/local/chroot/ /usr/local/apache/bin/httpd</p>
<p>http://noc.smarthost.kiev.ua/info.php</p>
<p>bash-2.05b# /usr/local/apache/bin/httpd -l<br />
Compiled-in modules:<br />
  http_core.c<br />
  mod_vhost_alias.c<br />
  mod_env.c<br />
  mod_log_config.c<br />
  mod_log_referer.c<br />
  mod_mime.c<br />
  mod_negotiation.c<br />
  mod_status.c<br />
  mod_include.c<br />
  mod_autoindex.c<br />
  mod_dir.c<br />
  mod_cgi.c<br />
  mod_asis.c<br />
  mod_imap.c<br />
  mod_actions.c<br />
  mod_userdir.c<br />
  mod_alias.c<br />
  mod_rewrite.c<br />
  mod_access.c<br />
  mod_auth.c<br />
  mod_setenvif.c<br />
  mod_php4.c<br />
suexec: enabled; valid wrapper /usr/local/apache/bin/suexec</p>
<p>1.  gunzip -c apache_1.3.x.tar.gz | tar xf -<br />
2.  cd apache_1.3.x<br />
3.  ./configure<br />
4.  cd ..</p>
<p>5.  gunzip -c php-4.x.y.tar.gz | tar xf -<br />
6.  cd php-4.x.y<br />
7.  ./configure &#8212;with-mysql &#8212;with-apache=../apache_1.3.x<br />
8.  make<br />
9.  make install</p>
<p>10. cd ../apache_1.3.x</p>
<p>11. ./configure &#8212;prefix=/www &#8212;activate-module=src/modules/php4/libphp4.a<br />
    (The above line is correct! Yes, we know libphp4.a does not exist at this<br />
    stage. It isn&#8217;t supposed to. It will be created.)</p>
<p>12. make<br />
    (you should now have an httpd binary which you can copy to your Apache bin<br />
dir if<br />
    is is your first install then you need to &#171;make install&#187; as well)</p>
<p>13. cd ../php-4.x.y<br />
14. cp php.ini-dist /usr/local/lib/php.ini</p>
<p>15. You can edit /usr/local/lib/php.ini file to set PHP options.<br />
    Edit your httpd.conf or srm.conf file and add:<br />
    AddType application/x-httpd-php .php</p>
<p>long utf8_mime2text (SIZEDTEXT *src,SIZEDTEXT *dst,long flags);</p>
]]></content:encoded>
			<wfw:commentRss>http://saygak.com/post/76/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Защищаем Apache Web сервер</title>
		<link>http://saygak.com/post/59</link>
		<comments>http://saygak.com/post/59#comments</comments>
		<pubDate>Wed, 11 Oct 2006 19:44:31 +0000</pubDate>
		<dc:creator>Michael Saygak</dc:creator>
				<category><![CDATA[Веб]]></category>

		<guid isPermaLink="false">http://saygak.com/post/59</guid>
		<description><![CDATA[17 июля, 2003 Artur Maj, по материалам SecurityFocus.com В этой статье мы шаг за шагом расскажем,  как правильно устанавливать и конфигурировать Apache 1.3.x Web сервер, для того чтобы смягчить или избежать возможность успешного взлома, в случае обнаружения новой уязвимости в этом популярном Web сервере. Функциональные возможности: Прежде чем защищать Apache, нужно определить  функциональные возможности, ожидаемые [...]]]></description>
			<content:encoded><![CDATA[<p><font class="text"><b>17 июля, 2003</b></font></p>
<p>                                        Artur Maj, по материалам SecurityFocus.com </p>
<p align="justify">В этой статье мы шаг за шагом расскажем,  как правильно устанавливать<br />
  и конфигурировать Apache 1.3.x Web сервер, для того чтобы смягчить или избежать<br />
  возможность успешного взлома, в случае обнаружения новой уязвимости в этом популярном<br />
  Web сервере.</p>
<p><span id="more-59"></span></p>
<p align="justify">Функциональные возможности:</p>
<p align="justify">Прежде чем защищать Apache, нужно определить  функциональные<br />
  возможности, ожидаемые от сервера. Разнообразие в использовании Apache делает<br />
  трудным написание универсальной процедуры для защиты сервера в каждом отдельном<br />
  случае. Именно поэтому в этой статье мы будем базироваться на следующих функциональных<br />
  возможностях:</p>
<div align="justify">
<ul>
<li> Web-сервер  будет доступен из Internet; и,
    </li>
<li> Будут обслуживаться только статические HTML страницы
    </li>
<li> Сервер будет поддерживать  виртуальный механизм хостинга на основе имен.
    </li>
<li> Указанные Web-страницы могут быть доступны только для выбранных IP-адресов<br />
      или пользователей (базовая идентификация)
    </li>
<li> Сервер регистрирует все Web-запросы (включая информацию о Web-браузерах)
  </li>
</ul>
</div>
<p align="justify">Стоит подчеркнуть, что вышеупомянутая модель не поддерживает<br />
  PHP, JSP, CGI и  любые другие технологии, которые позволяют взаимодействовать<br />
  с Web службами. Использование таких технологий может представлять большую угрозу<br />
  защите, так  даже маленький, неприметный сценарий может радикально уменьшить<br />
  уровень защиты сервера. Почему? Прежде всего, PHP/CGI приложения могут содержать<br />
  уязвимость защиты (например, SQL инъекцию или межсайтовый скриптинг). Во вторых,<br />
  опасна сама технология (уязвимость в PHP, Perl модулях и т.д.). Именно поэтому<br />
  настоятельно рекомендуется использовать такие технологии только в тех случаях, <br />
  когда взаимодействие с Web-cайтом абсолютно необходимо. </p>
<p align="justify"><b>Предложения по  защите.</b></p>
<p align="justify">Одним из наиболее важных элементов каждого компьютерного проекта<br />
  является спецификация предложений по защите. Она должна быть выполнено прежде,<br />
  чем проект осуществлен. Предложения по защите для нашего Web-сервера следующие:
</p>
<div align="justify">
<ul>
<li> Операционная система должна быть  в максимально возможной степени защищена <br />
      от  локальных и удаленных нападений;
    </li>
<li> Сервер не должен поддерживать отличные от HTTP(80/TCP) сетевые протоколы;
    </li>
<li> Удаленный доступ к серверу должен управляться межсетевой защитой, которая<br />
      должна блокировать все внешние подключения и разрешать  входящие подключения<br />
      только через 80/TCP порт Web-сервера;
    </li>
<li> Apache Web server должен быть единственной службой,  доступной системе;
    </li>
<li> Необходимо разрешить использование только самых необходимых модулей Apache;
    </li>
<li> Должны быть выключены любые диагностические Web-страницы и автоматические<br />
      службы индексации каталога;
    </li>
<li> Сервер должен раскрыть наименьшее количество информации о себе (защита<br />
      втемную);
    </li>
<li> Сервер Apache должен выполняться под уникальным UID/GID, не используемым<br />
      никаким другим системным процессом;
    </li>
<li> Процессы Apache, должны быть, ограничены доступом к системным файлам<br />
      (chrooting); и,
    </li>
<li>
  </li>
</ul>
</div>
<ul>
<li>
<p align="justify">Никакие программы-оболочки не должны присутствовать в chrooted<br />
      среде Apache (/bin/sh,/bin/csh и т.д.). </p>
</li>
</ul>
<h3 align="justify">Инсталляция операционной системы </h3>
<p align="justify">Перед установкой <a name="OLE_LINK11">Apache </a>мы должны<br />
  выбрать операционную систему, на которой будет установлен сервер. У нас имеется<br />
  широкий выбор, потому что Apache может компилироваться и устанавливаться почти<br />
  каждой операционной системе. В оставшейся части статьи мы расскажем, как защитить<br />
  Web-сервер Apache на FreeBSD (4.7). Описанные методы можно применить в большинстве<br />
  UNIX/Linux систем. Единственная операционная система, которую не рекомендуется<br />
  использовать &#8212; MS Windows &#8212; главным образом из-за ограниченных возможностей<br />
  поддержки Apache.</p>
<p align="justify">Первый шаг в защите Web-сервера укрепляет операционную систему.<br />
  Обсуждение укрепления операционной системы &#8212; вне возможностей этой статьи.</p>
<p align="justify">После того, как система установлена и укреплена, мы должны<br />
  добавить новую группу, а  пользователя назвать &#171;apache&#187;. (пример от<br />
  FreeBSD): </p>
<p align="justify">pw groupadd apache</p>
<p align="justify">pw useradd apache -c &#171;Apache Server&#187; -d /dev/null<br />
  -g apache -s /sbin/nologin</p>
<p align="justify">По умолчанию, процессы Apache  выполняются с привилегиями пользователя<br />
  <i>nobody</i> (кроме главного процесса, который выполняется с привилегиями <i>root</i>)<br />
  и GID группы <i>nogroup</i>. Это может создать существенную угрозу защите. В<br />
  случае успешного прорыва  вторгшийся может получить доступ ко всем другим процессам,<br />
  которые выполняются под тем же самым UID/GID. Следовательно, оптимальное решение<br />
  состоит в том, чтобы выполнить Apache под UID/GID уникального пользователя/группы,<br />
  специализированного под это программное обеспечение. </p>
<p align="justify"><b>Подготовка программного обеспечения</b> </p>
<p align="justify">Следующий шаг заключается в  загрузке самой последней версии<br />
  <u>Web</u><u>-сервера </u><u>Apache</u><u> </u><u>http://httpd.</u><u>Apache</u><u>.org/</u>.<br />
  Некоторые из параметров Apache доступны только во время компиляции, таким образом,<br />
  важно загрузить исходный код вместо двоичной версии.</p>
<p align="justify">После загрузки программного обеспечения, мы должны  его распаковать.<br />
  Затем мы должны решить, какие модули оставить доступными. Краткое описание всех<br />
  модулей, доступных в самой последней версии Apache 1.3.x (1.3.27) можно найти<br />
  в <u> http://httpd.</u><u>Apache</u><u>.org/docs/mod/.</u> </p>
<p align="justify"><b>Модули </b><b> Apache</b></p>
<p align="justify">Выбор модулей &#8212; один из наиболее важных шагов защиты Apache.<br />
  Нужно действовать в соответствии с правилом: чем меньше, тем  лучше. Для выполнения<br />
  функциональных возможностей и предложений по защите, следующие модули должны<br />
  остаться доступными: </p>
<div align="justify">
<table border=1 cellspacing=0 cellpadding=0 width="627">
<tr>
<td width=131 valign=top>
<p align=center><b>Название модуля</b></p>
</td>
<td width=490 valign=top>
<p align=center><b>Описание</b></p>
</td>
</tr>
<tr>
<td width=131 valign=top>
<p>httpd_core</p>
</td>
<td width=490 valign=top>
<p>Особенности ядра Apache, требуются при каждой<br />
          установке Apache</p>
</td>
</tr>
<tr>
<td width=131 valign=top>
<p>mod_access</p>
</td>
<td width=490 valign=top>
<p>Обеспечивает управление доступом, основанным<br />
          на имени хоста клиента, IP-адресе и других характеристиках запроса клиента.<br />
          Поскольку этот модуль необходим, чтобы использовать директивы &#171;order&#187;,<br />
          &#171;allow&#187; и &#171;deny&#187;, он  должен оставаться доступным.</p>
</td>
</tr>
<tr>
<td width=131 valign=top>
<p>mod_auth</p>
</td>
<td width=490 valign=top>
<p>Требуется для осуществления пользовательской<br />
          идентификации (базовая HTTP идентификация).</p>
</td>
</tr>
<tr>
<td width=131 valign=top>
<p>mod_dir</p>
</td>
<td width=490 valign=top>
<p><a name="OLE_LINK12">Требуется</a>, для поиска<br />
          и обслуживания каталога с индексными файлами: &#171;index.html&#187;,<br />
          &#171;default.htm&#187;, и т.д.</p>
</td>
</tr>
<tr>
<td width=131 valign=top>
<p>mod_log_config</p>
</td>
<td width=490 valign=top>
<p>Требуется для регистрации запросов, сделанных<br />
          на сервер.</p>
</td>
</tr>
<tr>
<td width=131 valign=top>
<p>mod_mime</p>
</td>
<td width=490 valign=top>
<p>Требуется для установки набора символов, <b>content</b><b><br />
          </b><b>encoding</b>, обработчика, <b>content</b><b>-</b><b>language</b>,<br />
          и документов MIME типа.</p>
</td>
</tr>
</table>
</div>
<p align="justify">Все другие модули  Apache должны быть отключены. Мы можем их<br />
  безопасно отключать, главным образом потому, что они нам не нужны. Отключая<br />
  ненужные модули, мы можем избежать потенциального взлома, когда была найдена<br />
  новая уязвимость защиты  в одном из них. </p>
<p align="justify">Также стоит обратить внимание на то, что два из модулей Apache<br />
  могут быть наиболее опасны, чем другие: <i>mod_autoindex</i> и <i>mod_info</i>.<br />
  Первый модуль обеспечивает автоматическую индексацию каталогов, и доступен по<br />
  умолчанию. Этот модуль удобен для проверки выполнения Apache на сервере (например,<br />
  http://server_name/icons/) и получения содержимого каталогов Web-сервера, когда<br />
  в них  отсутствуют индексные файлы. Второй модуль, <i>mod_info</i>, никогда<br />
  не должен быть доступен из Internet, главным образом потому он показывает конфигурацию<br />
  Apache сервера. </p>
<p align="justify">Следующий вопрос &#8212; как правильно скомпилировать модули. Лучше<br />
  использовать статический метод. Если найдена новая уязвимость в Apache, мы вероятно<br />
  повторно скомпилируем не только уязвимые модули, но и всю программу. Выбирая<br />
  статический метод, мы устраняем потребность в еще одном модуле &#8212; <i>mod_so</i>.
</p>
<p align="justify"><b>Компиляция программы</b></p>
<p align="justify">Сначала, если возможно, должны быть установлены все патчи защиты.<br />
  Затем, сервер должен быть скомпилирован и установлен следующим образом: </p>
<div align="justify">
<pre>
./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 сервера
</pre>
</div>
<p align="justify"><b>Сhrooting сервера</b></p>
<p align="justify">Следующий шаг должен ограничить доступ <a name="OLE_LINK40">Apache</a><br />
  к процессам  файловой системы<a name="OLE_LINK39">. Мы можем достигнуть этого,<br />
  используя </a>chrooting  httpd демона. Вообще, средства методики chrooting,<br />
  создают новую структуру корневого каталога, перемещая в него все файлы демона,<br />
  и выполняя демон в этой новой среде. Благодаря этому, демон (и все дочерние<br />
  процессы) будет иметь доступ только к новой структуре каталога. </p>
<p align="justify">Мы запустим этот процесс, создавая новую структуру корневого<br />
  каталога из  /chroot/httpd:</p>
<div align="justify">
<pre>
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
  </pre>
</div>
<p align="justify">Владельцем всех  каталогов должен быть корневой каталог, а<br />
  права доступа должны быть установлены в 0755. Затем, мы создадим специальный<br />
  файл устройства: /dev/null</p>
<div align="justify">
<pre>
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
</pre>
</div>
<p align="justify">Различные методы должны использоваться для создания устройства<br />
  /chroot/httpd/dev/log, которое также необходимо для правильной работы сервера.<br />
  В случае системы FreeBSD,  к /etc/rc.conf должна быть добавлена следующая строка:</p>
<p align="justify"><b>syslogd_flags=&#187;-l /chroot/httpd/dev/log&#187;</b></p>
<p align="justify">Мы должны перезапустить систему или syslogd демон непосредственно<br />
  для вступления в силу сделанных изменений. Для создания устройства /chroot/httpd/dev/log <br />
  на других операционных системах, нужно смотреть справочное руководство (man<br />
  syslogd).</p>
<p align="justify">В следующем шаге мы должны скопировать главную httpd программу<br />
  в новое дерево каталога со всеми необходимыми кодами и библиотеками. Для осуществления<br />
  этого, мы должны подготовить список всех требуемых файлов. Мы можем сделать<br />
  такой список, используя следующие команды (их присутствие зависит от особенностей<br />
  операционной системы): </p>
<div align="justify">
<table border=1 cellpadding=0>
<tr>
<td width=180 align="center">
<p>Команда</p>
</td>
<td width=161 align="center">
<p>Принадлежность</p>
</td>
<td width=304 align="left">
<p>Описание</p>
</td>
</tr>
<tr>
<td width=180 align="center">
<p><i><b>idd</b></i></p>
</td>
<td width=161 align="center">
<p>Все</p>
</td>
<td width=304 valign=top align="left">
<p>Показывает  динамические  отношения<br />
          исполняемых файлов или общедоступных библиотек.</p>
</td>
</tr>
<tr>
<td width=180 align="center">
<p><i><b>ktrace/ktruss/kdump</b></i></p>
</td>
<td width=161 align="center">
<p>*BSD</p>
</td>
<td width=304 valign=top align="left">
<p>Разрешает трассировку процессов ядра<br />
          . Отображает данные трассировки<br />
        адра.</p>
</td>
</tr>
<tr>
<td width=180 align="center">
<p><i><b>sotruss</b></i></p>
</td>
<td width=161 align="center">
<p>Solaris</p>
</td>
<td width=304 valign=top align="left">
<p>Трассирует вызовы процедур совместно<br />
          используемых библиотек </p>
</td>
</tr>
<tr>
<td width=180 align="center">
<p><i><b>strace/ltrace</b></i></p>
</td>
<td width=161 align="center">
<p>Linux</p>
</td>
<td width=304 valign=top align="left">
<p>Отслеживает системные вызовы и<br />
          сигналы.</p>
</td>
</tr>
<tr>
<td width=180 align="center">
<p><i><b>strings</b></i></p>
</td>
<td width=161 align="center">
<p>Все</p>
</td>
<td width=304 valign=top align="left">
<p>Находит  печатаемые строки в двоичных<br />
          файлах.</p>
</td>
</tr>
<tr>
<td width=180 align="center">
<p><i><b>trace</b></i></p>
</td>
<td width=161 align="center">
<p>AIX</p>
</td>
<td width=304 valign=top align="left">
<p>Осуществляет запись выбранных<br />
          системных событий.</p>
</td>
</tr>
<tr>
<td width=180 align="center">
<p><i><b>trace (freeware)</b></i></p>
</td>
<td width=161 align="center">
<p>HP-UX &lt;10.20</p>
</td>
<td width=304 valign=top align="left">
<p>Отображает системные вызовы и<br />
          трассировку kernal процессов.</p>
</td>
</tr>
<tr>
<td width=180 align="center">
<p><i><b>truss</b></i></p>
</td>
<td width=161 align="center">
<p>FreeBSD, Solaris, AIX 5L, SCO Unixware</p>
</td>
<td width=304 valign=top align="left">
<p>Отслеживает системные вызовы и<br />
          сигналы.</p>
</td>
</tr>
<tr>
<td width=180 align="center">
<p><i><b>tusc (freeware)</b></i></p>
</td>
<td width=161 align="center">
<p>HP-UX>11</p>
</td>
<td width=304 valign=top align="left">
<p>Отслеживает системные вызовы и<br />
          процессы, вызванные из HP-UX 11</p>
</td>
</tr>
</table>
</div>
<p align="justify">Ниже представлены примеры использования ldd, strings и truss<br />
  команд.</p>
<div align="justify">
<pre>
  localhost# ldd /usr/local/apache/bin/httpd
/usr/local/apache/bin/httpd:
 libcrypt.so.2 =&gt; /usr/lib/libcrypt.so.2 (0x280bd000)
 libc.so.4 =&gt; /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)
(...)
</pre>
</div>
<p align="justify">Вышеупомянутые команды должны применяться не только для  httpd<br />
  программ, но также и для всех библиотек и исходников (библиотеки часто требуют<br />
  других библиотек). В случае FreeBSD системы, следующие файлы должны быть скопированы<br />
  в новую структуру корневого каталога:</p>
<div align="justify">
<pre>
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/
</pre>
</div>
<p align="justify">Используя truss команду, мы можем  обнаружить, что следующие<br />
  файлы конфигурации должны присутствовать в chrooted среде:</p>
<div align="justify">
<pre>
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/
  </pre>
</div>
<p align="justify">Обратите внимание, что мы должны удалить все строки из <b>/chroot/httpd/etc/passwords,</b><br />
  кроме <b>&#171;</b><b>nobody</b><b>&#171;</b> и <b>&#171;</b><b>apache</b><b>&#171;.</b><br />
  Подобным способом, мы должны удалить все строки кроме <b>&#171;</b><b>apache</b><b>&#171;</b><br />
  и &#171;<b>nogroup</b><b>&#171;</b> из <b>/chroot/httpd/etc/group.</b> Затем,<br />
  мы должны построить базу данных паролей следующим образом: </p>
<div align="justify">
<pre>
cd /chroot/httpd/etc
pwd_mkdb -d /chroot/httpd/etc passwords
rm -rf /chroot/httpd/etc/master.passwd
  </pre>
</div>
<p align="justify">Следующий шаг состоит в проверке правильности выполнения httpd<br />
   сервера в новой chrooted среде. Для этого, мы должны скопировать  файл apache<br />
  конфигурации и index.html: </p>
<div align="justify">
<pre>
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
  </pre>
</div>
<p align="justify">После копирования вышеупомянутых файлов, мы должны изменить<br />
  директиву DocumentRoot так,  как представлено ниже (в /chroot/ httpd/ usr/ local/<br />
  apache/ conf/ htt pd.conf): </p>
<p align="justify">DocumentRoot &#171;/www&#187;</p>
<p align="justify">Затем, мы можем пробовать запустить сервер:</p>
<p align="justify">chroot /chroot/httpd /usr/local/apache/bin/httpd</p>
<p align="justify">Если возникают какие либо  проблемы, рекомендуется точно анализировать<br />
  логи Apache (/chroot/httpd/usr/local/apache/logs). Также может использоваться<br />
  следующая команда: </p>
<p align="justify">truss chroot /chroot/httpd /usr/local/apache/bin/httpd</p>
<p align="justify">Truss программа должна показать причину проблемы. После устранения<br />
  любых возможных ошибок, мы можем конфигурировать Apache сервер.</p>
<p align="justify"><b>Конфигурирование </b><b>Apache</b></p>
<p align="justify">Сначала должен быть удален /chroot/httpd/usr/local/apache/conf/httpd.conf<br />
  файл и создан новый на его месте, с следующим содержимым:</p>
<div align="justify">
<pre>
  # =================================================
# 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
&lt;IfModule mod_dir.c&gt;
    DirectoryIndex index.html&lt;/IfModule&gt;
DocumentRoot "/www/vhosts"
# =================================================
# Access control
# =================================================
&lt;Directory&gt;
    Options None    AllowOverride None    Order deny,allow
    Deny from all&lt;/Directory&gt;
&lt;Directory "/www/vhosts/www.ebank.lab"&gt;
    Order allow,deny    Allow from all&lt;/Directory&gt;
&lt;Directory "/www/vhosts/www.test.lab"&gt;
    Order allow,deny    Allow from all&lt;/Directory&gt;
# =================================================
# MIME encoding
# =================================================
&lt;IfModule mod_mime.c&gt;
    TypesConfig /usr/local/apache/conf/mime.types&lt;/IfModule&gt;
DefaultType text/plain
&lt;IfModule mod_mime.c&gt;
    AddEncoding x-compress Z    AddEncoding x-gzip gz tgz
    AddType application/x-tar .tgz&lt;/IfModule&gt;
# =================================================
# Logs
# =================================================
LogLevel warn
LogFormat "%h %l %u %t \"%r\" %&gt;s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %&gt;s %b" common
LogFormat "%{Referer}i -&gt; %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 *
&lt;VirtualHost *&gt;
                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
&lt;/VirtualHost&gt;
&lt;VirtualHost *&gt;
                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
   &lt;/VirtualHost&gt;
</pre>
</div>
<p align="justify">Вышеупомянутая конфигурация включает в себя только те команды,<br />
  которые необходимы для сделанных предложений по защите и функциональным возможностям.<br />
  В представленной конфигурации присутствуют два виртуальных хоста, поддерживаемые<br />
  Web-сервером: </p>
<ptext -align:justify'>
<div align="justify">Наполнение вышеупомянутых сайтов физически существует в следующих<br />
  каталогах: </div>
<p align="justify"><b>- /chroot/httpd/www/vhosts/www.ebank.lab </b></p>
</ptext>
<ptext -align:justify'>
<div align="justify">Каждый сайт имеет свои собственные журналы регистраций, которые<br />
  присутствуют в следующих каталогах: </div>
<p align="justify"><b>- /chroot/httpd/usr/local/apache/logs/www.ebank.lab</b></p>
<p align="justify"><b>- /chroot/httpd/usr/local/apache/logs/www.test.lab</b></p>
<p align="justify">Вышеупомянутые каталоги должны быть  созданы перед первым запуском <br />
  Apache &#8212; иначе он не будет правильно выполняться. Владельцем вышеупомянутых<br />
  каталогов должен быть root:sys, и права доступа должны быть установлены к 0755.
</p>
<p align="justify">По сравнению с  базовым файлом  конфигурации Apache, были сделаны<br />
  следующие изменения:</p>
<ul>
<li> Было уменьшено<br />
  число доступных модулей.
</li>
<li>  Apache не<br />
  раскрывает информацию о номере своей версии (директивы: ServerTokens, ServerSignature).
</li>
<li>  Процессы<br />
  Apache (кроме корневого процесса)  были установлены, чтобы  выполняться с привилегиями<br />
  уникального пользователя/группы (директивы: User, Group).
</li>
<li>  Apache разрешает<br />
  доступ только к тем каталогам, подкаталогам и файлам, которые были явно определены<br />
  в файле конфигурации (директивы: Directory, Allow); все другие запросы будут<br />
  отклонены по умолчанию.
</li>
<li>  Apache регистрирует<br />
  большее количество информации о HTTP запросах.</p>
</li>
</ul>
<p align="justify"><b>Финальные шаги</b></p>
<p align="justify"> В конце, мы должны создать запускающий сценарий &#171;apache.sh&#187;,<br />
  содержание которого будет подобно следующему: </p>
<div align="justify">
<pre>
  #!/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}"
 &gt;&#038;2                exit 64                ;;esac
exit 0
</pre>
</div>
<p align="justify">Вышеупомянутый сценарий должен быть скопирован в надлежащий<br />
  каталог (зависит от специфической UNIX системы),  где по умолчанию содержаться<br />
  сценарии запуска. В случае FreeBSD это &#8212; каталог/usr/local/etc/rc.d. </p>
<p align="justify"><b>Выводы</b></p>
<p align="justify">Вышеупомянутый метод позволяет достигнуть более высокого уровня<br />
  защиты Web сервера Apache, чем тот, который предлагается в заданной по умолчанию<br />
  инсталляции. </p>
<p align="justify">Благодаря активации только абсолютно необходимых модулей Apache,<br />
  обнаружение новой уязвимости в любом из них не должно указывать, на то, что<br />
  сервер уязвим. Сокрытие номера версии Apache, отключение службы индексации каталогов,<br />
  изменение корневой директории и ограниченная конфигурация затрудняют успешный<br />
  взлом.  сhrooted среда имеет также еще одно важное преимущество &#8212; устойчивость<br />
  к большому количеству эксплойтов, главным образом из-за недостатка оболочки<br />
  (/bin/sh,/bin/csh и т.д.). Даже если вторгшийся сможет выполнять произвольные<br />
  команды системы, выход из chrooted среды будет настоящей проблемой. </p>
</ptext>
]]></content:encoded>
			<wfw:commentRss>http://saygak.com/post/59/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Защищаем PHP. Шаг за шагом.</title>
		<link>http://saygak.com/post/58</link>
		<comments>http://saygak.com/post/58#comments</comments>
		<pubDate>Wed, 11 Oct 2006 19:43:27 +0000</pubDate>
		<dc:creator>Michael Saygak</dc:creator>
				<category><![CDATA[Веб]]></category>

		<guid isPermaLink="false">http://saygak.com/post/58</guid>
		<description><![CDATA[14 августа, 2003 В предыдущей статье «Защищаем Apache» автор описал метод защиты Web сервера Apache от несанкционированного доступа из Internet. Благодаря этому методу можно было достичь высокого уровня защиты, но в случае обслуживания только статических HTML страниц. Но как же осуществить защиту, когда необходимо взаимодействие с пользователем, а данные пользователей должны быть сохранены в локальной базе данных? Эта статья рассказывает [...]]]></description>
			<content:encoded><![CDATA[<p><font class="text"><b>14 августа, 2003</b></font></p>
<p align="justify">В предыдущей статье <a href="http://www.securitylab.ru/?ID=38966">«Защищаем<br />
    Apache»</a> автор описал метод защиты Web сервера Apache от несанкционированного<br />
    доступа из Internet. Благодаря этому методу можно было достичь высокого уровня<br />
    защиты, но в случае обслуживания только статических HTML страниц. Но как же <span id="more-58"></span><br />
    осуществить защиту, когда необходимо взаимодействие с пользователем, а данные<br />
    пользователей должны быть сохранены в локальной базе данных? </p>
<p align="justify">Эта статья рассказывает об основных шагах в защите PHP, одном<br />
    из наиболее популярных языков создания сценариев, созданном в основном для<br />
    создания динамических web-страниц. Для избежания повтора информации, охваченной<br />
    в предыдущей статье, мы покажем только основные различия, от процесса защиты <br />
    Web сервера Apache.</p>
<p align="justify"><b>Операционная система</b> </p>
<p align="justify">Как и в предыдущей статье, операционной системой является<br />
    &#8212; FreeBSD 4.7. Однако, представленные методы можно также применять и на более<br />
    современных unix и unix-подобных системах. Мы также предполагаем, что база<br />
    данных MySQL установлена на <b>хосте</b>, и помещена в каталог &quot;/usr/local/mysql&quot;.</p>
<p align="justify"><b>Функциональные возможности</b> </p>
<p align="justify">Функциональные возможности будут подобны описанным в предыдущей<br />
    статье. Однако, существуют некоторые изменения: </p>
<div align="justify"></div>
<ul>
<li>
<div align="justify"> Web-сервер должен обрабатывать язык PHP </div>
</li>
<li>
<div align="justify">PHP компонент должен иметь возможность считывать и записывать<br />
      пользовательские данные в локально установленной базе данных MySQL </div>
</li>
</ul>
<div align="justify">
<p align="justify"><b>Предложения по защите</b> </p>
<p align="justify">Должно быть добавлено следующее:</p>
</div>
<div align="justify">
<ul>
<li> PHP конфигурация должна пользоваться преимуществом встроенных механизмов<br />
      защиты </li>
<li>PHP сценарии должены быть выполнены в chrooted среде </li>
<li>Apache сервер должен отклонять все запросы (GET и POST), которые содержат<br />
      HTML-тэги (возможная атака межсайтового скриптинга), знаки апострофа “`”<br />
      и двойные кавычки (возможная SQL-injection атака) </li>
<li> Ни одно из PHP предупреждений или сообщений об ошибках не должно быть<br />
      доступно пользовательским Web приложениям.</li>
<li>
<div align="justify"> Должна быть реализована возможность сохранения входящих <br />
      GET и POST запросов, в текстовом файле, что позволит использовать дополнительную<br />
      Host-based систему обнаружения взлома (HIDS), например <a href="http://www.securitylab.ru/tools/?ID=39642" target="_blank">swatch</a>.</div>
</li>
</ul>
<div align="justify">
<p align="justify"><b>Подготовка программного обеспечения</b> </p>
<p align="justify">Прежде всего, мы должны загрузить исходники самых последних<br />
    версий Apache, PHP и модуля <a href="/bitrix/exturl.php?goto=http%3A%2F%2Fwww.modsecurity.org%2F">mod_security</a><u><br />
    </u>. Модуль будет использоваться, для защиты от CSS и SQL-injection атак.<br />
    Затем, загруженное программное обеспечение должно быть распаковано, а содержание<br />
    архива &#8212; помещено в основной каталог. Исходники модуля mod_security должны<br />
    быть помещены в каталог Apaсhe &quot;src/modules/extra&quot;: </p>
<p align="justify"><strong>gzip -dc apache_1.3.27.tar.gz | tar xvf -<br />
    gzip -dc php-4.3.2.tar.gz | tar xvf -<br />
    gzip -dc mod_security_1.5.tar.gz | tar xvf -<br />
    cp mod_security_1.5/apache1/mod_security.c apache_1.3.27/src/modules/extra/</strong></p>
<p align="justify">Если существуют любые доступные патчи защиты к вышеупомянутому<br />
    программному обеспечению, то они должны быть загружены и выполнены.</p>
<p align="justify">Перед компиляцией программы, мы должны определиться в одном<br />
    из трех методов инсталляции PHP: </p>
</div>
<ul>
<li>
<div align="justify"> &nbsp;&nbsp; Как статический модуль Web сервера </div>
</li>
<li>
<div align="justify"> &nbsp;&nbsp; Как динамический модуль Web сервера </div>
</li>
<li>
<div align="justify">&nbsp;&nbsp; Как интерпретатор CGI </div>
</li>
</ul>
<div align="justify">
<p align="justify">Каждый из этих методов имеет свои преимущества и недостатки.<br />
    Компиляция PHP, как статического модуля, принесет пользу от улучшения производительности<br />
    Web сервера, но при апгрейде PHP до более новой версии придется перекомпилировать<br />
    весь Web сервер. Компиляция PHP как динамического модуля, позволяет избежать<br />
    этого недостатка, но производительность WEB сервера будет уменьшена приблизительно<br />
    на 5%, и был бы необходим еще один модуль: mod_so. Третий метод состоит в <br />
    установке PHP как интерпретатора CGI &#8212; вместе с механизмом Apache &#8212; suEXEC,<br />
    что является весьма интересным решением. К сожалению, при неправильной установке<br />
    этот метод может представлять серьезную угрозу защите. </p>
<p align="justify">Для лучшей защиты и производительности, лучшим выбором, является<br />
    компиляция PHP как статического модуля. Именно поэтому остальная часть статьи<br />
    основана на этом методе инсталляции.</p>
<p align="justify"><b>Установка </b><b>PHP</b> </p>
<p align="justify">Вообще, как описано в предыдущей статье, инсталляционный<br />
    процесс Apache с PHP очень похож на процесс установки Apache без PHP, Единственное<br />
    различие &#8212; использование двух дополнительных модулей: mod_PHP и mod_security.
  </p>
<p align="justify">Как и в предыдущей статье, мы начнем с создания учетной записи<br />
    и группы, называемых &quot;apache&quot;. Для этого мы должны подготовить Web<br />
    сервер Apache следующим образом:</p>
<p align="justify"><strong>cd apache_1.3.27<br />
    ./configure</strong></p>
<p align="justify">И откомпилировать PHP модуль:</p>
<p align="justify"><strong>cd ../php-4.3.2<br />
    ./configure &#8212;with-mysql=/usr/local/mysql &#8212;with-apache=../apache_1.3.27 &#8212;enable-safe-mode<br />
    make<br />
    su<br />
    make install</strong></p>
<p align="justify">Затем мы перемещаемся в каталог с <b>Apache</b> и продолжаем<br />
    установку:</p>
<p align="justify"><strong>cd ../apache_1.3.27<br />
    ./configure &#8212;prefix=/usr/local/apache &#8212;disable-module=all &#8212;server-uid=apache<br />
    &#8212;server-gid=apache &#8212;enable-module=access &#8212;enable-module=log_config &#8212;enable-module=dir<br />
    &#8212;enable-module=mime &#8212;enable-module=auth &#8212;activate-module=src/modules/extra/mod_security<br />
    &#8212;enable-module=security &#8212;activate-module=src/modules/php4/libphp4.a<br />
    make<br />
    su<br />
    make install<br />
    chown -R root:sys /usr/local/apache</strong></p>
<p align="justify">В команде &quot;./configure&quot;, используются только те<br />
    модули, которые являются необходимыми для выполнения функциональных возможностей<br />
    и предложений по защите. Выбор модулей был детально обсужден в предыдущей<br />
    статье. В следующем шаге мы должны возвратиться к каталогу PHP и скопировать<br />
    файл конфигурации PHP:</p>
<p align="justify"><strong>cd ../php-4.3.2<br />
    mkdir /usr/local/lib<br />
    chmod 755 /usr/local/lib<br />
    cp php.ini-recommended /usr/local/lib/php.ini<br />
    chown root:sys /usr/local/lib/php.ini<br />
    chmod 644 /usr/local/lib/php.ini</strong>
  </p>
<p align="justify">Для сценариев PddType application/x-httpd-php .phpHP, которые<br />
    будут обрабатываться <b>Web</b><b> сервером </b><b>Apache</b>, к /usr/local/Apache/conf/httpd.conf<br />
    должна быть добавлена следующая строка:</p>
<p align="justify"><strong>AddType application/x-httpd-php .php</strong></p>
<p align="justify">В этом пункте мы можем попробовать запустить и проверить<br />
    <b>Apache</b>, в случае если PHP должным образом связывается с MySQL. Достигнуть<br />
    этого можно, используя сценарий &quot;test.PHP&quot;, со следующим содержанием:<br />
    (значения &quot;user_name&quot; и &quot;password&quot; должны быть изменены<br />
    в соответствии с установками базы данных): </p>
<p>  <strong>&lt;html&gt;&lt;body&gt;<br />
  &lt;?php <br />
  $link = mysql_connect(&quot;localhost&quot;, &quot;user_name&quot;, &quot;password&quot;)<br />
  <br />
  or die; <br />
  print &quot;Everything works OK!&quot;; <br />
  mysql_close($link); <br />
  ?&gt;<br />
  &lt;/body&gt;&lt;/html&gt; </strong></p>
<p align="justify">Вышеупомянутая web-страница может просматриваться в любом<br />
    WEB-браузере. Если команды PHP нормально интерпретируются и установлено подключение<br />
    к MySQL, то можно начать защиту программного обеспечения. Если нет &#8212; то необходимо<br />
    проанализировали логи Apache и MySQL и устранить причину проблемы. </p>
<p align="justify"><b>Chrooting</b><b> сервер</b> </p>
<p align="justify">Первым шагом в защите сервера, должна быть подготовка chrooted<br />
    среды, к Apache серверу с PHP модулем.</p>
<p align="justify"> этом пункте, необходимо выполнить все шаги, описанные в<br />
    разделе &quot;Chrooting сервер&quot; предыдущей статьи. Кроме того, перед<br />
    первым запуском Apache в chrooted среде, нужно скопировать следующие библиотеки<br />
    (они необходимы для должной работы PHP):</p>
<p align="justify"><strong>cp /usr/local/mysql/lib/mysql/libmysqlclient.so.12<br />
    /chroot/httpd/usr/lib/<br />
    cp /usr/lib/libm.so.2 /chroot/httpd/usr/lib/<br />
    cp /usr/lib/libz.so.2 /chroot/httpd/usr/lib/</strong></p>
<p align="justify">Необходимо также скопировать файл конфигурации PHP:</p>
<p align="justify"><strong>umask 022<br />
    mkdir -p /chroot/httpd/usr/local/lib<br />
    cp /usr/local/lib/php.ini /chroot/httpd/usr/local/lib/</strong></p>
<p align="justify">и создать каталог /chroot/httpd/tmp. Владелецем каталога<br />
    должен быть корневой каталог, а права доступа должны быть установлены в 1777.<br />
    После создания новой среды необходимо проверить правильность, выполнения <b>Apache</b>:</p>
<p align="justify"><b>chroot</b><b> /</b><b>chroot</b><b>/</b><b>httpd</b><b><br />
    /</b><b>usr</b><b>/</b><b>local</b><b>/</b><b>apache</b><b>/</b><b>bin</b><b>/</b><b>httpd</b></p>
<p align="justify">Прежде, чем начать конфигуриование PHP, необходимо учесть<br />
    еще одну очень важную деталь &#8212; связь между PHP и MySQL. Поскольку PHP связывается<br />
    с MySQL локально, используя /tmp/MySQL.sock socket, размещение PHP в chrooted<br />
    среде означает, что они не могут связываться друг с другом. Для решения этой<br />
    проблемы, каждый раз при выполнении MySQL, необходимо создавать постоянную<br />
    связь с Apache chrooted средой: </p>
<p align="justify"><b>Ln</b><b>/tmp/</b><b>MySQL</b><b>.sock/chroot/httpd/tmp/</b></p>
<p align="justify">Для создания связи между PHP и MySQL, &quot;/tmp/MySQL.sock&quot;<br />
    socket и каталог &quot;/chroot/httpd/tmp&quot;, должны быть физически размещены<br />
    в том же самом filesystem (постоянные связи не работают между filesystems).
  </p>
<p align="justify"><b>Конфигурирование </b><b>PHP</b> </p>
<p align="justify">Процесс защиты сервера Apache, был описан в предыдущей статье,<br />
    поэтому отправной точкой, мы будем считать файл конфигурации, который был<br />
    в ней представлен. Для того чтобы Apache мог обрабатывать PHP сценарии, необходимо<br />
    к httpd.conf добавить следующие строки: </p>
<p align="justify"><b>AddModule</b><b> mod_php4.c<br />
    AddType application/x-httpd-php .php<br />
    AddType application/x-httpd-php .inc<br />
    AddType application/x-httpd-php .class</b></p>
<p align="justify">Стоит обратить внимание, на то что помимо &quot;*.PHP&quot;, <br />
    есть еще два расширения, определяющие PHP сценарии: &quot;*.inc&quot; и &quot;*.class&quot;.<br />
    Программисты часто включают дополнительные файлы, с этими расширением. Поскольку,<br />
    по умолчанию, файлы с этими расширениями обрабатываются как <b>постоянные</b><br />
    файлы, то их загрузка покажет исходный текст, содержащийся в них. Это может<br />
    привести к раскрытию паролей или другой чувствительной информации. </p>
<p align="justify">Необходимо также сделать несколько изменений в файле конфигурации <br />
    PHP (/chroot/httpd/usr/local/lib/PHP.ini). Ниже представлены наиболее важные<br />
    из них, которые приводят к улучшению защиты PHP:</p>
<table border=2 cellspacing=0 cellpadding=3>
<tr>
<td width=273 valign=top>
<p align="center"><b>Параметр</b></p>
</td>
<td width=366 valign=top>
<p align="center"><b>Описание</b></p>
</td>
</tr>
<tr>
<td width=273>
<p align="center">safe_mode = On</p>
</td>
<td width=366>
<p align="left">Активизируя параметр safe_mode, PHP сценарий<br />
          может осуществлять доступ к файлам только в том случае, когда их владелец<br />
          &#8212; владелец сценариев PHP. Это является одним из наиболее важных механизмов<br />
          защиты, встроенных в PHP, эффективно противодействует взлому, и добавляет<br />
          много ограничений, затрудняющих несанкционированные попытки доступа<br />
          к системным файлам (например/etc/paswd).</p>
</td>
</tr>
<tr>
<td width=273>
<p align="center">safe_mode_gid = Off</p>
</td>
<td width=366>
<p align="left">Когда safe_mode включен, а safe_mode_gid<br />
          выключен, PHP сценарии имеют доступ к файлам не только, когда UIDs тот<br />
          же самый, но и когда группа владельца сценария PHP такая же как и группа<br />
          владельца файла.</p>
</td>
</tr>
<tr>
<td width=273>
<p align="center">open_basedir = directory[:...]</p>
</td>
<td width=366>
<p align="left">Когда включен параметр open_basedir, PHP<br />
          может обращаться только к файлам, размещенным в указанных каталогах<br />
          (и подкаталогах).</p>
</td>
</tr>
<tr>
<td width=273>
<p align="center">safe_mode_exec_dir = directory[:...]</p>
</td>
<td width=366>
<p align="left">Когда включен параметр safe_mode, system(),<br />
          Exec() и другие функции запускающие системные программы не смогут запускать<br />
          эти программы, если они не находятся в указанном каталоге.</p>
</td>
</tr>
<tr>
<td width=273>
<p align="center">expose_php = Off</p>
</td>
<td width=366>
<p align="left">Выключение параметра &quot;expose_PHP&quot;<br />
          приводит к к тому, что PHP не будет раскрывать информацию о себе в заголовках<br />
          HTTP, которые отсылаются клиентам в ответ на Web запросы.</p>
</td>
</tr>
<tr>
<td width=273>
<p align="center">register_globals = Off</p>
</td>
<td width=366 valign=top>
<p align="left">Когда включен параметр register_globals,<br />
          все EGPCS переменные (Environment, GET, POST, Cookie and Server) автоматически<br />
          объявляются как глобальные. Поскольку это может привести к серьезной<br />
          угрозе защиты, настоятельно рекомендуется отключить этот параметр (начиная<br />
          с версии 4.2.0, этот параметр по умолчанию отключен)</p>
</td>
</tr>
<tr>
<td width=273>
<p align="center">display_errors = Off</p>
</td>
<td width=366 valign=top>
<p align="left">При отключенном параметре display_errors,<br />
          не отображаются PHP ошибки и предупреждения. Поскольку такие предупреждения<br />
          часто показывают важную информацию, например: пути, SQL запросы и т.д.,<br />
          то настоятельно рекомендуется отключать этот параметр на производственных<br />
          серверах.</p>
</td>
</tr>
<tr>
<td width=273>
<p align="center">log_errors = On</p>
</td>
<td width=366 valign=top>
<p align="left">Когда включен параметр log_errors,<br />
          все предупреждения и ошибки регистрируются в файле, определенном параметром<br />
          error_log. Если этот файл не доступен, то информация о предупреждениях<br />
          и ошибках регистрируется сервером Apache.</p>
</td>
</tr>
<tr>
<td width=273>
<p align="center">error_log = filename</p>
</td>
<td width=366 valign=top>
<p align="left">Этот параметр определяет имя файла,<br />
          используемого для хранения информации о предупреждениях и ошибках (внимание:<br />
          этот файл должен быть доступен для записи пользователям или группе <b>apache</b>)</p>
</td>
</tr>
</table>
<p align="justify">Кроме того, должно быть принято во внимание изменение в расширениях<br />
    файлов. Например *.php в *.asp, *.dhtml или даже *.html. Такая замена не дает<br />
    потенциальным взломщикам узнать, используемую server-side технологию. Чтобы<br />
    заменить расширения необходимо все *.php файлы переименовать, к примеру в<br />
    *.dhtml, а в </p>
<p align="justify"><b>/chroot/httpd/usr/local/apache/conf/htt</b><b>pd</b><b>.</b><b>conf</b>,<br />
    необходимо изменить следующую строку:</p>
<p align="justify"> <strong>AddType application/x-httpd-php .php </strong></p>
<p align="justify">На новую:</p>
<p align="justify"><strong>AddType application/x-httpd-php .dhtml</strong></p>
<p align="justify">Благодаря этому, Web пользователи не будут видеть *.PHP расширение<br />
    в адресе URL, что сразу же показывает на использование PHP технологии на сервере.</p>
<p align="justify"><b>Защита от </b><b>CSS</b><b> и </b><b>SQL</b><b> </b><b>injection</b><b><br />
    нападений.</b> </p>
<p align="justify">Предыдущими шагами в защите сервера были регистрация GET<br />
    и POST запросов и осуществления защиты от Cross-Site-Scripting и SQL injection<br />
    атак. Для оуществления этого, необходимо использовать модуль mod_security,<br />
    которой активизируется, добавлением в httpd.conf следующей строки: </p>
<p align="justify"><strong>AddModule mod_security.c </strong></p>
<p align="justify">Для включения регистрации GET и POST запросов, необходимо<br />
    добавить к httpd.conf следующий раздел:</p>
<p align="justify"><strong>&lt;IfModule mod_security.c&gt; <br />
    AddHandler application/x-httpd-php .php <br />
    SecAuditEngine On <br />
    SecAuditLog logs/audit_log <br />
    SecFilterScanPOST On <br />
    SecFilterEngine On <br />
    &lt;/IfModule&gt;</strong>
  </p>
<p align="justify"> Вышеупомянутые команды активизируют <b>Audit</b><b> </b><b>Engine</b>,<br />
    который отвечает за регистрацию запросов, и <b>Filtering</b><b> </b><b>POST</b><b><br />
    </b><b>Engine</b>, который осуществляет возможность регистрации POST запросов.<br />
    Для защиты Web-приложений от CSS атак перед &quot; &lt;/IfModule&gt; &quot;<br />
    должны быть вставлены следующие строки: </p>
<p align="justify"><strong>SecFilterDefaultAction &quot;deny,log,status:500&quot;<br />
    SecFilter &quot; &lt; (. | \n) + &gt; &quot;</strong></p>
<p align="justify">Первая строка необходима для возврата сервером сообщения<br />
    &quot;Internal Server Error&quot;, в случае если запрос содержит фразу поиска<br />
    из любой переменной <b>SecFilter</b>. Вторая строка устанавливает фильтр поиска <br />
    HTML тэгов в запросах POST и GET.</p>
<p align="justify">Одной из типичных сигнатур SQL injection атаки является появление<br />
    апострофа (&#8216;) или двойной кавычки (&quot;) в GET или POST запросе. Отклоняя<br />
    все запросы, содержащие эти символы, мы можем затруднить использование SQL<br />
    injection методики: </p>
<p align="justify"> <strong>SecFilter &quot;&#8217;&quot;<br />
    SecFilter &quot;\&quot; &quot;</strong></p>
<p align="justify">Обратите внимание, что фильтрация символов &lt;,&gt;, &#8216;,<br />
    &quot; , позволяющая нам защищаться от <b>CSS</b> и <b>SQL</b><b> </b><b>injection</b><br />
    атак, может привести к некорректному функционированию PHP приложения. Это<br />
    происходит из-за того, что пользователи не могут использовать эти символы<br />
    в HTML формах. Для решения этой проблемы можно со стороны пользователя использовать<br />
    язык <b>JavaScript</b>, который должен заменить запрещенные символы специальными<br />
    отметками, например *lt; *gt; *quot; и т.д. </p>
<p align="justify"><b>Заключение</b> </p>
<p align="justify">Достижение высокого уровня защиты Web сервера, использующего<br />
    серверные технологии (PHP, ASP, JSP и т.д.) на практике является очень трудной<br />
    задачей. Сам характер взаимодействий с Web сервером, существенным способом<br />
    уменьшает его защиту. Именно поэтому серверные сценарии должны использоваться<br />
    только там, где это абсолютно необходимо.</p>
<p align="justify">Методы, описанные в этой статье, позволяют нам уменьшить<br />
    риск успешного взлома, в случае нахождения новой уязвимости в Apache, PHP<br />
    или даже в Web приложении. Конечно, статья не дает исчерпывающей информации<br />
    по защите PHP технологии, здесь представлены только основные методы. Их применение <br />
    увеличивает уровень защиты сервера, но нельзя забывать, что защита всей среды<br />
    зависит не только от защиты Apache или конфигурации PHP, но также и от основного <br />
    &#8212; непосредственно защиты Web приложения.</p>
</p></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://saygak.com/post/58/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Защищаем MySql. Шаг за шагом</title>
		<link>http://saygak.com/post/57</link>
		<comments>http://saygak.com/post/57#comments</comments>
		<pubDate>Wed, 11 Oct 2006 19:42:40 +0000</pubDate>
		<dc:creator>Michael Saygak</dc:creator>
				<category><![CDATA[Веб]]></category>

		<guid isPermaLink="false">http://saygak.com/post/57</guid>
		<description><![CDATA[01 сентября, 2003 1. Введение MySQL является одной из наиболее популярных баз данных в Internet, и часто используется вместе с PHP. Помимо её бесспорных преимуществ, таких как простота использования и относительно высокая эффективность, MySQL предлагает простые, но в то же время очень эффективные механизмы защиты. К сожалению, заданная по умолчанию инсталляция MySQL, а в особенности [...]]]></description>
			<content:encoded><![CDATA[<p><font class="text"><b>01 сентября, 2003</b></font></p>
<p align="justify"><b>1. Введение</b></p>
<p align="justify"><b>MySQL</b> является одной из наиболее популярных баз данных<br />
  в <b>Internet</b>, и часто используется вместе с <b>PHP</b>. Помимо её бесспорных<br />
  преимуществ, таких как простота использования и относительно высокая эффективность, <span id="more-57"></span><br />
  <b>MySQL</b> предлагает простые, но в то же время очень эффективные механизмы<br />
  защиты. К сожалению, заданная по умолчанию инсталляция <b>MySQL</b>, а в особенности<br />
  пустой пароль по умолчанию и потенциальная уязвимость к атакам переполнения<br />
  буфера, делают базу данных<b> </b><b>MySQL</b> простым объектом для нападений.</p>
<p align="justify">Эта статья описывает основные шаги, выполнение которых, максимально<br />
  защитит базу данных <b>MySQL</b> от локальных и удаленных нападений. Это третья<br />
  и последняя статья из цикла статей, посвященных защите <b>Apache</b>, <b>PHP</b><br />
  и <b>MySQL</b>.</p>
<p align="justify"><b>1.1 Функциональные возможности</b></p>
<p align="justify">В этой статье мы предполагаем, что <b>Web</b>-сервер <b>Apache</b><br />
  вместе с <b>PHP</b> модулем, был установлен в соответствии с требованиями предыдущих<br />
  статей, и помещен в каталог <b><i>/chroot/httpd</i></b>. </p>
<p align="justify">Кроме этого мы также принимаем следующее:</p>
<div align="justify">
<ul>
<li> База данных <b>MySQL</b> будет использоваться только <b>PHP</b> приложениями,<br />
      установленными на том же самом хосте; </li>
<li> Для управления базой данных будут использоваться стандартные административные<br />
      средства, типа <b><i>mysqladmin</i></b><i>, <b>mysql</b>, </i><b><i>mysqldump</i></b><br />
      и т.д.; </li>
<li> Для удаленного резервирования MySQL данных будет использоваться SSH протокол.</li>
</ul>
</div>
<p align="justify"><b>1.2 Необходимые условия для защиты</b></p>
<p align="justify">Чтобы достигнуть самого высокого возможного уровня защиты,<br />
  установка и конфигурация <b>mysql</b> должна быть выполнена в соответствии со<br />
  следующими требованиями:</p>
<div align="justify">
<ul>
<li> база данных <b>mysql</b> должна быть выполнена в <b>chrooted</b> среде;
    </li>
<li> процессы <b>mysql</b> должны выполняться под уникальным <b>UID</b>/<b>GID</b>,<br />
      неиспользуемым никаким другим системным процессом; </li>
<li> Должен быть разрешен только локальный доступ к <b>mysql</b>;</li>
<li> Основная учетная запись <b>mysql</b> должна быть защищена “сложным” паролем;</li>
<li> Будет переименована учетная запись администратора;</li>
<li> Должен быть заблокирован анонимный доступ к базе данных (используя учетную<br />
      запись <b>nobody</b>); </li>
<li> Должны быть удалены все типовые базы данных и таблицы. </li>
</ul>
</div>
<p align="justify"><b>2. Установка </b><b>MySQL</b></p>
<p align="justify">Прежде чем начать осуществление защиты <b>MySQL</b>, мы должны<br />
  установить программное обеспечение на сервере. Как мы писали в предыдущих статьях,<br />
  мы запустим инсталляцию, создав уникальную, постоянную группу и учетную запись<br />
  пользователя на операционной системе, которая будет посвящена базе данных <b>MySQL</b>:
</p>
<p align="justify"><b>pw</b><b> groupadd mysql</b></p>
<p align="justify"><b>pw</b><b> useradd mysql-c &quot; mysql </b><b>Сервер</b><b><br />
  &quot;-d/dev/null-g mysql-s/sbin/nologin</b> </p>
<p align="justify"><b>2.1 Компиляция </b><b>mysql</b></p>
<p align="justify">Мы скомпилируем и установим <b>mysql</b> в каталог <b><i>/usr/local/</i></b><b><i>mysql</i></b>:</p>
<p align="justify">./configure &#8212;prefix=/usr/local/mysql &#8212;with-mysqld-user=mysql<br />
  &#8212;with-unix-socket-path=/tmp/mysql.sock &#8212;with-mysqld-ldflags=-all-static<br />
  make<br />
  su<br />
  make install<br />
  strip /usr/local/mysql/libexec/mysqld<br />
  scripts/mysql_install_db<br />
  chown -R root /usr/local/mysql<br />
  chown -R mysql /usr/local/mysql/var<br />
  chgrp -R mysql /usr/local/mysql</p>
<p align="justify">Приведенный процесс установки сервера практически идентичен<br />
  описанному в руководстве к <b>mysql</b>. Единственным отличием является использование<br />
  нескольких дополнительных параметров, указанных в строке: <b><i>./configure</i></b>.<br />
  Наиболее важным отличием является использование параметра <b>-<i>- </i></b><b><i>with</i></b><b><i>-</i></b><b><i>mysqld</i></b><b><i>-</i></b><b><i>ldflags</i></b><b><i><br />
  =-all-static</i></b>, который делает <b>MySQL</b> сервер статически связанным.<br />
  Это значительно упрощает процесс <b>chrooting</b> сервера, как описано в Разделе<br />
  3. Остальные параметры приказывают <b><i>make</i></b><i> </i>программе установить<br />
  программное обеспечение в каталог <b><i>/usr/local/mysql</i></b>, выполнить<br />
  <b>MySQL</b><b> демон</b> с привилегиями учетной записи <b><i>mysql</i></b>,<br />
  и создать сокет <b><i>mysql</i></b><b><i>.</i></b><b><i>sock</i></b> в каталоге<br />
  <b><i>/tmp</i>.</b> </p>
<p align="justify"><b>2.2 Копирование файлов конфигурации</b></p>
<p align="justify">После выполнения вышеупомянутых команд, мы должны скопировать<br />
  заданный по умолчанию файл конфигурации в соответствии с ожидаемым размером<br />
  базы данных (маленькая, средняя, большая, огромная). Например:</p>
<p align="justify">cp support-files/my-medium.cnf /etc/my.cnf<br />
  chown root:sys /etc/my.cnf<br />
  chmod 644 /etc/my.cnf</p>
<p align="justify"><b>2.3 Запуск сервера</b></p>
<p align="justify">Теперь <b>mysql</b> полностью установлен и готов к выполнению.<br />
  Мы можем запустить <b>mysql</b> сервер, выполнив следующую команду: </p>
<p align="justify">/usr/local/mysql/bin/mysqld_safe</p>
<p align="justify"><b>2.4 Проверка подключений</b></p>
<p align="justify">Попробуйте установить связь с базой данных следующим образом:
</p>
<div align="justify">
<pre>
/usr/local/mysql/bin/mysql -u root mysql

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 2 to server version: 4.0.13-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql&gt; show databases;

+----------+

| Database |

+----------+

| mysql |

| test |

+----------+

2 rows in set (0.00 sec)

mysql&gt; quit;
</pre>
</div>
<p align="justify">Как только подключение успешно установлено, мы можем остановить<br />
  работу базы данных:</p>
<p align="justify"><b>/usr/local/mysql/bin/mysqladmin -u root shutdown</b></p>
<p align="justify">и начать защиту программного обеспечения. Иначе, мы должны<br />
  будем проанализировать информацию, сохраненную в файле регистрации <b><i>/usr/local/mysql/var/`hostname`.err</i></b>,<br />
  и устранить причину проблемы.</p>
<p align="justify"><b>3. </b><b>Chrooting</b><b> сервер</b></p>
<p align="justify">Первый шаг защиты <b>mysql</b> должен подготовить <b>chrooted</b><br />
  среду, в которой будет выполняться <b>mysql</b> сервер. <b>Chrooting</b> методика<br />
  была подробно описана в первой статье этого цикла (&quot;<a href=http://www.securitylab.ru/?ID=38966>Защита<br />
  Apache: Шаг за шагом</a>, поэтому если Вы не знакомы с этой методикой или не<br />
  знаете почему рекомендуется <b>chrooting</b>, пожалуйста прочтите эту статью.</p>
<p align="justify"><b>3.1 Операционная система</b></p>
<p align="justify">Как и в предыдущих статьях, мы будем основываться на операционной<br />
  системе <b>FreeBSD</b><b> 4.7</b>. Однако представленные методы должны также<br />
  применяться и на более современных <b>unix</b> и <b>unix</b>-подобных системах.</p>
<p align="justify"><b>3.2 Подготовка </b><b>chroot</b><b> среды</b></p>
<p align="justify">Чтобы подготовить <b>chrooted</b> среду, мы должны создать<br />
  следующую структуру каталога:</p>
<p align="justify"><strong>mkdir -p /chroot/mysql/dev<br />
  mkdir -p /chroot/mysql/etc<br />
  mkdir -p /chroot/mysql/tmp<br />
  mkdir -p /chroot/mysql/var/tmp<br />
  mkdir -p /chroot/mysql/usr/local/mysql/libexec<br />
  mkdir -p /chroot/mysql/usr/local/mysql/share/mysql/english</strong></p>
<p align="justify">3.3 Установка прав доступа</p>
<p align="justify">Права доступа к вышеупомянутым каталогам должны быть установлены<br />
  следующим образом: </p>
<p align="justify"><b>chown</b><b> -R root:sys /chroot/mysql<br />
  chmod -R 755 /chroot/mysql<br />
  chmod 1777 /chroot/mysql/tmp</p>
<p>  </b></p>
<p align="justify"><b>3.4 Создание структуры каталогов</b></p>
<p align="justify">Затем, необходимо скопировать следующие файлы в новую структуру<br />
  каталога:</p>
<p align="justify"><b>cp/usr/local/mysql/libexec/mysqld/chroot/mysql/usr/local/mysql/libexec</b><b>/</b></p>
<p align="justify"><b>cp/usr/local/mysql/share/mysql/english/er</b><b> rmsg.sys/chroot/mysql/usr/local/mysql/share/mys<br />
  ql/english/</b></p>
<p align="justify"><b>cp/etc/hosts/chroot/mysql/etc</b><b>/</b></p>
<p align="justify"><b>cp/etc/host.conf/chroot/mysql/etc/</b></p>
<p align="justify"><b>cp/etc/resolv.conf/chroot/mysql/etc/</b></p>
<p align="justify"><b>cp/etc/group/chroot/mysql/etc</b><b>/</b></p>
<p align="justify"><b>cp/etc/master.passwd/chroot/mysql/etc/passwords</b></p>
<p align="justify"><b>cp/etc/my.cnf/chroot/mysql/etc/</b></p>
<p align="justify"><b>3.5 Сжатие паролей и групп</b></p>
<p align="justify">Из файлов: <b><i>/chroot/</i></b><b><i>mysql</i></b><b><i>/etc/passwords</i></b><br />
  и <b><i>/chroot/</i></b><b><i>mysql</i></b><b><i>/etc/group</i></b> мы должны<br />
  удалить все строки кроме учетной записи <b>mysql</b> и группы. Затем, мы должны,<br />
  создать базу данных паролей (допустимо только в <b>FreeBSD</b>): </p>
<p align="justify">cd /chroot/mysql/etc<br />
  pwd_mkdb -d /chroot/mysql/etc passwords<br />
  rm -rf /chroot/mysql/etc/master.passwd</p>
<p align="justify"><b>3.6 Специальные соображения</b></p>
<p align="justify">Как и в случае с <b>Web</b>-сервером <b>Apache</b>, мы должны<br />
  создать специальный файл устройства <b><i>/dev/null</i></b>:</p>
<p align="justify"><b>ls</b><b> -al /dev/null</b></p>
<p align="justify"><b> crw-rw-rw- 1 root sys 2, 2 Jun 21 18:31 /dev/null</b></p>
<p align="justify"><b>mknod</b><b> /chroot/mysql/dev/null c 2 2</b></p>
<p align="justify"><b>chown</b><b> root:sys /chroot/mysql/dev/null</b></p>
<p align="justify"><b>chmod</b><b> 666 /chroot/mysql/dev/null</b></p>
<p align="justify">Теперь необходимо скопировать базу данных <b><i>mysql</i></b>,<br />
  которая содержит таблицы, созданные в процессе инсталляции <b>mysql</b>:</p>
<p align="justify"><b>cp-R/usr/local/mysql/var</b><b>//chroot/mysql/usr/local/mysql/var</b></p>
<p align="justify"><b>chown</b><b>-R</b><b> mysql:mysql/chroot/mysql/usr/local/mysql/var</b></p>
<p align="justify">3.7 Локализация</p>
<p align="justify">Если будет использоваться какой-либо язык кроме английского,<br />
  то необходимо будет скопировать нужный набор символов из каталога <b><i>/usr/local/</i></b><b><i>mysql</i></b><b><i>/share/</i></b><b><i>mysql</i></b><b><i>/</i></b><b><i>charsets</i></b>.
</p>
<p align="justify"><b>3.8 Проверка конфигурации</b></p>
<p align="justify">Теперь <b>MySQL</b> готов к запуску в <b>chrooted</b> среде.<br />
  Мы можем проверить, правильно ли запускается <b>MySql</b>, выполнив следующую<br />
  команду:</p>
<p align="justify"><b>chrootuid</b><b> /chroot/mysql mysql /usr/local/mysql/libexec/mysqld<br />
  &amp;</b></p>
<p align="justify">Если произойдет какая-либо ошибка, то необходимо будет использовать<br />
  команду <b><i>truss</i></b> или подобную ей, типа <b><i>ktrace</i></b><b><i>/</i></b><b><i>kdump</i></b><b>,<br />
  </b><b><i>strace</i></b>, и т.д. Это поможет нам определить и устранить причину<br />
  проблемы.</p>
<p align="justify">Заметьте, что для выполнения процесса <b><i>mysqld</i></b>,<br />
  вместо <b><i>chroot</i></b><i>, </i>как в случае <b>Apache</b> или <b>PHP</b>,<br />
  использовалась программа <b><i>chrootuid</i></b>. Главное отличие состоит в<br />
  том, что <b><i>chrootuid</i></b> меняет владельца запущенного процесса. В нашем<br />
  примере, <b><i>mysqld</i></b> выполняется в chrooted среде, но владелец процесса<br />
  &#8212; не <b><i>root</i></b>, а пользователь<b><i> mysql</i></b>. <b>C<i>hrootuid</i></b><br />
  во многих операционных системах не установлен по умолчанию, поэтому необходимо<br />
  загрузить и установить эту программу вручную. Программа <b><i>Chrootuid</i></b><i><br />
  </i>может быть загружена <a href="ftp://ftp.porcupine.org/pub/security/chrootui d1.3.tar.gz">здесь</a> <a name="_Hlt18476788"></a> . </p>
<p align="justify"><b>4. Конфигурирование сервера</b></p>
<p align="justify">Следующий шаг должен сконфигурировать сервер базы данных в<br />
  соответствии с нашими требованиями по защите. </p>
<p align="justify">В случае заданной по умолчанию инсталляции <b>mysql</b>, главным<br />
  файлом конфигурации является <b><i>/etc/my.cnf</i></b>. Однако, в нашем случае,<br />
  из-за выполнения сервера в <b>chrooted</b> среде, мы будем использовать два<br />
  файла конфигурации: <b><i>/chroot/</i></b><b><i>mysql</i></b><b><i>/etc/my.cnf</i></b><br />
  и <b><i>/etc/my.cnf</i></b>. Первый будет использоваться сервером <b>mysql</b>,<br />
  а второй &#8212; утилитами <b>mysql</b> (например: <b><i>mysqladmin</i></b><i>, <b>mysql</b>,<br />
  </i><b><i>mysqldump</i></b> и т.д.). В обоих случаях, потребуются некоторые<br />
  изменения конфигурации.</p>
<p align="justify"><b>4.1 Отключение удаленного доступа</b></p>
<p align="justify">Первое изменение касается порта <b>3306/tcp</b>, который <b>mysql</b><br />
  прослушивает по умолчанию. Поскольку, согласно начальным предположениям по защите,<br />
  база данных будет использоваться только локально установленными <b>PHP</b> приложениями,<br />
  мы можем свободно отключить прослушивание этого порта. Это ограничит возможность<br />
  нападения на базу данных <b>mysql</b> прямыми <b>TCP</b><b>/</b><b>IP</b> подключениями<br />
  с других хостов. Чтобы отключить прослушивание упомянутого порта, необходимо<br />
  к разделу <i>[</i><b><i>mysqld</i></b><i>] файла <b>/</b></i><b><i>chroot</i></b><b><i>/mysql/etc/my.cnf<br />
  </i></b><b>добавить</b> следующий параметр: </p>
<p align="justify"><b>skip-networking</b></p>
<p align="justify">Если, по некоторым причинам, все же требуется удаленный доступ<br />
  к базе данных (например, чтобы выполнить удаленное резервирование данных), то<br />
  можно использовать SSH протокол, как показано ниже: </p>
<p align="justify"><b>backuphost</b><b>$ ssh mysqlserver /usr/local/mysql/bin/mysqldump<br />
  -A &gt; backup</b></p>
<p align="justify"><b>4.2 Улучшение локальной защиты</b></p>
<p align="justify">Следующее изменение должно отключить использование команды<br />
  <b>LOAD DATA LOCAL INFILE</b>, что поможет предотвратить несанкционированное<br />
  чтение данных из локальных файлов. Это имеет особенное значение, в случае если<br />
  в PHP будет найдена новая уязвимость к <b>SQL</b> инъекциям.</p>
<p align="justify">Для этой цели, в раздел <i>[</i><b><i>mysqld</i></b><i>]</i><br />
  файла <b><i>/</i></b><b><i>chroot</i></b><b><i>/mysql/etc/my.cnf</i></b><i>,<br />
  </i>необходимо добавить следующий параметр:</p>
<p align="justify">Set-variable=local-infile=0</p>
<p align="justify">Кроме того, чтобы сделать более удобным использование административных<br />
  средств базы данных, в разделе <b><i>[</i></b><b><i>Client</i></b><b><i>]</i></b><br />
  файла <b><i>/etc/my.cnf</i></b><i>, </i>должен быть изменен следующий параметр:</p>
<p align="justify"><b>socket</b><b> = /chroot/mysql/tmp/mysql.sock</b></p>
<p align="justify">Благодаря этому, каждый раз при выполнении этих утилит, не<br />
  будет никакой потребности передавать в команды: <b><i>mysql</i></b><b><i>, </i></b><b><i>mysqladmin</i></b><b><i>,<br />
  </i></b><b><i>mysqldump</i></b><b> </b>и т.д., параметр<i> <b>socket</b><b><br />
  =/chroot/mysql/tmp/mysql.sock</b></i>.</p>
<p align="justify"><b>4.3 Изменение пароля администратора</b></p>
<p align="justify">Одним из наиболее важных шагов в защите <b>MySQL</b>, является<br />
  изменение пароля администратора базы данных, который является по умолчанию пустым.<br />
  Чтобы сделать это, мы должны запустить <b>MySQL</b> (если конечно, он уже не<br />
  запущен):</p>
<p align="justify"><b>chrootuid</b><b> /chroot/mysql mysql /usr/local/mysql/libexec/mysqld<br />
  &amp;</b></p>
<p align="justify">и изменить пароль администратора следующим образом: </p>
<p align="justify"><b>/usr/local/mysql/bin/mysql -u root </b></p>
<p align="justify"><b>mysql</b><b>&gt; SET PASSWORD FOR root@localhost=PASSWORD(&#8216;new_password&#8217;);</b></p>
<p align="justify">Хорошей привычкой является отказ от изменений паролей из командной<br />
  строки, например, используя команду &quot;<b><i>mysqladmin</i></b><i> <b>password</b></i>&#171;.<br />
  Это особенно важно, если на сервере работают несколько пользователей. В таком<br />
  случае пароль можно легко узнать, например, используя команду &#171;<b><i>ps</i></b><b><i><br />
  </i></b><b><i>aux</i></b>&#187; или просмотрев файлы истории команд <b>(<i>~/.history,<br />
  ~/.bash_history</i></b> и т.д), в случае если на них установлены неподходящие<br />
  права доступа. </p>
<p align="justify"><b>4.4 Удаление значений по умолчанию </b><b>users</b><b>/</b><b>db</b></p>
<p align="justify">Затем, мы должны удалить типовую базу данных (test) и все учетные<br />
  записи, кроме главной локальной учетной записи:</p>
<p align="justify"><b>mysql</b><b>&gt; drop database test;</b></p>
<p align="justify"><b>mysql</b><b>&gt; use mysql;</b></p>
<p align="justify"><b>mysql</b><b>&gt; delete from db;</b></p>
<p align="justify"><b>mysql</b><b>&gt; delete from user where not (host=&quot;localhost&quot;<br />
  and user=&quot;root&quot;);</b></p>
<p align="justify"><b>mysql</b><b>&gt; </b><b>flush</b><b> </b><b>privileges</b><b>;</b></p>
<p align="justify">Это предотвратит нашу базу данных от установления анонимных<br />
  подключений, а также, независимо от параметра <b><i>skip-networking</i></b><br />
  в файле <b><i>/chroot/mysql/etc/my.cnf</i></b><b> &#8212;,</b> удаленных подключений.
</p>
<p align="justify">4.5 Изменение имени учетной записи администратора.</p>
<p align="justify">Также рекомендуется изменить заданное по умолчанию имя учетной<br />
  записи администратора <i>(</i><b><i>root</i></b><i>)</i>, на любое более сложное<br />
  значение. Такая замена затруднит выполнение &quot;лобовых&quot; и &quot;словарных&quot;<br />
  атак на пароль администратора. В этом случае, вторгшийся должен будет предположить<br />
  не только пароль, но и, прежде всего, имя учетной записи администратора. </p>
<p align="justify"><b>mysql</b><b>&gt; update user set user=&quot;mydbadmin&quot;<br />
  where user=&quot;root&quot;;<br />
  mysql&gt; flush privileges;</b></p>
<p align="justify"><b>4.6 Удаление файлов истории команд</b></p>
<p align="justify">Наконец, мы должны удалить содержимое файла истории команд<br />
  <b>mysql</b> <b>(<i>~/.</i></b><b><i>mysql</i></b><b><i>_history</i></b>), в<br />
  котором сохраняются все выполненные SQL команды (особенно пароли, сохраненные<br />
  как открытый текст):</p>
<p align="justify"><b>5. Связь между </b><b>PHP</b><b> и </b><b>mysql</b></p>
<p align="justify">В предыдущей статье &#171;<u><a href="http://www.securitylab.ru/?ID=39645">Защищаем PHP: Шаг за шагом</a></u>&#171;,<br />
  автор упомянул о проблеме связи между PHP и mysql, в случае, если одна из этих<br />
  программ выполняется в <b>chrooted</b> среде. Поскольку локально <b>PHP</b><br />
  связывается с <b>mysql</b>, используя сокет <b><i>/tmp/</i></b><b><i>mysql</i></b><b><i>.sock</i></b>,<br />
  размещение <b>PHP</b> в <b>chrooted</b> среде, означает, что они не могут связываться<br />
  друг с другом. Для решения этой проблемы, каждый раз, запуская <b>mysql</b>,<br />
  мы должны создавать постоянную связь с <b>PHP</b> <b>chrooted</b> средой: </p>
<p align="justify"><b>ln</b><b> /chroot/mysql/tmp/mysql.sock /chroot/httpd/tmp/</b></p>
<p align="justify">Обратите внимание на то, что сокет <b><i>/chroot/</i></b><b><i>mysql</i></b><b><i>/tmp/</i></b><b><i>mysql</i></b><b><i>.sock</i></b><br />
  и каталог <b><i>/chroot/httpd/tmp</i></b> должны быть физически помещены в том<br />
  же самой файловой системе. Иначе программы не смогут связываться друг с другом,<br />
  т.к. постоянные связи не работают между различными файловыми системами.</p>
<p align="justify"><b>6. Финальные шаги</b></p>
<p align="justify">Теперь мы уже можем создавать все базы данных и учетные записи,<br />
  которые будут использоваться определенными <b>PHP</b> приложениями. Необходимо<br />
  подчеркнуть, что эти учетные записи должны иметь права доступа только к базам<br />
  данных, используемым <b>PHP</b> приложениями. В частности они не должны иметь<br />
  никаких прав доступа к базе данных <b><i>mysql</i></b>, и ни никаким системным<br />
  или административным привилегиям (<b>FILE, GRANT, ALTER, SHOW DATABASE, RELOAD,<br />
  SHUTDOWN, PROCESS, SUPER</b> и т.д.). </p>
<p align="justify">Наконец, необходимо создать основной сценарий, который будет<br />
  использоваться для запуска <b>mysql</b> во время загрузки операционной системы.<br />
  Пример такого сценария показан ниже,: </p>
<div align="justify">
<pre>
#!/bin/sh
CHROOT_MYSQL=/chroot/mysql
CHROOT_PHP=/chroot/httpd
SOCKET=/tmp/mysql.sock
MYSQLD=/usr/local/mysql/libexec/mysqld
PIDFILE=/usr/local/mysql/var/`hostname`.pid
CHROOTUID=/usr/local/sbin/chrootuid
echo -n " mysql"
case "$1" in
start)
rm -rf ${CHROOT_PHP}/${SOCKET}
nohup ${CHROOTUID} ${CHROOT_MYSQL} mysql ${MYSQLD} &gt;/dev/null 2&gt;&#038;1 &#038;
sleep 5 &#038;&#038; ln ${CHROOT_MYSQL}/${SOCKET} ${CHROOT_PHP}/${SOCKET}
;;
stop)
kill `cat ${CHROOT_MYSQL}/${PIDFILE}`
rm -rf ${CHROOT_MYSQL}/${SOCKET}
;;
*)
echo ""
echo "Usage: `basename $0` {start|stop}" &gt;&#038;2
exit 64
;;
esac
exit 0
</pre>
</div>
<p align="justify">В случае с нашей системой <b>FreeBSD</b>, вышеупомянутый сценарий<br />
  должен быть помещен в каталог <b><i>/usr/local/etc/rc.d</i></b>, под именем<br />
  <b><i>mysql</i></b><b><i>.sh</i></b><b>.</b></p>
<p align="justify"><b>6.1 Заключение</b></p>
<p align="justify">Применение методов, описанных в данной статье, позволит нам<br />
  значительно увеличить степень защиты <b>mysql</b>. Запуская базу данных в <b>chrooted</b><br />
  среде, отключая прослушивание <b>3306/tcp</b> порта, и применяя &#171;строгие&#187; пароли<br />
  к учетным записям пользователей, мы можем сделать базу данных неуязвимой ко<br />
  многим видам нападений, которые были бы возможны с заданной по умолчанию инсталляцией.</p>
<p align="justify">Хотя никакой метод не позволит нам достигнуть 100% защиты,<br />
  но применение, описанных данной статье методов, по крайней мере, ограничит возможность<br />
  нападения пользователей, посещающих наши <b>Web</b>-сервера с недобросовестными<br />
  намерениями.</p>
]]></content:encoded>
			<wfw:commentRss>http://saygak.com/post/57/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Защита Web приложений с помощью Apache и mod_security</title>
		<link>http://saygak.com/post/56</link>
		<comments>http://saygak.com/post/56#comments</comments>
		<pubDate>Wed, 11 Oct 2006 19:41:30 +0000</pubDate>
		<dc:creator>Michael Saygak</dc:creator>
				<category><![CDATA[Веб]]></category>

		<guid isPermaLink="false">http://saygak.com/post/56</guid>
		<description><![CDATA[21 декабря, 2003 Иван Ристик, перевод SecurityLab.ru В последнее время резко увеличилось количество нападений через HTTP протокол, поэтому все чаще возникает потребность в использовании дополнительных средств защиты Web приложений. Большинство существующих инструментов работает на TPC/IP уровне и не способны контролировать нападения, специфические для HTTP протокола. Для увеличения безопасности Web приложения лучше всего использовать прикладные шлюзы [...]]]></description>
			<content:encoded><![CDATA[<p><font class="text"><b>21 декабря, 2003</b></font></p>
<p>Иван Ристик, перевод SecurityLab.ru</p>
<p>В последнее время резко увеличилось количество нападений через HTTP протокол,<br />
    поэтому все чаще возникает потребность в использовании дополнительных средств<br />
    защиты Web приложений. Большинство существующих инструментов работает на TPC/IP <span id="more-56"></span><br />
    уровне и не способны контролировать нападения, специфические для HTTP протокола.<br />
    Для увеличения безопасности Web приложения лучше всего использовать прикладные<br />
    шлюзы – утилиты, которые являются обратными прокси к Web приложению, способные<br />
    выполнять анализ протокола. В этой статье мы покажем, как быстро можно развернуть<br />
    ваш собственный прикладной шлюз, используя общедоступный бесплатный инструмент<br />
    mod_security.</p>
<h3>Обратный прокси сервер</h3>
<p>Наша задача состоит в том, чтобы защитить один или более Web серверов, постоянно<br />
    находящихся во внутренней сети и обеспечивающие услуги внешним клиентам. В<br />
    этой статье мы предполагаем, что внутренние клиенты, типа служащих, постоянно<br />
    находящихся во внутренней сети, тоже являются внешними клиентами для защищаемых<br />
    нами Web серверов. Также мы предполагаем, что нам требуется защитить два или<br />
    более Web серверов, сервер базы данных и, возможно, другие внутренние сервера.<br />
    Чем больше серверов, тем более оправдано использование обратного прокси сервера.</p>
<p>Прокси, по определению, является устройством,<br />
    которое расположено между двумя объектами, участвующими в сеансе связи. Чаще<br />
    всего прокси сервер используется как прямой прокси – устройство, которое расположено<br />
    между клиентом и сервером. Обратный прокси-сервер делает точно наоборот: он<br />
    расположен между сервером и всеми его клиентами. В более широком смысле, один<br />
    обратный прокси-сервер будет использоваться для всех внутренних Web серверов. 
  </p>
<p>Основное преимущество использования обратного<br />
    прокси сервера – единая централизация. Как только мы заставляем весь трафик<br />
    проходить через единую точку, мы можем выгодно использовать другие инструментальные<br />
    средства для его анализа. Кратко рассмотрим преимущества и недостатки использования<br />
    обратного прокси сервера:</p>
<p>Преимущества:</p>
<ul>
<li>
<div><b>Единая точка доступа. </b>Используя единую точку доступа,<br />
      вы можете централизованно управлять доступом для всех ваших Web серверов.<br />
      Здесь, например, лучше всего осуществлять ограничение доступа, основанное<br />
      на IP адресах. Также вы можете централизованно регистрировать все запросы,<br />
      что значительно упрощает их дальнейшую обработку.</div>
</li>
<li>
<div><b>Firewall</b><b> на </b><b>HTTP</b><b> </b><b>уровне.</b><br />
      <b> </b>Так как прокси сервер обычно создает новый запрос, основанный на<br />
      первоначальном запросе, то вы можете использовать прикладные межсетевые<br />
      экраны для выполнения более широкого набора проверок, контроля трафика и<br />
      реагирования на возможные нападения в реальном масштабе времени.</div>
</li>
<li>
<div><b>Увеличение производительности. </b>Поскольку обратный<br />
      прокси-сервер установлен на отдельной машине, это означает, что вы можете<br />
      использовать дополнительные ресурсы центрального процессора. Вы можете осуществить<br />
      кэширование как статического, так и динамического содержания. SSL трафик<br />
      может использоваться только между прокси сервером и клиентом, освобождая<br />
      фактический Web сервер только на ответ входящим запросам. Наконец, исходящий<br />
      трафик может быть сжат, понижая тем самым требования к пропускной способности.</div>
</li>
<li>
<div><b>Сетевая изоляция. </b> В этом случае обратный прокси<br />
      сервер использует другой уровень межсетевой защиты, вместо того, чтобы защищать<br />
      множественные Web сервера и операционные системы, вы скрываете их позади<br />
      единственного прокси.</div>
</li>
<li>
<div> <b>Топология сети скрыта от внешнего мира. </b> Это хорошо<br />
      как минимум по двум причинам. Изначально мы даем атакующему намного меньше<br />
      информации. Во вторых, вы отделяете структуру сети от ее интерфейса. Любые<br />
      изменения в топологии сети будут выполнены незаметно для внешнего мира.
    </div>
</li>
</ul>
<div>
<p>Недостатки:</p>
</div>
<ul>
<li>
<div><b>Увеличенная сложность.</b> Увеличивая защиту, вы увеличиваете<br />
      сложность сети.</div>
</li>
<li>
<div><b>Единственная точка отказа.</b> Для критических операций<br />
      недопустимо наличие единственной точки отказа. Эта проблема может быть решена<br />
      наличием двух обратных прокси в кластере, однако такой подход еще сильнее<br />
      увеличивает сложность нашей сети.</div>
</li>
</ul>
<div>
<p><b>Описание mod_security</b></p>
<p>ModSecurity – модуль Apache, добавляющий возможности обнаружения и предотвращения<br />
    вторжения на Web сервер. Модуль подобен IDS системе, которую вы бы использовали<br />
    для анализа сетевого трафика, за исключением того, что <b>mod_security </b>работает<br />
    только на HTTP уровне. Модуль позволяет вам анализировать действия, обычные<br />
    с точки зрения HTTP протокола, но трудные для анализа классическими IDS системами.
  </p>
<p>В дополнение к обнаружению, mod_security также поддерживает предотвращение<br />
    нападение. Поскольку модуль расположен между клиентом и сервером, то если<br />
    он найдет, что запрос содержит злонамеренные данные, он может отклонить запрос,<br />
    выполняя любое множество встроенных действий.</p>
<p>Поскольку mod_security такой же модуль, как и множество других, вы можете<br />
    использовать его как часть любой инсталляции Apache. Вот несколько из основных<br />
    возможностей, предоставляемых модулем mod_security (более подробно о работе<br />
    модуля можно узнать из описания, доступного на Web сайте <u>mod</u><u>_</u><u>security</u>):</p>
</div>
<ol>
<li>
<div><b>Анализ запроса.</b> Это основная функция данного модуля,<br />
      особенно когда вы имеете дело с POST запросами, в которых получение тела<br />
      запроса может быть затруднено. </div>
</li>
<li>
<div><b>Выполнение канонизации и функции антиуклонения.</b> Выполнение<br />
      ряда преобразований, для преобразования входных данных в форму, подходящую<br />
      для анализа. Этот шаг применяется для борьбы с различными методами уклонения.</div>
</li>
<li>
<div><b>Выполнение специальных встроенных проверок.</b> В этом<br />
      месте выполняются более сложные проверки правильности, такие как проверка<br />
      правильности URL кодирования и проверка правильности Unicode кодирования.<br />
      Вы можете также контролировать некоторые значения байтов в запросе для борьбы<br />
      с shellcode. </div>
</li>
<li>
<div><b>Запуск входных правил.</b> В этом месте запускаются правила,<br />
      созданные вами. Они позволяют вам анализировать каждый аспект запроса, используя<br />
      регулярные выражения. Также здесь могут быть объединены несколько правил<br />
      для более сложного анализа.</div>
</li>
</ol>
<div>
<p>Затем запрос достигает обработчика. После запроса: </p>
</div>
<ol>
<li>
<div><b>Запуск правил вывода.</b> Правила вывода применяются к<br />
      телу ответа. Они очень полезны для предотвращения утечек информации. </div>
</li>
<li>
<div><b> Регистрация запроса.</b> Регистрируется окончательный<br />
      запрос, состоящий из тела запроса и заголовков ввода и вывода. Чтобы предотвращать<br />
      чрезмерную регистрацию, mod_security может регистрировать запросы по выбору,<br />
      например запросы, которые получили ответ от mod_security. </div>
</li>
</ol>
<div>
<p><b>Инсталляция и конфигурация</b></p>
<p>Инсталляция удивительно проста. Предположим,<br />
    что сервер, который вы хотите защитить, использует адрес 192.168.254.10, и<br />
    на обратном прокси сервере вы сконфигурировали общедоступное имя домена www.modsecurity.org.</p>
<p><b>Инсталляция</b><b> </b><b>и</b><b> </b><b>конфигурация</b></p>
<p>На обратном проски вы должны инсталлировать Apache 2 Web<br />
    server, удостоверяясь что вы установили в mod_proxy, mod_proxy_http, и mod_security.<br />
    Мы не будем тратить время на объяснение этого процесса, считая, что вы уже<br />
    знакомы с ним. В противном случае загляните в раздел ссылок, там вы найдете<br />
    ссылки на несколько хороших статей, посвященных процессу инсталляции Apache<br />
    Web сервера. Неплохо будет также установить mod_rewrite, так как он может<br />
    работать в тандеме с mod_proxy, что значительно увеличивает ваши возможности.</p>
<p>Хотя любой Web сервер может стать обратным прокси, просто,<br />
    путем добавления модулей, всетаки не рекомендуется совмещать эти две роли<br />
    вместе. Обратный прокси сервер должен быть единственным уязвимым сервером,<br />
    и поэтому вы должны уменьшить количество кода, который он содержит, чтобы<br />
    свести к минимуму риск использования уязвимости. </p>
<p>Apache 2.x - лучший выбор для обратного прокси сервера, потому<br />
    что он содержит новый фильтрационный API, позволяющий модулям видеть и взаимодействовать<br />
    с телом запроса на входе и с ответом на выходе. Это особенно важно для прикладного<br />
    шлюза, так как информация будет проверена прежде, чем она достигнет получателя.
  </p>
<p>После того как вы установили прокси, ознакомьтесь с приведенными<br />
    ниже правилами конфигурирования виртуального хоста: </p>
<pre>
  &lt;VirtualHost www.modsecurity.org&gt;

# Just the bare minimum of directives
ServerName www.modsecurity.org
DocumentRoot /rproxy/nowhere

# While the following line is not strictly necessary it's here to emphasize
# the fact that the reverse proxy does not use this directive. In fact, turning
# it On without proper access control creates an open proxy!
ProxyRequests Off
ProxyPass / http://192.168.254.10/
ProxyPassReverse / http://192.168.254.10/

# Yes, we want to use mod_security
SecFilterEngine On

# Scan request body
SecFilterScanPOST On

# Scan response body
SecFilterScanOutput On

# Check URL encoding
SecFilterCheckURLEncoding On

# This setting should be set to On only if the Web site is
# using the Unicode encoding. Otherwise it may interfere with
# the normal Web site operation.
SecFilterCheckUnicodeEncoding Off

# Only allow certain byte values to be a part of the request.
# This is pretty relaxed, most applications where only English
# is used will happily work with a range 32 - 126.
SecFilterForceByteRange 1 255

# Audit log logs complete requests. Configured as below it
# will only log invalid requests for further analysis.
SecAuditEngine RelevantOnly
SecAuditLog logs/audit_log
# You may need this later but we don't log anything
# here for now. Excessive debug logging may slow down
# the server.
SecFilterDebugLevel 0
SecFilterDebugLog logs/modsec_debug_log

# By default, deny requests with status 500
SecFilterDefaultAction "deny,log,status:500"

# Put your mod_security rules here
# ...

&lt;/VirtualHost&gt;
  </pre>
<p><b>Практические примеры</b></p>
<p>В этом разделе я продемонстрирую типичный набор<br />
    правил mod_security. Вы должны всегда сначала выполнять правила, которые имеют<br />
    широкие возможности, только затем подходя к более специфичным проблемам. Все<br />
    правила mod_security (и варианты конфигурации) могут быть применены на виртуальном<br />
    хосте или директории, так что у вас могут быть области с полностью различными<br />
    конфигурациями защиты. </p>
<p><b>Обнаружение обычных нападений</b></p>
<p>Эти правила защитят от самых распространенных нападений на<br />
    Web приложения: </p>
<pre>
  # Command execution attacks
SecFilter /etc/password
SecFilter /bin/ls
# Directory traversal attacks
SecFilter "\.\./"
# XSS attacks
SecFilter "&lt;(.|\n)+&gt;"
SecFilter "&lt;[[:space:]]*script"

# SQL injection attacks
SecFilter "delete[[:space:]]+from"
SecFilter "insert[[:space:]]+into"
SecFilter "select.+from"

# MS SQL specific SQL injection attacks
SecFilter xp_enumdsn
SecFilter xp_filelist
SecFilter xp_availablemedia
SecFilter xp_cmdshell
SecFilter xp_regread
SecFilter xp_regwrite
SecFilter xp_regdeletekey
  </pre>
<p><b>Защита уязвимого сценария</b></p>
<p>Некоторые PHP приложения уязвимы, когда включена опция конфигурации register_globals,<br />
    разрешающая нападающим установить значение внутренней переменной по своему<br />
    выбору. В результате удаленный атакующий может выполнить произвольный PHP<br />
    код на уязвимом сервере.</p>
<p><em>SecFilterSelective ARG_b2inc &quot;!^$&quot;</em></p>
<p><b>Защита от </b><b>XSS</b><b> </b><b>нападений через </b><b>cookie</b><b><br />
    </b><b>PHP</b><b> </b><b>сессии </b></p>
<p>PHP до версии 4.3.2 уязвимы к XSS нападениям, выполняемым через идентификатор<br />
    сессии. Если вы не можете заменить вашу версию PHP на последнюю версию, вы<br />
    можете защитить себя следующим правилом: </p>
<pre>
SecFilterSelective ARG_PHPSESSID "!^[0-9a-z]*$"
SecFilterSelective COOKIE_PHPSESSID "!^[0-9a-z]*$"
</pre>
<p><b>Прекращение использования </b><b>FormMail</b><b> </b><b>для<br />
    рассылки спама</b></p>
<p>Некоторые версии FormMail могут использоваться<br />
    для рассылки электронной почты на произвольные адреса. Следующее правило показывает,<br />
    как вы можете использовать фильтр для применения его к скрипту FormMail. Запрос<br />
    будет отклонен, если электронная почта предназначена какому-либо адресу кроме<br />
    тех, которые заканчиваются на &quot;@modsecurity.org&quot;:</p>
<pre>
 &lt;Location /cgi-bin/FormMail&gt;
    SecFilterSelective "ARG_recipient" "!@modsecurity\.org$"
&lt;/Location&gt;
 </pre>
<p><b>Ограничение административного входа в систему по IP адресу<br />
    </b></p>
<p>Вот – хороший пример. У вас есть приложение,<br />
    в котором администратор входит через ту же самую панель входа, что и другие<br />
    пользователи, но вам хочется ограничить административный вход в систему некоторыми<br />
    IP адресами. Для этого надо использовать цепочку из двух правил. Второе правило<br />
    выполнится, только если сработало первое правило; в этом случае &#8212; если вводимое<br />
    имя пользователя &#8212; &quot;admin&quot;. </p>
<p>SecFilterSelective ARG_username admin chain<br />
    SecFilterSelective REMOTE_ADDR &quot;!^ADMIN_IP_ADDRESS_HERE$&quot;</p>
<p><b>Предотвращение утечки информации</b></p>
<p>Во всех версиях PHP, если происходит фатальная<br />
    ошибка, сценарий будет немедленно закончен (стандартная подпрограмма обработки<br />
    ошибок не будет вызвана). Утечку информации, которая может произойти из-за<br />
    этих проблем, можно предотвратить, просматривая выходные данные и препятствуя<br />
    им достигнуть пользователя, если данные содержат сообщения об ошибках. </p>
<p>SecFilterSelective OUTPUT &quot;Fatal error:&quot;</p>
<p><b>Обнаружение вторжений</b></p>
<p>Фильтрация выходных данных может также использоваться<br />
    для обнаружения успешных вторжений. Эти правила будут контролировать выходные<br />
    данные и обнаруживать типичные ключевые слова, следующие из выполнения команды<br />
    на сервере:</p>
<pre>
SecFilterSelective OUTPUT "Volume Serial Number"
SecFilterSelective OUTPUT "Command completed"
SecFilterSelective OUTPUT "Bad command or filename"
SecFilterSelective OUTPUT "file(s) copied"
SecFilterSelective OUTPUT "Index of /cgi-bin/"
SecFilterSelective OUTPUT ".*uid\=\("
</pre>
<p><b>Другое</b></p>
<p>Эти правила могут быть для вас полезными, в зависимости от типов приложений<br />
    и Web серверов, которые расположены за обратным прокси. На сайте mod_security,<br />
    вы можете найти большое количество правил, автоматически преобразованных из<br />
    Snort правил. Загрузите список и просто удалите правила, которые вам не нужны.
  </p>
<p><b>Заключение</b></p>
<p>В данной статье освящена только малая часть очень<br />
    сложной проблемы. Я предлагаю вам посмотреть ссылки на ряд сайтов, инструментальных<br />
    средств, для того, чтобы ознакомиться с другими аспектами, которые мы не охватили<br />
    в данной статье, например, балансирование загрузки обратного прокси и объединенная <br />
    или прозрачная конфигурация обратного прокси. В данной ситуации можно действовать<br />
    и другим способом, загрузите руководство по mod_security и узнайте его особенности.<br />
    Однако данный модуль содержит также другие особенности, не упомянутые в руководстве.<br />
    Поэтому, если вам это будет необходимо, свяжитесь со мной, чтобы узнать о<br />
    новых особенностях mod_security. </p>
</p></div>
]]></content:encoded>
			<wfw:commentRss>http://saygak.com/post/56/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Защита Web-сервисов с использованием mod_security</title>
		<link>http://saygak.com/post/55</link>
		<comments>http://saygak.com/post/55#comments</comments>
		<pubDate>Wed, 11 Oct 2006 19:39:47 +0000</pubDate>
		<dc:creator>Michael Saygak</dc:creator>
				<category><![CDATA[Веб]]></category>

		<guid isPermaLink="false">http://saygak.com/post/55</guid>
		<description><![CDATA[09 июня 2005 Web-сервисы все чаще становятся неотъемлемой частью Web-приложений нового поколения. И они также уязвимы к атакам. Природа таких атак точно такая же, как и для обычных Web-приложений, однако принцип действий разный. Эти атаки могут привести к утечке информации; далее, они способствуют удаленному выполнению команд. Используя WSDL, хакер может определить точку доступа и доступные [...]]]></description>
			<content:encoded><![CDATA[<p>09 июня 2005 </p>
<p>Web-сервисы все чаще становятся неотъемлемой частью Web-приложений нового<br />
поколения. И они также уязвимы к атакам. Природа таких атак точно такая же, как<br />
и для обычных Web-приложений, однако принцип действий разный. Эти атаки могут<br />
привести к утечке информации; далее, они способствуют удаленному <span id="more-55"></span>выполнению<br />
команд. Используя WSDL, хакер может определить точку доступа и доступные<br />
интерфейсы Web-сервисов. Интерфейсы эти принимают данные с использованием SOAP<br />
по HTTP/HTTPS и без хорошей защиты на уровне исходного кода могут быть взломаны.<br />
<a href="/bitrix/exturl.php?goto=http%3A%2F%2Fwww.modsecurity.org%2F">mod_security</a> работает как Web-модуль<br />
сервера Apache, идеальный для защиты Web-сервисов против атак, которые также<br />
включают специально обработанные POST запросы, содержащие SOAP конверты.</p>
<h3>Проблемный Домен</h3>
<p>Для атаки Web-сервисов существует четыре основных направления:</p>
<ul type="disc">
<li>Инъекция в буфер с непостоянным размером</li>
<li>Инъекция метасимвола </li>
<li>SQL инъекция </li>
<li>SOAP раскрытие дефектного кода</li>
</ul>
<p>Обычно конфигурации межсетевых экранов беспрепятственно пропускают входящий<br />
HTTP/HTTPS трафик. Каждая из вышеуказанных атак, проще говоря, представляет<br />
собой посылку специально обработанного трафика, выглядящего как обычный трафик,<br />
поэтому он и проходит через межсетевой экран. В этой статье будут описаны пути и<br />
средства разделения легального и злоумышленного HTTP/HTTPS трафика, и, в<br />
дальнейшем,  блокировки злоумышленного. Выполнение этих действий поможет резко<br />
снизить вероятность успешного проведения атаки через 80/443 порты.</p>
<h3>Каково же решение?</h3>
<p>Решений на самом деле очень много, начиная с установки дополнительных<br />
проверок на вводимые данные. Один из способов – провести проверку содержимого<br />
каждого входящего запроса и сравнить его с заранее определенными правилами. Это<br />
предотвратит проникновение злоумышленных SOAP запросов в Web-службы на уровне<br />
исходного кода. Mod_security может использоваться для защиты против всех типов<br />
нападений в том случае, когда вы правильно развернули и настроили его для<br />
Web-служб. В этой статье будет подробно рассказано &#8212; как настраивать<br />
mod_security для защиты Web-служб.</p>
<p>После установки Web-служб необходимо провести грамотную защиту от различных<br />
направлений атак. Каждое направление атак требует своего подхода со стороны<br />
защиты. В качестве примера рассмотрим фиктивный случай с банком.</p>
<p>Blue Bank (<em><a href="/bitrix/exturl.php?goto=http%3A%2F%2Fwww.bluebank.example.com%2F">www.bluebank.example.com</a></em>)<br />
только что принял Web-сервисы с использованием mod_security. Эти службы<br />
предоставляют банковые сервисы через Интернет для финансовых партнеров и<br />
клиентов (баланс счета, денежные переводы, исправление личных данных). На<br />
рисунке 1 показана архитектура развертки Web служб Blue Bank’a.</p>
<p>
<img border="0" src="http://www.securitylab.ru/_Article_Images/2005/07/image001.gif" width="500" height="347"/></p>
<p><em>Рисунок 1. Система Web-служб Blue Bank’a</em></p>
<p>Существует много способов развертывания Web-служб. В нашем случае Web-служба<br />
запускается на Tomcat/Axis и подключается к Web-серверу Apache. Приложения<br />
банковских Web-сервисов написаны на Java (с расширением файла .jws).</p>
<p>Важные части настроек Apache и Axis включают в себя Apache <em>httpd.conf,<br />
который загружает </em>Tomcat:</p>
<pre>
LoadModule jk2_module modules/mod_jk2.so
JkSet config.file /usr/local/apache2/conf/workers2.properties
</pre>
<p>Файл Axis &#8212; <em>web.xml, который поддерживает </em>AxisServlet для Web<br />
сервисов в обработке:</p>
<pre>
&lt;servlet-mapping&gt;
    &lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt;
    &lt;url-pattern&gt;*.jws&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;
</pre>
<p>С того момента, как выше указанные настройки вступили в силу, вы можете<br />
ставить любые Web-службы на свой сервер. Если посмотреть ответ сервера на запрос<br />
банера, то можно увидеть следующее:</p>
<pre>&lt;code&gt;Server: Apache/2.0.50 (Unix) mod_ssl/2.0.50 OpenSSL/0.9.7d mod_jk2/2.0.4&lt;/code&gt;</pre>
<p>Этот баннер указывает на то, что Web-сервер крутится на Apache/2.0.50 (Unix)<br />
с запущенным модулем mod_jk2/2.0.4. Axis запускается как часть Web-приложения<br />
Tomcat и готов для поднятия Web-сервисов. Для обеспечения безопасности на уровне<br />
Web- сервисов, Blue Bank загрузил модуль mod_security, предоставляющий<br />
возможности программной фильтрации. Следующая строка в <em>httpd.conf загружает<br />
модуль безопасности:</em></p>
<pre>&lt;code&gt;LoadModule security_module    modules/mod_security.so&lt;/code&gt;</pre>
<p>С установленным mod_security Blue Bank может добавить правила фильтрации в<br />
<em>httpd.conf</em>:</p>
<pre>
&lt;IfModule mod_security.c&gt;
     # Turn the filtering engine On or Off
     SecFilterEngine On
     SecFilterDefaultAction "deny,log,status:500"
     SecFilterScanPOST On

     . . .
     # Other rules
     . . .
&lt;/IfModule&gt;
</pre>
<p>Этого вполне достаточно, чтобы позволить системным администраторам и<br />
разработчикам использовать mod_security для обнаружения входящих злонамеренных<br />
HTTP/HTTPS запросов.</p>
<p>Рассмотрим пример Web-сервиса просмотра баланса <em><br />
<a href="/bitrix/exturl.php?goto=http%3A%2F%2Fwww.bluebank.example.com%2Faxis%2FgetBalance.jws"><br />
www.bluebank.example.com/axis/getBalance.jws</a> </em>WSDL-<em>ответ этого Web<br />
сервиса будет приходить из </em><em><br />
<a href="/bitrix/exturl.php?goto=http%3A%2F%2Fwww.bluebank.example.com%2Faxis%2FgetBalance.jws%3Fwsdl"><br />
www.bluebank.example.com/axis/getBalance.jws?wsdl</a></em></p>
<h4>Метод/Интерфейс вывода баланса счета из данных, полученных от WSDL</h4>
<p>Тщательно рассмотренный WSDL-ответ является результатом выполнения входящего<br />
HTTP запроса. Особый интерес здесь представляет метод инициализации, который<br />
берет банковый id и передает состояние счета обратно клиенту через HTTP. Тэг<br />
операции устанавливает методы, которые может использовать клиент Web-сервисов.<br />
Важные отрывки файла WSDL включают:</p>
<pre>
&lt;wsdl:operation name="getInput"&gt;
 &lt;wsdlsoap:operation soapAction=""/&gt;
   &lt;wsdl:input name="getInputRequest"&gt;
     &lt;wsdlsoap:body encodingStyle=http://schemas.xmlsoap.org/soap/encoding/
             namespace="http://DefaultNamespace"
             use="encoded"/&gt;
   &lt;/wsdl:input&gt;
   &lt;wsdl:output name="getInputResponse"&gt;
     &lt;wsdlsoap:body encodingStyle=http://schemas.xmlsoap.org/soap/encoding/
             namespace="http://www.bluebank.example.com/axis/getBalance.jws"
             use="encoded"/&gt;
   &lt;/wsdl:output&gt;

&lt;wsdl:message name="getInputResponse"&gt;
    &lt;wsdl:part name="getInputReturn" type="xsd:string"/&gt;
&lt;/wsdl:message&gt;
&lt;wsdl:message name="getInputRequest"&gt;
    &lt;wsdl:part name="id" type="xsd:string"/&gt;
&lt;/wsdl:message&gt;
</pre>
<p>Как показано выше, передача <code>id конкретному методу приведет к возврату<br />
строки в выходных данных. Когда вы посылаете id банкового счета как входные<br />
данные Web-сервису, вы получаете информацию о балансе счета.</code></p>
<h4>Вызов Web-сервиса через HTTP</h4>
<p>Клиенты или партнеры Blue Bank, запрашивающие информацию о состоянии счета<br />
через Интернет могут выбрать информацию реквизита, послав правильно собранный<br />
конверт Web-сервисам банка. На рисунке 2 показан HTTP запрос на информацию о<br />
балансе счета с id 12123, посланный Web-сервису.</p>
<p>
<img border="0" src="http://www.securitylab.ru/_Article_Images/2005/07/image002.gif" width="500" height="336"/></p>
<h4><em>Рисунок 2. </em>Вызов Web сервиса через HTTP</h4>
<p>Существует несколько способов создания SOAP клиентов, которые будут<br />
генерировать SOAP запросы правильного формата. Ниже представлен пример SOAP<br />
клиента с использованием <a href="/bitrix/exturl.php?goto=http%3A%2F%2Fwww.soaplite.com%2F">SOAP::Lite</a> на<br />
Perl. Следующий простой код генерирует SOAP запрос:</p>
<pre>
#!perl -w
use SOAP::Lite;

print SOAP::Lite
  -&gt; service('http://www.bluebank.example.com/axis/getBalance.jws?wsdl')
  -&gt; getInput('12123');
</pre>
<p>Однако существует вероятность перехвата HTTP-запроса с помощью снифера,<br />
например <a href="/bitrix/exturl.php?goto=http%3A%2F%2Fwww.ethereal.com%2F">ethereal</a>. HTTP/SOAP запрос,<br />
посланный на <em><a href="/bitrix/exturl.php?goto=http%3A%2F%2Fwww.bluebank.example.com%2F"><br />
www.bluebank.example.com</a> с id 12123 сгенерирует что-то вроде этого:</em></p>
<pre>
POST /axis/getBalance.jws HTTP/1.0
Content-Type: text/xml; charset=utf-8
SOAPAction: ""
Content-Length: 576
Expect: 100-continue
Host: www.bluebank.example.com

&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tns="http://www.bluebank.example.com/axis/getBalance.jws" xmlns:types="
http://www.bluebank.example.com/axis/getBalance.jws/encodedTypes"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
        &lt;soap:Body
soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"&gt;
                &lt;q1:getInput xmlns:q1="http://DefaultNamespace"&gt;
                        &lt;id xsi:type="xsd:string"&gt;12123&lt;/id&gt;
                &lt;/q1:getInput&gt;
        &lt;/soap:Body&gt;
&lt;/soap:Envelope&gt; 

...

HTTP/1.1 200 OK
Date: Mon, 03 Jan 2005 19:24:10 GMT
Server: Apache/2.0.50 (Unix) mod_ssl/2.0.50 OpenSSL/0.9.7d mod_jk2/2.0.4
Set-Cookie: JSESSIONID=69C6540CC427A8B064C0795ADDFC20EA; Path=/axis
Content-Type: text/xml;charset=utf-8
Connection: close

&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;
        &lt;soapenv:Body&gt;
                &lt;ns1:getInputResponse
soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
                        xmlns:ns1="http://DefaultNamespace"&gt;
                        &lt;ns1:getInputReturn
xsi:type="xsd:string"&gt;$2500&lt;/ns1:getInputReturn&gt;
                &lt;/ns1:getInputResponse&gt;
        &lt;/soapenv:Body&gt;
&lt;/soapenv:Envelope&gt;
</pre>
<h3>Встраиваем ресурсы Web-сервисов в mod_security</h3>
<p>Web сервис Blue Bank’а использует URL<em><br />
<a href="/bitrix/exturl.php?goto=http%3A%2F%2Fwww.bluebank.example.com%2Faxis%2FgetBalance.jws"><br />
www.bluebank.example.com/axis/getBalance.jws</a>. Необходимо создать набор<br />
правил для этого ресурса. </em>Blue Bank встроил этот ресурс в <em>httpd.conf:</em></p>
<pre>
&lt;IfModule mod_security.c&gt;
      SecFilterEngine On
      SecFilterDefaultAction "deny,log,status:500"
      # Other rules
# ------- Rules for web services --------------------------
      &lt;Location /axis/getBalance.jws&gt;
        SecFilterInheritance Off
        SecFilterDefaultAction "deny,log,status:500"
        SecFilterScanPOST On
        SecFilterCheckURLEncoding On
        SecFilterCheckUnicodeEncoding On
      &lt;/Location&gt;
#---------------------------------------------------------------
&lt;/IfModule&gt;
</pre>
<p>Следующий блок директивы относится к критерию фильтрации для<br />
/axis/getBalance.jws. Здесь добавляется требуемая метка-заполнитель для защиты<br />
Web-сервиса. Метки-заполнители находятся в блоке &lt;Location&gt;.</p>
<pre>
# ------- Rules for web services --------------------------
&lt;Location /axis/getBalance.jws&gt;
        SecFilterInheritance Off
        SecFilterDefaultAction "deny,log,status:500"
        SecFilterScanPOST On
        SecFilterCheckURLEncoding On
        SecFilterCheckUnicodeEncoding On
&lt;/Location&gt;
#---------------------------------------------------------------
</pre>
<p>Здесь находятся две очень важные директивы:</p>
<p>SecFilterInheritance  Off</p>
<p>Эта директива отключает другие правила и дает пустое пространство для нового<br />
набора правил, разрешающих вводить только путь.</p>
<p>SecFilterScanPOST  On</p>
<p>Для вызова процедур Web сервисов используется метод POST. Следовательно,<br />
следующая директива, которую следует задействовать – SecFilterScanPost – для<br />
включения POST фильтрации.</p>
<p>Выполнив эти действия, Blue Bank установил защиту в форме mod_security. Кроме<br />
того, mod_security знает что нужно охранять – id, который посылают клиенты<br />
Web-сервису в SOAP конверте.</p>
<h3>Защищаемся от Других Направлений Атак</h3>
<p>Первым делом для защиты ото всех входящих злоумышленных запросов, Blue Bank’у<br />
нужно перехватить значение id, чтобы предостеречь клиента от ввода неверного<br />
значения. SOAP запрос использует XML тэг для передачи информации <code>id во<br />
внутренний код Web сервиса. Тэг выглядит примерно следующим образом:</code></p>
<pre>
&lt;q1:getInput xmlns:q1="http://DefaultNamespace"&gt;
     &lt;id xsi:type="xsd:string"&gt;12123&lt;/id&gt;
&lt;/q1:getInput&gt;
</pre>
<p>Чтобы отфильтровать запрос, mod_security должен как-то прочитать значение,<br />
ассоциированное с тэгом; в нашем случае это 12123. В mod_security имеется<br />
несколько возможностей для перехвата значения, переданного с <code>POST<br />
запросом. Один из методов – это использование заготовленного фильтра:</code></p>
<pre>
&lt;Location /axis/getBalance.jws&gt;
    SecFilterInheritance Off
    SecFilterDefaultAction "deny,log,status:500"
    SecFilterScanPOST On
    SecFilterCheckURLEncoding On
    SecFilterCheckUnicodeEncoding On
    SecFilterSelective POST_PAYLOAD "&lt;\s*id[^&gt;]*&gt;" chain
&lt;/Location&gt;
</pre>
<p>Выделенная линия перехватывает запрос, сделанный на id. <code>POST_PAYLOAD<br />
перехватывает блок данных POST и пытается сравнить его с правильной маской<br />
</code>(<code>&lt;\s*id[^&gt;]*&gt;</code>). Эта <i>маска регулярного выражения</i><br />
подтверждает, что <code>существует</code> тэг для <code>id. Только после этого<br />
процесс пойдет дальше по оставшимся проверкам (из-за цепной директивы). Другими<br />
словами, если тэг id существует, </code>mod_security переходит к следующей<br />
проверке.</p>
<p>Если в <code>POST запросе содержится id, то сервер сможет обработать<br />
информацию. Однако злоумышленник может модифицировать определенное значение,<br />
чтобы провести инъекцию. Существует четыре основных методов атак.</code></p>
<h4>Вид атаки 1: Инъекция в буфер с непостоянным размером</h4>
<p>Одной из основных опасностей при передаче большого буфера в переменную<br />
является то, что большой буфер может вызвать сбой в работе приложения и/или<br />
выполнить произвольный код во время работы. Правило, представленное ниже<br />
защищает переменную <code>id от данного типа атаки:</code></p>
<pre>
&lt;Location /axis/getBalance.jws&gt;
        SecFilterInheritance Off

        SecFilterDefaultAction "deny,log,status:500"
        SecFilterScanPOST On
        SecFilterCheckURLEncoding On
        SecFilterCheckUnicodeEncoding On

        SecFilterSelective POST_PAYLOAD "&lt;\s*id[^&gt;]*&gt;" chain
        SecFilterSelective POST_PAYLOAD "&lt;\s*id[^&gt;]*&gt;.{6,}&lt;/\s*id\s*&gt;"
		  "deny,status:500"
&lt;/Location&gt;
</pre>
<p>Эта директива позволяет принимать в буфер только первые пять символов.<br />
Используется маска ввода <code>&lt;\s*id[^&gt;]*&gt;.{6,}&lt;/\s*id\s*&gt;. Чтобы убедиться в<br />
том, что описанный выше блок директив работает, </code>Blue Bank может послать<br />
два запроса, один – соответствующий установленной длине; другой – превышающий<br />
её.</p>
<pre>
POST /axis/getBalance.jws HTTP/1.0
Content-Type: text/xml; charset=utf-8
SOAPAction: ""
Content-Length: 576
Expect: 100-continue
Host: www.bluebank.example.com

&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tns="http://www.bluebank.example.com/axis/getBalance.jws" xmlns:types="
http://www.bluebank.example.com/axis/getBalance.jws/encodedTypes"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
        &lt;soap:Body
soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"&gt;
                &lt;q1:getInput xmlns:q1="http://DefaultNamespace"&gt;
                        &lt;id xsi:type="xsd:string"&gt;12123&lt;/id&gt;
                &lt;/q1:getInput&gt;
        &lt;/soap:Body&gt;
&lt;/soap:Envelope&gt;

...

HTTP/1.1 200 OK
Date: Mon, 03 Jan 2005 19:24:10 GMT
Server: Apache/2.0.50 (Unix) mod_ssl/2.0.50 OpenSSL/0.9.7d mod_jk2/2.0.4
Set-Cookie: JSESSIONID=69C6540CC427A8B064C0795ADDFC20EA; Path=/axis
Content-Type: text/xml;charset=utf-8
Connection: close

&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;
        &lt;soapenv:Body&gt;
                &lt;ns1:getInputResponse
soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
                        xmlns:ns1="http://DefaultNamespace"&gt;
                        &lt;ns1:getInputReturn
xsi:type="xsd:string"&gt;$2500&lt;/ns1:getInputReturn&gt;
                &lt;/ns1:getInputResponse&gt;
        &lt;/soapenv:Body&gt;
&lt;/soapenv:Envelope&gt;
</pre>
<p>В случае, приведенном выше, буфер из пяти символов был пропущен и сервер<br />
прислал ответ со значением $2500. Ниже показан запрос и ответ сервера на id<br />
121234 (шесть символов):</p>
<pre>
POST /axis/getBlalance.jws HTTP/1.0
Content-Type: text/xml; charset=utf-8
SOAPAction: ""
Content-Length: 577
Expect: 100-continue
Host: www.bluebank.example.com

&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tns="http://www.bluebank.example.com/axis/getBalance.jws" xmlns:types="
http://www.bluebank.example.com/axis/getBalance.jws/encodedTypes"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
        &lt;soap:Body
soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"&gt;
                &lt;q1:getInput xmlns:q1="http://DefaultNamespace"&gt;
                        &lt;id xsi:type="xsd:string"&gt;121234&lt;/id&gt;
                &lt;/q1:getInput&gt;
        &lt;/soap:Body&gt;
&lt;/soap:Envelope&gt;

...

HTTP/1.1 500 Internal Server Error
Date: Mon, 03 Jan 2005 22:00:33 GMT
Server: Apache/2.0.50 (Unix) mod_ssl/2.0.50 OpenSSL/0.9.7d mod_jk2/2.0.4
Content-Length: 657
Connection: close
Content-Type: text/html; charset=iso-8859-1

&lt;!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"&gt;
&lt;html xmlns:v="urn:schemas-microsoft-com:vml"
	xmlns:o="urn:schemas-microsoft-com:office:office"
		xmlns="http://www.w3.org/TR/REC-html40"&gt;&lt;head&gt;
   &lt;title&gt;500 Internal Server Error&lt;/title&gt;
  &lt;/head&gt;&lt;body&gt;
  &lt;h1&gt;Internal Server Error&lt;/h1&gt;
  &lt;p&gt;The server encountered an internal error or misconfiguration and was
  unable to complete your request.&lt;/p&gt;
  &lt;p&gt;Please contact the server administrator, you@example.com and inform
  them of the time the error occurred, and anything you might have done that
  may have caused the error.&lt;/p&gt;
  &lt;p&gt;More information about this error may be available in the server
error
  log.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;address&gt;Apache/2.0.50 (Unix) mod_ssl/2.0.50 OpenSSL/0.9.7d
mod_jk2/2.0.4
  Server  at 192.168.7.50 Port 80&lt;/address&gt;
&lt;/body&gt;&lt;/html&gt;
</pre>
<p>Модуль mod_security отклонил этот запрос. Статус 500 говорит о том, что ответ<br />
получен. Таким образом, запрос никогда не затронет уровня Web-сервисов. Blue<br />
Bank’у удалось поострить грамотную защиту от переполнения буфера – часто<br />
встречающейся и игнорируемой уязвимости.</p>
<h4>Вид Атаки 2: Инъекция Мета Символа</h4>
<p>Другая угроза состоит в использовании мета символов (%,’,”). Эти символы<br />
могут стать причиной атаки методом SQL инъекции, приводящей к утечке информации.<br />
Следующая стратегия обеспечит устойчивость к таким атакам.</p>
<pre>
&lt;Location /axis/getBalance.jws&gt;
   SecFilterInheritance Off

   SecFilterDefaultAction "deny,log,status:500"
   SecFilterScanPOST On
   SecFilterCheckURLEncoding On
   SecFilterCheckUnicodeEncoding On

   SecFilterSelective POST_PAYLOAD "&lt;\s*id[^&gt;]*&gt;" chain
   SecFilterSelective POST_PAYLOAD "&lt;\s*id[^&gt;]*&gt;.{6,}&lt;/\s*id\s*&gt;"
     "deny,status:500"
   SecFilterSelective POST_PAYLOAD "&lt;\s*id[^&gt;]*&gt;.*[^a-zA-Z0-9][^&lt;]*&lt;/\s*id\s*&gt;"
     "deny,status:500"
&lt;/Location&gt;
</pre>
<p>Маска выражения &lt;\s*id[^&gt;]*&gt;.*[^a-zA-Z0-9][^&lt;]*&lt;/\s*id\s*&gt; отклоняет HTTP<br />
запрос, если переменная POST_PAYLOAD содержит символы, не являющимися<br />
строковыми. Это очень важная возможность в модуле mod_security.</p>
<p>Ниже показан запрос и ответ сервера на id 12’12:</p>
<pre>
POST /axis/getBalance.jws HTTP/1.0
Content-Type: text/xml; charset=utf-8
SOAPAction: ""
Content-Length: 576
Expect: 100-continue
Host: www.bluebank.example.com

&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tns="http://www.bluebank.example.com/axis/getBalance.jws" xmlns:types="
http://www.bluebank.example.com/axis/getBalance.jws/encodedTypes"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
        &lt;soap:Body
soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"&gt;
                &lt;q1:getInput xmlns:q1="http://DefaultNamespace"&gt;
                        &lt;id xsi:type="xsd:string"&gt;12'12&lt;/id&gt;
                &lt;/q1:getInput&gt;
        &lt;/soap:Body&gt;
&lt;/soap:Envelope&gt;

...

500 Internal Server Error
HTTP/1.1 500 Internal Server Error
Date: Mon, 03 Jan 2005 22:00:33 GMT
Server: Apache/2.0.50 (Unix) mod_ssl/2.0.50 OpenSSL/0.9.7d mod_jk2/2.0.4
Content-Length: 657
Connection: close
Content-Type: text/html; charset=iso-8859-1
</pre>
<p>Эта атака тоже не удалась, а mod_security перехватил её.</p>
<h4>Вид Атаки 3: SQL инъекция</h4>
<p>В переменные можно вставлять и SQL операторы. Возможно и объединение<br />
нескольких SQL операторов. Если ваше приложение не очищает такие входные данные,<br />
то злоумышленники могут добавить SQL операторы к уже существующим, часто с<br />
плачевными последствиями. Blue Bank блокировал атаки типа SQL-инъекция, добавив<br />
следующие директивы:</p>
<pre>
&lt;Location /axis/getBalance.jws&gt;
   SecFilterInheritance Off
   SecFilterDefaultAction "deny,log,status:500"
   SecFilterScanPOST On
   SecFilterCheckURLEncoding On
   SecFilterCheckUnicodeEncoding On

   SecFilterSelective POST_PAYLOAD "&lt;\s*id[^&gt;]*&gt;" chain
   SecFilterSelective POST_PAYLOAD "&lt;\s*id[^&gt;]*&gt;.{6,}&lt;/\s*id\s*&gt;"
     "deny,status:500"
   SecFilterSelective POST_PAYLOAD "&lt;\s*id[^&gt;]*&gt;.*[^a-zA-Z0-9][^&lt;]*&lt;/\s*id\s*&gt;"
     "deny,status:500"
   SecFilterSelective POST_PAYLOAD "&lt;\s*id[^&gt;]*&gt;.*select.+from[^&lt;]*&lt;/\s*id\s*&gt;"
     "deny,status:500"
&lt;/Location&gt;
</pre>
<p>Выделенные жирным строки проверяют, содержатся ли в запросе слова &quot;select *<br />
from . . .&quot;, а если находит их, то возвращает статус 500, как в предыдущем<br />
примере. Аналогично вы можете добавить SQL операторы, которые следует<br />
блокировать, обновлять и т.п.</p>
<h4>Вид Атаки 4: SOAP Раскрытие Дефектного Кода</h4>
<p>Один из основных источников информации в Web-сервисах – это дефектный код.<br />
Вызванная на сервере ошибка может создать дефектный код. Ниже представлен запрос<br />
злоумышленника и ответ сервера в результате подстановки символа «а» вместо<br />
целого числа в переменную id:</p>
<pre>
POST /axis/getBalance.jws HTTP/1.0
Content-Type: text/xml; charset=utf-8
SOAPAction: ""
Content-Length: 569
Expect: 100-continue
Host: www.bluebank.example.com

&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tns="http://www.bluebank.example.com/axis/getBalance.jws" xmlns:types="
http://www.bluebank.example.com/axis/getBalance.jws/encodedTypes"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
        &lt;soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"&gt;
                &lt;q1:getInput xmlns:q1="http://DefaultNamespace"&gt;
                        &lt;id xsi:type="xsd:string"&gt;a&lt;/id&gt;
                &lt;/q1:getInput&gt;
        &lt;/soap:Body&gt;
&lt;/soap:Envelope&gt;

...

500 Internal Server Error
HTTP/1.1 500 Internal Server Error
Date: Tue, 04 Jan 2005 16:22:14 GMT
Server: Apache/2.0.50 (Unix) mod_ssl/2.0.50 OpenSSL/0.9.7d mod_jk2/2.0.4
Set-Cookie: JSESSIONID=1CAF4CD0ED0F38FB40ECBC7BDAB56C75; Path=/axis
Content-Type: text/xml;charset=utf-8
Connection: close

&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;
 &lt;soapenv:Body&gt;
   &lt;soapenv:Fault&gt;
        &lt;faultcode&gt;soapenv:Server.userException&lt;/faultcode&gt;
        &lt;faultstring&gt;java.lang.NumberFormatException:
		  For input string:"a"&lt;/faultstring&gt;
   &lt;detail/&gt;
   &lt;/soapenv:Fault&gt;
  &lt;/soapenv:Body&gt;
&lt;/soapenv:Envelope&gt;
</pre>
<p>Как показано в ответе сервера, дефектный код может раскрыть критическую<br />
внутреннюю информацию. Это достаточно веский довод для создания соответствующих<br />
фильтров:</p>
<pre>
&lt;Location /axis/getBalance.jws&gt;
   SecFilterInheritance Off

   SecFilterDefaultAction "deny,log,status:500"
   SecFilterScanPOST On
   SecFilterCheckURLEncoding On
   SecFilterCheckUnicodeEncoding On

   SecFilterSelective POST_PAYLOAD "&lt;\s*id[^&gt;]*&gt;" chain
   SecFilterSelective POST_PAYLOAD "&lt;\s*id[^&gt;]*&gt;.{6,}&lt;/\s*id\s*&gt;"
     "deny,status:500"
   SecFilterSelective POST_PAYLOAD "&lt;\s*id[^&gt;]*&gt;.*[^a-zA-Z0-9][^&lt;]*&lt;/\s*id\s*&gt;"
     "deny,status:500"

   SecFilterScanOutput On
   SecFilterSelective OUTPUT "faultcode" "deny,status:500"
&lt;/Location&gt;
SecFilterScanOutput On
</pre>
<p>Эта директива сканирует выходной блок данных и принимает определенные<br />
фильтры.</p>
<pre>&lt;code&gt;SecFilterSelective OUTPUT &quot;faultcode&quot; &quot;deny,status:500&quot;&lt;/code&gt;</pre>
<p>Директива блокирует исходящий трафик, содержащий дефектные коды. Если<br />
атакующий посылает сформированный запрос с символом «а» в поле целых чисел, он<br />
получит ответ, похожий на этот:</p>
<pre>
HTTP/1.1 500 Internal Server Error
Date: Mon, 03 Jan 2005 22:00:33 GMT
Server: Apache/2.0.50 (Unix) mod_ssl/2.0.50 OpenSSL/0.9.7d mod_jk2/2.0.4
Content-Length: 657
Connection: close
Content-Type: text/html; charset=iso-8859-1

&lt;!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"&gt;
&lt;html&gt;&lt;head&gt;
   &lt;title&gt;500 Internal Server Error&lt;/title&gt;
  &lt;/head&gt;&lt;body&gt;
  &lt;h1&gt;Internal Server Error&lt;/h1&gt;
  &lt;p&gt;The server encountered an internal error or misconfiguration and was
  unable to complete your request.&lt;/p&gt;
  &lt;p&gt;Please contact the server administrator,  you@example.com and inform
  them of the time the error occurred, and anything you might have done that
  may have caused the error.&lt;/p&gt;
  &lt;p&gt;More information about this error may be available in the server
error
  log.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;address&gt;Apache/2.0.50 (Unix) mod_ssl/2.0.50 OpenSSL/0.9.7d
mod_jk2/2.0.4
  Server  at 192.168.7.50 Port 80&lt;/address&gt;
&lt;/body&gt;&lt;/html&gt;
</pre>
<h3>Заключение</h3>
<p>mod_security выглядит как еще один продукт в области безопасности, однако<br />
имеет хорошее превосходство над другими уже доступными утилитами. Кроме<br />
обнаружения вторжений и системы защиты на уровне HTTP, mod_security также имеет<br />
возможности фильтрования <code>POST_PAYLOAD.</code></p>
<p>Кроме того, превосходство mod_security состоит в том, что разработчики и Web<br />
администраторы могут защищать Web-сервисы без исправления исходного когда<br />
приложений. Он не сделает исходный код лучше; просто теперь организация может<br />
поднять эффективную дополнительную защиту своих Web-сервисов без необходимости<br />
правки множества строк кода.</p>
<p><i>Shreeraj Shah основатель и руководитель Net-Square.</i></p>
]]></content:encoded>
			<wfw:commentRss>http://saygak.com/post/55/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

