OpenLDAP 与 MySQL 配合使用,但需要架构建议

OpenLDAP 与 MySQL 配合使用,但需要架构建议

因此,我下载了最新的 OpenLDAP 源代码,用 进行编译—-enable-sql,摆弄slapd.conf,配置了 odbc 文件,将表添加到我当前的数据库中,花了一周时间调试slapd -d -1,现在 MySQL 用户已成为 LDAP 用户并能够登录。

我需要一些帮助来理解 LDAP 对象的基本结构。从我读到的所有内容来看,我假设每个对象都需要属于一个structuralObjectClass,然后每个对象可以属于许多其他对象objectClasses

我需要这个 LDAP 服务器做的唯一事情就是验证用户身份。用户无需编辑他们的信息。因此我首先设计了以下结构:

Institute
dn: dc=example,dc=org
dc: example
structuralObjectClass: dcObject
objectClass: organization
o: example
description: Example Company

Groups

Dn: ou=Groups,dc=example,dc=org
Ou: Groups
structuralObjectClass: organizationalUnit

dn: ou=Users,dc=example,dc=org
ou: Users
structuralObjectClass: organizationalUnit

dn: ou=marketing,ou=Groups,dc=example,dc=org
cn: marketing
gidNumber: 1554
structuralObjectClass: posixGroup
memberUid: user1
memberUid: userN

dn: ou=administration,ou=Groups,dc=example,dc=org
cn: administration
gidNumber: 1555
structuralObjectClass: posixGroup
memberUid: user1
memberUid: userN

Users
Dn: uid=user1,ou=Users,dc=example,dc=org
structuralObjectClass: inetOrgPerson
givenName: 
displayName:
cn: 
uidNumber: 
homeDirectory: 
sn: 
gidNumber: 
objectClass: person
objectClass: organizationalPerson
objectClass: posixAccount
objectClass: shadowAccount

我相信 OpenLDAP 会添加缺失的top objectClass。由于我已经有一个包含这些用户的数据库,而且我更喜欢使用 RDBMS 而不是 LDAP 中的模式,因此我有点不明白为什么当我尝试登录时,该ldapsearch实用程序会遍历我在 ldap_oc_mappings 表中拥有的所有对象类,而不仅仅是搜索 objectClass inetOrgPerson。这样就不会有任何不必要的查询。无论如何,这些是表格:

ldap_attr_mappings
+----+-----------+---------------+-----------------------------------------------------------+---------------+---------------------------------+-------------+
| id | oc_map_id | name          | sel_expr                                                  | from_tbls     | join_where                      | param_order |
+----+-----------+---------------+-----------------------------------------------------------+---------------+---------------------------------+-------------+
|  3 |         1 | sn            | users     .lName                                          | users         | NULL                            |           3 |
|  4 |         1 | userPassword  | concat('{MD5}',BASE64_ENCODE(unhex(users     .password))) | users    | NOT ISNULL(users     .password) |           3 |
|  5 |         1 | displayName   | concat(users     .fName,' ',users     .lName)             | users    | NULL                            |           3 |
|  6 |         1 | homeDirectory | users     .homeDirectory                                  | users    | NULL                            |           3 |
|  7 |         1 | loginShell    | users     .loginShell                                     | users    | NULL                            |           3 |
|  8 |         1 | uidNumber     | users     .uidNumber                                      | users    | NULL                            |           3 |
|  9 |         1 | gidNumber     | users     .gidNumber                                      | users    | NULL                            |           3 |
| 10 |         1 | cn            | users     .loginName                                      | users         | NULL                            |           3 |
| 11 |         1 | uid           | users     .loginName                                      | users         | NULL                            |           3 |
| 12 |         3 | ou            | ldap_groups.name                                          | ldap_groups   | NULL                            |           3 |
| 14 |         2 | o             | ldap_org_unit.o                                           | ldap_org_unit | NULL                            |           3 |
| 16 |         2 | dc            | ldap_org_unit.o                                           | ldap_org_unit | NULL                            |           3 |
| 17 |         2 | description   | ldap_org_unit.Description                                 | ldap_org_unit | NULL                            |           3 |
| 18 |         4 | gidNumber     | ldap_groups.gid                                           | ldap_groups   | NULL                            |           3 |
| 19 |         4 | cn            | ldap_groups.cn                                            | ldap_groups   | NULL                            |           3 |
+----+-----------+---------------+-----------------------------------------------------------+---------------+---------------------------------+-------------+


ldap_oc_mappings
+----+--------------------+---------------+--------------+
| id | name               | keytbl        | keycol       |
+----+--------------------+---------------+--------------+
|  1 | inetOrgperson      | users         | userID       |
|  2 | organization       | ldap_org_unit | id           |
|  3 | organizationalUnit | ldap_groups   | gid          |
|  4 | posixGroup         | ldap_groups   | gid          |
+----+--------------------+---------------+--------------+

ldap_entry_objclasses
+----------+---------------+
| entry_id | oc_name       |
+----------+---------------+
|    12216 | inetOrgPerson |
|    12216 | posixAccount  |
|    12216 | shadowAccount |
+----------+---------------+

objclasses 条目仅适用于一个用户。每个用户都分配有这些 objectClasses。这是一个视图,而不是一个表。

ldap_org_unit
+----+-------------+---------------------------------+--------+---------------------+-----------+
| id | o           | dn                              | parent | Description         | oc_map_id |
+----+-------------+---------------------------------+--------+---------------------+-----------+
|  1 | Example     | DC=Example,DC=org               |      0 | Example Co          |         2 |
|  2 | Users       | ou=Users,DC=example,DC=org      |      1 |                     |         3 |
|  3 | Groups      | ou=Groups,DC=example,DC=org     |      1 |                     |         3 |
+----+-------------+---------------------------------+--------+---------------------+-----------+

我认为这里的父母价值观可能不正确

ldap_groups
+------+----------------+----------------+-----------------------------------------------+
| gid  | name           | cn             | dn                                            |
+------+----------------+----------------+-----------------------------------------------+
| 1554 | Marketing      | marketing      | cn=marketing,ou=Groups,dc=example,dc=org      |
| 1155 | administration | administration | cn=administration,ou=Groups,dc=example,dc=org |
+------+----------------+----------------+-----------------------------------------------+

Lastly: ldap_entries
+-------+-----------------------------------------------+-----------+--------+--------+
| id    | dn                                            | oc_map_id | parent | keyval |
+-------+-----------------------------------------------+-----------+--------+--------+
|     1 | DC=EXAMPLE,DC=ORG                             |         2 |      0 |      1 |
|     2 | OU=USERS,DC=EXAMPLE,DC=ORG                    |         3 |      1 |      2 |
|     3 | OU=GROUPS,DC=EXAMPLE,DC=ORG                   |         3 |      1 |      3 |
|  1554 | CN=MARKETING,OU=GROUPS,DC=EXAMPLE,DC=ORG      |         4 |      3 |   1554 |
|  1155 | CN=ADMINISTRATION,OU=GROUPS,DC=EXAMPLE,DC=ORG |         4 |      3 |   1155 |
| 22963 | CN=ROOT,DC=EXAMPLE,DC=ORG                     |         1 |   1554 |  12963 |
| 12216 | CN=USER1,OU=USERS,DC=EXAMPLE,DC=ORG           |         1 |   1555 |   2216 |
+-------+-----------------------------------------------+-----------+--------+--------+

这里的父值正确吗?

正如我所说,这有效,用户可以登录。但是当我运行时,ldasearch -b "dc=example,dc=org" "(objectclass=*)"它需要很长时间。我读过许多文章,指出 RDBMS 不能也不应该用于 LDAP 后端的原因主要是因为这个问题。但它的速度非常慢,这让我相信有一些不必要的查询,我的表“关系”不正确。前几个结果ldapsearch是:

# ROOT, EXAMPLE.ORG
dn: cn=ROOT,dc=EXAMPLE,dc=ORG
objectClass: inetOrgPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: root
sn: Admin
uid: root
gidNumber: 1554
uidNumber: 0
loginShell: /bin/bash
displayName: Domain Admin
userPassword:: *******
homeDirectory: /ldaphomes/root

# USER1, USERS, EXAMPLE.ORG
dn: cn=USER1,ou=USERS,dc=EXAMPLE,dc=ORG
objectClass: inetOrgPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: user1
sn: User 1
uid: user1
gidNumber: 0
uidNumber: 0
displayName: User 1
userPassword:: ******

如您所见,objectClass inetOrgPerson 出现了两次。这适用于所有用户。

当我执行此操作时:ldapsearch -b "dc=example,dc=org" "(cn=user1)"结果以毫秒为单位返回,这让我相信应该有一种方法可以告诉 OpenLDAP 服务器始终基于 CN 进行搜索。

嗯,这是一篇很长的帖子/问题。因此,欢迎对架构、父值、或 objectClasses 显示两次的原因提出任何意见,或者提供一些优化指导。

谢谢

相关内容