Squid и LDAP-аутентификация из Active Directory
Сегодня возникла необходимость аутентифицировать пользователей на прокси. Поскольку все они уже имеют учётные записи в ActiveDirectory, то было решено брать информацию оттуда.
Сразу оговорюсь, строил basic аутентификацию, т.к. посмотрев на танцы с бубнами вокруг ntlm-authentication & kerberos & AD, решил что овчинка не стоит выделки.
Подобную схему аутентификации при минимальных переделках можно применить к любому дереву каталогов, например к Novell eDirectory или Netscape Directory Server...
В системе должены быть установлены библиотеки openldap для последующей сборки squid.
Сам squid должен быть собран с поддержкой basic аутентификации и внешних групп в LDAP. Ключи для конфигурации при ручной сборке:
... --enable-basic-auth-helpers=LDAP --enable-external-acl-helpers=ldap_group ...
Наш домен в Active Directory называеться domain.com.
Для начала заведём в дерево несколько групп, пользователи которых могут ходить в интернет. Почему несколько — вхождение в ту или иную группу определяет delay pool в squid. Скажем inet_64k, inet_128k и inet_1024k. Для отладки делаем тестового пользователя test_inet c паролем 123456, и включаем его в группу inet_64k.
Для работы с каталогом нам необходим пользователь, в нём зарегистрированный и умеющий читать оттуда хэши с паролями. Применительнительно к Active Directory нам нужен обыкновенный юзер без особых привилегий
. В Novell eDirectory или Netscape Directory такая шутка уже не прокатит и пользователю нужно будет присвоить некие привилегии для чтения паролей. Обозвём этого пользователя для примера squidreader.
Теперь проверяем на доступность каталога под вышеуказанным пользователем.
ldapsearch -D "squidreader@domain.com" -x -W -b "dc=domain,dc=com" -h 192.168.1.1
В результате выпольнения команды мы должны получить содержимое нашего АД.
Маленькое отступление. Для соединения с каталогом мы должны указать Distinguished Name, под которым мы его будем читать. Так вот, в отличии от нормальных LDAP каталогов, DN в Microsoft Active Directory мы можем извратиться, указав его как «squidreader@domain.com», либо же указать в нормальном виде как «cn=squidreader,dc=domain,dc=com».
Дальше проверяем работу работу компонентов squid. Создаём файл с паролем к учётной записи, которой мы читаем, к примеру он будет /usr/local/etc/squid/adpw.txt.
Сначала проверяем группы.
/usr/local/libexec/squid/squid_ldap_group -R -b "dc=domain,dc=com" -f \ "(&(sAMAccountName=%v)(memberOf=cn=%a,dc=domain,dc=com))" -D squidreader@domain.com -W \ /usr/local/etc/squid/adpw.txt 192.168.1.1
В качестве запроса вводим строку в формате:
имя_пользователя группа_пользователя
Ответом будет либо «ОК», либо «ERR». В нашем случае это будет «test_inet inet_64k».
Естессно, что если у нас всё правильно работает, то ответ будет «ОК».
Дальше проверяем аутентификацию.
/usr/local/libexec/squid/squid_ldap_auth -R -D squidreader@domain.com -W \ /usr/local/etc/squid/adpw.txt -b "dc=domain,dc=com" -f "sAMAccountName=%s" \ 192.168.1.1
В качестве запроса вводим строку в формате:
имя_пользователя пароль
Ответы такие же как и в прошлом случае. Вводим «test_inet 123456» и ждём ответа «ОК»
.
Теперь конфигурим сам squid.
Аутентификатор:
auth_param basic program /usr/local/libexec/squid/squid_ldap_auth -R -D \ squidreader@domain.com -W /usr/local/etc/squid/adpw.txt -b "dc=domain,dc=com" -f \ "sAMAccountName=%s" 192.168.1.1
Внешняя группа:
external_acl_type ldap_users %LOGIN /usr/local/libexec/squid/squid_ldap_group -R -b \ "dc=domain,dc=com" -f "(&(cn=%v)(memberOf=cn=%a,dc=domain,dc=com \ ))" -D squidreader@domain.com -W /usr/local/etc/squid/adpw.txt 192.168.1.1
Параметр %LOGIN в описании внешней группы указывает на то, перед проверкой на вхождение в эту группу, пользователя необходимо аутентифицировать.
Описание ACL:
acl ad64 external ldap_users inet_64k acl ad128 external ldap_users inet_128k acl ad1024 external ldap_users inet_1024k
Ну и последние штрихи — разрешаем данным ACL ходить в интернет и добавляем их в delay pool.
... http_access allow ad128 ... delay_class 3 1 delay_access 3 allow ad128 delay_access 3 deny all ...
Популярность: 51%
Похожие заметки
Aутентификация Squid+Kerberos c LDAP авторизацией в Active DirectorySquid: привязка имени пользователя к IP
Аутентификация в Apache из LDAP
ADSL и мнимые проблемы с Path MTU Discovery
Избитая тема. IPSec между Cisco и D-Link
P.S.
Попробуйте аппарат космодиск, если вас замучила межпозвоночная грыжа поясничного отдела.Круги по бетону
Roman Shramko