目录
2. 在服务器任意位置创建目录,例如我在根目录下创建myldap
3. 然后进入到myldap目录下创建schema文件,例如名字为test.schema
4.进入myldap目录下创建conf文件,例如名字为test.conf
5. 执行slaptest命令编译自定义的schema,生成ldif等文件
7. 执行 slapadd命令,将该文件添加进OpenLdap库
10. 通过工具Apache Directory Studio查看是否导入自定义属性
知识准备
Schema是LDAP的一个重要组成部分,类似于数据库的模式定义,LDAP的Schema定义了LDAP目录所应遵循的结构和规则,比如一个 objectclass会有哪些属性,这些属性又是什么结构等等,schema给LDAP服务器提供了LDAP目录中类别,属性等信息的识别方式,让这些 可以被LDAP服务器识别。
在LDAP的schema中,有四个重要的元素:
1. Objectclass
objectclass定义了一个类别,这个类别会被不同的目录(在LDAP中就是一个Entry)用到,它说明了该目录应该有哪些属性,哪些属性是必须 的,哪些又是可选的。一个objectclass的定义包括名称(NAME),说明(DESC),类型(STRUCTURAL或AUXILARY ,表示是结构型的还是辅助型的),必须属性(MUST),可选属性(MAY)等信息。
2. Attribute
attribute就是一个上面objectclass中可能包含的属性,对其的定义包括名称,数据类型,单值还是多值以及匹配规则等。后面用具体的例子来说明。
3. Syntax
syntax是LDAP中的“语法”,其实就是LDAP中会用到的数据类型和数据约束,这个语法是遵从X.500中数据约束的定义的。其定义需要有一个ID(遵从X.500)以及说明(DESP)
4. Matching Rules
是用来指定某属性的匹配规则,实际上就是定义一个特殊的Syntax的别名,让LDAP服务器可以识别,并对定义的属性进行匹配
很多常用schema的定义都在了RFC2252中,LDAP服务器都应该支持这些基本的schema。下面进行定义自己的schema。
前言
由于OpenLDAP本身包含的属性有限,不能满足实际生产需求,因此考虑自定义部分属性来满足业务上的需要,此文也在参考其他博客的基础上进行总结编写,以此记录下实际操作过程,参考博文在文章最后有标出
操作步骤
本人使用的是docker安装的OpenLDAP
docker run -p 389:389 ^
--name myopenldap ^
--network bridge ^
--hostname openldap-host ^
--env LDAP_ORGANISATION="XXX" ^
--env LDAP_DOMAIN="XXX.com" ^
--env LDAP_ADMIN_PASSWORD="ldap123" ^
--detach osixia/openldap
配置LDAP组织者:--env LDAP_ORGANISATION="mylitboy"
配置LDAP域:--env LDAP_DOMAIN="mylitboy.com"
配置LDAP密码:--env LDAP_ADMIN_PASSWORD="ldap123"
默认登录用户名:admin
OpenLDAP版本:2.4.57
查看OpenLDAP版本命令:
slapd -V
1. 首先使用docker进入容器内部
docker exec -it 你的容器id bash
2. 在服务器任意位置创建目录,例如我在根目录下创建myldap
3. 然后进入到myldap目录下创建schema文件,例如名字为test.schema
注:docker下默认没有vi和vim编辑器,记得安装,不会的百度一下
vim test.schema
在test.schema中输入内容
attributetype (
3.2.2.1.1
NAME 'myId'
DESC '我测试的id'
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
EQUALITY caseIgnoreMatch
SUBSTR caseIgnoreSubstringsMatch
SINGLE-VALUE )
attributetype (
3.2.2.1.2
NAME 'myName'
DESC '我测试的名称'
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
EQUALITY caseIgnoreMatch
SUBSTR caseIgnoreSubstringsMatch
SINGLE-VALUE )
objectClass (
3.2.2.1.3
NAME 'myObjectClass'
DESC '我测试的objectClass'
SUP inetOrgPerson STRUCTURAL
MAY ( myId $ myName ))
3.1 内容说明
以上创建了myId和myName两个属性,和myObjectClass一个类别,myObjectClass类别下包含myId和myName两个属性
第一个参数:
第一个参数是oid,oid必须且唯一,不重复就好
NAME:
你需要定义的属性名称
DESC:
属性的描述
SYNTAX:
表示的数据类型,可参考如下表格
Name | OID | Description |
---|---|---|
boolean | 1.3.6.1.4.1.1466.115.121.1.7 | boolean value |
directoryString | 1.3.6.1.4.1.1466.115.121.1.15 | Unicode (UTF-8) string |
distinguishedName | 1.3.6.1.4.1.1466.115.121.1.12 | LDAP DN |
integer | 1.3.6.1.4.1.1466.115.121.1.27 | integer |
numericString | 1.3.6.1.4.1.1466.115.121.1.36 | numeric string |
OID | 1.3.6.1.4.1.1466.115.121.1.38 | object identifier |
octetString | 1.3.6.1.4.1.1466.115.121.1.40 | arbitrary octets |
EQUALITY:
约束规则,参考如下表格
Name | Type | Description |
---|---|---|
booleanMatch | equality | boolean |
caseIgnoreMatch | equality | case insensitive, space insensitive |
caseIgnoreOrderingMatch | ordering | case insensitive, space insensitive |
caseIgnoreSubstringsMatch | substrings | case insensitive, space insensitive |
caseExactMatch | equality | case sensitive, space insensitive |
caseExactOrderingMatch | ordering | case sensitive, space insensitive |
caseExactSubstringsMatch | substrings | case sensitive, space insensitive |
distinguishedNameMatch | equality | distinguished name |
integerMatch | equality | integer |
integerOrderingMatch | ordering | integer |
numericStringMatch | equality | numerical |
numericStringOrderingMatch | ordering | numerical |
numericStringSubstringsMatch | substrings | numerical |
octetStringMatch | equality | octet string |
octetStringOrderingMatch | ordering | octet string |
octetStringSubstringsMatch | ordering | octet st ring |
objectIdentiferMatch | equality | object identifier |
SUBSTR caseIgnoreSubstringsMatch
表示支持模糊查询
SINGLE-VALUE:
表示这个属性只有一个值,有些属性可以有多个值,比如地址等。默认是多值的。
SUP:
继承的父类别,父类别可以在已有的ObjectClass中查找,使用Apache Directory Studio查看如下,可以在其中搜索
SUP top:后续只会生成一个ldif文件
MAY:
必须属性(MUST),可选属性(MAY)
4.进入myldap目录下创建conf文件,例如名字为test.conf
vim test.conf
在test.conf中输入如下内容
参考自己OpenLDAP安装的路径,这个是inetorgperson类别需要的schema,如果SUP是top,则下面三行不需要引入
include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/inetorgperson.schema
即引入上步骤创建的schema文件
include /myldap/test.schema
5. 执行slaptest命令编译自定义的schema,生成ldif等文件
slaptest -f /myldap/test.conf -F /myldap
6. 修改生成文件
执行完后,会在myldap目录下方生成cn=config和cn=config.ldif目录,再进入cn=config/cn=schema目录下可以查到生成的多个ldif文件
多个ldif文件中的cn={3}test.ldif就是我们需要的文件,需要将它重命名,并修改其中的cn和dn(ldif文件中对空格等元素有严格要求,请不要额外添加空格等其他不必要的元素)
修改前文件内容
修改后文件内容
重命名
mv cn\=\{3\}test.ldif myObjectClass.ldif
修改文件
7. 执行 slapadd命令,将该文件添加进OpenLdap库
slapadd -l /myldap/cn=config/cn=schema/myObjectClass.ldif -n 0
如图正常不报错即成功了
要注意是否有提示属性重复或者oid重复,如果提示报错需要修改schema后再次编译。
较为常见的错误是提示你属性重复或者oid重复,此时最好重新修改schema文件然后再次编译。
8. 查看新添加的objectclass为营的ldif文件
完成以上步骤就可以在路径/etc/ldap/slapd.d/cn=config/cn=schema(根据自己的安装路径确定)看到文件了
9. 文件复权并重启ldap服务
直接重启服务会报错,需要给/etc/openldap/slapd.d/cn=config/cn=schema赋权
chmod -R 777 /etc/ldap/slapd.d/cn=config/cn=schema
重启服务
docker stop 容器id
docker restart 容器id
10. 通过工具Apache Directory Studio查看是否导入自定义属性
11. 参考博客
OpenLDAP自定义Schema_芒果黑的博客-CSDN博客
OpenLDAP添加自定义objectClass实现添加自定义属性 - 快乐肥宅 - 博客园
关于openldap加inetorgperson.schema报错的问题_wangpeng_新浪博客