среда, 22 сентября 2010 г.

Настройка URLScan

Почитав некоторые материалы в сети ( например: http://www.hanselman.com/blog/HackedAndIDidntLikeItURLScanIsStepZero.aspx
http://haacked.com/archive/2008/08/22/dealing-with-denial-of-service-attacks.aspx), я пришел к выводу, что к моему написанному приложению ASP.NET нужно срочно приделать URLscan.
Итак, качаем отсюда http://www.iis.net/download/urlscan . Устанавливаем на сервере. В каталоге c:\windows\system32\inetsrv\ появляется новая папка urlscan.
В ней два файла urlscan.dll и urlscan.ini. Эти файлы отвечают за глобальную фильтрацию всех сайтов, расположенных на сервере. Но можно настроить и отдельно для каждого сайта. Для этого нужно скопировать эти два файла в корневой каталог. Например, у меня корневой каталог моей программы (сайта) c:\Inetpub\foo.  Так как у меня права NTFS на корневой каталог только "чтение", на файл urlscan.dll пришлось дать права "чтение и выполнение" пользователю IIS_WPG. Теперь идем в "Диспетчер служб IIS" . Правой клавишей мыши достаем свойства сайта и в закладке "фильтр ISAPI" добавляем urlscan из корневой директории.
По умолчанию urlscan.ini уже содержит настройки фильтрации. Но я хотел все-таки несколько увеличить безопасность. Для начала  нужно настроить лог. В urlscan.ini  существует параметр для указания пути к лог файлу "LoggingDirectory". Я указал c:\InetPub\foo\logs. После этого не забудьте  дать NTFS права на "запись" IIS_WPG и IIS права на "запись" на этот каталог.
 Потом прошелся по настройкам в urlscan.ini. Во первых, я включил (то есть установил в единицу) параметр UseAllowExtensions=1. Это значит будет отрабатывать секция [AllowExtensions] , если параметр 0 - то отрабатывет [DenyExtensions].  У меня она выглядит так
[AllowExtensions]
.
.css
Это список разрешенных раcширений. У меня получился вот такой маленький.
 "." точка нужна для файлов без раcширений. Без этой точки у меня приложение не запускалось.
Затем я переключился на параметры в секции [RequestLimits]
MaxAllowedContentLength=30000000
MaxUrl=260
MaxQueryString=2048
Это явно излишне для моего сайта. Немного теории . Как вы знаете, протокол HTTP использует два метода запроса к серверу GET и POST. Они отличается тем,что при методе GET запрос как бы является частью URI. Например http://www.google.ru/search?source=ig&hl=ru&rlz=1R2GFRE_ruRU333&q=urlscan&aq=f&aqi=g10&aql=&oq=&gs_rfai=
 и тело запроса пусто . А при методе POST данные передаются в теле запроса.  Так вот параметр "MaxAllowedContentLength" как раз относится к POST, а  "MaxQueryString" - GET. MaxUrl - это максимальное количество символов в строке URL без QUERY_STRING. Опытным путем я вычислил следующие значения
MaxAllowedContentLength=30
MaxUrl=30
MaxQueryString=60