OpenLDAP添加自定义属性

由于OpenLDAP本身提供的属性有限,不能满足每个个性化需求,所有需要对属性进行自定义扩展。

根据LDAP知晓,添加自定义属性需要添加对应的objectClass和AttributeType,即属性对象和该属性所拥有的属性类型。

方法:通过编写schema扩展自定义属性

参考文献:https://www.openldap.org/devel/admin/schema.html

第一步:定义schema

定义一个schema文件分为五步:
  1. 获取对象标识符
  2. 选择一个名字前缀
  3. 创建本地架构文件
  4. 定义自定义属性类型(如有必要)
  5. 定义自定义对象类
1. 获取对象标识符

每个schema元素均有全局唯一标识 对象标识符(OID)。基本OID类似于1.3.6.1.4.1.X,其中X是整数。

2. 选择一个名字前缀

除了为每个schema元素分配唯一的对象标识符之外,还应该为每个元素至少提供一个文本名称。

3. 创建本地schema文件

本地创建的schema文件应当添加到import.conf文件中,以便openLDAP可以找到该文件。

#工作目录不确定,所以使用绝对路径指定Schema
# /etc/ldap/schema 为ldap的安装目录,自带以下五个schema文件
include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/inetorgperson.schema
include /etc/ldap/schema/ppolicy.schema
#schema文件会挂载在/tmp/schema路径下
#该文件为新增的自定义文件
include /tmp/schema/ldap.schema
4. 定义自定义属性类型(如有必要)

常用语法:

NameOIDDescription
boolean1.3.6.1.4.1.1466.115.121.1.7boolean value
directoryString1.3.6.1.4.1.1466.115.121.1.15Unicode (UTF-8) string
distinguishedName1.3.6.1.4.1.1466.115.121.1.12LDAP DN
integer1.3.6.1.4.1.1466.115.121.1.27integer
numericString1.3.6.1.4.1.1466.115.121.1.36numeric string
OID1.3.6.1.4.1.1466.115.121.1.38object identifier
octetString1.3.6.1.4.1.1466.115.121.1.40arbitrary octets

常用匹配规则:

NameTypeDescription
booleanMatchequalityboolean
caseIgnoreMatchequalitycase insensitive, space insensitive
caseIgnoreOrderingMatchorderingcase insensitive, space insensitive
caseIgnoreSubstringsMatchsubstringscase insensitive, space insensitive
caseExactMatchequalitycase sensitive, space insensitive
caseExactOrderingMatchorderingcase sensitive, space insensitive
caseExactSubstringsMatchsubstringscase sensitive, space insensitive
distinguishedNameMatchequalitydistinguished name
integerMatchequalityinteger
integerOrderingMatchorderinginteger
numericStringMatchequalitynumerical
numericStringOrderingMatchorderingnumerical
numericStringSubstringsMatchsubstringsnumerical
octetStringMatchequalityoctet string
octetStringOrderingMatchorderingoctet string
octetStringSubstringsMatchorderingoctet st ring
objectIdentiferMatchequalityobject identifier

定义格式例如:

attributetype (
    2.2.2.1.1
    NAME 'unitId'
    DESC '单位ID'
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
    EQUALITY caseIgnoreMatch
    SINGLE-VALUE )
5. 定义自定义对象类

该对象类指令用来定义一个新的对象类。定义如下:

objectClass (
    2.5.6.45
    NAME 'job'
	DESC 'Job'
	SUP organizationalRole STRUCTURAL
    MUST ( jobId $ unitId $ isManager $ levelOrder $ levelTitle )
    )

详细定义规则请参考上方参考文献。
本文定义ldap.schema内容为:

attributetype (
    2.2.2.1.1
    NAME 'unitId'
    DESC '单位ID'
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
    EQUALITY caseIgnoreMatch
    SINGLE-VALUE )
attributetype (
    2.2.2.1.2
    NAME 'jobId'
    DESC '岗位ID'
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
    EQUALITY caseIgnoreMatch
    SINGLE-VALUE )
attributetype (
    2.2.2.1.4
    NAME 'isExpert'
    DESC '是否专家'
    EQUALITY booleanMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.7
    )
attributetype (
    2.2.2.1.8
    NAME 'levelTitle'
    DESC '职位名称'
    EQUALITY caseIgnoreMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
    )
attributetype (
    2.2.2.1.9
    NAME 'levelOrder'
    DESC '职位等级, 数字越小级别越高'
    EQUALITY integerMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
    )
attributetype (
    2.2.2.1.10
    NAME 'roleName'
    DESC '用户角色名称'
    EQUALITY caseIgnoreMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
    )
# unit
objectClass (
    2.5.6.44
    NAME 'unit'
	DESC 'Unit'
	SUP organizationalUnit STRUCTURAL
    MUST unitId
    )
# jobs
objectClass (
    2.5.6.45
    NAME 'job'
	DESC 'Job'
	SUP organizationalRole STRUCTURAL
    MUST ( jobId $ unitId $ isManager $ levelOrder $ levelTitle )
    )
# user
objectClass (
    2.5.6.46
    NAME 'user'
	DESC 'User'
    SUP iNetOrgPerson STRUCTURAL
    MAY ( jobId $ isExpert $ expertType $ expertMajor $ rtxCode $ roleName )
    )
# role
objectClass (
    2.5.6.47
    NAME 'role'
	DESC 'Role'
    SUP organizationalRole STRUCTURAL
    MUST roleName
    )

第二步:将schema文件转为ldif文件

桌面新建一个文件夹aaa,添加两个文件ldap.schema和import.conf
指定命令slaptest -f import.conf -F . 将在该文件夹下常见一个目录cn=config ,进入该目录下的cn=schema 会看到6个ldif文件,最后一个就是我们新添加的。但是该文件有许多不需要的内容,需要对它进行修改。
在aaa下创建aa文件夹,复制ldap.chema文件到aa文件下,
在aaa文件夹中新建run.sh文件

valid_ldifs=""
cd /home/xiao/桌面/aaa/cn=config/cn=schema
for ldif in `ls ./*.ldif`
do
    ldif_name=`basename $ldif`
    #ldif_name=${ldif_name#cn=\{[0-9]*\}}
    ldif_name=${ldif_name#*\}}
    ldif_name=${ldif_name%".ldif"}

    rel_schema_file=/home/xiao/桌面/aaa/aa/${ldif_name}.schema

    if [ -f $rel_schema_file ]; then
        valid_ldifs="${valid_ldifs} ${ldif}"
    fi
done

for ldif in ${valid_ldifs}
do

    ldif_name=`basename $ldif`
    ldif_name=${ldif_name#cn=\{[0-9]*\}}
    ldif_name=${ldif_name%".ldif"}

    final_file=/home/xiao/桌面/aaa/$ldif_name.ldif
    echo "dn: cn=${ldif_name},cn=schema,cn=config" >> $final_file
    echo "cn: ${ldif_name}" >> $final_file
    cat $ldif \
        | grep -v "#" \
        | grep -v "structuralObjectClass" \
        | grep -v "entryUUID" \
        | grep -v "creatorsName" \
        | grep -v "createTimestamp" \
        | grep -v "entryCSN" \
        | grep -v "modifiersName" \
        | grep -v "modifyTimestamp" \
        | grep -v "dn: " \
        | grep -v "cn: " \
        >> $final_file
done

这样就可以生成我们需要的ldif文件ldap.ldif

dn: cn=ldap,cn=schema,cn=config
cn: ldap
objectClass: olcSchemaConfig
olcAttributeTypes:: ezB9KCAyLjIuMi4xLjEgTkFNRSAndW5pdElkJyBERVNDICfljZXkvY1J
 RCcgRVFVQUxJVFkgY2FzZUlnbm9yZU1hdGNoIFNZTlRBWCAxLjMuNi4xLjQuMS4xNDY2LjExNS4
 xMjEuMS4xNSBTSU5HTEUtVkFMVUUgKQ==
olcAttributeTypes:: ezF9KCAyLjIuMi4xLjIgTkFNRSAnam9iSWQnIERFU0MgJ+Wyl+S9jUlE
 JyBFUVVBTElUWSBjYXNlSWdub3JlTWF0Y2ggU1lOVEFYIDEuMy42LjEuNC4xLjE0NjYuMTE1LjE
 yMS4xLjE1IFNJTkdMRS1WQUxVRSAp
olcAttributeTypes:: ezJ9KCAyLjIuMi4xLjMgTkFNRSAnaXNNYW5hZ2VyJyBERVNDICfmmK/l
 kKbmiYDlsZ7ljZXkvY3lhoXnmoTpooblr7wnIEVRVUFMSVRZIGJvb2xlYW5NYXRjaCBTWU5UQVg
 gMS4zLjYuMS40LjEuMTQ2Ni4xMTUuMTIxLjEuNyAp
olcAttributeTypes:: ezN9KCAyLjIuMi4xLjQgTkFNRSAnaXNFeHBlcnQnIERFU0MgJ+aYr+WQ
 puS4k+WuticgRVFVQUxJVFkgYm9vbGVhbk1hdGNoIFNZTlRBWCAxLjMuNi4xLjQuMS4xNDY2LjE
 xNS4xMjEuMS43ICk=
olcAttributeTypes:: ezR9KCAyLjIuMi4xLjUgTkFNRSAnZXhwZXJ0VHlwZScgREVTQyAn5LiT
 5a6257G75Z6LJyBFUVVBTElUWSBjYXNlSWdub3JlTWF0Y2ggU1lOVEFYIDEuMy42LjEuNC4xLjE
 0NjYuMTE1LjEyMS4xLjE1ICk=
olcAttributeTypes:: ezV9KCAyLjIuMi4xLjYgTkFNRSAnZXhwZXJ0TWFqb3InIERFU0MgJ+S4
 k+WutuS4k+S4micgRVFVQUxJVFkgY2FzZUlnbm9yZU1hdGNoIFNZTlRBWCAxLjMuNi4xLjQuMS4
 xNDY2LjExNS4xMjEuMS4xNSAp
olcAttributeTypes:: ezZ9KCAyLjIuMi4xLjcgTkFNRSAncnR4Q29kZScgREVTQyAn6IW+6K6v
 6YCa5qCH6K+G56CBJyBFUVVBTElUWSBjYXNlSWdub3JlTWF0Y2ggU1lOVEFYIDEuMy42LjEuNC4
 xLjE0NjYuMTE1LjEyMS4xLjE1ICk=
olcAttributeTypes:: ezd9KCAyLjIuMi4xLjggTkFNRSAnbGV2ZWxUaXRsZScgREVTQyAn6IGM
 5L2N5ZCN56ewJyBFUVVBTElUWSBjYXNlSWdub3JlTWF0Y2ggU1lOVEFYIDEuMy42LjEuNC4xLjE
 0NjYuMTE1LjEyMS4xLjE1ICk=
olcAttributeTypes:: ezh9KCAyLjIuMi4xLjkgTkFNRSAnbGV2ZWxPcmRlcicgREVTQyAn6IGM
 5L2N562J57qnLCDmlbDlrZfotorlsI/nuqfliKvotorpq5gnIEVRVUFMSVRZIGludGVnZXJNYXR
 jaCBTWU5UQVggMS4zLjYuMS40LjEuMTQ2Ni4xMTUuMTIxLjEuMjcgKQ==
olcAttributeTypes:: ezl9KCAyLjIuMi4xLjEwIE5BTUUgJ3JvbGVJZCcgREVTQyAn55So5oi3
 6KeS6ImyaWQnIEVRVUFMSVRZIGNhc2VJZ25vcmVNYXRjaCBTWU5UQVggMS4zLjYuMS40LjEuMTQ
 2Ni4xMTUuMTIxLjEuMTUgKQ==
olcObjectClasses: {0}( 2.5.6.44 NAME 'unit' DESC 'Unit' SUP organizationalUn
 it STRUCTURAL MUST unitId )
olcObjectClasses: {1}( 2.5.6.45 NAME 'job' DESC 'Job' SUP organizationalRole
  STRUCTURAL MUST ( jobId $ unitId $ isManager $ levelOrder $ levelTitle ) )
olcObjectClasses: {2}( 2.5.6.46 NAME 'user' DESC 'User' SUP iNetOrgPerson ST
 RUCTURAL MAY ( jobId $ isExpert $ expertType $ expertMajor $ rtxCode ) )
olcObjectClasses: {3}( 2.5.6.47 NAME 'role' DESC 'Role' SUP organizationalRo
 le STRUCTURAL MUST roleId )

第三步:执行ldif文件

输入命令ldap -Y EXTERNAL -H ldapi:/// -f ldap.ldif

第四步:打开Apache Directory Studio验证

在这里插入图片描述
打开Schema BrowserObject Class 中搜索添加的属性unit job 等,在Attribute Type 中搜索 roleName 等,都存在说明已经添加成功了。


版权声明:本文为qq_33017507原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。