2.1 schema
schema主要用于控制目录中各种条目所拥有的对象类以及各种属性的定义,可以理解成是一个数据模型。它定义了对象类,指定对象类中有哪些属性,哪些属性是必须的哪些是可选的,属性应该是邮箱地址还是电话号码,字符还是数字等。
比如说,openldap想支持sudo验证,就需要加载sudo的schema文件,这样有了sudo相关的对象类定义,我们在openldap中的条目中才能进行sudo相关的配置。就类似于系统中的库,有了库,我们所使用的方法、命令才能用。
2.2 objectClass
对象类是schema定义的,对象类规定了你可以在一个条目(下边会解释什么是条目)中设置哪些属性,在配置员工信息、账号信息时,我们需要在条目中需要添加对象类,然后才能设置相应的属性。比如你有了person类,你才能定义cn、sn姓名等。如果不添加对象类,就没办法用这个对象类中的属性。
2.3 常见的对象类
person
posixAccount
posixGroup
shadowAccount
uidObject
organizationalRole
organizationalUnit
organizationalPerson
inetOrgPerson
等等
2.4 objectClass对象类详解
LDAP中,一个条目必须包含一个objectClass属性,且需要赋予至少一个值。每一个值将用作一条LDAP条目进行数据存储的模板;模板中包含了一个条目必须被赋值的属性和可选的属性。objectClass有着严格的等级之分,最顶层是top和alias。例如,organizationalPerson这个objectClass就隶属于person,而person又隶属于top。
objectClass可分为以下3类:
结构型(Structural):如person和organizationUnit;
辅助型(Auxiliary):如extensibeObject;
抽象型(Abstract):如top,抽象型的objectClass不能直接使用。
在OpenLDAP的schema中定义了很多objectClass,下面列出部分常用的objectClass的名称。
● account
● alias
● dcobject
● domain
● ipHost
● organization
● organizationalRole
● organizationalUnit
● person
● organizationalPerson
● inetOrgPerson
● residentialPerson
● posixAccount
● posixGroup
对象类(ObjectClass)是属性的集合,LDAP预想了很多人员组织机构中常见的对象,并将其封装成对象类。比如人员(person)含有姓(sn)、名(cn)、电话(telephoneNumber)、密码(userPassword)等属性,单位职工(organizationalPerson)是人员(person)的继承类,除了上述属性之外还含有职务(title)、邮政编码(postalCode)、通信地址(postalAddress)等属性。
通过对象类可以方便的定义条目类型。每个条目可以直接继承多个对象类,这样就继承了各种属性。如果2个对象类中有相同的属性,则条目继承后只会保留1个属性。对象类同时也规定了那些属性是基本信息,必须含有(Must 活Required,必要属性):哪些属性是扩展信息,可以含有(May或Optional,可选属性)。
对象类有三种类型:结构类型(Structural)、抽象类型(Abstract)和辅助类型(Auxiliary)。结构类型是最基本的类型,它规定了对象尸体的基本属性,每个条目属于且仅属于一个结构型对象类。抽象类型可以是结构类型或其他抽象类型父类,它公国将对象属性中共性的部分组织在一起,称为其他类的模板,条目不能直接集成抽象型对象类。辅助类型规定了对象实体的扩展属性。虽然每个条米只属于一个结构型对象类,但可以同时属于多个辅助型对象类。
对象类本身是可以相互继承的,所以对象类的根类是top抽象型对象类。以常用的人员类型为例,他们的继承关系如图:
Attribute
属性(Attribute)类似于程序设计中的变量,可以被赋值。在OpenLDAP中声明了许多常用的Attribute(用户也可自己定义Attribute)。常见的Attribute含义如下:
● c:国家。
● cn:common name,指一个对象的名字。如果指人,需要使用其全名。
● dc:domain Component,常用来指一个域名的一部分。
● givenName:指一个人的名字,不能用来指姓。
● l:指一个地名,如一个城市或者其他地理区域的名字。
● mail:电子信箱地址。
● o:organizationName,指一个组织的名字。
● ou:organizationalUnitName,指一个组织单元的名字。
● sn:surname,指一个人的姓。
● telephoneNumber:电话号码,应该带有所在的国家的代码。
提示:objectClass是一种特殊的Attribute,它包含其他用到的Attribute以及其自身。
对于不同的objectClass,通常具有一些必设属性值和一些可选属性值。例如,可使用person这个objectClass来表示系统中一个用户的条目,对于系统中用户通常需要有这样一些信息:姓名、电话、密码、描述等。如下图所示,对于person,通过cn和sn设置用户的名和姓,这是必须设置的,而其他属性则是可选的。
条目(Entry)相当于关系数据库中的表的记录
条目是具有分辨名DN(Distinguished Name)的属性-值对(Attribute-value,简称AV)的集合
LDAP 通过属性 objectClass 来控制哪一个属性必须出现或允许出现在一个条目中,它的值决定了该条目必须遵守的模式 规则(可以理解为关系数据库的表结构)
objectClass 含义
olcGlobal 全局配置文件类型, 主要是 cn=config.ldif 的配置项
top 顶层的对象
organization 组织,比如公司名称,顶层的对象
organizationalUnit 重要, 一个目录节点,通常是 group,或者部门这样的含义
inetOrgPerson 重要, 我们真正的用户节点类型,person 类型, 叶子节点
groupOfNames 重要, 分组的 group 类型,标记一个 group 节点
olcModuleList 配置模块的对象
2.5 属性
属性(Attribute)在目录树中主要用于描述条目相关信息,例如用户条目的用途、联系方式、邮件、uid、gid、密码等辅助信息。属性是由objectClass所控制,一个objectClass的节点具有一系列Attribute,Attribute可以理解成一个变量,每个变量都有对应的值,Attribute也是有对应的值。这些属性的对应值表示每个对象的特点,有些属性是必须指定的,有些不是必须的。在目录中常用的Attribute有uid、sn、giveName、objectClass、dc、ou、cn、mail、telephoneNumber等。
2.5.1 常用属性介绍
关键字 英文全称 含义
dc Domain Component 通常指定一个域名,例如 dc=myit,dc=icu
uid User Id 通常指一个用户的登录名称,例如:uid=zhangsan
ou Organization Unit 指定一个组织单元的名称
cn Common Name 公共名称,如 “Thomas Johansson”
sn Surname 通常指一个人的姓氏,例如:sn: zhang
dn Distinguished Name 唯一标志名,类似于Linux文件系统中的绝对路径,每个条目都有一个标识名,例如:uid=zhangsan,ou=people,dc=myit,dc=icu,
在整个OpenLDAP中是唯一的,类似于MySQL表中的主键
rdn Relative dn 通常指相对标识名,类似于Linux文件系统中的相对路径,如uid=zhangsan
c Country 国家,如“CN”或“US”等。
o Organization 组织名,如“Example, Inc.”
通常用户 id 也是唯一的。所以在使用 ldap 做认证的时候,大概逻辑如下:
1.配置 ldap host, admin, admin pass
2.用户登录时传递 username
3.读取配置的 ldap 信息,查询 cn 或者 uid 等于 username 的数据
4.取出第一个记录, 获得 dn, 根据 dn 和 password 再次去 ldap 服务器认证。即我们必须保证 cn 或 uid 是全局唯一的,
5.认证通常需要进行两次。原因就在于 dn 没办法根据用户名计算出来。
2.5.2 常用objectClass要求必设的属性
- account:userid。
- organization:o。
- person:cn和sn。
- organizationalPerson:与person相同。
- organizationalRole:cn。
- organizationUnit:ou。
- posixGroup:cn、gidNumber。
- posixAccount:cn、gidNumber、homeDirectory、uid、uidNumber。
一个 ldap 用户组织可能是这样的:
2.6 LDIF文件
LDIF(LDAP Data Interchanged Format)轻量级目录访问协议交换数据格式的简称,是存储LDAP配置信息及目录内容的标准文本文件格式,通常用来完成openldap数据的导入、导出、修改。
2.6.1 LDIF文件特点
● 每行的结尾不允许有空格或制表符
● 允许相关属性可以重复赋值并使用
● 文件以.ldif结尾命名
● 文件中以#号开头的一行为注释,可以作为解释使用
● LDIF文件中所有赋值方式为:属性:[空格]属性值
● LDIF文件通过空行来定义一个条目,空行前为一个条目,空行后为另一个条目的开始
2.6.2 LDIF文件样例
dn: uid=user2,ou=people,dc=baidu,dc=com # 唯一标识名,用来定位这个条目
objectClass: shadowAccount # 意思是条目集成了shadowAccount这个对象类了,可以使用这个对象类中定义的属性了,也就是下边定义的各种属性,shadowMin、shadowMax等。
objectClass: top
objectClass: posixAccount
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
cn: user2
gidNumber: 1005
homeDirectory: /home/user2
sn: user2
uid: user2
uidNumber: 1003
loginShell: /bin/bash
mail: user2@baidu.com
shadowLastChange: 17843
shadowMax: 99999
shadowMin: 0
shadowWarning: 7
userPassword:: e2NyeXB0fSQxJFRmY2NYODV6JDlqTzdlRUpYQjFjcG9sVFg1Y3ZSRC8=