Здравствуйте.
В нашей организации запрещен интернет для пользователей во избежание утечки информации. Я решил обойти эту проблему, используя squid и попробывать дать интернет. Нашел в squid.conf параметр request_body_max_size и он реально блокирует отправку файлов большего размера, чем задам. Но этот параметр един для squid и штатными средствами нельзя использовать его в acl, а групп у меня 4. Ну, не запускать же 4 squid'а на одной машине?
Основная идея такова: 1 группе дать возможность отправлять файлы без ограничений; 2 группе ограничить request_body_max_size до 30кб, для возможности отправки сообщений на форумах; 3 группе дать возможность отправлять не более 3х мегабайт (отчетность в бухгалтерии); 4-ой группе дать request_body_max_size до 3кб, дав доступ чисто для открытия страниц (компьютер для общего доступа в интернет). Доступ в интернет дан только к белому списку сайтов, поэтому здесь исключается возможность использовать тунелль, который соединяет клиента с сайтом методом CONNECT или GET, что позволяет избежать обхода моих блокировок на отправку файлов.Натолкнулся на основном сайте кальмара на вот такую темку: http://www.squid-cache.org/mail-archive/squid-users/200404/1...
Цитирую:
======================================================
> Can I use "request_body_max_size" inside a acl ?
There only is one single limit in this directive.
But it is possible to invent a new acl for this using the external acl
interface. request_body_max_size looks into the Content-Length request
header, available to external_acl_type as %{Content-Length}
This silly shell script should work
#!/bin/sh
while read line; do
set -- $line
length="$1"
limit="$2"
if [ "$length" -le "$2" ]; then
echo OK
else
echo ERR
fi
done
Use this as
external_acl_type request_body %{Content-Length} /path/to/above/script
acl request_max_20MB request_body 20971520
This acl can then be used in http_access to match requests up to the given
size. If you need different sizes just define new acls with different
limits in bytes (20971520 == 20480 * 1024 == 20480 KB)
============================================================
В сообщении видно, что возможно использовать внешний acl, используя парамерт которым может являтся обычный скрипт. Опция request_body_max_size в squid ищет параметр Content-Length, т.е. размер, в заголовке запроса и сравнивает его со своим параметром. Если размер заголовка больше, чем задано, то этот запрос блокируется. За внешние acl отвечает опция external_acl_type. Если создать скрипт, как описано выше и прописать его в external_acl_type, то squid нормально запускается и вместе с ним запускается 5 родительских процессов с названием этого скрипта, в моём случае он называется request_body.sh
external_acl_type request_body %{Content-length} /home/request_body.sh
Тут все нормально. Далее пытаюсь присвоить ему acl в squid.conf вот так:
acl request1 request_body 100000
И тут squid отваливается с такой ошибкой:
2009/05/14 14:10:49| aclParseAclLine: Invalid ACL type 'request_body'
FATAL: Bungled squid.conf line 104: acl request_body 100000
Squid Cache (Version 2.7 STABLE3): Terminated abnormally.
т.е., если я правильно понял, после определения внешнего acl, нужно присвоить acl со своим именем и параметром в байтах, в данном случае 100000 байт. Но squid падает с такими настройками. Кто-нибудь сталкивался с подключением внешних acl или видит где моя ошибка? уже 2 дня бьюсь.
P.s. Моя система Debian Lenny 5.0.1 и squid 2.7 STABLE3, установленный из apt.
P.p.s. Эта тема вроде затрагивалась на opennet, но найти я её не смог. А тема очень актуальна для многих организаций.