Здравствуйте.
В нашей организации запрещен интернет для пользователей во избежание утечки информации. Я решил обойти эту проблему, используя 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
doneUse 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, но найти я её не смог. А тема очень актуальна для многих организаций.
Юзай тэг reply_body_max_size вместо того что ты пишешь!
# TAG: reply_body_max_size bytes allow|deny acl acl...
>Юзай тэг reply_body_max_size вместо того что ты пишешь!
># TAG: reply_body_max_size bytes allow|deny acl acl...
>Этот тег у меня уже используется для этих 4-х групп, для ограничения размера скачиваемых файлов, а мне теперь требуется ограничить размер ОТПРАВЛЯЕМЫХ файлов через веб-формы. В том и вся загвоздка, что reply_body_max_size можно штатными средствами использовать в acl, а request_body_max_size - нет.
P.s. Натолкнулся на программу-прокси для маниакальных админов :). Она умеет резать POST запросы указанных размеров, но умеет ли она использовать разные ограничения на разные группы? Пока читаю его маны и статьи, но определённо на этот вопрос ответить не могу..
>P.s. Натолкнулся на программу-прокси для маниакальных админов :). Она умеет резать POST
>запросы указанных размеров, но умеет ли она использовать разные ограничения на
>разные группы? Пока читаю его маны и статьи, но определённо на
>этот вопрос ответить не могу..Совсем упустил из вида - она называется "dansguardian".
Вместо acl request1 request_body 100000 пишите acl request1 external request_body 100000.
> Вместо acl request1 request_body 100000 пишите acl request1 external request_body 100000.У кого-то получилось???
>> Вместо acl request1 request_body 100000 пишите acl request1 external request_body 100000.
> У кого-то получилось???У меня получилось :)
В скрипте меняем -le на -ge----файл /etc/squid/postmaxsize ---
#!/bin/sh
while read line; do
set -- $line
length="$1"
limit="$2"
if [ "$length" -ge "$2" ]; then
echo OK
echo OK $line >>/etc/squid/postmaxsize.log
else
echo ERR
echo ERR $line >>/etc/squid/postmaxsize.log
fi
doneПеред самым первым http_access allow пишем:
----файл /etc/squid/squid.conf ---
acl AllowAnyBodySize src 192.168.1.234 192.168.1.200external_acl_type request_body %{Content-Length} /etc/squid/postmaxsize
acl request_max_30MB external request_body 30000000
acl request_max_50Kb external request_body 50000http_access allow AllowAnyBodySize request_max_30Mb
http_access deny all request_max_50KbAllowAnyBodySize - список ip адресов кому разрешены POST запросы размером до 30 мегабайт.
для остальных стоит ограничение в ~~50 Кбайт, чего вполне достаточно.