понедельник, 6 июля 2009 г.

Фильтрующий прокси

Фильтрующий прокси

Варианты использования
1. Apache2(продакшен) + mod_securtity
2. Apache2 + mod_proxy + mod_securtity

Для защиты вашего сервера от то атак разного типа можно использовать 2 вариант подключения модуля mod_securtity
Один из них это прямая защита сайта, этим модулем, т.е. наш сервер должен быть доступен из вне.
Второй вариант, это дополнительное использование прокси сервера, что позволит оставить продакшен в интрасети и кэшировать, при желании, запросы.

Коротко о преимуществах mod_securtity
1. Бесплатный
2. Открытые исходные коды
3. Фильтрует как get запросы, так и post данные
4. Удобный язык для написания правил фильтрации, базированный на проверке по регулярным выражениям
5. Интеграция с прокси модулями апача, что позволяет оптимально ускорить работу веб-сервера (loadbalancing)
6. Графическая оболочка для написание правил безопасности (REMO)
Так же просмотреть презентацию можно по ссылке
http://www.modsecurity.org/documentation/ApacheCon_Europe_2008-Web_Intrusion_Detection_with_ModSecurity.pdf

Структурная схема работы mod_securtity


Установка mod_security
Установить модуль можно, из пакетов или собрать из исходников
Выбрать пакет для интересуемей вас ОС или исходники можно здесь
http://www.modsecurity.org/download/index.html
Так же там можно скачать базовый набор правил, что предотвращает 70%-80% всевозможных атак

Необходимые предварительно установленные модули Apache
1. mod_so
2. mod_unique_id
3. mod_proxy
4. mod_proxy_http
5. mod_proxy_balancer
Так же если мы хотим использовать mod_security с прокси сервером, нужно установить еще один экземпляр апача.
После этого приступаем к установке mod_security
Создаем папку .../apache2/modules/mod_security2 и копируем туда mod_security2.so и libxml2.dll

Добавте в httpd.conf:
LoadModule security2_module modules/mod_security2/mod_security2.so
LoadModule unique_id_module modules/mod_unique_id.so

Для того, что бы в основном конфигурационном файле не было мешанины, выносим настройки наших модулей в отдельные файл
Include ……/bin/Apache2_Proxy/conf/mod_security.conf
Include ……/bin/Apache2_Proxy/conf/mod_proxy.conf

В конфигурационном файле mod_proxy, настраиваем прокси
Базовая настройка прокси сервера, которая передает полностью все запросы, без кэширования
ProxyRequests On
ProxyVia On

ProxyPass / http://localhost/
ProxyPassReverse / http://localhost/

В файле mod_security.conf, мы должны указать правила безопасности
Для проверки работоспособности конфигурации, можно указать такие правила

SecRuleEngine On
SecDefaultAction log,auditlog,deny,status:403,phase:2,t:lowercase,t:replaceNulls,t:compressWhitespace

SecAuditEngine RelevantOnly
SecAuditLogType Serial
SecAuditLog logs/mod_security2.log

## -- General rules --------------------
SecRule ARGS "c:/" t:normalisePathWin
SecRule ARGS "\.\./" "t:normalisePathWin,id:99999,severity:4,msg:'Drive Access'"
SecRule ARGS "d:/" t:normalisePathWin

## -- phpBB attack --------------------
SecRule ARGS:highlight "(\x27|%27|\x2527|%2527)"

И сделать запрос
http://www.xxxxcom/?abc=../../

Вы должны получить на странице, сообщение о отказе доступа

Введение в язык правил доступа

Что доступно:
1. Указание правила
2. Доступ к серверным переменным
3. Доступ переменным из get и post
a. Загрузка файлов
4. Настройки аудита

Коротко по пунктам:
1. Используется ключевое слово SecRule для указания правил
Синтаксис SecRule VARIABLES OPERATOR [ACTIONS]
2. Доступ к серверным переменным осуществляется через ключевые слова, к примеру
REQUEST_LINE, REQUEST_PROTOCOL, REQUEST_METHOD и тд
3. Доступ к переменным из запроса, осуществляется через ключевые слова, к примеру
QUERY_STRING, а так же к массиву переменных ARGS.
ARGS:username или ARGS:password, получаем данные из поста, к примеру
Что бы установить ограничения на загрузку файлов, можно использовать
SecUploadDir /tmp/dir
SecTmpDir /tmp/dir
SecDataDir /tmp

Так же что бы указать максимальный размер загружаемого файла
SecRule FILES_SIZES "@gt 2097152" "phase:2,t:none,deny,log,auditlog,status:403,msg:'Uploaded file size too large',id:'960342',severity:'4'"

И если не обходимо указать проверяющий скрипт(антивирус)
#SecRule FILES_TMPNAMES "@inspectFile /opt/apache/bin/inspect_script.pl" \ "t:none"

Для настройки аудита, можно использовать такие директивы
#For logging
SecAuditEngine RelevantOnly
SecAuditLogType Serial
SecAuditLog logs/mod_security2.log

# Debug log
SecDebugLog logs/modsec_debug.log
SecDebugLogLevel 0

Самый лучший пример, что демонстрирует возможности описания правил

SecDefaultAction "log,deny,t:lowercase"
SecRule REQUEST_METHOD !POST
SecRule ARGS:destination " URL" "t:urlDecode"
SecRule ARGS:flags "[0-9]{1,2}"
SecRule ARGS:username "[0-9a-zA-Z].{256,}"
SecRule ARGS:password ".{256,}"
SecRule ARGS:SubmitCreds "!Log.On"
SecRule ARGS:trusted "!(0|4)"


Более подробно, по правилам можно прочитать по ссылке
http://www.modsecurity.org/documentation/ModSecurity2_Rule_Language.pdf