Расширяем функциональность Dansguardian.

Изображение пользователя den2007.


Не так давно, пытаясь подключить в Dansguardian возможность обхода заблокированных страниц по паролю, наткнулся на очень интересную WIKI по DANSGUARDIAN, правда на английском, но всё-таки с её помощью я разрешил свою задачу :)

http://contentfilter.futuragts.com

У любого коммерческого фильтра, есть возможность просмотра заблокированного сайта, введя специальный пароль.
Конечно, такой фильтр как Dansguardian тоже имеет такую функцию, но к сожалению она не используется сразу.
Для чего это может быть полезно?
Например, когда Dansguardian по ошибке заблокировал материал, а он нужен прямо сейчас, а времени заходить на сервер и править конфиги нет. Или например, все видео-форматы заблокированы, а вам надо скачать например видео с экспериментом по физике.

Приведённый ниже материал является примером, того как можно задействовать такую функцию. Именно примером, так как всего лишь демонстрирует принцип, а используемый скрипт может содержать уязвимости.

Скрипт взят с WIKI http://contentfilter.futuragts.com , он присоединен к статье.

Итак приступим.
Скачаем два файла, прикреплённые к статье, и переименуем их в templates.html и passwords.cgi.
Теперь скопируем templates.html в /usr/share/dansguardian/languages/russian-1251, заменив оригинальный файл.
Отличие от оригинального заключается в добавленной форме html.

Скрипт passwords.cgi копируем в каталог для скриптов на веб-сервере, у меня по умолчанию /var/www/cgi-bin

Теперь в templates.html находим строку
FORM id="myform" action="http://192.168.4.1/cgi-bin/passwords.cgi" method="post"
и заменяем адрес расположения скрипта http://192.168.4.1/cgi-bin/passwords.cgi на свой.
Теперь откроем passwords.cgi
здесь задаем:

пароль
my %passwordlist = ( "ВАШ ПАРОЛЬ", "admin");

ключевую фразу
my $magic = 'ВАША ФРАЗА или ПРОСТО НАБОР СИМВОЛОВ';

адрес веб-страницы, которая будет выводиться при неправильном пароле
my $invalidurl = "АДРЕС СТРАНИЦЫ";

Пока все, переходим к настройке Dansguardian.

Открываем dansguardian.conf
Изменяем опции, как показано ниже:

reportinglevel=3
т. е. использовать HTML-шаблон для формирования страницы запрета.

language='russian-1251'
чтобы использовать наш измененный шаблон

Сохраняем.

Переходим к конфигурационному файлу соответствующей группы, по-умолчанию всего одна.

Открываем dansguardianf1.conf
Изменяем опции, как показано ниже:

bypass = -1
разрешаем работу с внешней программой для генерации ссылок для обхода фильтра.

bypasskey ='ВАША КЛЮЧЕВАЯ ФРАЗА'
вводим ключевую фразу, которую вводили в passwords.cgi

Сохраняем и закрываем.

Перезапускаем Dansguardian.

Пробуем зайти на отключенный Dansguardian ресурс, в появишемся окне вводим пароль, указанный в passwords.cgi и либо получаем доступ, либо попадем на страницу с сообщением о неверном пароле.

Конечно это только базовое применение, функциональность скрипта и такого подхода можно значительно расширить, добавив контроль над именами пользователей, и URL в скрипте.

Если что-то не работает проверьте права доступа на скрипт, он должен быть исполняемым, и принадлежать к группе и владельцу, под которыми работает сам веб-сервер.
CGI-скрипт написан на PERL, поэтому проверьте наличие соответствующих модулей для вашего веб-сервера.
И еще раз просмотрите соответствующие конфигурационные файлы.

Всем, кто читает мои материалы огромное СПАСИБО, за проявленный Вами интерес к ним.

Прикрепленный файлРазмер
template.html_.txt2.79 кб
passwords.cgi_.txt1.26 кб

У кого получилось настроить?

У меня что-то нет. Пробовал настраивать под Ubuntu 10.04.
1. Скрипт исполняемый вроде, сделал владельцем этого файла www-data, apache2 под ним вроде работает:
cd /usr/lib/cgi-bin
ls -l
-rwxr-xr-x 1 www-data www-data 1198 2011-08-28 00:10 passwords.cgi
-rwxr-xr-x 1 root root 78 2011-08-27 23:37 test.pl

2. Тестовый скрипт test.pl выполняется (обращение к нему через браузер http//:localhost/cgi-bin/test.pl), т.е. модули perl на веб-сервере работают.

При вводе спец-пароля получаю в ответ, например:
Firefox не может найти сервер www.megamovs.com&gbypass=1f09188b8fc24a256ae7c97ffa3415b61314470818.

Подскажите, куда "копать"?

Изображение пользователя den2007.

Решил проблему.

Копать никуда не надо.
Ошибка была в скрипте, отредактированный скрипт прикреплен к статье.
Если посмотреть на адрес указанный вами, то можно заметить, что вместо положенного разделителя ? адреса домена и параметров находится &, из-за этого сервер DNS считает всю строку адресом домена, и честно сообщает, что такого адреса нет.

Фактически, добавление простого условия в скрипт решает проблему(частично).

if ($url =~ m/\?/)
{
$bypass_url = $url . '&GBYPASS=' . $hash;
}
else
{
$bypass_url = $url . '?GBYPASS=' . $hash;
}

PS. С защищенными соединениями (SSL) механизм обхода не работает.

Да, действительно работает, но ...

Спасибо. Действительно работает, но только при фильтрации по фразам. Если используется белый, черный, серый списки не работает.

Изображение пользователя den2007.

еще одна ошибка есть

Еще одна ошибка есть в скрипте и заключается она в том, что если адрес url не оканчивается символом / , то генерируется неправильный MD5-хэш и dansguardian снова блокирует соединение, Это я вчера вечером на работе обнаружил, когда стал разбираться почему генерируются разные md5-хэши при генерировании dansguardian и скриптом, так как переписывал скрипт на PHP, просто не хотелось еще и perl использовать в веб-интерфейсе, так как это бы подняло бы планку системных требований к веб-серверу.
Отдельно php скрипт я не планирую выкладывать, он будет включен в состав архива веб-интерфейса откуда его смогут взять все желающие. Возможности скрипта значительно более широкие чем этого.
PS. На PHP недостающий код выглядит так,

if (!eregi("https?://.+/.*", $url)){$url = $url . "/";}

и располагается перед кодом указанным в предыдущем комментарии.
если кто сможет, пожалуйста перепишите эту строчку на PERL, и разместите в комментарии, просто действительно нет времени этим заниматься, да и сегодня целый день пропал, поскольку с сильнейшей головной болью пролежал целый день, хотел дописать код веб-интерфейса, но куда там ..., осталось только импорт списка сайтов в базу дописать, да документацию оформить, плюс проверочная установка на школьный сервер 5.0.2, после чего разместить первую альфа-версию под лицензией GNU/GPL

Perl вариант eregi

Сколько не пробовал, сам не смог осилить. Поэтому попросил людей на форуме Perl помочь. Вот какой вариант написали:
$url .= "/" if $url !~ m!https?://.+/!i;
Начал проверять, вроде работает, а вроде и нет.
Пример:
1. url-адрес, оканчивающийся слэшом - http://www.narkotiki.name/rasteniya-enteogeny/gashish-himka-anasha/himka-konoplya/ (извиняюсь за такой адрес, фантазии не хватило сделать более безобидный запрос) - обход срабатывает, страница загрузилась.

2.url-адрес без слэша - http://ganjaclub.ru/publ/3-1-0-22 - обход также срабатывает, страница загрузилась.

Но:
3. url-адрес http://mp3baza.net/ обход не срабатывает, результат такой http://mp3baza.net/?GBYPASS=C3BA22B1B13E9CFB7A8101C55AD568B91319829887. Хотя видим в конце слэш. Странно, в строке браузера http://mp3baza.net/, а на странице запрета доступа в строке "Доступ к интернет ресурсу: http://mp3baza.net ... запрещён по следующим причинам" без слэша.