OpenLDAP添加自定义属性

    科技2022-08-09  98

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

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

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

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

    第一步:定义schema

    定义一个schema文件分为五步:
    获取对象标识符选择一个名字前缀创建本地架构文件定义自定义属性类型(如有必要)定义自定义对象类
    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. 定义自定义属性类型(如有必要)

    常用语法:

    NameOIDDescriptionboolean1.3.6.1.4.1.1466.115.121.1.7boolean valuedirectoryString1.3.6.1.4.1.1466.115.121.1.15Unicode (UTF-8) stringdistinguishedName1.3.6.1.4.1.1466.115.121.1.12LDAP DNinteger1.3.6.1.4.1.1466.115.121.1.27integernumericString1.3.6.1.4.1.1466.115.121.1.36numeric stringOID1.3.6.1.4.1.1466.115.121.1.38object identifieroctetString1.3.6.1.4.1.1466.115.121.1.40arbitrary octets

    常用匹配规则:

    NameTypeDescriptionbooleanMatchequalitybooleancaseIgnoreMatchequalitycase insensitive, space insensitivecaseIgnoreOrderingMatchorderingcase insensitive, space insensitivecaseIgnoreSubstringsMatchsubstringscase insensitive, space insensitivecaseExactMatchequalitycase sensitive, space insensitivecaseExactOrderingMatchorderingcase sensitive, space insensitivecaseExactSubstringsMatchsubstringscase sensitive, space insensitivedistinguishedNameMatchequalitydistinguished nameintegerMatchequalityintegerintegerOrderingMatchorderingintegernumericStringMatchequalitynumericalnumericStringOrderingMatchorderingnumericalnumericStringSubstringsMatchsubstringsnumericaloctetStringMatchequalityoctet stringoctetStringOrderingMatchorderingoctet stringoctetStringSubstringsMatchorderingoctet st ringobjectIdentiferMatchequalityobject 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 Browser 在Object Class 中搜索添加的属性unit job 等,在Attribute Type 中搜索 roleName 等,都存在说明已经添加成功了。

    Processed: 0.019, SQL: 8