Автор Тема: Авторизация через openldap  (Прочитано 20078 раз)

Serko

  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
Авторизация через openldap
« : 19 Июль 2012, 13:32:34 »
Здравствуйте! Хочу сделать авторизацию прокси (squid) и lda (dovecot) через openldap. Меня интересует вопрос - когда пользователь будет авторизоваться на прокси (squid) - пароль будет передаваться браузером пользователя к прокси в открытом виде? Аналогично вопрос по dovecot.

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: Авторизация через openldap
« Ответ #1 : 20 Июль 2012, 09:11:54 »
Здравствуйте!
Если для аутентификации squid Вы используете хелпер squid_auth_ldap, то тип аутентификации будет basic, и, соответственно, пароль от браузера в squid будет передаваться закодированным в кодировке base64, предназначенной не для защиты, а для предотвращения потери данных (легко раскодируется, практически в открытом виде). Дело в том, что этот хелпер использует для проверки аутентификации LDAP-операцию simple_bind (простое подключение), для чего нужно предъявиль DN и пароль, пароль поэтому требуется в открытом виде. Можно ли организовать ssl-соединение от браузера до squid я точно не знаю, скорее всего нет. Есть еще другой хелпер digest_ldap_auth для типа аутентификации digest -- по идее пароль должен перед отправкой хэшироваться в MD5 и, следовательно, расхэшировать его обратно на стороне squid  не получится. Как в этом случае происходит аутентификация не совсем понятно -- man-страницы для этого хелпера нет, надо поизучать исходник хелпера.

По поводу dovecot -- если не настраивать ssl, пароль от клиента будет передаваться в открытом виде. ssl, как я помню, там настраивается.

Егор

Serko

  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
Re: Авторизация через openldap
« Ответ #2 : 18 Декабрь 2012, 23:44:43 »
Приветствую снова! Вобщем, наконец, дошли руки, и я сделал наконец-то авторизацию на squid в openldap.
Basic:
auth_param basic program /usr/sbin/squid_ldap_auth -b "dc=Intranet,dc=TKS" -u "uid" -D "cn=Administrator,dc=Intranet,dc=TKS" -w "123456" -v 3 -h mail.mydomain.com
По этой схеме в openldap пароли пользователей хранятся в любом виде: plain, md5, sha1, etc ...
Digest:
auth_param digest program /usr/sbin/digest_ldap_auth -b "dc=Intranet,dc=TKS" -A "userPassword" -F "uid=%s" -D "cn=Administrator,dc=Intranet,dc=TKS" -w "123456" -v 3 -h mail.mydomain.com
Вот тут уже интереснее: если пароль пользователя хранится в открытом виде (plaintext), то авторизация проходит успешно. Однако, существует вариант хранения пароля в sha1, тогда требуется непросто связка пользователь:пароль, а пользователь:$REALM:пароль. Вопрос - что такое $REALM? В каком поле его хранить? И надо ли его указывать при авторизации? Очень запутанно: потому что на примере http://wiki.squid-cache.org/KnowledgeBase/LdapBackedDigestAuthentication я остановился на второй операции:

2. Create a hash in one account to make a test. Run it from the shell.
REALM="Squid proxy-caching web server" HASH=`echo -n "usuario1:$REALM:password" | md5sum | cut -f1 -d' '` ldapmodify -x -D "uid=usuario1,dc=Intranet,dc=TKS" -w "temppass" << EOF
dn: uid=usuario1,ou=Users,dc=minharede,dc=lan
l: $REALM:$HASH
EOF

Ошибка:
ldapmodify: modify operation type is missing at line 2, entry "uid=usuario1,dc=Intranet,dc=TKS"

Сразу ещё спрошу про логи - куда пишет slapd? Только в /var/log/messages? Или ещё куда-то? Openldap стоит на SLES 11.

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: Авторизация через openldap
« Ответ #3 : 20 Декабрь 2012, 03:51:34 »
Здравствуйте!
В приведённой Вами статье рассматривается оригинальный подход, хотя, как я понял из изучения дефолтного squid.conf, этот подход стандартен для всех механизмов digest-аутентификации, просто вместо линейного текстового файла в качестве хранилища используется LDAP-каталог. Суть в том, что вместо сочетания username:password используется сочетание username:REALM:password, где REALM — некая область действия аутентификации. В случае использования в качестве хранилища каталога LDAP предполагается, что usename будет храниться как значение одного атрибута (задаётся опцией -u хелпера digest_ldap_auth, чаще всего uid), а пара REALM:password — как значение другого атрибута (задаётся опцией -A хелпера digest_ldap_auth, в статье предлагается использовать атрибут l, но можно, конечно, и любой другой). Таким образом, для digest-аутентификации squid предлагается хранить отдельно REALM+хэшированный пароль для squid и отдельно хэшированный пароль общего назначения (userPassword).

Я попробовал — получилось =). В примере имя пользователя — egor, REALM — Squid scope, пароль — 123.
Сначала задаём переменные:
# REALM="Squid scope" HASH=`echo -n "egor:$REALM:123" | md5sum | cut -f1 -d' '`

# echo $REALM:$HASH
Squid scope:117f484dc66f4dc07bdcfb97d359c119

Меняем запись в LDAP:
#ldapmodify -x -D "cn=manager,ou=System,dc=mycompany,dc=ru" -W << EOF
> dn: uid=egor,ou=Users,dc=mycompany,dc=ru
> changetype: modify
> add: l
> l: $REALM:$HASH
> EOF
Enter LDAP Password:
modifying entry "uid=egor,ou=Users,dc=mycompany,dc=ru"

В статье не совсем верный LDIF, поэтому у Вас и не получилась модификация. Посмотрим, что получилось:
# ldapsearch -x -LLL -b 'ou=Users,dc=mycompany,dc=ru' '(uid=egor)' l
dn: uid=egor,ou=Users,dc=mycompany,dc=ru
l: Squid scope:117f484dc66f4dc07bdcfb97d359c119

Протестируем digest_ldap_auth:
# echo '"egor":"Squid scope"' | /usr/lib/squid3/digest_ldap_auth -b "ou=Users,dc=mycompany,dc=ru" -u "uid" -A "l" -e -v 3 -d
Connected OK
searchbase 'uid=egor, ou=Users,dc=mycompany,dc=ru'
password: 117f484dc66f4dc07bdcfb97d359c119
117f484dc66f4dc07bdcfb97d359c119

Работает =). Теперь внесём изменения в squid.conf:

auth_param digest program /usr/lib/squid3/digest_ldap_auth -b "ou=Users,dc=mycompany,dc=ru" -u "uid" -A "l" -e -v 3
auth_param digest realm Squid scope
auth_param digest children 5

acl VALID_USERS proxy_auth REQUIRED
http_access allow VALID_USERS
http_access deny all

После перезапуска squid и настройки браузера на прокси, он пускает меня с логином egor и паролем 123.

По поводу логов openldap почитайте здесь: http://pro-ldap.ru/tr/zytrax/ch6/#logfile – куда, а самое главное, что можно выводить.

Егор