跳转到主要内容

多LDAP服务器客户端或代理

项目描述

pyMultiLDAP

pyMultiLDAP可以从多个LDAP服务器收集数据,可以使用重写规则进行数据聚合和处理。pyMultiLDAP还可以作为代理服务器,在openldap的slapd-sock后端或任何自定义实现之后。

特性

  • 将多个服务器作为单个LDAP客户端;
  • 自定义函数来操作返回的数据(重写规则);
  • 以python字典、json或ldif格式导出数据;
  • 代理服务器,通过slapd-sock后端暴露可用的服务器守护程序。

pyMultiLDAP不会写入LDAP服务器,它只处理只读数据。它还用于自动执行即时智能数据处理。

请参阅example/settings.py.examplemultildap/attr_rewrite.py以了解如何配置和扩展它。

测试环境

  • Debian9;
  • Debian10.

设置

settings.py中配置多个连接和搜索参数。

安装

git clone https://github.com/peppelinux/pyMultiLDAP.git
cd pyMultiLDAP
pip install -r requirements
python3 setup.py install

或使用pipy [WIP]

pip install pyMultiLDAP

LdapClient类使用

from multildap.client import LdapClient
from settings import LDAP_CONNECTIONS

lc = LdapClient(LDAP_CONNECTIONS['SAMVICE'])

# get all the results
lc.get()

# apply a filter
lc.get(search="(&(sn=de marco)(schacPersonalUniqueId=*DMRGPP83*))")
搜索和获取

请参阅examples/run_test.py

.search.get之间的区别

  • search依赖于连接配置,并以原始形式返回结果;
  • get处理自定义搜索过滤器,并以字典、json、ldif或python对象格式检索结果。它还应用重写规则。
import copy

from multildap.client import LdapClient
from settings import LDAP_CONNECTIONS

lc = LdapClient(LDAP_CONNECTIONS['DEFAULT'])

kwargs = copy.copy(lc.conf)
kwargs['search']['search_filter'] = "(&(sn=de medici)(givenName=aurora))"
r = lc.search(**kwargs['search'])

json格式的结果

from multildap.client import LdapClient
from . settings import LDAP_CONNECTIONS


for i in LDAP_CONNECTIONS:
    lc = LdapClient(LDAP_CONNECTIONS[i])
    print('# Results from: {} ...'.format(lc))

    # get all as defined search_filter configured in settings connection
    # but in json format
    r = lc.get(format='json')
    print(r)

    # set a custom search as method argument
    r = lc.get(search="(&(sn=de marco)(schacPersonalUniqueId=*DMRGPP345tg86H))", format='json')
    print(r)

    print('# End {}'.format(i))

运行服务器

网络地址

multildapd.py -conf settings.py -port 1234

Unix域套接字(用于slapd-sock后端)

multildapd.py -conf ./settings.py -loglevel "DEBUG" -socket /var/run/multildap.sock -pid /var/run/multildap.pid -uid openldap

无LDAP客户端连接配置的模拟测试,仅用于测试slapd-sock

multildapd.py -conf ./settings.py -dummy -loglevel "DEBUG" -socket /var/run/multildap.sock -pid /var/run/multildap.pid

从命令行测试Unix域套接字

nc -U /tmp/multildap.sock

与OpenLDAP slapd-sock接口

Slapd-sock后端为slapd使用外部程序处理查询。这使得可以有一个进程池,这些进程在请求之间持久化。这允许多线程操作和更高的效率。Multildapd监听Unix域套接字,并且必须独立启动;

此模块也可以用作某些其他数据库的覆盖。作为覆盖使用允许在主数据库操作时触发外部操作。

将slapd-sock配置为数据库

添加模块。

ldapadd -Y EXTERNAL -H ldapi:/// <<EOF
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModuleLoad: back_sock.la
EOF

创建数据库。

ldapadd -Y EXTERNAL -H ldapi:/// <<EOF
dn: olcDatabase={4}sock,cn=config
objectClass: olcDbSocketConfig
olcDatabase: {4}sock
olcDbSocketPath: /var/run/multildap.sock
olcSuffix: dc=proxy,dc=testunical,dc=it
olcDbSocketExtensions: binddn peername ssf
EOF

如果您想包装现有的后端,请添加覆盖。

ldapmodify -H ldapi:// -Y EXTERNAL <<EOF
dn: olcOverlay=sock,olcDatabase={1}mdb,cn=config
changetype: add
objectClass: olcConfig
objectClass: olcOverlayConfig
objectClass: olcOvSocketConfig
olcOverlay: sock
olcDbSocketPath: /var/run/multildap/multildap.sock
olcOvSocketOps: bind unbind search
olcOvSocketResps: search
EOF

请记住配置ACL,否则只有root使用ldapsearch -H ldapi:// -Y EXTERNAL才能获取ldif。请记住,在每行olaAccess之后添加一个空格字符' ',否则您将收到Implementation specific error(80)

export BASEDC="dc=testunical,dc=it"

ldapadd -Y EXTERNAL -H ldapi:/// <<EOF
dn: olcDatabase={4}sock,cn=config
changeType: modify
replace: olcAccess
olcAccess: to *
 by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth manage
 by * break
# the following permits self BIND by users
olcAccess: to dn.subtree="dc=proxy,$BASEDC"
 by self read
 by * break
# the following two permits SEARCH by idp and foreign auth system
olcAccess: to dn.subtree="ou=people,$BASEDC"
 by dn.children="ou=auth,$BASEDC" read
 by self read
 by * break
olcAccess: to dn.subtree="ou=people,$BASEDC"
 by dn.children="ou=idp,$BASEDC" read
 by self read
 by * break
olcAccess: to *
 by anonymous auth
 by * break
EOF

在multildapd上配置认证(绑定)必须使用rewrite_dn_to属性针对settings.py中的每个连接进行配置。如果不存在,则指定的连接将被排除在认证之外。TODO:采用openldap代理authz语句

ldapsearch -H ldap://localhost:389 -D "uid=peppe,dc=proxy,dc=testunical,dc=it" -w thatsecret -b 'uid=peppe,dc=proxy,dc=unical,dc=it'

提示

查看当前安装的数据库

  • ldapsearch -Y EXTERNAL -H ldapi:/// -b 'cn=config' -LLL "olcDatabase=";
  • 在settings.py中,使用client_strategy = RESTARTABLE而不是REUSABLE以提高性能;
  • 在OpenLDAP 2.5发布之前,无法通过ldapdelete/modify删除后端;
  • 更改套接字路径
ldapmodify -Y EXTERNAL -H ldapi:/// <<EOF
dn: olcDatabase={4}sock,cn=config
changetype: modify
replace: olcDbSocketPath
olcDbSocketPath: /var/run/multildap.sock
EOF
  • 使用socat部署一个虚拟套接字监听器,仅用于调试来自slapd-sock的传入连接。
socat -s UNIX-LISTEN:/tmp/slapd-sock,umask=000,fork EXEC:"$your_command"

其他slapd-sock资源

待办事项

  • 使用slapd的代理授权规则(authzTo: dn.regex:^uid=[^,]*,dc=example,dc=com$)的示例配置;
  • 只有SEARCH、BIND和UNBIND可用,其他LDAP方法应实现;

项目详情


下载文件

为您的平台下载文件。如果您不确定要选择哪个,请了解更多关于安装包的信息。

源分布

multildap-0.3.3.tar.gz (16.2 kB 查看散列)

上传时间

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面