阿男的小窝

View the Project on GitHub

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

在上篇文章里,我们查询了dc=my-domain,dc=com这个数据库。从查询结果来看,这个数据库里还没有任何数据,因此我们需要首先往数据库里添加数据。

在添加数据之前,我们首先要将相关的schema添加进slapd的配置目录当中。在slapd.d中可以看到OpenLDAP默认提供了很多schema:

$ pwd
/etc/openldap
$ ls schema/
collective.ldif    corba.schema  cosine.ldif    duaconf.schema   inetorgperson.ldif    java.schema  nis.ldif       openldap.schema  ppolicy.ldif
collective.schema  core.ldif     cosine.schema  dyngroup.ldif    inetorgperson.schema  misc.ldif    nis.schema     pmi.ldif         ppolicy.schema
corba.ldif         core.schema   duaconf.ldif   dyngroup.schema  java.ldif             misc.schema  openldap.ldif  pmi.schema
$

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

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

可以看一下这个ldif里面的内容:

[root@f64 cn=schema]# head cn\=\{0\}core.ldif 
# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
# CRC32 0acd7455
dn: cn={0}core
objectClass: olcSchemaConfig
cn: {0}core
olcAttributeTypes: {0}( 2.5.4.2 NAME 'knowledgeInformation' DESC 'RFC2256: k
 nowledge information' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.
 121.1.15{32768} )
olcAttributeTypes: {1}( 2.5.4.4 NAME ( 'sn' 'surname' ) DESC 'RFC2256: last 
 (family) name(s) for which the entity is known by' SUP name )
[root@f64 cn=schema]# 

这篇文章里不展开讲解ldif文件的格式。此时为了创建用户的基本数据类型,我们还需要引入两个schema:

cosine.schema
inetorgperson.schema

这两个schema文件位于openldap的schema目录:

[root@f64 schema]# pwd
/etc/openldap/schema
[root@f64 schema]# ls cosine.schema 
cosine.schema
[root@f64 schema]# ls inetorgperson.schema 
inetorgperson.schema
[root@f64 schema]# 

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

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

[root@f64 schema]# 

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

[root@f64 schema]# mkdir -p /tmp/import
[root@f64 schema]# slaptest -f import.conf -F /tmp/import/
config file testing succeeded

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

[root@f64 schema]# ls /tmp/import
'cn=config'  'cn=config.ldif'

完整内容如下:

[root@f64 schema]# tree /tmp/import/
/tmp/import/
├── cn=config
│   ├── cn=schema
│   │   ├── cn={0}core.ldif
│   │   ├── cn={1}cosine.ldif
│   │   └── cn={2}inetorgperson.ldif
│   ├── cn=schema.ldif
│   ├── olcDatabase={0}config.ldif
│   └── olcDatabase={-1}frontend.ldif
└── cn=config.ldif

2 directories, 7 files

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

[root@f64 cn=schema]# pwd
/etc/openldap/slapd.d/cn=config/cn=schema
[root@f64 cn=schema]# cp /tmp/import/cn\=config/cn\=schema/* .
cp: overwrite './cn={0}core.ldif'? y

上面的命令过程当中,我选择覆盖已有的core.ldif,这个没关系的,因为都是同一个openldap里面带的文件,所以从core.schema生成的ldif文件也是一样的。

这里要同时使用core.ldifcosine.ldifinetorgperson.ldif,是因为inetorgperson.ldif同时依赖前两者。而我们主要要用的是最后这个inetorgperson.ldif,用来创建一些用户信息。可以把这些ldif文件,也就是schema文件,理解为数据规范,约定数据的结构和类型,这一点有点类似于关系型数据库里面的tables。

因为我们在上面一直使用root权限来操作数据,要调整一下上面的ldif文件的owner才能让slapd来正常访问这些文件:

[root@f64 cn=schema]# ls -l
total 32
-rw------- 1 ldap ldap 15546 Dec 28 22:39 'cn={0}core.ldif'
-rw------- 1 root root 11363 Dec 28 22:39 'cn={1}cosine.ldif'
-rw------- 1 root root  2857 Dec 28 22:39 'cn={2}inetorgperson.ldif'
[root@f64 cn=schema]# chown ldap:ldap *
[root@f64 cn=schema]# ls -l
total 32
-rw------- 1 ldap ldap 15546 Dec 28 22:39 'cn={0}core.ldif'
-rw------- 1 ldap ldap 11363 Dec 28 22:39 'cn={1}cosine.ldif'
-rw------- 1 ldap ldap  2857 Dec 28 22:39 'cn={2}inetorgperson.ldif'

添加了所需的ldif文件并调整好权限以后,我们可以重启slapd服务以使其生效:

[root@f64 cn=schema]# service slapd restart
Redirecting to /bin/systemctl restart  slapd.service
[root@f64 cn=schema]# ps -ef | grep slapd
ldap     27488     1  0 23:04 ?        00:00:00 /usr/sbin/slapd -u ldap -h ldap:/// ldaps:/// ldapi:///

接下来我们就可以往数据库里面添加用户数据了,这个任务留给下一篇文章去做。