【问题标题】:check ldap access rights with python使用 python 检查 ldap 访问权限
【发布时间】:2010-11-19 11:29:51
【问题描述】:

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

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

我需要的是某种方式来查询 ACL,这种方式类似于我可以查询架构定义。但也许这被 LDAP “禁止”了?

有什么想法吗?

艾萨克

【问题讨论】:

  • 您使用哪个 Ldap 服务器?您使用哪些接口/绑定来访问它?
  • 我使用 openldap 2.3.32 和 python 2.6 ldap 绑定(导入 ldap)
  • 我突然想到,我不需要写一个假人来看看我是否有写权限。我可以尝试写入原始值,如果我没有写入权限,这将导致错误,如果我有读取权限,则不会更改任何内容。不过,看起来并不那么优雅。
  • "import ldap" 在我的 vanilla python2.6 中产生错误,因此您必须安装了第三方模块。是哪个?
  • 嗯,我使用来自python-ldap.org 的python-ldap,准确地说是python 2.6.5,它们都是为ubuntu server 10.04 打包的。

标签: python ldap acl


【解决方案1】:

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

也许你是说 ACL 是动态生成的?


关于您的评论,如果您的 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

然后,在普通用户上,您设置授权标志。 当您的登录用户想要做某事时,您的应用程序会检查该标志。如果这个标志是OK的,服务用户将数据写入Backend。

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

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

【讨论】:

  • 对不起,我可能理解的比较慢,但是:如果我知道我的DN,我怎么知道ACL? ACL 在 slapd.conf 中定义,至少在概念上我的 django 应用程序不知道它。你是在建议我从 django 解析 slapd.conf 吗?
  • 回答您的问题:我的 ACL 是静态的。不过我可能会偶尔更改一些设置,所以我希望有一个地方来定义它们。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-06-03
      • 2015-01-11
      • 2015-05-27
      • 2014-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-13
      相关资源
      最近更新 更多