Примечание.
Это часть служебной документации, поэтому конкретные названия и IP-адреса заменены на нечто нейтральное.
Общие сведения
Прокси сервис (aurora.net.xaxa.firm:3128) собран на основе ОС FreeBSD 4.8-RELEASE и кэширующего прокси-сервера SQUID 2.5.STABLE4
Сборка прокси сервера производилась из исходников с опциями
"--prefix=/usr/local --sysconfdir=/usr/local/etc/squid --localestatedir=/var/log/squid --enable-ssl --enable-default-err-language=Russian-koi8-r --enable-external-acl-helpers=ldap_group"
Для данной конфигурации сборки прокси-сервера, необходимы библиотеки и заголовки пакета OpenLDAP. Легче всего их получить - поставить пакет OpenLDAP.
Так же необходимо установить модуль Net::LDAP, реализующий API LDAP-сервисов для PERL.
Аутентификация пользователей прокси-сервера опирается на учетные записи пользователей NDS "O=PPPP", пользовательские бюджеты прокси-сервер определяет относительно принадлежности пользователя NDS к той или иной группе NDS .
Итак, схема работы сервиса: пользователь, желающий получить доступ к ресурсам Internet, должен подтвердить право обращения к ресурсам вообще, а затем proxy-server, опираясь на его (пользователя) учетные данные в NDS "определяет" пространство ресурсов доступное пользователю.
Обмен информацией между NDS и Squid proxy сервером происходит посредством Novel LDAP service со стороны Novell DS и "внешними помощниками" (external helpers) /usr/local/etc/squid/utils/ldap_auth.pl и /usr/local/etc/squid/utils/ldap_group.pl со стороны proxy-сервера
ldap_auth.pl осуществляет аутентификацию пользователя, ldap_group.pl предоставляет информацию о принадлежности пользователя NDS к интересующей группе.
NDS
Для разграничения прав пользователей прокси-сервера в дереве "O=PPPP" созданы группы
full_access.proxy.PPPP для полного доступа к ресурсам Internet
http_access.proxy.PPPP для доступа только по HTTP
ftp_access.proxy.PPPP для доступа только по FTP
https_access.proxy.PPPP для доступа только через SSL
allow_big_file.proxy.PPPP для этой группы разрешено "скачивание" файлов с большым объемом информации (*.mp3, *.zip, и т. д.) (работает только если пользователь ассоциирован с одной из групп доступа)
black_list.proxy.PPPP запрещает любой доступ! (для карательных целей)
Для определения нового правила доступа достаточно создать в дереве новую группу пользователей. (бюджет доступа этой группы к ресурсам Internet определяется в файле squid.conf). Рекомендую внутри OU=proxy.O=PPPP, хотя и в другом месте найдет
SQUID
Информация о настройке сервера лежит в файле /usr/local/etc/squid/squid.conf. Внутри файла достаточно подробно задокументированы основные опции настройки сервера, поэтому рассмотрим только те, которые имеют прямое отношение к нашей схеме.
...skip
auth_param basic program /usr/local/etc/squid/utils/ldap_auth.pl 172.aaa.bbb.ccc "O=PPPP"
...skip
Описание:
auth_param scheme parameter [settings]
этот тэг описывает внешнюю программу авторизации и ее опции, (IP адрес LDAP сервера и исходная точка поиска в дереве NDS) а также условия запуска программы.
Обмен данными между программой (это касается и программы ldap_group.pl) и сервером происходит через стандартный поток ввода/вывода. Сервер посылает в стандартный вывод имя и пароль, введенные пользователем при обращении к proxy, программа, соединяясь с LDAP-сервером проверяет пару login/password и в зависимости от результата выдает в стандартный вывод OK или ERR, На основе ответа программы proxy-server принимает решение имеет ли пользователь право пользования данным сервисом вообще.
Далее. Proxy-сервер SQUID поддерживает так называемые "внешние списки доступа" (external_acl_type). С помощью этой возможности, выясняем принадлежность пользователя к указаным группам
Описание тэга
external_acl_type name options FORMAT.. /path/to/helper [helper arguments]
В нашем случае дополнительные опции запуска программы взяты по умолчанию.
...skip
external_acl_type all_perm %LOGIN /usr/local/etc/squid/utils/ldap_group.pl proxy-all 172.aaa.bbb.ccc O=PPPP
external_acl_type full_access %LOGIN /usr/local/etc/squid/utils/ldap_group.pl full_access 172.aaa.bbb.ccc O=PPPP
external_acl_type allow_big_files %LOGIN /usr/local/etc/squid/utils/ldap_group.pl allow_big_files 172.aaa.bbb.ccc O=PPPP
external_acl_type http_perm_only %LOGIN /usr/local/etc/squid/utils/ldap_group.pl http_access 172.aaa.bbb.ccc O=PPPP
external_acl_type ftp_perm %LOGIN /usr/local/etc/squid/utils/ldap_group.pl ftp_access 172.aaa.bbb.ccc O=PPPP
external_acl_type https_perm %LOGIN /usr/local/etc/squid/utils/ldap_group.pl https_access 172.aaa.bbb.ccc O=PPPP
external_acl_type black_list %LOGIN /usr/local/etc/squid/utils/ldap_group.pl black_list 172.aaa.bbb.ccc O=PPPP
ФОРМАТ: ./ldap_group.pl <NDS-group> <LDAP-server> <basesearch>
<NDS-group> - интересующая нас группа издерева NDS
<LDAP-server> - IP адрес сервера
<basesearch> - исходная точка поиска в дереве каталогов
Шаблон %LOGIN получает имя пользователя, полученное в результате процедуры аутентификации (если она прошла успешно) . Программа ldap_group.pl работает аналогично программе аутентификации - получает пару user/group из стандартного ввода от прокси-сервера,"проверяет", посредством LDAP сервера пренадлежность пользователя к указанной группе NDS и выдает в стандартный вывод OK или ERR в зависимости от того пренадлежит ли пользователь к интересующей группе или нет соответственно.
Далее, непосредственно определяем списки
Описание тэга:
acl aclname acltype string1...
Определение списков доступа для групп
acl all 0.0.0.0/0.0.0.0
acl adv_users external all_perm
acl http_users external http_perm_only
acl ftp_users external ftp_perm
acl https_users external https_perm
acl big_files external allow_big_files
acl blacklist external black_list
Для аутентификации (для ВСЕХ без исключения)
acl password proxy_auth REQUIRED
Для URL
acl stopURLs url_regex "/usr/local/etc/squid/ACL.stoplist"
acl hackURLs url_regex "/usr/local/etc/squid/ACL.hackList"
acl stop_MS url_regex "/usr/local/etc/squid/ACL.stop_M$"
acl bigfiles urlpath_regex \.mp3$ \.avi$ \.swf$ \.zip$ \.rar$ \.mpeg$ \.mpg$ \.flash$ \.exe$
Списки методов и протоколов доступа.
acl CONNECT method CONNECT
acl FTP port 21
acl POST method POST
acl HTTP port 80 8000 8080 8001
acl SSL poer 443
Далее описываем правила доступа групп
http_access deny blacklist
http_access deny hackURLs
http_access allow adv_users password
http_access deny stopURLs
http_access deny stop_MS
http_access allow big_files password
http_access deny bigfiles
http_access deny POST
http_access allow https_users !FTP !HTTP password
http_access allow http_users !CONNECT !FTP password
http_access allow ftp_users !CONNECT !SSL !HTTP password
http_access deny all
ИТАК:
Если пользователь авторизовался (ldap_auth.pl ->OK), то proxy-сервер, с помошью программы ldap_group.pl, определяет пренадлежность пользователя к указанным группам (результат можно посмотреть tail -f /var/log/squid/logs/cache.log). Далее определяются списки групп пользователей и ресурсов. Аутентификация в данном случае требуется для ВСЕХ пользователей. Правила определены в данном случае следующим образом (приоритет правил действует согласно очередности, т.е. первое (самое верхнее правило) имеет приоритет над нижестоящим).
Если пользователь успешно прошел авторизацию и пренадлежит к одной или нескольким из указаных групп, то
Первое правило запрещает ЛЮБОЙ доступ для пользователей группы NDS black_list (список доступа blacklist) несмотря на то что пренадлежит ли к другим группам или нет,
второе - запрещает доступ к дискредитировавшим себя ресурсам, список берется из файла /usr/local/etc/squid/ACL_hackList (это определяется из описания списка для URS's)
далее - http_access allow adv_users password разрешает авторизованным (список password) пользователям списка adv_users доступ к ЛЮБЫМ ресурсам ЕСЛИ они успешно прошли первые два правила.
следующие два правила ограничивают доступ к нежелательным ресурсам /usr/local/etc/squid/ACL.stoplist и /usr/local/etc/squid/ACL.stop_M$ (список URL stopURLs и stop_MS)
затем разрешается доступ пользователей группы NDS allow_big_files, (список big_files)
следующее правило ( http_access deny bigfiles) запрещает ВСЕМ остальным пользователям к файлам с большим объемом информации (*.mp3, *.flash... и т.д из списка bigfiles)
Запрещаем метод POST,
разрешаем доступ группы NDS https_perm через SSL исключаем FTP и HTTP (список доступа https_users)
разрешаем пользователям группы NDS http_perm поступ к Веб-ресурсам по HTTP исключаем метод CONNECT и протокол FTP (список http_users)
ftp_perm группа получает доступ по FTP, исключая метод CONNECT доступ ч-з SSL и HTTP (список доступа ftp_users)
ВСЕ пользователи групп должны пройти процедуру аутентификации!
последнее правило запрещает анонимный вход.
Как добавить/убрать/изменить бюджет пользователя
Для имеющихся групп NDS все просто: для разрешения доступа пользователю, добавляем его в соответствующую группу(ы), для запрещения - удаляем из групп OU=proxy либо добавляем его в black_list.proxy.PPPP.
Если нам понадобилось создать новую группу доступа, то мы ее сначала создаем в дереве NDS. Затем мы описываем эту группу и условия доступа ее пользователей в squid.conf.
НАПРИМЕР:
Нам необходимо создать группу, членам которй разрешен доступ только к огранниченному списку ресурсов интернет. Так же нам желательно что бы эти пользователи не имели доступ к различным внешним архивам свободного доступа, ограничить мультимедийный трафик, запретить "скачивать" исполняемые файлы Windows, DOS,OS/2 и пользовали только метод GET
NDS
Создаем группу в дереве NDS для определенности limit_access.proxy.PPPP
Добавляем в группу пользователей
Файл настроек сервера squid.conf
создаем список сайтов, к которому мы планируем разрешить доступ новой группе. Для ороеделенности размещаем его /usr/local/etc/squid/ACL.validList
Для того чтобы выделить пользователей этой группы определяем класс пользователей
external_acl_type limitAccess %LOGIN /usr/local/etc/squid/utils/ldap_group.pl limit_access 172.aaa.bbb.ccc O=PPPP
далее, описываем список доступа limitAccess
acl limitAccess external limit_access
затем определяем список сайтов , разрешенных к доступу validList
acl validList url_regex "/usr/local/etc/squid/ACL.validList
после правил нашей конфигурации
http_access deny bigfiles
http_access deny POST
определяем правило доступа
http_access allow limitAccess !CONNECT validList password
Важно:
Следует учитывать такую вещь как репликация между серверами NDS. LDAP тоже не мнгновенно получает новую информацию от NDS
Доступ:
Доступ через SSH
Назначения внешних списков:
файлы конфигурации находятся /usr/local/etc/squid
ACL.hackList - список ресурсов, нежелательных для посещения пользователей
ACL.limitlist - список сайтов, разрешенных для посещения в рабочее время
ACL.stop_M$ - запрещение несанкционированного обновления программного обеспечения майкрософт
ACL.stoplist - список сайтов, запрещенных для посещения в любое время
Изменения внешних списков:
Добавление: записываем в конец соответствующего файла с новой строки фрагмент сайта БЕЗ звездочек и прочих шаблонов. Например требуется запретить пользователям посещать сайт
www.coolhackers.org
в файле
/usr/local/etc/squid/ACL.hackList
добавляем запись в конец, с новой строки
coolhackers
сохраняем, перезапускаем squid
# squid -k reconfigure
теперь пользователи не смогут попасть на сайты в имени которых встречается последовательность символов coolhackers
Удаление – путем удаления соответствующей строки из файла ACL.*
При отказах в работе NDS:
В случае отказа работы NDS надолго, для доступа в интернет пользователей следует проделать след. процедуру
Остановить сквид
#squid -k shutdown
затем запустить, указав другой конфигурационный файл
#squid -f /usr/local/etc/squid/squid.conf.resque
В этом случае доступ открыт для ВСЕХ пользователей корпоративной сети
После восстановления работоспособности NDS вернуть все обратно
#squid -k shutdown
#/usr/local/etc/rc.d/squid.sh start
От себя добавлю, что:
1. не должно быть пользователей с одинаковыми именами, хотя бы и в разных контекстах
2. кстати, не проверялось на русских именах пользователей, у нас их нет
3. пароль пользователя не д.б. русским
4. кол-во соединений у юзеров д.б. больше на 1, чем ранее,т.к. при идентификации в инете используется 1 соединение
5. если у юзера истек срок пароля, то прокси его тоже не пустит, но не объяснит почему.