Перевод (C): Александр Куприн


Часть вторая

Краткое введение: SquidGuard


Что такое SquidGuard?

SquidGuard -- внешняя программа переадресации ("редиректор"), с помощью которой squid осуществляет фактическую пересылку пришедших к нему запросов. Задача SquidGuard'а -- лучшее управление процессом фильтрации, чем это делает сам Squid.

Хочу сразу заметить, что использовать SquidGuard при построении простых фильтров не имеет смысла.


Установка

SquidGuard можно найти на http://www.squidguard.org/download (забавно, правда?). Этот сайт содержит много информации о том, как его настраивать.

Как и Squid, SquidGuard можно скачать в двух форматах -- rpm и .tar.gz.

Если ваш дистрибутив поддерживает пакеты RPM, установить его можно так:

su - -c "rpm -i ./SquidGuard-1.2.1.noarch.rpm"

Если же формат RPM не поддерживается, то можно скачать и откомпилировать исходники, вот так:

tar xzvf ./SquidGuard-1.2.1.tgz
 ./configure
make && make install

Файлы будут установлены в "/usr/local/squidGuard/"


Настройка

Прежде чем мы начнём править конфигурационный файл "/etc/squidGuard.conf", требуется внести небольшие изменения в конфигурационный файл нашего старого друга "/etc/squid.conf". Найдите в нём такое место:

#redirect_program none

Раскомментируйте строку и замените слово "none" на путь к главному файлу SquidGuard. Если не знаете, где он -- воспользуйтесь командой:

whereis squidGuard

после чего впишите нужные путь и имя файла. Выглядеть это будет примерно так:

redirect_program /usr/local/bin/squidGuard

Сохраните файл и перезагрузите squid:

squid -k reconfigure

Это заставит его заново перечитать конфигурационный файл.

Хорошо. Теперь начинается самое интересное. Указав squid'у, что мы будем фильтровать приходящие к нему запросы с помощью внешней программы переадресации, мы должны определить соответствующие правила:

Основной конфигурационный файл SquidGuard -- это "/etc/squidGuard.conf". Выглядит он примерно так:

-------------------

( текстовая версия на http://gazette.linux.ru.net/lg78/articles/misc/adam/squidGuard.conf.txt)

logdir /var/squidGuard/logs
dbhome /var/squidGuard/db

src grownups {
    ip     10.0.0.0/24    # диапазон 10.0.0.0  - 10.0.0.255
                          # И
    user   foo bar        # идентификаторы foo и bar
}

src kids {
    ip     10.0.0.0/22    # диапазон 10.0.0.0 - 10.0.3.255
}

dest blacklist {
    domainlist blacklist/domains
    urllist    blacklist/urls
}

acl {
    grownups {
        pass all
    }

    kids {
        pass !blacklist all
    }

    default {
        pass none
        redirect http://localhost/cgi/blocked?clientaddr=%a&clientname=%n&clientuser=%i&clientgroup=%s&targetgroup=%t&url=%u
    }
}

-------------------

Теперь разберём каждую секцию отдельно:

logdir /var/squidGuard/logs
dbhome /var/squidGuard/db

Первая строка указывает каталог, где будет размещаться файл журнала, и создаёт его, если он не существует.

Вторая строка описывает каталог баз(ы) данных, в которых будут храниться имена запрещённых сайтов, регулярные выражения для фильтров и прочее.

src grownups {
    ip     10.0.0.0/24    # диапазон 10.0.0.0  - 10.0.0.255
                          # И
    user   foo bar        # ident foo or bar
}

Этот блок настраивает сразу несколько параметров. Во-первых, src "grownups" определяет диапазон IP-адресов и пользователей, являющихся "членами" этого блока. Обычные "неопределенно-личные" идентификаторы "foo" и "bar" используются здесь в качестве примера.

Следует заметить, что метка [TAG] user может использоваться, если идентифицирующий сервер [6] запущен на том же сервере, который перенаправляет запросы proxy-серверу, иначе оно будет недействительным.

src kids {
    ip     10.0.0.0/22    # диапазон 10.0.0.0 - 10.0.3.255
}

Этот раздел настраивает другой блок, называемый "kids". Он описывает только диапазон IP-адресов, без указания имён пользователей.

Вы можете думать о grownups и kids, как о таких же именах ACL, определенных в "/etc/squid.conf".

dest blacklist {
    domainlist blacklist/domains
    urllist    blacklist/urls
    expression blacklist/expressions
}

Этот раздел кода важен, т.к. описывает список (dest), используемый конкретными фильтрами. В своей работе SquidGuard использует три основных способа фильтрации:

1. domainlist -- список доменов, каждый в отдельной строке, например:

nasa.gov.org
squid-cache.org
cam.ac.uk

2. urllist -- список web-страниц с пропущенным префиксом "www.", например:

linuxgazette.com/current
cam.ac.uk/~users

3. expression -- слова (регулярные выражения) встречающиеся в URL:

sex
busty
porn

Последний блок кода:

acl {
    grownups {
        pass all
    }

    kids {
        pass !blacklist all
    }

    default {
        pass none
        redirect http://localhost/cgi/blocked?clientaddr=%a&clientname=%n&clientuser=%i&clientgroup=%s&targetgroup=%t&url=%u
    }
}

Здесь, в разделе "grownups" acl-блока описывается разрешение на полный доступ к Интернет пользователям, входящим в группу "src grownups", вне зависимости от URL, наличия в их составе регулярных выражений и прочих ограничений, определённых в dest blacklist.

Раздел "kids" разрешает пользователям, входящим в группу "src kids" получать результат любого запроса, за исключением подпадающих под правила из dest blacklists. В случае, если URL совпадает с одним из определений dest blacklists, запрос перенаправляется по адресу, определённому в секции default.

В секцию default запрос перенаправляется в том случае, если его источник не принадлежит ни "grownups", ни "kids". При этом клиент попадает на web-страницу, , которая выглядит как страница с сообщением об ошибке.

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

Следует отметить, что для того, чтобы фильтрация работала, как минимум должен присутствовать следующий участок кода:

default {
  pass none
}

С командой переадресации или без неё.

Существует множество "навороченных" опций конфигурации, которые могут быть применены в этом файле. Примеры вы можете найти на http://www.squidguard.org/configuration.

На этом введение в "основы" Squid и SquidGuard заканчивается. Дополнительную информацию можно найти по ссылкам, которые встречались в этой статье или на моём сайте: www.squidproxyapps.org.uk


Keyfiles: удобный BASH-скрипт для резервного копирования

Да, да. Я знаю, вы все думаете: "Что! Опять! Только не это! Ещё один скрипт для создания резервных копий!". Я пару раз слышал разговоры на эту тему в почтовой рассылке и подумал, почему бы и мне не поучаствовать в них....

Этот скрипт прост как "кусок хозяйственного мыла" [7] -- он использует конфигурационный файл (plain text), который содержит список файлов и директорий, с которых вы хотите сделать копии и упаковать в "за-gz-ипованный тарбол" в определённом месте.

Те из вас, кто хорошо знаком с созданием скриптов на BASH'е найдут это немного забавным, но я надеюсь, что мои комментарии помогут тем, кто только пытается изучить программирование на BASH'е.

-------------------

(Текстовая версия файла http://gazette.linux.ru.net/lg78/articles/misc/adam/keyfiles.sh.txt )[13]

#!/bin/bash
#################################################
#Keyfiles - tar/gzip configuration files        #
#Version:   Версия  1.0 (черновик)              #
#Ackn:      основан на идее Dave Turnbull       #
#Authour:   Thomas Adam                         #
#Date:      Понедельник 28 мая 2001, 16:05 BST  #
#Website:   www.squidproxyapps.org.uk           #
#Contact:   [email protected]        #
########################################Комментарии

#Комментарии для Dave Turnbull. Чтобы он не заблудился :-).

#объявление переменных
configfile="/etc/keyfiles.conf"
tmpdir="/tmp"
wrkdir="/var/log/keyfiles"
tarfile=keyfiles-$(date +%d%m%Y).tgz
method=$1           #опции выбора операции
submethod=$2        #дополнительные опции для "$1"
quiet=0             #вывод отладочной информации (по умолчанию)

cmd=basename $0   #удаляем путь из имени файла
optfiles="Usage: $cmd [--default (--quiet)] [--listconffiles] [--restore (--quiet)] [--editconf] [--delold] [--version]"
version="keyfiles: Автор Thomas Adam, Версия 1.0 (Вторник 5 июня 2001, 23:42)"

#проверка конфигурационного файла...
if [ ! -e $configfile ]; then
  for beepthatbell in 1 2 3 4 5; do
    echo -en "\x07"
  done
  echo " " | mail -s "[Keyfiles]: отсутствует файл $configfile" $USER
  echo " [Ошибка!]: отсутствует файл $configfile" $USER
  exit -1
fi

#проверяем существование рабочей директории, если её нет, то создаём
[ ! -d $wrkdir ] && mkdir $wrkdir

#проверка того, запущен ли скрипт без опций
if [ -z $method ]; then
  echo $optfiles
  exit 0
fi

#синтаксический разбор командной строки
check_syntax ()
{
  case $method in
    --default)
    cmd_default
    ;;
    --listconffiles)
    cmd_listconffiles
    ;;
    --restore)
    shift 1
    cmd_restore
    ;;
    --editconf)
    exec $EDITOR $configfile
    exit 0
    ;;
    --delold)
    cd $wrkdir && rm -f ./*.old > /dev/null
    exit 0
    ;;
    --version)
    echo $version
    exit 0
    ;;
    --*|-*|*)
    echo $optfiles
    exit 0
    ;;
  esac
}

#Вот теперь и начинается самое интересное.....
#объявление функции используемой опцией "--default"
cmd_default ()
{

  #пакуем все файлы, указанные в $configfile

  if [ $submethod ]; then
    tar -cZPpsf $tmp/$tarfile $(cat $configfile) &>/dev/null 2>&1
  else
    tar -vcZPpsf $tmp/$tarfile $(cat $configfile)
  fi

  #если содержимое каталогов пусто......
  if test $(ls -1 $wrkdir | grep -c -) = "0"; then
    mv $tmp/$tarfile $wrkdir
    exit 0
  fi

  for i in $(ls $wrkdir/*.tgz); do
    mv $i $i.old
  done

  mv $tmp/$tarfile $wrkdir
}

#вывести список, содержащийся в $configfile
cmd_listconffiles ()
{
  sort -o $configfile $configfile
  cat $configfile
  exit 0
}

#восстановить файлы......
cmd_restore ()
{
  cp $wrkdir/keyfiles*.tgz /
  cd /

  #проверка флага тишины :-)
  if [ $submethod ]; then
    tar vzxfmp keyfiles*.tgz &>/dev/null 2>&1
    rm -f /keyfiles*.tgz
    exit 0
  else
    tar vzxfmp keyfiles*.tgz
    rm -f /keyfiles*.tgz
    exit 0
  fi
}

#вызов головной функции
check_syntax

-------------------

Следует заметить, что основные изменения, которые вы можете делать в скрипте -- это изменять три переменные:

configfile="/etc/keyfiles.conf"
tmpdir="/tmp"
wrkdir="/var/log/keyfiles"

Тем не менее, мой скрипт достаточно "интеллектуален", чтобы проверить существование рабочей директории и в случае необходимости создать её.

Вы должны убедится, что установили для файла со скриптом соответствующие права доступа:

chmod 700 /usr/local/bin/keyfiles

Самый важный файл -- конфигурационный. В моём случае он выглядит так:

-------------------

( Текстовая версия файла http://gazette.linux.ru.net/lg78/articles/misc/adam/keyfiles.conf.txt )

/etc/keyfiles.conf
/etc/rc.config
/home/*/.AnotherLevel/*
/home/*/.fvwm2rc.m4
/home/solent/ada/*
/root/.AnotherLevel/*
/root/.fvwm2rc.m4
/usr/bin/header.sed
/usr/bin/loop4mail
/var/spool/mail/*

-------------------

Основные функции в скрипте базируются на утилите tar, которая использует конфигурационный файл, точнее шаблоны имен файлов [wildcards][8] указанные в нём.

Обратите внимание, что каждый раз, когда скрипт выполняется, создаётся копия последнего архива, т.е. файл "keyfiles-DATE.tgz" (если он, конечно, существует) переименовывается в "keyfiles-DATE.tgz.old" прежде, чем будет создан новый.

Всё, что вам нужно для восстановления данных из архива, мой скрипт уже знает -- последний созданный архив имеет расширение ".tgz".

Благодаря этой особенности, я добавил в скрипт ещё одну опцию, которая удаляет из каталога $workdir все старые резервные копии -- "--delold".

Для того, чтобы создать резервную копию, введите:

keyfiles --default

Если вы не хотите, чтобы в процессе работы скрипт выдавал какую-либо информацию, воспользуйтесь вторым ключом -- "--quiet"[9]:

keyfiles --default --quiet

Думаю, названия остальных опций программы говорят сами за себя.

Предложенный вашему вниманию скрипт резервного копирования далёк от совершенства, существуют более удачные аналоги. Но, в любом случае, замечания и пожелания по поводу его работы приветствуются!!


Обзор программы: Nedit

Вернёмся назад, в те дни, когда когда прославленный основатель этого специализированного журнала John Fisk писал для этой колонки. Другой автор, Larry Ayers, имел обыкновение делать обзоры программ. Он кратко упомянул о программе Nedit. Но никогда рассматривал её более подробно.

В таком случае, это сделаю я :-)

Вот уже три года я использую Nedit. Всю работу я делаю в нём -- когда нахожусь в "иксах", как сейчас. Внешний вид Nedit вы можете увидеть на http://gazette.linux.ru.net/lg78/articles/misc/adam/nedit1.png .

Эта программа обладает огромными возможностями. Наиболее популярная из них -- синтаксическая подсветка для языков программирования. Вот их список:

Если случается так, что вы пишете на языке программирования, который не перечислен выше, то вы можете сами написать для него шаблоны в виде регулярных выражений.

Nedit также предоставляет развитый механизм поиска и замены, использующий всё те же шаблоны (регулярные выражения) как с учётом регистра, так и без него.

Типичный пример окна диалога поиска/замены выглядит так:

В нём имеется возможность формировать сложные запросы.

Каждый из пунктов меню (имеется ввиду меню 1-го уровня), может быть "оторван" и расположен в отдельном окне. Это может быть полезно, если какой-то из пунктов приходится вызывать очень часто.

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

Рекомендую эту программу всем и каждому. В то же время, не желая изобретать новый велосипед в стиле Emacs/Vim, я всё-таки считаю Nedit реальной заменой и альтернативой "X11-Emacs", пожирающему слишком много оперативной памяти!! :-)

Вы можете скачать Nedit отсюда:

www.nedit.org

Попробуйте и наслаждайтесь им :-)


"А напоследок я скажу..."

Ну что ж, пора и этому месяцу закончиться -- я не ожидал, что он будет таким длинным!! Мой академический год более-менее приближается к концу и в последних числах мая меня ждут экзамены. После них я буду свободен целое лето, достаточно, чтобы привести в порядок все мои идеи относительно Linux'а, поселившиеся у меня в мозгу ( -- после того, как Ben Okopnik промыл его) :-)

До следующего месяца. Удачи и берегите себя.


Любые комментарии и предложения можно отослать мне, не поленившись и щелкнув по ссылке:

[email protected]ahoo.com


Thomas Adam

Меня зовут Thomas Adam. Мне 18, и в настоящее время я готовлюсь к A-Levels (= вступительные экзамены в университет). Живу на маленькой ферме в округе Дорсет в Англии. Я большой энтузиаст Linux, и помогаю в школе со всеми делами, связанными с его повседневным использованием. Linux использую уже около шести лет. Когда я не работаю с Linux, то играю на пианино, люблю пешие прогулки и кататься на мотоцикле.[10]

Примечания переводчика

[Если у вас возникнет вопрос: "А почему ссылки не по порядку?", отвечу: "Вам шашечки или чтобы ехать?" ;-)]

[6] Не могу сказать с уверенностью на все "сто", но, по моему, речь идёт о DNS-сервере.

[7] Вообще-то я не уверен в том, есть ли в Объединенном Королевстве хозяйственное мыло. 8-)

[8] Цитата из "Инсталляция Linux и первые шаги", автор М. Уэлш: "Ключевое свойство большинства оболочек Unix -- это способность ссылаться сразу более, чем на один файл, используя специальные символы ... так называемые "дикие карты" (wildcards)..."

[9] Только не спутайте очерёдность ключей.

[10] Автор немного забыл обновить свои автобиографические данные. Судя по всему, теперь он "обычный" студент "обычного" университета. И не исключено, что времени для игры на пианино у него сейчас меньше обычного. В любом случае спасибо ему за то, что нашёл время возобновить работу колонки LWM. 8-)

[13] В скрипт пришлось внести небольшие изменения -- вряд ли вам нужно, чтобы он отсылал пять одинаковых сообщений о том, что не найден конфигурационный файл "/etc/keyfiles.conf".


Copyright (C) 2002, Thomas Adam.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 78 of Linux Gazette, May 2002

Команда переводчиков:
Владимир Меренков, Александр Михайлов, Иван Песин, Сергей Скороходов, Александр Саввин, Роман Шумихин, Александр Куприн, Андрей Киселев

Со всеми предложениями, идеями и комментариями обращайтесь к Сергею Скороходову ([email protected]). Убедительная просьба: указывайте сразу, не возражаете ли Вы против публикации Ваших отзывов в рассылке.

Сайт рассылки: http://gazette.linux.ru.net
Эту статью можно взять здесь: http://gazette.linux.ru.net/lg78/articles/rus-adam.html