LINUX.ORG.RU
ФорумAdmin

apache + ldap, фильтр

 ,


0

2

Всем доброго времени суток :)

Структура:

ou=people,dc=example,dc=ru - люди
ou=groups,dc=example,dc=ru - группы
ou=access,dc=example,dc=ru - уровни доступа

Для групп без проблем сделал:

AuthLDAPURL "ldap://127.0.0.1/ou=people,dc=example,dc=ru"
Require ldap-group cn=company,ou=groups,dc=example,dc=ru
Require ldap-group cn=outsource,ou=groups,dc=example,dc=ru

Но не получается сделать вот что:

dn: cn=user.project,ou=access,dc=example,dc=ru
objectClass: access
sn: user -> project.example.ru
domain: project
uid: user
cn: user.project

Нужно проверять, возвращает ли что-то ldap по запросу domain=project для авторизовавшегося юзера.

Вообще это для того, чтобы ограничить доступ к виртуалхостам.

Как с этим разберусь, нужно будет сделать подобное для svn (через mod_svn_dav, там же в виртуалхосте Location /svn), только нужно будет проверять domain=project&developers=yes

Но это я сам смогу сделать, думаю, если подскажете с предыдущим

Заранее спасибо за помощь!

Немного уточнений: Юзерам из группы cn=company,ou=groups,dc=example,dc=ru можно везде и всё. А вот user в группе cn=outsource,ou=groups,dc=example,dc=ru - у них ограниченный доступ к виртуалхостам.

no_Bra1n
() автор топика

Извиняюсь за флуд.

Если бы всё было в пределах одной ветки, то без проблем, но тут юзеры в одной и записи уровней доступа в другой и как-то нужно между ними настроить связь.

По вышеуказанной информации можно понять примерно структуру моего дерева, но если требуется, могу написать подробнее.

no_Bra1n
() автор топика

Нужно проверять, возвращает ли что-то ldap по запросу domain=project для авторизовавшегося юзера.

Зачем это? Чем это отличается от группы?

zgen ★★★★★
()
Ответ на: комментарий от zgen

Зачем это? Чем это отличается от группы?

Ну потому что в access могут быть несколько записей по одному и тому же юзеру, только проекты отличаться могут и уровни доступа.

Группы company, clients, outsource. Сервисы apache, svn, ftp, ssh.

Если в access есть запись юзера, то к проекту даётся доступ apache (чтобы можно было открыть сайт, обычно для клиентов).

Если есть developers=yes, то даётся доступ к проекту по svn и ftp - это аутсорсерам. Конкретно к этому проекту, а не ко всех.

Ну и ssh=yes - отдельно доступ в консоль. По группам не получится, т.к. доступ будет даваться ко всем проектам скопом, а нужно ограничивать вывод проектов в svn и т.д.

no_Bra1n
() автор топика
Ответ на: комментарий от no_Bra1n

Ну потому что в access могут быть несколько записей по одному и тому же юзеру

Добавь пользователя в несколько групп.

zgen ★★★★★
()
Ответ на: комментарий от zgen

Возможно вы не до конца поняли суть вопроса.

Вот пример:

Вася Пупкин - клиент Петя Иванов - дизайнер-аутсорсер Федор Сумкин - программист-аутсорсер Нубокодер - программист-аутсорсер

radio.example.com music.example.com test.example.com

Все проекты, кроме test.example.com Васи Пупкина (2 записи в access на каждый проект), он может их открыть в браузере.

test.example.com - проект компании, над которым трудится Нубокодер - у него developers=yes и project: test

Федор Сумкин делает radio.example.com и music.example.com у него 2 записи access с developers:yes и project: radio, project: music

Петя Иванов дизайнить все три проекта, имеет 3 записи access и developers=yes

И при такой структуре, в svn каждый увидит только то, к чему имеет доступ. Ну и открыть по http сможет только то, какой проект у него.

Я осветил клиентов и аутсорсеров, сотрудники компании имеют имеют доступ везде.

Если я не понял, что вы хотели донести - пожалуйста, опишите подробнее.

Спасибо!

no_Bra1n
() автор топика
Ответ на: комментарий от no_Bra1n

В общем - понятно.

Непонятно только,

1) почему вверху речь про апач, а внизу про svn.
2) Почему не юзаем svnauthz
http://stackoverflow.com/questions/2728021/how-to-allow-unamed-user-in-svn-au...

Где можно указать что угодно и как угодно, а apache'у оставить проверять, действительно ли этот пользователь и знает ли он свой пароль.

zgen ★★★★★
()
Ответ на: комментарий от zgen

Про svn - это вторая часть. Понятное дело через svnauthz. Можно прочитать первое сообщение, не читая остальные и попробовать помочь по новой :)

no_Bra1n
() автор топика
Ответ на: комментарий от no_Bra1n

svn доступ будет тоже через apache и ldap-шаблон доступа примерно одинаковые, разве что помимо project: название нужно будет иметь developers: yes

Как вы уже, наверное, поняли - это структура для разработки сайтов.

no_Bra1n
() автор топика
Ответ на: комментарий от zgen

ну это фильтры внутри ou=people,dc=example,dc=ru (ldap://127.0.0.1/ou=people,dc=example,dc=ru), а у нас же проверять по фильтру нужно в другом дереве, ou=access,dc=example,dc=ru

мимими

no_Bra1n
() автор топика
Ответ на: комментарий от no_Bra1n

Фильтры будут внутри того, внутри чего напишите. Проверяйте, будут ли обрабатываться ссылки или накладывайте rwm.

zgen ★★★★★
()
Ответ на: комментарий от zgen

Я думал (а может так и есть, вечером на практике опробую), что он ищет юзеров тут ldap://127.0.0.1/ou=people,dc=example,dc=ru где указываешь. Надеюсь, что я правильно «обновил» свои знания и после адреса, где ldap, не обязательно указывать дерево с юзерами, а другое, ну или и его, и ещё что-то.

rwm - крутая штука, спасибо :)

Да и в общем спасибо за помощь, zgen!

no_Bra1n
() автор топика
Ответ на: комментарий от no_Bra1n

не обязательно указывать дерево с юзерами

Можно указывать что угодно (dc=example,dc=ru или просто dc=ru), только изменить тип запроса с base,one на sub. Однако следует учесть, что если у вас дублируются данные, то по фильтру может вернуться более одного результата.

zgen ★★★★★
()
Ответ на: комментарий от zgen

Принял! В access записи на юзер.проект уникальны, да даже если и несколько вдруг, значит 100% доступ есть :)

no_Bra1n
() автор топика
18 мая 2012 г.
Ответ на: комментарий от zgen
# ldapsearch -x -b 'ou=access,dc=example,dc=ru' '(|(domain=radio.example.ru)(domain=*))'
# extended LDIF
#
# LDAPv3
# base <ou=access,dc=example,dc=ru> with scope subtree
# filter: (|(domain=radio.example.ru)(domain=*))
# requesting: ALL
#

# radio@radio.example.ru, access, example.ru
dn: cn=radio@radio.example.ru,ou=access,dc=example,dc=ru
objectClass: top
objectClass: access
cn: radio@radio.example.ru
uid: radio
domain: radio.example.ru

# anton@example.ru, access, example.ru
dn: cn=anton@example.ru,ou=access,dc=example,dc=ru
objectClass: top
objectClass: access
cn: anton@example.ru
uid: anton
domain: *

# search result
search: 2
result: 0 Success
<Location />
	AuthType basic
	AuthName "LDAP"
	AuthBasicProvider ldap
	AuthLDAPURL "ldap://127.0.0.1/ou=access,dc=example,dc=ru?uid??(|(domain=radio.example.ru)(domain=*))"
	Require valid-user
</Location>

Не работает собака сутулая!

no_Bra1n
() автор топика
Ответ на: комментарий от no_Bra1n

Ерунда же написана.

Ты заставляешь авторизоваться по URL, хотя password в записях нет. К тому же, как я и говорил - возвращаются 2 записи.

zgen ★★★★★
()
Ответ на: комментарий от zgen

хотя password в записях нет.

Вкурил, значит в любом случае надо на ou=people указывать, где есть пароль.

К тому же, как я и говорил - возвращаются 2 записи

Неправильно понял. Я думал он по uid сам фильтрует изначально, тогда выведется всего одна.

Чтобы не хранить пароли в десяти местах, мне придется использовать rwm, верно?

no_Bra1n
() автор топика
Ответ на: комментарий от no_Bra1n

Или же всё таки получится с sub и сложным фильтром, чтобы он работал ещё и с access?

no_Bra1n
() автор топика
Ответ на: комментарий от no_Bra1n

Чтобы не хранить пароли в десяти местах, мне придется использовать rwm, верно?

Чтобы по запросу, который вы не можете изменить, возвращались данные, которые вы хотите, придется использовать rwm.

Как именно использовать? У меня нет готового решения, поэтому вам нужно сеть и начать курить доки.

zgen ★★★★★
()
Ответ на: комментарий от zgen

Спасибо! Буду внедрять rwm и курить доки :)

no_Bra1n
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.