OpenLDAP的安装与基本使用方法(上)

本文介绍OpenLDAP的基本使用方法。我在本文中使用的操作系统是Fedora20:

OpenLDAP的安装与基本使用方法(上)_第1张图片

下面我们来安装OpenLDAP。

安装OpenLDAP


首先我们要把所有openldap相关的包都装上:

OpenLDAP的安装与基本使用方法(上)_第2张图片

我在Fedora20里使用yum命令进行安装:

$ sudo yum install openldap*


接下来是启动OpenLDAP服务。

启动OpenLDAP


在Fedora20当中,我使用service命令来启动OpenLDAP的服务:

OpenLDAP的安装与基本使用方法(上)_第3张图片

可以看到OpenLDAP的服务进程名字为slapd。服务启动后,我们可以查看一下OpenLDAP的基本配置:

[weli@localhost openldap]$ pwd
/etc/openldap
[weli@localhost openldap]$ ls
certs  check_password.conf  ldap.conf  schema  slapd.d
[weli@localhost openldap]$


如上所示,OpenLDAP的配置文件默认在"/etc/openldap"当中。其中slapd.d中保存了slapd的配置内容。注意我们使用的OpenLDAP版本为2.4:

$ yum info openldap
Name        : openldap
Arch        : x86_64
Version     : 2.4.23


在2.4以前的版本中,OpenLDAP使用slapd.conf配置文件来进行服务器的配置,而2.4开始则使用slapd.d目录保存细分后的各种配置,这一点需要注意[1]。

接下来我们看看slapd.d中的内容:

OpenLDAP的安装与基本使用方法(上)_第4张图片

可以看到配置文件也是标准的ldif格式。其中cn=schema目录中包含了服务器支持的数据格式定义文件,我们后续会用到。首先看一下olcDatabase={2}hdb.ldif中的内容:

OpenLDAP的安装与基本使用方法(上)_第5张图片

在这个文件里面定义了openldap默认配置好的数据库[2]:

objectClass: olcDatabaseConfig
objectClass: olcHdbConfig


配置文件中还定义了数据库的位置:

olcDbDirectory: /var/lib/ldap


因为这个数据库的objectClass为olcHdbConfig,因此可以知道数据库使用的是BerkeleyDB,我们可以进入到数据库目录查看一下:

OpenLDAP的安装与基本使用方法(上)_第6张图片

因为是bdb(BerkeleyDB)格式的文件,因此也可以使用标准的bdb提供的命令来查看数据文件:

OpenLDAP的安装与基本使用方法(上)_第7张图片

再回过头继续看olcDatabase={2}hdb.ldif中的内容:

olcRootDN: cn=Manager,dc=my-domain,dc=com
olcRootPW: secret


olcRootDN和olcRootPW是用来操作这个数据库的账号,其中"olcRootPW"是我自己添加的密码,使用名文,因此密码是"secret"。最后,我们看这个数据的olcSuffix定义:

olcSuffix: dc=my-domain,dc=com


上面的配置定义了这个数据库的查询地址。接下来要做的是重启slapd(因为加入了olcRootPW配置),然后我们试着用olcRootDN和olcRootPW查询这个数据库。

数据查询及数据操作


首先重启slapd:

# service slapd restart
Redirecting to /bin/systemctl restart  slapd.service


接下来使用ldapsearch命令来做数据查询:

$ ldapsearch -x -D 'cn=Manager,dc=my-domain,dc=com' -w secret -b 'dc=my-domain,dc=com'


以下是查询结果:

OpenLDAP的安装与基本使用方法(上)_第8张图片

从结果中可以看出来"dc=my-domain,dc=com"这个数据库里还没有任何数据。因此我们需要首先往数据库里添加数据。但在添加数据之前,我们首先要将相关的schema添加进slapd的配置目录当中。

在slapd.d中可以看到OpenLDAP默认提供了很多schema:

OpenLDAP的安装与基本使用方法(上)_第9张图片

而slapd默认只使用core这一个schema:

[root@localhost cn=schema]# pwd
/etc/openldap/slapd.d/cn=config/cn=schema
[root@localhost cn=schema]# ls
cn={0}core.ldif


为了创建用户的基本数据类型,我们还需要引入两个schema:

cosine.schema
inetorgperson.schema


这里面定义了我们后续要用到的数据类型。但为了导入这两个schema,我们需要把它们转化成ldif格式。OpenLDAP在2.4及后续版本中可以使用slaptest命令将2.3中使用的conf文件转换成所需的新的ldif格式。因此,为了将两个schema转换成配置文件的ldif格式,我们首先需要写一个conf文件。以下是所需的conf文件及其内容:

[root@localhost schema]# pwd
/etc/openldap/schema
[root@localhost schema]# cat import.conf
include core.schema
include cosine.schema
include /etc/openldap/schema/inetorgperson.schema
[root@localhost schema]#


如上所示,我将conf文件命名为import.conf,并将其放在了schema所在目录。在这个文件中引入了所需的所有的schema文件。然后使用slaptest命令完成转换:



这样,转换后的配置文件就存到了/tmp/import目录中。我们可以查看转换后的内容:

OpenLDAP的安装与基本使用方法(上)_第10张图片

可以看到相关的schema已经被转化成ldif格式。接下来只需把这几个ldif文件拷贝到slapd的目录中:

[root@localhost schema]# cd /tmp/import/cn\=config/cn\=schema
[root@localhost cn=schema]# ls
cn={0}core.ldif  cn={1}cosine.ldif  cn={2}inetorgperson.ldif
[root@localhost cn=schema]# cp * /etc/openldap/slapd.d/cn\=config/cn\=schema/
[root@localhost cn=schema]# ls /etc/openldap/slapd.d/cn\=config/cn\=schema/
cn={0}core.ldif  cn={1}cosine.ldif  cn={2}inetorgperson.ldif


这样,我们就将所需的schema导入了,接下来把slapd重新启动一下,确保新的schema被读入:

# service slapd restart
Redirecting to /bin/systemctl restart  slapd.service


完成准备工作后,我们可以添加一些数据了。首先我们添加一个organization,仍然是使用ldif文件格式:

dn: dc=my-domain,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
dc: my-domain
o: ExmapleCo


注意这条数据的objectClass分别是top,dcObject以及organisation。有关数据类型的具体含义可以查看OpenLDAP的管理文档[2]。这里只需要明白这是一个"组织"类型的数据,可以包含类型为"用户组"的数据,而"用户组"可以包含"用户"。我们稍后将会创建"用户组"和"用户",目前将这个文件保存为exampleco.ldif并进行导入:

OpenLDAP的安装与基本使用方法(上)_第11张图片

注意在命令中我们使用-x选项来使用简单认证方式,并分别使用-D和-w来使用olcRootDN和olcRootPW登录至ldap服务器,最后我们使用-f来指定导入文件。从上面程序的输出可以看到数据被成功添加了,于是我们可以使用ldapsearch来进行查询:

OpenLDAP的安装与基本使用方法(上)_第12张图片

ldapsearch的使用方法和ldapadd类似,其中-b选项指定查询的dn,因为我们的数据库的dn为dc=my-domain,dc=com,上面添加的数据也在这里,因此查询范围就设定为这里。

接下来让我们创建用户组及用户数据文件,并将其命名为usergroup.ldif。文件内容如下:

dn: ou=Users,dc=my-domain,dc=com
ou: Users
cn: LDAP Users
description: Users of LDAP
objectClass: groupOfNames
member: uid=weli,ou=Users,dc=my-domain,dc=com

# Weinan Li
dn: uid=weli,ou=Users,dc=my-domain,dc=com
ou: Users
# Name info:
uid: weli
cn: Weinan Li
sn: Weinan
givenName: Weinan
displayName: Weinan Li
# Work Info:
title: Software Engineer
description: Systems Integration and IT for Example.Com
employeeType: Employee
departmentNumber: 001
employeeNumber: 001-08-98
mail: [email protected]
mail: [email protected]
roomNumber: 301
telephoneNumber: +1 555 555 4321
mobile: +1 555 555 6789
st: Beijing
l: Beijing
street: Foo Bar
# Home Info:
homePhone: +1 555 555 9876
homePostalAddress: Foo Bar
# Misc:
preferredLanguage: en-us,en-gb
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson


如上所示,我们创建了两条数据,他们的dn及objectClass分别为:

dn: ou=Users,dc=my-domain,dc=com
objectClass: groupOfNames

dn: uid=weli,ou=Users,dc=my-domain,dc=com
ou: Users
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson


其中Users为用户组数据,而uid=weli这条用户数据属于Users用户组。注意到数据所使用的objectClass都包含在我们之前导入的schema当中,如果没有导入schema,对应的数据类型将无法使用。比如用户数据中的"homePhone"等属性也就无法使用[3]。接下来同样将这个文件中的数据导入:

ldapadd -x -D 'cn=Manager,dc=my-domain,dc=com' -w secret -f exampleco.ldif
adding new entry "dc=my-domain,dc=com"
adding new entry "uid=weli,ou=Users,dc=my-domain,dc=com"


接下来我们来做数据查询进行验证:

$ ldapsearch -LLL -x -D 'cn=Manager,dc=my-domain,dc=com' -w secret -b 'dc=my-domain,dc=com' 'uid=weli'
dn: dc=my-domain,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
dc: my-domain
o: ExmapleCo

dn: ou=Users,dc=my-domain,dc=com
ou: Users
cn: LDAP Users
description: Users of LDAP
objectClass: groupOfNames
member: uid=weli,ou=Users,dc=my-domain,dc=com

dn: uid=weli,ou=Users,dc=my-domain,dc=com
ou: Users
uid: weli
cn: Weinan Li
sn: Weinan
givenName: Weinan
displayName: Weinan Li
title: Software Engineer
description: Systems Integration and IT for Example.Com
employeeType: Employee
departmentNumber: 001
employeeNumber: 001-08-98
mail: [email protected]
mail: [email protected]
roomNumber: 301
telephoneNumber: +1 555 555 4321
mobile: +1 555 555 6789
st: Beijing
l: Beijing
street: Foo Bar
homePhone: +1 555 555 9876
homePostalAddress: Foo Bar
preferredLanguage: en-us,en-gb
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson


从上面的ldapsearch查询可以看到导入的三条数据都在数据库当中了。其中-LLL选项是精减输出,去到不必要的内容。我们也可以使用filter来只查所需数据:

[root@localhost ~]# ldapsearch -LLL -x -D 'cn=Manager,dc=my-domain,dc=com' -w secret -b 'dc=my-domain,dc=com' 'uid=weli'
dn: uid=weli,ou=Users,dc=my-domain,dc=com
ou: Users
uid: weli
...


可以看到,通过指定'uid=weli',我们只查询这个用户的数据。‘uid=weli’这个查询条件叫做filter。有关filter的使用可以查看ldapsearch的manpage。

这篇文章就介绍到这里。我们学习了OpenLDAP的安装,配置,导入schema,添加数据,查询数据。在本文的下篇中,我将介绍如果修改数据,删除数据,以及如何配置httpd使用ldap数据库进行用户认证。

参考资料


[1] 从2.3到2.4的迁移方法可以参考 Converting old style slapd.conf(5) file to cn=config format
[2] objectClass对应的含义可以参考OpenLDAP的文档: 5. Configuring slapd
[3]OpenLDAP对schema的定义有一套完整且复杂的标准,有兴趣可以看书做系统学习。Mastering OpenLDAP这本书非常系统地介绍了schema的数据标准。这本书有一个问题是它使用OpenLDAP的2.3版本进行介绍,因此在配置OpenLDAP方面的内容已经过时,需要结合2.4的官方管理文档来配合阅读。总之是一本值得系统阅读的书。

你可能感兴趣的:(LDAP)