Страница 1 из 1

squid + ldap

Добавлено: 07 апр 2008, 12:58
flash
Задачи
1. Сделать авторизацию на прокси сервере squid через opeopenldap.
2. Получать статистику по пользователям

Решение
Я буду использовать squid 2.6.18 openldap-server-2.3.41 и sarg для генерации отчетов за день, неделю, месяц. Строить все это будем под freebsd 6.3 stable

Приступим
Начинаем разумеется с установки операционной системы, но здесь я останавливаться не буду ставим на свой вкус доменное имя будет example.ru
Ставим из портов openldap-server-2.3.41 (он ставиться вместе с клиентом)
cd /usr/ports/net/openldap23-server/
make
Далее правим конфиг
Включам следующие опции (неуказанные отключаем)
[X] BDB With BerkeleyDB support
[X] DYNGROUP With Dynamic Group overlay
[X] DYNLIST With Dynamic List overlay
[X] RETCODE With Return Code testing overlay
[X] SLURPD Build slurpd replication daemon

make install
Далее переходим в директорию /usr/local/etc/openldap открываем файл slap.conf.
#
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
# Здесь подключаем нужные нам схемы
include /usr/local/etc/openldap/schema/core.schema
include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/inetorgperson.schema
include /usr/local/etc/openldap/schema/nis.schema
# Define global ACLs to disable default read access.

# Do not enable referrals until AFTER you have a working directory
# service AND an understanding of referrals.
#referral ldap://root.openldap.org
#Вводим нужные переменные
pidfile /var/run/openldap/slapd.pid // где будет храниться pid
argsfile /var/run/openldap/slapd.args // где будут храниться перемепнные

# Load dynamic backend modules:
# Подключаем модули баз данных где у нас будет храниться инфа о
# пользователях
modulepath /usr/local/libexec/openldap
moduleload back_bdb // исполдьзуем Беркли базу данных
# moduleload back_ldap
# moduleload back_ldbm
# moduleload back_passwd
# moduleload back_shell

# Sample security restrictions
# Require integrity protection (prevent hijacking)
# Require 112-bit (3DES or better) encryption for updates
# Require 63-bit encryption for simple bind
# security ssf=1 update_ssf=112 simple_bind=64
# Sample access control policy:
# Root DSE: allow anyone to read it
# Subschema (sub)entry DSE: allow anyone to read it
# Other DSEs:
# Allow self write access
# Allow authenticated users read access
# Allow anonymous users to authenticate
# Directives needed to implement policy:
#access to dn.base="" by * read
#access to dn.base="cn=Subschema" by * read
#access to *
# by self write
# by users read
# by anonymous auth
# by * read
# Задаем правы доступа к объектам (определенные поддеревья (ou, group
# …), атрибуты (userPassword, cn, gid, uid…) )
access to attrs=userPassword // доступ к полю пароль
by self write // зарегистрированный пользователь может править свою
// запись
by anonymous auth // анонимного просим назвать себя иначе «в сад»
by dn.base="cn=admin,dc=example,dc=ru" write // админ имеет доступ на
// запись
by dn.base="cn=proxy,ou=users,dc=example,dc=ru " read // пользователь
// proxy может читать это поле
by * none // остальные в сад

access to dn.subtree="ou=users,dc=example,dc=ru" // доступ к поддереву users
by self write
by dn.base="cn=admin,dc=example,dc=ru" write
by dn.base="cn=proxy,ou=users,dc=example,dc=ru " read
by * read

access to *
by self write
by anonymous auth
by dn.base="cn=admin,dc=example,dc=ru" write
by * none
#Итак анонимный пользователь может видеть ou users кроме поля
#userPassword но не может видеть корня

# if no access controls are present, the default policy
# allows anyone and everyone to read anything but restricts
# updates to rootdn. (e.g., "access to * by * read")
#
# rootdn can always read and write EVERYTHING!

#######################################################################
# BDB database definitions
#######################################################################

database bdb // указываем тип базы данных
suffix "dc=example,dc=ru" // указываем имя доменного корня
rootdn "cn=admin,dc=example,dc=ru" // указываем владельца базы
# Cleartext passwords, especially for the rootdn, should
# be avoid. See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
rootpw secret // указываем пароль владельца базы
# The database directory MUST exist prior to running slapd AND
# should only be accessible by the slapd and slap tools.
# Mode 700 recommended.
directory /var/db/openldap-data // место хранения базы
# Indices to maintain
index objectClass,uid,uidNumber,gidNumber eq // индексация базы
index cn,mail,surname,givenname eq,subinitial // индексация базы
C файлом конфигурации разобрались теперь надо выполнить команду
сp /usr/local/etc/openldap/DB_CONFIG.example /var/db/openldap-data/DB_CONFIG
Далее открываем файл /etc/rc.conf и добавляем туда следующую строку
slapd_enable="YES"
И запускаем лдап
/usr/local/etc/rc.d/slapd start
sockstat | grep slapd

Если получили что-то в этом роде
ldap slapd 77986 3 dgram -> /var/run/logpriv
ldap slapd 77986 6 tcp6 *:389 *:*
ldap slapd 77986 7 tcp4 *:389 *:*
то все хорошо но проверить не мешает
ldapsearch -h 127.0.0.1 | less
ответ должен быть примерно таким
# extended LDIF
#
# LDAPv3 // обратите на это внимание это важно для работы сквид
# base <> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# example.ru
dn: dc=example,dc=ru
objectClass: top
objectClass: dcObject
objectClass: organization
dc: example
o: example.ru
Если этот ответ мы получили то у нас все ок
Теперь для удобства того, кто будет добавлять пользователей ставим веб-сервер апач, PHP5 + extentions и phpldapadmin из портов
Все ставиться довольно просто, но хочу сразу обратить ваше внимание на то что при установке расширений php обратите внимание на то чтобы были следующие расширения
extension=mysql.so
extension=ctype.so
extension=dba.so
extension=dbase.so
extension=dom.so
extension=iconv.so
extension=pcre.so
extension=zlib.so
extension=pdo.so
extension=posix.so
extension=session.so
extension=simplexml.so
extension=sqlite.so
extension=tokenizer.so
extension=xml.so
extension=xmlreader.so
extension=xmlwriter.so
extension=gettext.so
extension=ldap.so
extension=openssl.so
extension=bz2.so
extension=calendar.so
extension=exif.so
extension=fileinfo.so
extension=filepro.so
extension=fribidi.so
extension=ftp.so
extension=gd.so
extension=mcrypt.so
extension=mhash.so
extension=ming.so
extension=mysqli.so
extension=readline.so
extension=recode.so
extension=sockets.so
extension=sybase_ct.so
extension=sysvmsg.so
extension=sysvsem.so
extension=sysvshm.so
extension=zip.so
Посмотреть их можно в файле /usr/local/etc/php/extensions.ini

Phpldapadmin по умолчанию ставиться в /usr/local/www/phpldapadmin
Заходим в /usr/local/www/phpldapadmin/config/
Открываем файл config.php. Нам нужно добавить две строчки в раздел Define your LDAP servers in this section

/*********************************************/
/* Define your LDAP servers in this section */
/*********************************************/

$i=0;
$ldapservers = new LDAPServers;

$ldapservers->SetValue($i,'server','name','FSK-EES LDAP SERVER');

$ldapservers->SetValue($i,'server','host','127.0.0.1'); // это в случае
// Если ваш лдапсервер находиться на той же машине что и phpldapadmin
// Если нет то надо указать ip адрес сервера
$ldapservers->SetValue($i,'server','port','389');
/* The port your LDAP server listens on (no quotes). 389 is standard. */
// $ldapservers->SetValue($i,'server','port','389');
Если все нормально то переходим http://ip_yours_web_server/phpldapadmin
Должен открыться лдап админ (подробнее читайте в мануале)
Обязательно добавляем ou users туда добавляем группу users и заводим туда пользователя Proxy которому дали права чтения на поле userPassword

Теперь ставим сквид из портов
cd /usr/ports/www/squid26/
make
[X] SQUID_LDAP_AUTH Install LDAP authentication helpers
[X] SQUID_CARP Enable CARP support
[X] SQUID_PINGER Install the icmp helper
[X] SQUID_DNS_HELPER Use the old 'dnsserver' helper
[X] SQUID_WCCP Enable Web Cache Coordination Prot. v1
[X] SQUID_IDENT Enable ident (RFC 931) lookups
[X] SQUID_PF Enable transparent proxying with PF
[X] SQUID_KQUEUE Use kqueue(2) instead of poll(2)
[X] SQUID_LARGEFILE Support log and cache files >2GB
Далее настраиваем как обычно за одним исключением.
cd /usr/local/etc/squid/
vi squid.conf
auth_param basic program /usr/local/libexec/squid/squid_ldap_auth -P -v 3 -b "ou=users,dc=example,dc=ru" -D "cn=proxy,ou=users,dc=example,dc=ru" -w "proxyuserpass" -u cn -h 127.0.0.1
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
Теперь о строчке
auth_param basic program /usr/local/libexec/squid/squid_ldap_auth подробнее
-Р говорит о том что порт не надо закрывать (ставьте если много пользователей)
-v 3 версия протокола
-b откуда начинать поиск
-D под каким пользователем просматривать записи лдап чтобы получить доступ к полю userPassword
-w пароль пользователя которого мы указали опцией –D
-u cn какой атрибут рассматривать как логин (если не cn то –f “attr” подробнее смотри ман)
-h хост где расположен у нас лдап сервер

Далее добавляем
acl mynet src 192.168.0.0/24
acl ldap proxy_auth mynet
acl ldap proxy_auth REQUIRED

http_access allow ldap
Вот собственно и все остальное методом проб и ошибок, могу сказать, что у меня все работает, если у вас что-то не так пишите в эту тему посмотрим