PDA

Просмотр полной версии : FAQ:Безопасность web сервера


zl0ba
17.03.2007, 21:11
У меня есть хостинг (Free BSD) и на нём хоститься несколько маленьких проектов.
На них постоянно идут (D)Dos,sql inl,xss,php-include атаки, могу ли я обезопасить
сервер от этих атак?

Многие из нас знакомы с распределенной атакой отказа в доступе (Distributed Denial of Servece Attack).
Как говориться, от этой собаки спасенье нет. Или эффективной sql inj, а также xss и межсайтового скриптинга.
К решению этой проблемы на помощь к нам приходит, знаменитый модуль mod_security!
Download : http://www.modsecurity.org/download/modsecurity-apache-1.9.2.tar.gz


<IfModule mod_security.c>

# On or Off движка фильтра
SecFilterEngine On

# Включения проверки правильности кодирования URL
SecFilterCheckURLEncoding On

# Использования байтов их этого диапазона
SecFilterForceByteRange 32 126

# Ведения логов для подозрительных запросов
SecAuditEngine RelevantOnly

# Имя файла лога
SecAuditLog logs/audit_log

# Вывод отладочной информации
SecFilterDebugLog logs/modsec_debug_log
SecFilterDebugLevel 0

# Проверка POST запросов
SecFilterScanPOST On

# Запись подозрительных запросов (по дефолту пишет в лог)
# возрат http ответа с кодом 406
SecFilterDefaultAction "deny,log,status:406"

# Redirect user on filter match
SecFilter xxx redirect:http://www.webkreator.com

# Execute the external script on filter match
SecFilter yyy log,exec:/home/ivanr/apache/bin/report-attack.pl

# Simple filter
SecFilter 111

# Only check the QUERY_STRING variable
SecFilterSelective QUERY_STRING 222

# Only check the body of the POST request
SecFilterSelective POST_PAYLOAD 333

# Only check arguments (will work for GET and POST)
SecFilterSelective ARGS 444

# Test filter
SecFilter "/cgi-bin/keyword"

# Another test filter, will be denied with 404 but not logged
# action supplied as a parameter overrides the default action
SecFilter 999 "deny,nolog,status:404"

# Раскритие конфигов
SecFilter /etc/password

# Чтения выше корня
SecFilter "\.\./"

# Межсайтовый скриптинг
SecFilter "<( |\n)*script"
SecFilter "<(.|\n)+>"

# Защита от sql inj
SecFilter "delete[[:space:]]+from"
SecFilter "insert[[:space:]]+into"
SecFilter "select.+from"

# Атаки с использованием cookie
SecFilterSelective "HTTP_USER_AGENT|HTTP_HOST" "^$"

# Forbid file upload
SecFilterSelective "HTTP_CONTENT_TYPE" multipart/form-data

# Only watch argument p1
SecFilterSelective "ARG_p1" 555

# Watch all arguments except p1
SecFilterSelective "ARGS|!ARG_p2" 666

# Only allow our own test utility to send requests (or Mozilla)
SecFilterSelective HTTP_USER_AGENT "!(mod_security|mozilla)"

# Do not allow variables with this name
SecFilterSelective ARGS_NAMES 777

# Do now allow this variable value (names are ok)
SecFilterSelective ARGS_VALUES 888

# Скажи спаму нет!
<Location /cgi-bin/FormMail>
SecFilterSelective "ARG_recipient" "!@webkreator.com$"
</Location>

# Фильтрация форматов изображения
<Location /fileupload.php>
SecFilterInheritance Off
SecFilterSelective POST_PAYLOAD "!image/(jpeg|bmp|gif)"
</Location>

</IfModule>


Также ставим модуль mod_evasive, который поможет уменьшить активность (D)Dos атаки.
Download: http://www.nuclearelephant.com/projects/mod_evasive/mod_evasive_1.10.1.tar.gz

Конфигурируем модуль:

/etc/apache2/modules.d/mod_evasive20.conf

<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
</IfModule>


Как мне запретить запуск программ в /tmp, на тот случай если взломщик проник на мой сервер?

Для этого Вам надо вынести /var/tmp в отдельную файловую систему, при этом /tmp сделаем симлинком
на /var/tmp. Идём в /etc/fstab ищем строчку для /var/tmp и в опциях добавляем noexex.
После проделанной операции , запуск программ из /tmp будет не возможна.



Как мне можно скрыть названия ОС и Apache от всяких (x-toolz) сканеров?

Apache 1.3.x and 2.x :

Для Apache 1.3.x мы лезем в src/include/httpd.h и меняем:

# define SERVER_BASEPRODUCT "Apache"
# define SERVER_BASEREVISION "7.7.7"

На :

# define SERVER_BASEPRODUCT "Tamagochi"
# define SERVER_BASEREVISION "1.1.1"

Для второй ветки Apache, идём в httpd.conf и добавляем:

Header set Server "version not listed"

При этом отключаем службу индексации каталогов в
/etc/httpd/conf/httpd.conf :

ServerSignature Off


Надо поменять системные переменные sysctl:

# sysctl net.inet.ip.random_id=1
# sysctl net.inet.tcp.blackhole=2
# sysctl net.inet.udp.blackhole=1
# sysctl -w net.inet.icmp.maskrepl=1

Далее в /etc/pf.conf вносим директивы:

scrub in all fragment reassemble
pass in quick proto tcp from to
$my_ip port $ports flags S/SA
synproxy state block quick all


Я слышал о модуле "mod_rewrite". Зачем же нужен этот модуль?
//материал взят с http://blog.excode.ru/post13-protect_site_sql_injection_mod_rewrite.html
Этот модуль используется в Apache и используется для разных вещей. Кто то делает ссылки более красивыми,
но использовать его можно для разных целей. А одни используют для защиты своего сайта от sql inj.
Рассмотрим пример с паролем администратора. Пускай переменная $idmd передаёт GET запрос
http://mysite.ru/script.php?idmd=4k55hk34ghkdf6kh7khf5
Нам нужно заменить адрес http://mysite.ru/script_4k55hk34ghkdf6kh7khf5.html на адрес
http://mysite.ru/script.php?idmd=4k55hk34ghkdf6kh7khf5

Делается это следующей строкой:
RewriteRule http://mysite.ru/script_([a-z0-9]*).html http://mysite.ru/script.php?idmd=$1

Выражение ([a-z0-9]*) означает, что в данном месте может находиться
последовательность из цифр и букв любой длины. [a-z0-9] - перечисление
допустимых символов (в данном примере заданы диапазоны), знак * означает что таких
символов может быть несколько. Выражение которое соответствует маске находящейся в
скобках присваивается переменной $1 (цифра обозначает номер скобок) и вставляется
в адрес на который будем заменять входящий адрес.В результате этой манипуляции после того
как пользователь введет в строке адреса
http://mysite.ru/script_4k55hk34ghkdf6kh7khf5.html он автоматически попадет на страницу
http://mysite.ru/script.php?idmd=4k55hk34ghkdf6kh7khf5. И конечно же переменная $idmd
будет содержать значение "4k55hk34ghkdf6kh7khf5".Теперь давайте рассмотрим, что же
произойдет если пользователь попытается ввести
http://mysite.ru/script_'%20or%20login='admin'#.html (%20 - тоже самое что и пробел).
В результате этого запроса адрес попадет модулю mod_rewrite, который проанализирует его,
т.к. выражение '%20or%20login='admin'# не подходит под маску ([a-z0-9]*), т.к.
содержит недопустимые символы, то mod_rewrite ничего не сделает, так как будто его вообще нет,
очевидно, что в этом случае пользователю будет возвращена ошибка 404 Page not found
(404 страница не найдена).
Это и есть защита. Она не идеальна и имеет минусы, но есть и плюсы.
Главный минус - это то, что в скрипты, все же можно передать вредоносную информацию,
но для этого придется воспользоваться методом POST, а не GET. Второй минус - mod_rewrite
немного нагружает сервер, как и любые регулярные выражения. Главный плюс - пользователь не видит,
как называются ваши переменные.


Теперь с помощью mod_rewrite мы сделаем адрес на более красивый, а заодно и реализуем проверку на входные данные.
Для того чтобы использовать модуль mod_rewrite вам необходимо создать файл .htaccess в корневом каталоге:

RewriteEngine on
Options +FollowSymlinks
RewriteBase /
RewriteRule ^.htaccess$ - [F]

Например, чтобы нам подменить адрес http://mysite.ru/blabla.html на http://mysite.ru/xek.html необходимо написать:

RewriteRule http://mysite.ru/blabla.html http://mysite.ru/xek.html

Constantine
17.03.2007, 21:24
Незнаю как начало, но mod_rewrite сдут с http://webscript.ru/stories/07/02/01/2099269 (просто узнал), причем линков на источники и списка используемых матерьялов нет
А как остальное?

zl0ba
17.03.2007, 21:41
Согласен, не было времени писать свои мысли по поводу mod_rewrite. Но что же писать когда я напишу тоже самое, прость другими словами.

Talisman
17.03.2007, 21:43
4k55hk34ghkdf6kh7khf5
4k2jhk34jhkjh6kh7kh33

не сильно отличаются, неправда? :))
ЗЫ: неуказание источников наказывается, а вот сбор инфы и ее переработка - приветствуется, хотябы поиск по ачату поюзал:
http://forum.antichat.ru/thread27498.html - тут лучше про мод реврайт написано.
ИМХО.

Connor
18.03.2007, 03:30
От народ ранимый пошел,ненужно писать чегото в чем неуверен,а если уже написал тогда слушай поправки другх и исправляйся.

Underwit
18.03.2007, 05:54
Как говориться, от этой собаки спасенье нет. Или эффективной sql inj, а также xss и межсайтового скриптинга.

XSS и межсайтовый скриптинг это разве не одно и тоже или я ошибаюсь???

Constantine
18.03.2007, 14:35
Это одно и тоже, просто "аффтор", видимо, этот кусок перепечатывал своими словами

Nova
09.05.2007, 16:10
Установка mod_security на apache22

переходим в каталог [root@gw-server]cd /usr/ports/www/mod_security2

набираем make install clean
возможно у вас появиться такая ошибка как появилась у меня

[root@gw-server /usr/ports/www/mod_security2]# make install clean
===> Building for mod_security2-2.1.0
===> Generating apache plist
/usr/local/build-1/libtool --silent --mode=compile cc -prefer-pic -O2 -fno-strict-aliasing -pipe -I/usr/local/include/apache22 -I/usr/local/include/apr-1 -I/usr/local/include/apr-1 -I/usr/local/include -c -o apache2_config.lo apache2_config.c && touch apache2_config.slo
In file included from modsecurity.h:37,
from apache2_config.c:15:
msc_pcre.h:18:18: pcre.h: No such file or directory
apache2_config.c: In function `cmd_audit_log_relevant_status':
apache2_config.c:583: error: `PCRE_DOTALL' undeclared (first use in this function)
apache2_config.c:583: error: (Each undeclared identifier is reported only once
apache2_config.c:583: error: for each function it appears in.)
apxs:Error: Command failed with rc=65536
.
*** Error code 1

Stop in /usr/ports/www/mod_security2.
[root@gw-server /usr/ports/www/mod_security2]#

для коректной установки понадобаиться добавить pcre

переходим в /usr/ports/devel/pcre и набираем make install clean

после того как соберёться сможем собрать наконец наш mod_security

delay(0)
09.05.2007, 17:32
в опциях добавляем noexex.
Ошибка... noexeC
Также, не понятно, зачем
Вам надо вынести /var/tmp в отдельную файловую систему
Права поменять разве нельзя?
Ещё хороший метод защиты сервера: использование chroot-окружения.
Статья так се, если честно...

p-range
10.05.2007, 21:33
Во-первых. http://mysite.ru/script_'%20or%20login='admin'#.html (%20 - тоже самое что и пробел).
откуда взялась эта решетка #? здесь поидее должен быть комментарий /* или --.

Во-вторых, методов котороые здесь описаны, недостаточно для нормальной безопасности веб-сервера.
имхо, на faq не тянет \=

nerezus
10.05.2007, 23:41
Замена php на питон увеличит производимость раз в 35(ну или просто в десяток раз с переходом на перл/руби).

http://www.alrond.com/ru/2007/jan/25/rezultaty-testirovanija-6-frameworks/

pento
13.05.2007, 20:54
По поводу mod_security. А его кто-нибудь вообще использует?
Просто пытаться исправлять бреши веб-приложений с помощью сервера - это неправильно.
Так же надо добавить, что если кто захочет его использовать, то проще заюзать уже готовые, идующие в комплекте с mod_security, наборы правил (в том числе и против XSS, SQL inj, и так далее).
При этом отключаем службу индексации каталогов в
/etc/httpd/conf/httpd.conf :
Код:
ServerSignature Off
Причём тут служба индексации и подпись сервера?
А где ServerTokens?
#
# ServerTokens
# This directive configures what you return as the Server HTTP response
# Header. The default is 'Full' which sends information about the OS-Type
# and compiled in modules.
# Set to one of: Full | OS | Minor | Minimal | Major | Prod
# where Full conveys the most information, and Prod the least.
#
ServerTokens Prod

#
# Optionally add a line containing the server version and virtual host
# name to server-generated pages (internal error documents, FTP directory
# listings, mod_status and mod_info output etc., but not CGI generated
# documents or custom error documents).
# Set to "EMail" to also include a mailto: link to the ServerAdmin.
# Set to one of: On | Off | EMail
#
ServerSignature EMail