Блог

Прокси-сервер Squid и программа-редиректор SquidGuard, обеспечивающие URL-фильтрацию на основе блэклистов, по-разному их  интерпретируют. Соответственно и требования к содержанию блэклистов у них различны. Мы рассмотрим какие здесь есть нюансы, и каким образом мы делаем для каждой из программ свои отдельные блэклисты так, чтобы они работали одинаково.

Для нас отличие в реализации механизмов блокирования по блэклистам заключается в различной реализации фильтрующими программами понятия единообразный домен.

В нашем понимании (на котором мы строим свои блэклисты) единообразным является домен, все поддомены которого относятся к той же категории, что и сам домен, вне зависимости от уровня вложенности поддомена. Например, если domain.com это единообразный домен, то поддомены sub1.domain.com, sub2.domain.com, subsub11.sub1.domain.com необходимо рассматривать как домены, относящиеся к той же категории, что и domain.com. И если уж принято решение, что домен единообразный и его надо блокировать, то и он и все его поддомены должны блокироваться фильтром.

Как же фильтрующие программы обрабатывают подключенные к ним блэклисты?

Редиректор SquidGuard интерпретирует блэклист следующим образом:

  • считываются все строки из блэклиста, их порядок не имеет значения;
  • если указан ТОЛЬКО домен какого-либо уровня, блокируется этот домен полностью, включая все поддомены;
  • если указаны несколько поддоменов одного уровня (sub1.domain.com и sub2.domain.com), блокируются только эти поддомены и все вложенные в них поддомены вышестоящих уровней; поддомены того же уровня, отсутствующие в блэклисте заблокированы не будут (sub5.domain.com);
  • если в блэклисте встретился домен и хотя бы один его поддомен (domain.com и sub1.domain.com), блокируется доступ к самому домену, и всем его поддоменам, перечисленным в списке. Важно понимать, что доступ к отсутствующим в блэклисте поддоменам закрыт не будет.

Как мы видим, SquidGuard анализирует весь блэклист и, в зависимости от его содержания (например, наличия/сочетания доменов и поддоменов), принимает различные решения об их блокировании.

Напротив, прокси-сервер Squid обрабатывает блэклист построчно
(Прим.: мы рассматриваем вариант подключения блэклиста dstdomain, команда в конфигурационном файле может выглядеть например, так: acl blacklist dstdomain -i "/etc/squid3/blacklists/porn" Подробнее о настройке Squid смотрите Настройка URL-фильтраций на локальном компьютере (только Squid)). Для большей гибкости здесь используется дополнительный синтаксис блэклиста - предлагается использовать префикс ".", указывающий, что необходимо блокировать и домен и все его вложенные поддомены. Тогда логика обработки блэклиста следующая:

  • последовательно считываются все строки блэклиста;
  • если встретился только домен вида domain.com (без точки в начале строки), блокируем доступ только к этому домену, разрешаем доступ к его поддоменам; Важно понимать, что www.domain.com также рассматривается Squid как поддомен, и не будет заблокирован.
  • если встретился только домен вида .domain.com (c "." в качестве префикса), блокируется доступ к домену domain.com и ко всем его поддоменам;
  • если указан одновременно и домен, и поддомен, тогда:
    • если домен указан раньше поддомена, и содержит префикс "." строки блэклиста, содержащая поддомен/поддомены игнорируются, а домен блокируется полностью, включая все его поддомены;
    • если домен указан раньше поддомена, и не содержит префикса ".", а поддомен содержит префикс ".", блокируется сам домен domain.com, и поддомен sub.domain.com со всеми своими поддоменами (sub5.sub.domain.com)
    • если поддомен указан раньше домена, Squid прекращает свою работу с ошибкой 
      (в нашем случае, в syslog  для каждого из восьми тредов squid появились следующие сообщения:
      kernel: init: squid3 main process (4216) terminated with status 1
      kernel: squid3 main process ended, respawning
      squid3: line 2 acl blacklist dstdomain -i "etc/squid3/blacklists/porn"
      kernel: init: squid3 main process (4222) terminated with status 1
      kernel: squid3 respawning too fast, stopped).

Для улучшения понимания, рассмотрим несколько примеров работы Squid:

Пример 1.

В блэклисте:
sub.domain.com
.domain.com
или
.sub.domain.com
.domain.com

Действие: аварийное завершение программы.

Пример 2.

В блэклисте:
sub.domain.com
domain.com
или
domain.com
sub.domain.com

Действие: блокируются только указанные в блэклисте domain.com и sub.domain.com. Иные поддомены (sub2.domain.com, www.domain.com) НЕ блокируются.

Пример 3.

В блэклисте:
.domain.com
или
.domain.com
sub.domain.com
или
.domain.com
.sub.domain.com
или
.domain.com
sub.domain.com
.sub2.domain.com

Действие: блокируется весь домен domain.com со всеми его поддоменами вне зависимости от того, присутствуют ли они в блэклисте (при условии, что домен встречается первым и содержит префикс ".", наличие его поддоменов в блэклисте не оказывает никакого влияния).

Здесь необходимо сделать важное замечание. В интернет нередко встречаются сайты, использующие большое количество поддоменов для размещения одинакового (с точки зрения нашей классификации) контента. Особенно это касается автоматически разворачиваемых порно-сайтов, которые могут содержать сотни и тысячи поддоменов. Мы считаем, что в этом случае достаточно заблокировать весь домен и всего поддомены, вне зависимости, знает ли о них наша система, собрала ли, или обработала ли она контент этих поддоменов. Но так как решение это довольно сильное (а давайте заблокируем... livejournal.com, ведь на множестве его поддоменов можно найти подозрительный контент), у нас оно принимается не автоматикой, а экспертом.

Отсюда следует, что для оценки эффективности блэклиста значимость такого параметра как "количество строк (записей) в блэклисте" не столь и велика, потому что один "свернутый" единообразный домен в реальности может содержать сотни, тысячи, а то и десятки тысяч поддоменов (если эксперт сказал, что домен единообразный, мы можем удалить из блэклиста все его поддомены, оставив только его самого). Более важным становится параметр "покрытие" блэклиста,а именно, к какому количеству доменов и поддоменов блеклист блокирует доступ. Кстати, в том числе и сворачиванием единообразных доменов объясняется динамическое изменение размера выкладываемых нами блэклистов. 

Для того, чтобы блэклисты и под Squid и под SquidGuard работали одинаково, мы приняли решение, что будем рассматривать домены, на которых обнаружен порноконтент порнографическими и единообразными до тех пор, пока не обнаружится обратное (например, пока не найдется не порнографический поддомен). Это конечно приводит к росту количества ложных срабатываний, но и увеличивает покрытие блэклиста.

Тогда логика построения блэклистов будет:

Для SquidGuard: 

  1. В блэклист добавляются все домены второго уровня, отмеченные экспертами как единообразные и подпадающие под категорию.
  2. В блэклист добавляются все домены второго уровня, оцененные как подпадающие под категорию экспертами и/или автоматикой, но не отмеченные экспертами как единообразные.
  3. В блэклист добавляются все домены третьего и выше уровня,  оцененные как подпадающие под категорию экспертами и/или автоматикой, за исключением тех, родители которых (домены второго уровня) уже присутствуют в блэклисте.

Для Squid блэклист генерируется из ранее созданного блэклиста для SquidGuard. Для этого: 

  1. Все строки инвертируются (domain.com превращается в moc.niamod)
  2. Сортируются по возрастанию (это гарантирует, что домен всегда будет в списке выше своих поддоменов, чтобы исключить возможность ситуации из Примера 1 с некорректным завершением работы Squid)
  3. Инвертируем строки обратно.
  4. Добавляем префикс "." перед каждой строкой.

Полученные блэклисты обеспечивают единообразное поведение программ Squid и SquidGuard. У блэклистов получается большее покрытие за счет того, что домены (и поддомены), указанные в них, рассматриваются фильтрами как единообразные и блокируются полностью. С другой стороны, это приводит к росту числа ложных срабатываний такого блэклиста (а вдруг на сайте porn.com действительно есть поддомен, не имеющий отношения к порнографии?) И этот факт необходимо учитывать при их использовании.