多LDAP服务器客户端或代理
项目描述
pyMultiLDAP
pyMultiLDAP可以从多个LDAP服务器收集数据,可以使用重写规则进行数据聚合和处理。pyMultiLDAP还可以作为代理服务器,在openldap的slapd-sock后端或任何自定义实现之后。
特性
- 将多个服务器作为单个LDAP客户端;
- 自定义函数来操作返回的数据(重写规则);
- 以python字典、json或ldif格式导出数据;
- 代理服务器,通过slapd-sock后端暴露可用的服务器守护程序。
pyMultiLDAP不会写入LDAP服务器,它只处理只读数据。它还用于自动执行即时智能数据处理。
请参阅example/settings.py.example
和multildap/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的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 3e4fb7d536c67e4335ec0af8e0821d7a9c54acc146d7305693fa72654c36677b |
|
MD5 | 420667cbe8d43bf8154e5c31763a01c1 |
|
BLAKE2b-256 | 37ba596fbfc929763ba4be0adbfe466819cfec6e2c64c7fdcf16a59354c70152 |