Цель данной статьи рассказать и показать, как можно настроить систему фильтрации контента для пользователей, работающих в доменной структуре MS Windows. Возможности данной системы должны позволять делить пользователей на группы и, в зависимости от принадлежности, давать доступ только в рамках своей группы фильтрации. Так же должна происходить проверка на вирусы, а в случае скачивания файлов должно появиться информационное окошко, которое покажет сколько скачалось,сколько осталось и общий размер.
В качестве некоторой тестовой задачи хотелось получить функционирование системы фильтрации контента, в связке с антивирусом, с несколькими группами фильтрации на основе их аккаунтов. Для этой задачи было принято решение использовать следующий набор ПО:
В качестве операционной системы был выбран RedHat Enterprise Linux 5. На вопрос почему я отвечу очень просто: все что было под рукой. Если раскрывать более детально, то RHEL 5 имеет более новое ядро, а так же важную функциональность CPUSET, благодаря которой у нас появилась возможность создавать защищённую среду для работы процессов. Защищённость в том смысле, что пользователь может задавать на каких процессорах исполнять тот или иной процесс и его потомков. После таких ограничений процесс не сможет перейти на свободный процессор, что дает нам возможность корректнее распределять нагрузку на процессоры, а так же даст возможность ограничить особо прожорливые процессы. Например в нашей конфигурации можно сделать так: 1 процессор для SQUID, 1 для DansGuardian, 1 для Clamav, 1 для самбы. В итоге у каждой службы будет своё процессор со своей нагрузкой (не считая системную). Описание процесса настройки CPUSET выходит за рамки данной статьи и будет описано позже (если найдется время ).
Задача формулировалась так:
Для решения данной задачи оптимально - разбиваем её на несколько этапов.
На данном этапе будет произведена установка ОС и всех базовых служб, таких как:
Т.к. все эти службы входят в дистрибутив, то процесс установки будет банальным rpm -ivh <Нужные пакеты>
На этом этапе мы остановимся подробнее. Здесь будет описан процесс конфигурирования системных служб и проверка настроек.
Настройка самбы тривиальна. Базовый конфиг /etc/samba/smb.conf, в котором исправляются нужные вам опции
workgroup = RESEARCH
называем рабочую группу RESEARCH
server string = server
имя сервера server
security = ads
режим безопасности ads - т.е. Active Directory, т.к. у нас основная задача интеграция именно с ним.
password server = x.x.x.x
указываем IP адресс контролера домена
realm = RESEARCH.LAN
указываем полное наименование MS Windows домена. В нашем случае это RESEARCH.LAN. Важная особенность - полное наименование должно быть большими буквами.
winbind cache time = 10
указываем период обновления кеш данных. Необходимо, если мы не хотим каждый раз при изменении в АД перезапускать службу winbind
encrypt passwords = yes winbind use default domain = no winbind uid = 10000-20000 winbind gid = 10000-20000 winbind enum users = yes winbind enum groups = yes
опции необходимые для маппинга доменных пользователей локально, установка локальных ID пользователей и групп и т.п. Теперь добавляем в автозапуск службу, чтобы при перезагрузки она стартовала автоматически:
# chkconfig winbind on
Убеждаемся в том, что служба занесена в автозагрузку
# chkconfig --list winbind winbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off
Как мы видим на уровнях 2, 3, 4, 5 служба прописана. Производим запуск службы
# service smb start # service winbind start
На этом вся настройка самбы может быть смело закончена. Теперь можно переходить к настройке kerberos и вводу машины в домен.
Надо отредактировать файл /etc/krb5.conf. Выглядить он будет примерно так:
[logging] default = FILE:/var/log/krb5libs.log kdc = FILE:/var/log/krb5kdc.log admin_server = FILE:/var/log/kadmind.log
[libdefaults] default_realm =RESEARCH.LAN dns_lookup_realm = false dns_lookup_kdc = false ticket_lifetime = 24h forwardable = yes
[realms] RESEARCH.LAN = { kdc = x.x.x.x:88 admin_server = x.x.x.x:749 default_domain = research.lan }
[domain_realm] .research.lan = RESEARCH.LAN research.lan = RESEARCH.LAN
[kdc] profile = /var/kerberos/krb5kdc/kdc.conf [appdefaults] pam = { debug = false ticket_lifetime = 36000 renew_lifetime = 36000 forwardable = true krb4_convert = false }
где адрес x.x.x.x совпадает с адресом контроллера домена, который указывали в конфигурационном файле самбы.
Важное замечание: Необходимо соблюдать регистр, т.е. там где прописаны большими буквами домены они должны быть большими. Это требование kerberos.
Чтобы избежать проблем с kerberos необходимо, чтобы время на контроллере домена и на машине было одинаковым. Допускается разница в 5 минут, но даже это крайне не желательно. Для начала мы просто синхронизируем время:
# ntpdate -u x.x.x.x
где x.x.x.x адрес контроллера домена. После чего у вас должен появиться такой ответ:
22 Aug 19:48:50 ntpdate[30264]: step time server x.x.x.x offset 4.082098 sec
Чтобы время синхронизировалось вне зависимости от вас, надо в файле /etc/ntp.conf прописать строку
server x.x.x.x
Теперь добавляем в автозапуск службу, чтобы при перезагрузки она стартовала автоматически:
# chkconfig ntpd on
Убеждаемся в том, что служба занесена в автозагрузку
# chkconfig --list ntpd ntpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
Как мы видим на уровнях 2, 3, 4, 5 служба прописана. Производим запуск службы:
# service ntpd start
Для правильной работы нам потребуется ввести машину в домен. Это делается тривиальным способом:
# net ads join -U admin%admin123
где запись «admin%admin123» обозначает ни что иное как логин%пароль. Проверяем в домене ли мы:
# wbinfo -u
Данная команда выведет список всех пользователей домена следующего вида:
RESEARCH\administrator RESEARCH\guest и т.п.
Теперь необходимо, чтобы система видела пользователей и группы доменной системы. Для этого редактируем файл /etc/nsswitch.conf следующим образом:
passwd: files winbind shadow: files winbind group: files winbind
И проверяем правда ли мы видим, или есть ошибки.
# getent group # getent passwd
Если все сделано правильно и без ошибок, то мы получим такие ответы
# getent group
root:x:0:root bin:x:1:root,bin,daemon daemon:x:2:root,bin,daemon ...... RESEARCH\domain computers:*:10010: RESEARCH\domain controllers:*:10011: RESEARCH\schema admins:*:10012: и т.п.
# getent passwd
root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin ...... RESEARCH\backup:*:10028:10000:backup:/home/RESEARCH/backup:/bin/false RESEARCH\dfs:*:10029:10000:dfs:/home/RESEARCH/dfs:/bin/false и т.п.
Мы убедились что у нас в системе отражаются пользователи. Теперь надо задать пользователя от которого будет происходить аутентификация:
# wbinfo --set-auth-user=RESEARCH\\admin%admin123 # wbinfo --get-auth-user
RESEARCH\admin%admin123
Теперь переходим к настройке кеширующего прокси сервера.
В дистрибутиве уже есть squid версии 2.6 который нам подойдет. Все что нам надо - это произвести его настройку, для этого в файле /etc/squid/squid.conf редактируем следующие опции:
http_port 127.0.0.1:3128
опция задает сетевой адрес и порт, на котором сквид будет принимать соединения. На не нужно, чтобы к сквиду обращались напрямую, поэтому вешаем его на петлевой интерфейс
auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp auth_param ntlm children 5 auth_param ntlm keep_alive on auth_param basic program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic auth_param basic children 5 auth_param basic realm Squid proxy-caching web server auth_param basic credentialsttl 2 hours auth_param basic casesensitive off
Заставляем сквид авторизовывать по NTLM, если браузер не поддерживает этого, то используем basic авторизацию. Здесь важна последовательность, поэтому другого варианта быть не может, иначе будут проблемы в работе.
acl RESEARCH proxy_auth REQUIRED
Создаем список доступа, согласно которому все, кто подпадает под него должны проходить авторизацию в обязательном порядке.
http_access allow RESEARCH localhost
Говорим сквиду, что все, кто идёт с адреса 127.0.0.1 обязаны пройти авторизацию.
Остальные опции настраивайте по вашему усмотрению. Документации на просторах интернета много, поэтому не вижу смысла описывать в очередной раз. Теперь добавляем в автозапуск службу, чтобы при перезагрузки она стартовала автоматически:
# chkconfig squid on
Убеждаемся в том, что служба занесена в автозагрузку
# chkconfig --list squid squid 0:off 1:off 2:on 3:on 4:on 5:on 6:off
Как мы видим на уровнях 2, 3, 4, 5 служба прописана. Производим запуск службы:
# service squid start
На этом этап настройки завершён. Переходим к этапу настройки антивируса и системы контроля за контентом.
На данном этапе на понадобиться антивирус clamav и система контроля за контентом dansguardian.
Скачиваем с сайта www.clamav.net последнюю версию антивируса (на момент публикации версия была 0.91.1)
Скачиваем с сайта www.dansguardian.org версию 2.9.9.0
Скачиваем патч для dansguardian (позже объясню для чего) отсюда: ntlm_group.patch.gz
Распаковываем скачанный файл
$ tar xzvf clamav-0.91.1.tar.gz
Собираем антивирус со следующими опциями
$ ./configure --prefix=/opt --with-user=squid --with-group=squid --with-tcpwrappers--enable-dns-fix
Описание этих опций можно получить по команде
$ ./configure --help
Далее производим компиляцию и установку
$ make # make install
Теперь добавим в /etc/ld.so.conf.d/clamav.conf следующую строчку
/opt/clamav/lib
Добавим в /etc/profile.d/clamav.sh следующее
PATH=/opt/clamav/bin:/opt/clamav/sbin:$PATH LD_LIBRARY_PATH=/opt/clamav/lib:$LD_LIBRARY_PATH
Обновим кеш библиотек
# ldconfig -n /opt/clamav/lib
Обновим переменные окружения, которые мы задали, чтобы увидеть исполняемые файлы clamav
# source /etc/profile
Есть второй и более правильный вариант - использовать rpm репозитарии. Чтобы задействовать репозитарий надо скачать пакет rpmforge-release, в котором уже есть необходимые конфигурационные файлы и GPG ключи. И так качаем его с сайта
http://dag.wieers.com/rpm/packages/rpmforge-release/
Берем самый последний, который соответствует нашей операционной системе. Для RHEL 5 был последним пакет
http://dag.wieers.com/rpm/packages/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
После того, как скачивание будет завершено произведём его установку
# rpm -ivh rpmforge-release-0.3.6-1.el5.rf.i386.rpm
Теперь у нас подключен репозитарий, с которого будет производиться так же и обновление. Чтобы установить clamav последней версии воспользуемся стандартными средствами RHEL для управления пакетами, а именно yum
# yum update
произведём обновление пакетов, если есть более новые версии.
# yum install clamav
после этого у вас в системе появится clamav последней версии, а так же будет обновляться по мере необходимости. Этот вариант более предпочтителен, т.к. вам не надо заботиться об обновлении антивируса, система сделает это за вас. Установка завершена. Теперь осталось сконфигурировать антивирус и обновить базы. Описывать эти процедуры не буду, т.к. есть документация.
Что такое DansGuardian? DG - это система фильтрации контента, в отличии от стандартных редиректоров сквида она умеет фильтровать не только по URL сайтов, но и по их содержимому, проставляя баллы и на основе набранных баллов разрешать или запрещать тот или иной сайт. DG умеет работать с несколькими группами фильтрации, что позволяет администратору давать гибко настраивать систему и разрешать/запрещать те или иные сайты для групп. Что не мало важно - DG умеет работать с антивирусами, что позволяет не только фильтровать но и проверять содержимое на наличии вирусов. Поддерживаются следующие виды антивирусов: Kaspersky и Clamav, остальные антивирусы могут работать либо через ICAP протокол, либо через командную строку. Для clamav есть следующие возможности:
libclamav
Данная возможность позволяет DG сканировать данные, используюя библиотеку антивируса. Здесь есть свои плюсы и минусы. К плюсам можно отнести полную интеграцию антивируса, сканирование будет производиться самостоятельно, без запуска демона clamd. Я рекомендую данную возможность на системах с 1 процессором. Минусы такого подхода в том, что DG тратит своё время на проверку вирусов, вместо того, чтобы отдать демону clamd контент и заниматься своим делом, ожидая ответа вида Чист/Заражён.
clamd
Данная возможность позволяет DG отдавать данные демону clamd и не заниматься самовыявлением. Такой подход хорош, когда у нас многопроцессорная машина и, в купе с CPUSET, мы можем отдать тяжёлую работу отдельному демону, который будет замаплен на процессор и не будет грузить остальные.
commanline
Самый тяжёлый метод - метод когда DG передает утилите сканирования, как параметр, файл с контентом.
Зачем нужен патч? Дело в том, что при использовании NTLM протокола DG удостоверится, что пользователю разрешён доступ и далее будет искать его в своих группах фильтрации. Проще говоря, нам надо будет ручками прописывать каждого пользователя к группе фильтрации, что может быть не эффективно, а если пользователей более 10 ещё и обременительно. Патч исправляет этот недочет. Благодаря ему, мы имеем возможность создавать системные группы вида
dgfilterX
где X - номер группы от 1 до 99. Теперь нам надо всего лишь задействовать механизм nsswitch для подключения нужных нам каталогов и создать в каталогах группы. Члены группы автоматически будут подключены к той или иной группе фильтрации, нам останется лишь создать необходимое количество конфигурационных файлов вида
danguardianfX.conf
где X - номер группы, там же поправить опции
groupmode = X
где X - номер политики
0 = banned 1 = filtered 2 = unfiltered (exception)
и назвать группу (что не обязательно)
groupname = 'XXXX'
где XXX - запись любого вида. Цель её просто назвать группу, ну например Full Access, WWW pages only и т.п. После этого в том же Active Directory мы просто добавляем пользователя в группу.
Важно знать: 1. Если пользователь в нескольких группах, то система автоматически направит его в группу по умолчанию, т.к. пользователь не может быть в 2-х и более группах одновременно 2. При создании группы в AD надо выбирать параметры Group scope: "Global" и Group Type: "Security"
Переходим непосредственно к установке. Распаковываем скачанный файл
$ tar xzvf dansguardian-2.9.9.0.tar.gz
Накладываем патч
$ zcat ../ntlm_group.patch.gz | patch -Np1
Производим конфигрурирование
$ ./configure --prefix=/opt/dg --with-proxyuser=squid --with-proxygroup=squid --with-zlib --enable-ntlm --enable-trickledm --enable-fancydm --enable-commandline --enable-icap --enable-kavd --enable-clamd --enable-clamav --enable-pcre
Опции
'--enable-ntlm'
включить поддержку NTLM
'--enable-trickled'
включить поддержку менеджера докачки. Данный менеджер позволяет постепенно отдавать контент, чтобы пользователь видел его статус, по окочанию скачивани и проверки будет принято решение отдавать до конца или заблокировать.
'--enable-fancydm'
включить поддерку менеджера докачки. Данный менеджер будет выводить странницу со статусом скачивания файла и результатом проверки. В случае, если будет найден вирус, то появится сообщение в браузере об этом. Важно знать, что на сайтах, где закачка подключается через javascript (например sourceforge.net) данная странница не появится, поэтому надо будет переходить по реальной ссылке. При этом закачка не будет останавливаться и при переходе вы получите текущий статус скачивания.
'--enable-commandline' '--enable-icap' '--enable-clamd' '--enable-clamav' '--enable-kavd'
режимы проверки на вредоносность данных
'--enable-pcre'
включить поддержку библиотеки регулярных выражений. Далее производим сборку и установку
$ make # make install
После этого производится конфигурация самого DG в файле <PATH_TO_INSTALL>/etc/dansguardina/dansguardian.conf Файл хорошо документирован, поэтому вдаваться в детали каждой опции не буду, опишу только те, на которые стоит обратить внимание:
language = 'russian-1251'
странница с сообщение о блокировке будет выдаваться на русском языке. Шаблоны лежат в директории
languagedir = '/opt/dg/share/dansguardian/languages'
можете перенести куда вам будет удобнее и исправить тут путь.
filterip = 10.0.60.150 filterport = 8080
IP адресс и порт, по которым DG будет работать.
proxyip = 127.0.0.1 proxyport = 3128
адрес прокси сервера, в нашем случае сквида. DG не умеет работать отдельно, только в связке.
filtergroups = 2
здесь необходимо прописывать количество групп фильтрации. Т.е. у вас в системе все группы должны идти последовательно и количество этих групп должно быть тут указано. Например у вас есть группы dgfilter1, dgfilter2 и dgfilter3 в итоге количество групп у нас будет 3.
deletedownloadedtempfiles = on
удалять файлы, после того как будут закачены.
downloadmanager = '/opt/dg/etc/downloadmanagers/fancy.conf' downloadmanager = '/opt/dg/etc/downloadmanagers/default.conf'
тут указывается необходимый вам менеджер докачки, которые я описал выше
contentscanner = '/opt/dg/etc/contentscanners/clamav.conf'
указываем, что хотим использовать libclamav
authplugin = '/opt/dg/etc/authplugins/proxy-basic.conf' authplugin = '/opt/dg/etc/authplugins/proxy-ntlm.conf'
указываем что хотим использовать авторизацию по NTLM и BASIC. На самом деле авторизация будет проходить на сквиде, а не на DG. Поэтому если у вас сквид не настроен, то работать DG не будет.
forwardedfor = off usexforwardedfor = off
опции необходимы, если вы хотите чтобы в логах сквида отображался IP адрес клиента, вместо 127.0.0.1
Вот собственно и все. Конфигурация закончена. Теперь приведу некоторое объяснение как создавать группы фильтрации. Если вы обратите внимание, то рядом с конфигурационным файлом лежит файл dansguardianf1.conf, который есть ни что иное, как файл конфигурации группы фильтрации по умолчанию. Чтобы создать файлы для других групп надо просто скопировать заменив суффикс на соответствующий, т.е.:
dgfilter1, default - dansguardianf1.conf dgfilter2 - dansguardianf2.conf dgfilter3 - dansguardianf3.conf
Далее копируем директорию с шаблонами проверки lists и создаем нужную вам структуру шаблонов (1 группа фильтрации использует директорию lists поэтому можно начать со второй), например так:
groups groups/fgroup2 groups/fgroup3
И соответсвенно заменяем в файлах конфигурации пути до списков согласно вашей структуре. Так же в этих файлах вы можете отключать для групп фильтрацию всего контента, делать группы, которым будет заблокирован доступ вообще и т.п.
Теперь добавляем в автозапуск службу, чтобы при перезагрузки она стартовала автоматически, для этого скопируем из директории <PATH_TO_INSTALL>/share/dansguardian/scripts/systemv-init в директорию /etc/init.d/
# cp <PATH_TO_INSTALL>/share/dansguardian/scripts/systemv-init /etc/init.d/dansguardian # chkconfig --add dansguardian # chkconfig dansguardian on
Убеждаемся в том, что служба занесена в автозагрузку
# chkconfig --list dansguardian ntpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
Как мы видим на уровнях 2, 3, 4, 5 служба прописана. Производим запуск службы:
# service dansguardian start
Важно знать: При первом запуске DG будет ругаться на отсутствие файлов, просто досоздайте их по тому же пути, на который он ругается при помощи команды ''touch''.
Вот и все, остальное дело ваше. Играйтесь, настраивайте, отсылайте ошибки разработчику. Эксперементируйте и/или наслаждайтесь.
Я постараюсь в ближайшее время отправить автору этот патч, может быть его включат в официальную ветку и тогда задача упростится.
Успехов в ваших начинаниях
Ресурсы, которые помогли мне в работе:
www.samba.org
www.squid-cache.org
www.sysadmins.ru
www.google.com
документация в комплекте с исходными кодами.
С уважением NoFate.