LDAP系列(1):快速搭建 LDAP 服务器

LDAP (Lightweight Directory Access Protocol) 是轻型目录访问协议,以目录形式存储信息(基于目录的数据库),具有良好的读性能。

前提

本文在 CentOS 7.x 上部署。

关闭防火墙

首先使用systemctl status firewalld确认防火墙是否打开,如过打开,则关闭:

1
2
systemctl stop firewalld
systemctl disable firewalld

关闭 Selinux

使用命令getenforce查看结果是否为Disabled,若不是,则关闭 Selinux:

  • 临时的生效:执行setenforce 0;
  • 永久生效:修改配置文件/etc/sysconfig/selinux,把SELINUX=disabled,然后重启 。

部署 LDAP 服务器

安装软件

安装openldap与相关的软件包:

1
yum install -y openldap openldap-clients openldap-servers migrationtools

启动 LDAP

生成秘钥

记下生成的值,在后面配置的时候要用

1
slappasswd -s <password>

生成类似{SSHA}v/GJvGG8SbIuCxhfTDVhkmWEuz2afNIR的秘钥。

复制配置模板

1
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG

生成数据库文件

使用如下命令生成数据库文件,不必担心报错信息。

1
slaptest

修改 LDAP 数据库所属用户与组

1
chown ldap:ldap /var/lib/ldap/*

启动 LDAP 服务

1
2
systemctl start slapd
systemctl enable slapd

配置 LDAP

在LDAP目录服务中使用LDIF(LDAP Interchange Format)格式来保存信息,而LDIF是一种标准的文本文件且可以随意的导入导出,所以我们需要有一种“格式”标准化LDIF文件的写法,这中格式叫做“schema”,schema用于指定一个目录中所包含对象的类型,以及每一个类型中的可选属性,我们可以将schema理解为面向对象程序设计中的“类”,通过“类”定义出具体的对象,因此其实LDIF数据条目则都是通过schema数据模型创建出来的具体对象:

ldapadd命令用于将LDIF文件导入到目录服务数据库中,格式为ldapadd [参数] LDIF文件

参数 作用
-x 进行简单认证
-D 用于绑定服务器的dn
-h 目录服务的地址
-w 绑定dn的密码
-f 使用LDIF文件进行条目添加的文件

添加基础模块

首先添加cosine/nis/inetorgperson三个基础模块:

1
2
3
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif 
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif

配置 LDAP 域名、管理员用户和密码

创建/etc/openldap/changes.ldif文件,并将下面的信息复制进去:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 修改域名
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=hikscale,dc=com

# 修改管理员用户
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=hikscale,dc=com

# 修改管理员密码
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: 此处输入之前生成的密码(如{SSHA}v/GJvGG8SbIuCxhfTDVhkmWEuz2afNIR)

# 修改访问权限
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.base="cn=Manager,dc=hikscale,dc=com" read by * none

将新的配置文件更新到slapd服务程序:

1
ldapmodify -Y EXTERNAL -H ldapi:/// -f /etc/openldap/changes.ldif

创建目录的基础结构

创建/etc/openldap/base.ldif文件,并将下面的信息复制进去:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
dn: dc=hikscale,dc=com
dc: hikscale
objectClass: top
objectClass: domain

dn: ou=People,dc=hikscale,dc=com
ou: People
objectClass: top
objectClass: organizationalUnit

dn: ou=Group,dc=hikscale,dc=com
ou: Group
objectClass: top
objectClass: organizationalUnit

创建目录的基础结构:

1
ldapadd -x -w <密码> -D cn=Manager,dc=hikscale,dc=com -f /etc/openldap/base.ldif

安全

因为LDAP目录服务是以明文的方式在网络中传输数据的(包括密码),这样非常不安全。可以采用TLS加密机制来解决这个问题。

生成证书

使用openssl工具生成X509格式的证书文件,存放在 ldap 目录下:

1
openssl req -new -x509 -nodes -out /etc/openldap/certs/cert.pem -keyout /etc/openldap/certs/priv.pem -days 365

修改证书的所属与私有证书的权限:

1
2
chown ldap:ldap /etc/openldap/certs/*
chmod 600 /etc/openldap/certs/priv.pem

配置服务器配置

编辑/etc/sysconfig/slapd,加入以下内容:

1
2
SLAPD_URLS="ldapi:/// ldap:/// ldaps:///"
SLAPD_LDAPS=yes

创建/etc/openldap/pem.ldif文件,并将下面的信息复制进去:

1
2
3
4
5
6
7
8
9
dn: cn=config
changetype: modify
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/openldap/certs/cert.pem

dn: cn=config
changetype: modify
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/openldap/certs/priv.pem

将新的配置文件更新到slapd服务程序:

1
ldapmodify -Y EXTERNAL -H ldapi:/// -f /etc/openldap/pem.ldif

重启 slapd 服务

1
systemctl restart slapd

部署秘钥

安装httpd服务程序:

1
yum install httpd -y

将密钥文件上传至网站目录:

1
cp /etc/openldap/certs/cert.pem /var/www/html

将httpd服务程序重启,并添加到开机启动项:

1
2
systemctl restart httpd
systemctl enable httpd

这样用户就可以使用 TSL 加密链接访问 LDAP 服务器了。