проверьте права доступа ldap с помощью python - PullRequest
2 голосов
/ 19 ноября 2010

Я пишу веб-интерфейс (django) для сервера LDAP. Существуют разные типы людей с разными типами привилегий, поэтому я настроил LDAP ACL, чтобы контролировать, кто может видеть или редактировать определенный атрибут. Теперь легко определить, имеет ли конкретный пользователь доступ для чтения - попробуйте прочитать, и вы увидите, что получите. Но я не вижу элегантного способа различить права на чтение и запись до . Я на самом деле пытаюсь записать некоторые изменения. То есть я хотел бы прояснить в интерфейсе, если вошедший в систему пользователь имеет права на запись или может только читать. Так что пользователи не будут пытаться редактировать атрибут, который они не могут.

Единственное, что мне пришло в голову, - это попытаться временно записать в атрибут какой-то манекен и посмотреть, было ли это успешным. Если это так, исходное значение будет восстановлено, и я знаю, что у этого пользователя есть права на запись. Затем я могу отобразить этот атрибут как редактируемый. Проблема заключается в том, что если сервер аварийно завершает работу после того, как фиктивная запись была написана и до восстановления исходного значения, у меня остаются пустые значения на моем сервере LDAP.

Мне нужен какой-то способ запроса ACL, аналогично тому, как я могу запрашивать определения схемы. Но, может быть, это «запрещено» LDAP?

Есть идеи?

Isaac

Ответы [ 3 ]

0 голосов
/ 22 ноября 2010

Я думаю, что попробую "тестовый" подход, если он слишком медленный, возможно, с некоторым кэшированием.Причина, по которой я хочу сохранить определение ACL только на сервере ldap, заключается в том, что существуют другие способы взаимодействия с сервером (будут инструменты cli, а также стандартные инструменты ldap), поэтому я хотел бы сохранить все эти интерфейсыв синхронизации ACL, только с одним местом для определения ACL

0 голосов
/ 23 марта 2011

В OpenLDAP определения ACL находятся за пределами DIT.Если вы хотите получить доступ к ACL с помощью запроса ldap, вы можете использовать FedoraDS (сервер каталогов 389): http://directory.fedoraproject.org/wiki/Howto:AccessControl

Вы также можете увидеть OpenDS (https://www.opends.org)

)
0 голосов
/ 19 ноября 2010

ACL, на openldap организованы проверка OU и / или DN с помощью регулярного выражения

ex:

access to attrs=userPassword
    by anonymous auth
    by self write
    by dn.base="ou=users_with_userPassword_write_access,dc=myproduct,dc=org" write
    by dn.exact="cn=manager,dc=myproduct,dc=org" write
    by * none

access to *
    by dn.exact="cn=manager,dc=myproduct,dc=org" write
    by dn.base="ou=users_with_powerfull_write_access,dc=myproduct,dc=org" write
    by * none

Таким образом, в отношении dn зарегистрированного пользователя (whoami_s сpython-ldap), вы можете определить, есть ли у пользователя какие-либо права.Вам не нужно проверять, можете ли вы записать данные, внедрите функцию в своем приложении django, которая проверяет DN.

Может быть, вы говорите, что ACL генерируются динамически?


Что касается вашего комментария, если ваш ACL является статическим, чтобы знать ACL, проще всего реализовать средство python, которое реализует эти ACL.С моим предыдущим примером:

W_ACCESS_OU = "ou=users_with_powerfull_write_access,dc=myproduct,dc=org"
def check_write_access(user_dn):
    return is_dn_base(W_ACCESS_OU, user_dn)

На данный момент python-ldap не может получить списки ACL для slapd.conf ... И это не безопасно для анализа slapd.conf (потому что slapd.conf может быть«где-нибудь» в системе, и объявление ACL может быть сложным для анализа), также требуется много времени, чтобы попытаться записать данные на серверную часть LDAP.

Я знаю, что это не очень удовлетворительно.Другое решение состоит в том, чтобы использовать «пользователя службы».Только этот пользователь имеет доступ на запись в бэкэнд LDAP.

Это упрощает запись ACL:

access to *
    by dn.exact="cn=manager,dc=myproduct,dc=org" write
    by * none

Затем для обычных пользователей вы устанавливаете флаг авторизации.Ваше приложение проверяет флаг, когда зарегистрированный пользователь хочет что-то сделать.И если этот флаг в порядке, пользователь службы записывает данные в серверную часть.

Это стратегия, которую мы развертываем в одном из наших приложений.

В обоих случаях проверка ACL выполняетсянаше приложение, а не серверная часть ldap.

...