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.
C файлом конфигурации разобрались теперь надо выполнить команду#
# 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 // индексация базы
с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 обратите внимание на то чтобы были следующие расширения
Посмотреть их можно в файле /usr/local/etc/php/extensions.iniextension=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
Phpldapadmin по умолчанию ставиться в /usr/local/www/phpldapadmin
Заходим в /usr/local/www/phpldapadmin/config/
Открываем файл config.php. Нам нужно добавить две строчки в раздел Define your LDAP servers in this section
Если все нормально то переходим http://ip_yours_web_server/phpldapadmin/*********************************************/
/* 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');
Должен открыться лдап админ (подробнее читайте в мануале)
Обязательно добавляем 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
