URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID12
Нить номер: 6063
[ Назад ]

Исходное сообщение
"Использование request_body_max_size в acl"

Отправлено Slayeruga , 14-Май-09 12:20 
Здравствуйте.
В нашей организации запрещен интернет для пользователей во избежание утечки информации. Я решил обойти эту проблему, используя 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, но найти я её не смог. А тема очень актуальна для многих организаций.


Содержание

Сообщения в этом обсуждении
"Использование request_body_max_size в acl"
Отправлено ipmanyak , 21-Май-09 11:29 
Юзай тэг reply_body_max_size вместо того что ты пишешь!
#  TAG: reply_body_max_size     bytes allow|deny acl acl...


"Использование request_body_max_size в acl"
Отправлено Slayeruga , 22-Май-09 20:44 
>Юзай тэг 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 запросы указанных размеров, но умеет ли она использовать разные ограничения на разные группы? Пока читаю его маны и статьи, но определённо на этот вопрос ответить не могу..


"Использование request_body_max_size в acl"
Отправлено Slayeruga , 23-Май-09 12:41 

>P.s. Натолкнулся на программу-прокси для маниакальных админов :). Она умеет резать POST
>запросы указанных размеров, но умеет ли она использовать разные ограничения на
>разные группы? Пока читаю его маны и статьи, но определённо на
>этот вопрос ответить не могу..

Совсем упустил из вида - она называется "dansguardian".


"Использование request_body_max_size в acl"
Отправлено Direvius , 22-Сен-10 14:00 
Вместо acl request1 request_body 100000 пишите acl request1 external request_body 100000.

"Использование request_body_max_size в acl"
Отправлено Alex , 24-Ноя-11 18:01 
> Вместо acl request1 request_body 100000 пишите acl request1 external request_body 100000.

У кого-то получилось???


"Использование request_body_max_size в acl"
Отправлено zabudkin , 24-Апр-12 08:21 
>> Вместо 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.200

external_acl_type request_body %{Content-Length} /etc/squid/postmaxsize

acl request_max_30MB external request_body 30000000
acl request_max_50Kb external request_body 50000

http_access allow AllowAnyBodySize request_max_30Mb
http_access deny all request_max_50Kb

AllowAnyBodySize - список ip адресов кому разрешены POST запросы размером до 30 мегабайт.
для остальных стоит ограничение в ~~50 Кбайт, чего вполне достаточно.