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
На них постоянно идут (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