用python检查ldap访问权限

时间:2010-11-19 11:29:52

标签: python ldap acl

我正在为LDAP服务器编写Web前端(django)。有不同种类的人具有不同类型的权限,因此我设置LDAP ACL来控制谁可以查看或编辑特定属性。 现在很容易确定特定用户是否具有读取权限 - 尝试阅读,您将看到所获得的内容。 但我没有看到一种优雅的方式来区分读取和写入访问之前我实际上尝试编写一些更改。也就是说,我想在界面中说清楚,如果登录用户具有写访问权限,或者只能读取。这样用户就不会尝试编辑他们不能的属性。

我唯一想到的是尝试暂时将某种虚拟内容写入属性,看看是否成功。如果是这样,原始值将被恢复,我知道该用户具有写访问权限。然后我可以将此属性显示为可编辑。 这样做的问题是,如果服务器在写入虚拟对象之后和原始值恢复之前崩溃,我的LDAP服务器中会留下虚拟值。

我需要的是一种查询ACL的方法,其方式类似于我可以查询模式定义。但也许LDAP被“禁止”了?

有什么想法吗?

艾萨克

3 个答案:

答案 0 :(得分:0)

openldap上的ACL由OU组织和/或使用regexp进行DN检查

前:

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(使用python-ldap whoami_s),您可以确定用户是否拥有某些权限。您无需测试是否可以编写数据,在django应用程序中实现检查DN的功能。

也许你说ACL是由dinamically生成的?


关于你的评论,如果你的ACL是静态的,要了解ACL,更简单的方法是实现一个实现这些ACL的python工具。以前的例子:

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无法检索slapd.conf的ACL ...并且解析slapd.conf是不安全的(因为slapd.conf可以在系统上“任何地方”并且ACL声明可能是棘手的解析),也花了很多时间尝试在LDAP后端写入数据。

我知道这不是很令人满意。另一种解决方案是使用“服务用户”。只有此用户对LDAP后端具有写访问权限。

它简化了ACL的写作:

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

然后,在普通用户上,设置授权标志。 当您的登录用户想要做某事时,您的应用程序会检查该标志。如果此标志正常,则服务用户在后端写入数据。

这是我们在其中一个应用程序上部署的策略。

在这两种情况下,ACL的检查由我们的应用程序完成,而不是由ldap后端完成。

答案 1 :(得分:0)

我想我会尝试“测试”approch,如果它太慢可能有一些缓存。 我想仅在ldap服务器上保留ACL定义的原因是有其他方式与服务器交互(将有cli工具,以及标准的ldap工具),所以我想保留这些接口同步ACL,只有一个地方来定义ACL

答案 2 :(得分:0)

在OpenLDAP中,ACL定义不在DIT中。 如果要使用ldap查询访问ACL,可以使用FedoraDS(389目录服务器):http://directory.fedoraproject.org/wiki/Howto:AccessControl

您还可以看到OpenDS(https://www.opends.org)