Напомню, что главная цель всей нашей
эпопеи - защита Web-сервера при помощи Squid-а. В прошлой
статье мы установили прокси перед
сервером и все запросы, обращенные к нему
будут проходить и обрабатываться Squid-ом.
Настала пора настроить проксю на допуск к
серверу исключительно правильного трафика.
Работать надо с squid.conf, секцией http_access. Для
начала можно объявить ACL переменные,
делается это так:
# acl aclname acltype string1 ...
# acl aclname acltype "file" ...
# when using "file", the file should contain one item per line
Например переменные в дефолтовом конфиге
выглядит примерно так:
acl all src 0.0.0.0/0.0.0.0
#--> define aclname'all' which says source of HTTP request may be
any IP address.
acl localhost src 127.0.0.1/255.255.255.255
#--> define localhost acl variable.
acl SSL_ports port 443 563
#--> Define aclname SSL_ports which refers to TCP ports 443 and 563
acl Safe_ports port 80 # http
#--> Define aclname Safe_ports wihich includes TCP port 80
acl Safe_ports port 21 # ftp
#--> Append more ports in Safe_port list.
# acl definition may span to more than 1 line
acl CONNECT method CONNECT
#--> define aclname variable 'CONNECT' for method 'CONNECT'
# which means direct TCP/IP connection
Переменные не влияют на обработку трафика,
они лишь хранят значения, и потому их ты
можешь объявлять как заБАГорассудится.
Напомню, что ACL фильтры применяются сверху
вниз, это значит что каждый запрос пройдет
по всему списку правил с верха страницы и до
его конца. Первое подходящее правило будет
применено и соответственно Squid разрешит или
запретит запрос. Логическое AND применяется
для правил в одной строчке, логическое OR для
двух разных строк http_access.
Тут самое время привести пример :).
Существует Web-Сервер с адресом 10.0.0.1, который
работает позади прокси, который в свою
очередь работает по таким правилам:
acl all src 0.0.0.0/0.0.0.0
acl mynetwork src 192.168.0.0/24
acl allowed_ports ports 80 8080
acl allowed_urls regex -i ^http://www.mywebserver.xxx
http_access allow mynetwork allowed_ports
http_access allow !mynetwork allowed_urls allowed_ports
http_access deny all
Адрес Squid-а 1.2.3.4. Он перенаправляет трафик
на реальный сервер, в данной конфигурации
он будет пропускать все правильные URL,
например http://www.mywebserver.xxx (-i для
нечувствительности к регистру), из сети
mynetwork И на порты 80 или 8080, ИЛИ если запрос
пришел извне mynetwork (оператор "!") то на
сервер http://www.mywebserver.xxx И порты 80 и 8080, ИЛИ
запрос будет отвергнут (последнее правило).
Пример №1: Защита от случайных атак
Атакующий или червь пытаются пробиться на
сервер путем посылки URL с cmd.exe (IIS) или /bin/sh на
Linux-е. Защитится от этого можно так просто:
acl bad_requests urlpath_regex -i cmd.exe \/bin\/sh default\.ida?XXX
http_access deny bad_requests
После этого каждый запрос вида http://www.myserver.xxx/blabla/cmd.exe
из любого места Сети будет отброшен прежде,
чем доберется до сервера.
Пример №2: Разграничение доступа
Допустим надо сделать так, что бы извне
все видели http://www.mywebserver.xxx/open_to_all, а
http://www.mywebserver.xxx/secret только из подсети
организации (допустим 192.168.0.0/24). Тогда
делаем так:
acl my_networks src 192.168.0.0/24
acl my_baseurl url_regex -i ^http://www.mywebserver.xxx
acl out_urls urlpath_regex ^open_to_all
http_access deny !my_baseurl
http_access allow my_networks
http_access allow !my_networks out_urls
http_access deny all
Редиректор
Обработка запросов Squid-ом не всегда удобна.
Для этого можно использовать редиректор,
который будет обрабатывать HTTP запросы
более удобно и гибко. Редиректор - внешняя
программа, запущенная в бесконечный цикл (обратите
внимание, что это обязательный параметр,
иначе связка просто не будет работать),
написанная на Perl, C/C++, Python или любом другом
языке. Squid можно сконфигурить так, что
каждый URL он будет отправлять редиректору
для обработки, а тот в свою очередь
возвращать ответ - пустую строку если
модификация не требуется или новый,
измененный по своим правилам адрес.
Редиректору через стандартный ввод
передаются четыре параметра: URL, IP адрес, ident
и метод, он их же и возвращает. Простейший
редиректор на Perl-е выглядит так:
#!/usr/bin/perl
$|=1; #Flush any buffer asap.
#Read Standard input, one request at a time from squid.
while(<>) #Infinite loop. So running as a daemon..
{
#Read URL first (first argument)
$url=(split)[0];
#Modify URL(search and replace), (power of programming comes handy here)
$url =~ s/^http:\/\/www.mywebserver.xxx/http:\/\/www.realwebserver.xxx:8080/
#Print modified URL to stdout which will be picked up by squid.
print $url;
}
В конфиг его добавить можно так:
redirect_program=
Работа программы заключается в простом
перенаправлении запросов с 80 порта на порт
8080. В природе, само собой, уже существуют
написанные редиректоры, так что можно
использовать их или со всей тщательностью
писать свой:
Squirm: http://squirm.foote.com.au/
Jesred: http://ivs.cs.uni-magdeburg.de/~eelkner/webtools/jesred/
Squidguard: http://www.squidguard.org/