Squid и регистр (Можно ли, по умолчанию, отключить чувствительность к регистру?)

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС для молодых и начинающих системных администраторов.

Модераторы: SLEDopit, Модераторы разделов

Аватара пользователя
technotrance
Сообщения: 280
ОС: Fedora, FreeBSD, CentOS, Debian

Squid и регистр

Сообщение technotrance »

Здравствуйте!
Имеем Squid-3.1.9, имеем SAMS-1.0.5.
В SAMS имеем список запрещённых url, в которых, например, присутствуют вот такие слова:
анонимайзер
anonimayzer
anonimaizer
anonimayser
anonimaiser
anonymizer
anonymiser

В конфиге сквида это выглядит примерно так:

Код: Выделить всё

acl _sams_4cde50e2ca761 proxy_auth "/etc/squid/4cde50e2ca761.sams"
acl _sams_4cde50e2ca761_time time MTWHFAS 00:00-23:59
acl _sams_4cde5bb6263f0 url_regex "/etc/squid/4cde5bb6263f0.sams"

http_access allow _sams_4cde50e2ca761  !_sams_4cde5bb6263f0 _sams_4cde50e2ca761_time


И всё хорошо работает, когда, пользователь в поисковике набирает эти слова маленькими буквами. Но если, он к примеру, наберёт "Анонимайзер", то блокировка не срабатывает.
Проблема в том, что SAMS не умеет подставлять параметр [-i] к url_regex... Вручную в конфиг его дописать, конечно, можно, но это только до первой реконфигурации сквида из САМСа.
Поэтому, хочу спросить, можно ли как-то у сквида отключить, по умолчанию, чувствительность к регистру вообще?
Спасибо сказали:
Indarien
Сообщения: 436
ОС: Debian, Fedora, Ubuntu

Re: Squid и регистр

Сообщение Indarien »

Ну так -i в строчке вроде как раз и есть отключение чувствительности регистра в правилах сквида. Или я не про то? =)
-=Правильно заданный вопрос содержит 50% ответа=-
Спасибо сказали:
Аватара пользователя
technotrance
Сообщения: 280
ОС: Fedora, FreeBSD, CentOS, Debian

Re: Squid и регистр

Сообщение technotrance »

technotrance писал(а):
03.12.2010 09:58
Проблема в том, что SAMS не умеет подставлять параметр [-i] к url_regex... Вручную в конфиг его дописать, конечно, можно, но это только до первой реконфигурации сквида из САМСа.
Поэтому, хочу спросить, можно ли как-то у сквида отключить, по умолчанию, чувствительность к регистру вообще?

Список запрещённых URL и список пользователей мы редактируем в самсе. И он создаёт файл /etc/squid/4cde5bb6263f0.sams, в котором содержатся эти самые слова:
анонимайзер
anonimayzer
anonimaizer
.................
и файл /etc/squid/4cde50e2ca761.sams, в котором содержится список тех или иных пользователей
После того, как списки отредактированы, я в самсе настраиваю правило, что вот этому списку пользователей ( /etc/squid/4cde50e2ca761.sams ) запретить URL, в которых содержатся вот такие-то слова ( /etc/squid/4cde5bb6263f0.sams ). И SAMS уже сам правит конфиг сквида, добавляя в него вот такие строчки:

Код: Выделить всё

acl _sams_4cde50e2ca761 proxy_auth "/etc/squid/4cde50e2ca761.sams"
acl _sams_4cde50e2ca761_time time MTWHFAS 00:00-23:59
acl _sams_4cde5bb6263f0 url_regex "/etc/squid/4cde5bb6263f0.sams"

http_access allow _sams_4cde50e2ca761  !_sams_4cde5bb6263f0 _sams_4cde50e2ca761_time

Параметр -i он (SAMS) туда добавлять не умеет.
Поэтому, если юзер открывает яндекс и набирает "анонимайзер", жмёт "искать", то срабатывает блокировка, и юзер обламывается.
А если же юзер набирает "Анонимайзер" и жмёт "поиск", то блокировка не срабатывает. А всё из-за того, что по умолчанию сквид чувствителен к регистру.
Вот я и спрашиваю, есть ли метод заставить Squid быть не чувствительным к регистру по умолчанию?
Спасибо сказали:
Indarien
Сообщения: 436
ОС: Debian, Fedora, Ubuntu

Re: Squid и регистр

Сообщение Indarien »

acl _sams_4cde5bb6263f0 url_regex -i "/etc/squid/4cde5bb6263f0.sams" сработает?

ЗЫ Я вкурил...вот фик знает, а нельзя самс заставить добавлять эти строки с таким параметром?
Блин, да, сорри, второпях читал. Вот не знаю....вечерком буду посвободней - свой тестовый сквид потерзаю.


Взято с сайта самс
Правила составления URL
Можно вводить как URL целиком:
rotabanner.utro.ru/cgi-bin/banner/65
так и при помощи регулярных выражений PERL:
/(adv?|rb)(\d+)?\..+\.\w{2}\w?\w?
Не силен в perle.
Но вроде вот так для этого выражения будет выглядеть строчка /(adv?|rb)(\d+)?\..+\.\w{2}\w?\w?/i
-=Правильно заданный вопрос содержит 50% ответа=-
Спасибо сказали:
Аватара пользователя
technotrance
Сообщения: 280
ОС: Fedora, FreeBSD, CentOS, Debian

Re: Squid и регистр

Сообщение technotrance »

Т.е. нужно нужно к слову, например, "анонимайзер" как-то подставить параметр /i ?
Я попробовал -- не получилось. По крайней мере, не получилось при таких вариантах:
анонимайзер/i
анонимайзер(/i)
анонимайзер(?i)
(анонимайзер)/i
Спасибо сказали:
Indarien
Сообщения: 436
ОС: Debian, Fedora, Ubuntu

Re: Squid и регистр

Сообщение Indarien »

?i вроде подмена....или не....
скорей /(анонимайзер)/i
Я ж говорю, не силен в PERL =)
-=Правильно заданный вопрос содержит 50% ответа=-
Спасибо сказали:
Аватара пользователя
technotrance
Сообщения: 280
ОС: Fedora, FreeBSD, CentOS, Debian

Re: Squid и регистр

Сообщение technotrance »

Так тоже не выходит...
Спасибо сказали:
Аватара пользователя
technotrance
Сообщения: 280
ОС: Fedora, FreeBSD, CentOS, Debian

Re: Squid и регистр

Сообщение technotrance »

Проблема решилась тем, что пришлось немного подпрапвить исходники SAMS. Теперь, он умеет подставлять параметр -i к url_regex.
Но на этом проблема не закончилась. Как выяснилось, параметр -i срабатывает, лишь когда параметр url_regex содержит латинские буквы. А если он содержит кирилицу, то к регистру оно всё равно чувствительно будет.
Подскажите, как заставить сквид применять параметр -i к кирилице? К прмеру, чтоб работало вот такое правило:
acl users proxy_auth "/etc/squid/usre_list"
acl zaprert url_regex -i "анонимайзер"

http_access allow users !zapret
Спасибо сказали:
AHDPEI
Сообщения: 2

Re: Squid и регистр

Сообщение AHDPEI »

Здравствуйте собственно у меня вопрос не совсем по теме, но как можно в sams используя регулярные выражения блочить пачки сайтов по ключевому слову, допустим mail, а то в документации кроме того что можно использовать регулярные выражения perl ничего больше не не написано, а с ним я вообще ну никак не дружу
Спасибо сказали:
Аватара пользователя
technotrance
Сообщения: 280
ОС: Fedora, FreeBSD, CentOS, Debian

Re: Squid и регистр

Сообщение technotrance »

:crazy: Вот это как раз очень просто. В список запрещённых URL добавь "mail" и всё. Если у тебя связка Squid+SAMS настроена правильно, то у тебя будут резаться все урлы, в которых содержится "mail".
Но вобще, этот вопрос лучше бы не сюда, а на форум SAMS. Кстати говоря, в документации как раз про это написано.

P.S. а по моему вопросу кто-нибудь может подсказать, в сторону чего рыть?
Спасибо сказали:
AHDPEI
Сообщения: 2

Re: Squid и регистр

Сообщение AHDPEI »

technotrance писал(а):
27.12.2010 13:53
:crazy: Вот это как раз очень просто. В список запрещённых URL добавь "mail" и всё. Если у тебя связка Squid+SAMS настроена правильно, то у тебя будут резаться все урлы, в которых содержится "mail".
Но вобще, этот вопрос лучше бы не сюда, а на форум SAMS. Кстати говоря, в документации как раз про это написано.

P.S. а по моему вопросу кто-нибудь может подсказать, в сторону чего рыть?


Странно просто если я добавляю в список запрещенных просто слово, ничего не режется, такое работает только в списке регулярных выражений((( да и у меня связка Squid+Sams+rejik, так что у меня получаеться что не сам сквид блокирует доступ а редиректиться на режик, хм может в этом проблема как раз)))
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4456
Статус: GNU generation
ОС: Debian GNU/Linux

Re: Squid и регистр

Сообщение Rootlexx »

technotrance писал(а):
27.12.2010 09:57
Как выяснилось, параметр -i срабатывает, лишь когда параметр url_regex содержит латинские буквы. А если он содержит кирилицу, то к регистру оно всё равно чувствительно будет.
Подскажите, как заставить сквид применять параметр -i к кирилице?

SQUID использует regcomp() для компиляции регулярных выражений, и это семейство функций, насколько знаю, поддерживает юникод, но результат зависит от значения переменных окружения LC_CTYPE и LC_COLLATE. Каковы значения данных переменных в окружении SQUID?
Спасибо сказали:
Аватара пользователя
technotrance
Сообщения: 280
ОС: Fedora, FreeBSD, CentOS, Debian

Re: Squid и регистр

Сообщение technotrance »

А какие они должны быть? Добавлял:

Код: Выделить всё

# export LC_TYPE=UTF-8
# service squid restart
Останавливается squid: .................                   [  OK  ]
Запускается squid: .                                       [  OK  ]
# export LC_COLLATE=ru_RU
# service squid restart
Останавливается squid: ................                    [  OK  ]
Запускается squid: .                                       [  OK  ]
# env | grep LC_
LC_TYPE=UTF-8
LC_COLLATE=ru_RU

Ничего не изменилось...
Скорей всего, что-то не так делаю... Может в конфиг сквида надо что-то добавить?
Спасибо сказали:
Аватара пользователя
technotrance
Сообщения: 280
ОС: Fedora, FreeBSD, CentOS, Debian

Re: Squid и регистр

Сообщение technotrance »

Решение нашлось! :)
В этом мне помог мой очень хороший товарищ Иван Мартюшев, за что ему огромное спасибо!
Сразу хочу рассказать, собственно, для чего именно это вообще всё нужно было: Есть у меня на работе сервер с работающей связкой Squid + SAMS. В настройках самса используется редиректор, встроенный в сквид. И всё бы ничего, да вот только юзвери нынче сильно хитрые пошли. Как и во многих конторах, у нас закрыт доступ на такие сайты, как контакт, одноклассники, маил.ру и прочие развлекаловки, отвлекающие от работы. Однако, юзвери повадились на них попадать через анонимайзеры. Само собой, что в списке запрещённых url содержались такие выражения, как "anonymizer", "anonimaiser", "анонимайзер" и прочие вариации. И эта фишка прекрасно работала, когда, например, юзверь набирал в гугле "anonymizer" или "анонимайзер" -- ему сразу вылазило "доступ закрыт". Однако, если юзверь набирал в гугле, например, "anonyMizer" или "аноНимайзер", то запрет ни шиша не срабатывал, и юзверь спокойно получал список анонимайзеров и делал, чё хотел.
Первое, что мне пришло в голову -- это как-то заставить либо чтобы сквид изначально не был чувствителен к регистру, либо, чтобы SAMS научился подставлять параметр -i к url_regex. Поломав над этим голову, мы с Иваном выбрали второе. Итак, вот как это делается:
Для того, чтобы SAMS начал подставлять параметр -i к url_regex, надо в исходниках найти файл samsdaemon.c. В этом файле находим строчки 874, 876, 922, и 924. Они будут выглядеть вот так соответственно:

Код: Выделить всё

                   fprintf(fout,"acl _sams_%s url_regex \"%s/%s.sams\"\n",row[1],conf.squidrootdir,row[1]);
                     printf("acl _sams_%s url_regex \"%s/%s.sams\"\n",row[1],conf.squidrootdir,row[1]);
                   fprintf(fout,"acl _sams_%s url_regex \"%s/%s.sams\"\n",row[1],conf.squidrootdir,row[1]);
                     printf("acl _sams_%s url_regex \"%s/%s.sams\"\n",row[1],conf.squidrootdir,row[1]);

Вот в них то и добавляем наш параметр -i. После чего выглядеть они будут вот так:

Код: Выделить всё

                   fprintf(fout,"acl _sams_%s url_regex -i \"%s/%s.sams\"\n",row[1],conf.squidrootdir,row[1]);
                     printf("acl _sams_%s url_regex -i \"%s/%s.sams\"\n",row[1],conf.squidrootdir,row[1]);
                   fprintf(fout,"acl _sams_%s url_regex -i \"%s/%s.sams\"\n",row[1],conf.squidrootdir,row[1]);
                     printf("acl _sams_%s -i url_regex -i \"%s/%s.sams\"\n",row[1],conf.squidrootdir,row[1]);

После чего пересобираем SAMS. Теперь, он будет создавать правила вот такого вида:

Код: Выделить всё

acl _sams_chat url_regex -i "/etc/squid/chat.sams"
acl _sams_porno url_regex -i "/etc/squid/porno.sams"

Однако, как выяснилось, этим решается лишь половина проблемы. Если url_regex будет содержать кириллицу (например "анонимайзер"), то чувствительность к регистру всё равно будет работать. Чтобы решить эту проблему, пришлось, всё-таки, лезть в исходники Squid. В них нужно кое-что прописать и пересобрать его.
Итак, в исходниках сквида в файле main.cc после строчки 888 нужно вставить конструкцию "setlocale(LC_ALL, "");"
Т.е. кусок кода, после этого, будет выглядеть так:

Код: Выделить всё

static void
mainInitialize(void)
{
setlocale(LC_ALL, "");
/* chroot if configured to run inside chroot */

if (Config.chroot_dir && (chroot(Config.chroot_dir) != 0 || chdir("/") != 0)) {
fatal("failed to chroot");
}

Также, в строку 36 файла main.cc надо добавить - #include <locale.h>
Кусок кода, после этого, получится:

Код: Выделить всё

#include "squid.h"
#include <locale.h>
#include "AccessLogEntry.h"

Потом пересобираем squid, в результате будет работать ignore case для русских букв! Ну, а для того, чтобы гугл не срабатывал даже на запросы подобно "Аннонимайзер", или "Анонимпрайзер", или даже "Анонимайквапзеер", то в список запрещённых url добавляем вот такое регулярное выражение:
А.*Н.*О.*Н.*И.*М.*А.*Й.*з.*е.*р
Буквы можно хоть маленькие, хоть большие -- сейчас это уже значение иметь не будет, поскольку сквид уже не чувствителен к регистру русских букв :)
Ну, и напоследок, выкладываю готовые rpm-пакеты сквида для Fedora12, Fedora13 i386, а также src.rpm-пакеты подправленных сквида и самса. Их можно пересобрать под свою систему командой rpmbuild --rebuild packetname.src.rpm.
http://letitbit.net/download/85905.8423a8e...s_rpms.rar.html
Прошу прощения за то, что их пришлось выложить на letitbit. Если у кого есть возможность, то переложите в нормальное место, чтоб можно было по прямой ссылке скачивать.
Спасибо сказали:
IMB
Сообщения: 2563
ОС: Debian

Re: Squid и регистр

Сообщение IMB »

Вы бы отправили патчи с описанием проблемы разработчикам, глядишь у кого то потом не возникнет подобной проблемы.
Спасибо сказали:
Аватара пользователя
technotrance
Сообщения: 280
ОС: Fedora, FreeBSD, CentOS, Debian

Re: Squid и регистр

Сообщение technotrance »

Ну, на официальном форуме SAMS я эту проблему в первую очередь озвучивал. И об решении уже там и отписался.
А что касается Squid, то не знаю даже, стоит ли? Нашему брату это помогло, но вдруг кому-то другому это, наоборот, что-то покалечит...
Спасибо сказали:
sidoy
Сообщения: 1

Re: Squid и регистр

Сообщение sidoy »

Столкнулся с этой проблемой в squid3.3.8, Ubuntu 14.04.4
изменил исходник main.cс как описано выше, но проблема осталась. Добавив после "setlocale(LC_ALL, "");" вывод в лог "setlocale(LC_ALL, NULL)" после сборки и установки в cashe.log наблюдаю LC_ALL=С, такое же значение LC_Locale и без "setlocale(LC_ALL, "");" Пробывал "setlocale(LC_ALL, "ru_RU.UTF-8");" Тоже безрезультатно: в логе LC_ALL=ru_RU.UTF-8, но regexec все равно не игнорирует регистр русских символов.
Может кто подскажет в чем может быть дело?
Опыта программирования нет, но думаю можно решить проблему приведением url к одному регистру в файле RegexData.cc в начале функции ACLRegexData::match(char const *word), может кто подскажет как это реализовать?
Создавать списки регулярных вырождений запрещенных слов учитывающие всевозможные комбинации Регистров символов совсем не хотелось бы.
Спасибо сказали: