共计 8255 个字符,预计需要花费 21 分钟才能阅读完成。
本文采用的是从源码编译安装,适合 Ubuntu 和 CentOS 平台,通过 apt-get
或yum
方式安装参考补充部分。openldap 原理介绍参考这里。
环境:
Ubuntu: 14.04.1 (trusty), x86_64
OpenLDAP: 2.4.31
Berkery DB: 5.1.29
1 安装
1.1 准备编译环境和依赖包
1
2
|
|
下载 openldap-2.4.31.tgz
和db-5.1.29.NC.tar.gz
并解压:
1
2
3
4
5
6
7
8
9
|
src# wget ftp://ftp.openldap.org/pub/OpenLDAP/openldap-release/openldap-2.4.31.tgz
|
建议人工指定 --prefix
,默认会安装到/usr/local/BerkeleyDB.5.1
。上面的make
过程会比较长,另外如果 gcc 版本在 4.7 及以上,可能会出现如下 warning,可以忽略:
1
2
|
../src/dbinc/atomic.h:179:19: warning: conflicting types for built-in function
‘__atomic_compare_exchange’[enabled by default]
|
1.2 安装 openldap
设置一些环境变量,修改 /etc/profile
或/etc/bash.bashrc
:
1
2
3
4
5
6
7
|
export BERKELEYDB_HOME=“/usr/local/berkeleydb-5.1”
export CPPFLAGS=“-I$BERKELEYDB_HOME/include”
export LDFLAGS=“-L$BERKELEYDB_HOME/lib”
export LD_LIBRARY_PATH=“$BERKELEYDB_HOME/lib”
export LDAP_HOME=“/usr/local/openldap-2.4”
export PATH=“$PATH:$BERKELEYDB_HOME/bin:$LDAP_HOME/bin:$LDAP_HOME/sbin:$LDAP_HOME/libexec”
|
其实只要在后面编译 openldap 时能找到 lib
和include
下的库就行了,不止上面设置环境变量一种办法,解决办法还有直接复制对应的库文件到 /usr/lib
和/usr/include
,或修改/etc/ld.so.conf.d
,选其一即可。
编译安装:
1
2
3
4
|
openldap-2.4.31# ./configure –prefix=/usr/local/openldap-2.4
|
出错提示解决:
如果没设置CPPFLAGS
,上面的 configure 过程可能会提示configure: error: BDB/HDB: BerkeleyDB not available
。
如果提示
1
2
|
configure: error: MozNSS not found – please specify the location to the NSPR and NSS header files
in CPPFLAGS and the location to the NSPR and NSS libraries in LDFLAGS (if not in the system location)
|
或
1
|
configure: error: no acceptable C compiler found in $PATH
|
请检查第一步的依赖是否已经安装,查看 openldap 解压目录下的 README
看到 REQUIRED SOFTWARE。
2 配置
2.1 基本配置
/usr/local/openldap-2.4
目录结构:
1
2
3
4
5
6
7
8
|
bin/ – 客户端工具如 ldapadd、ldapsearch
etc/ – 包含主配置文件 slapd.conf、schema、DB_CONFIG 等
include/
lib/
libexec/ – 服务端启动工具 slapd
sbin/ – 服务端工具如 slappasswd
share/
var/ –bdb 数据、log 存放目录
|
2.1.1 配置 root 密码
1
2
3
4
|
New password:
Re-enter new password:
{SSHA}phAvkua+5B7UNyIAuoTMgOgxF8kxekIk
|
2.1.2 修改后的 slapd.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
include /usr/local/openldap-2.4.31/etc/openldap/schema/core.schema
include /usr/local/openldap-2.4.31/etc/openldap/schema/cosine.schema
include /usr/local/openldap-2.4.31/etc/openldap/schema/inetorgperson.schema
pidfile /usr/local/openldap-2.4.31/var/run/slapd.pid
argsfile /usr/local/openldap-2.4.31/var/run/slapd.args
loglevel 256
logfile /usr/local/openldap-2.4.31/var/slapd.log
database bdb
suffix “dc=mydomain,dc=net”
rootdn “cn=root,dc=mydomain,dc=net”
rootpw {SSHA}UK4eGUq3ujR1EYrOL2MRzMBJmo7qGyY3
directory /usr/local/openldap-2.4.31/var/openldap-data
index objectClass eq
|
根据自己的需要加入 schema,suffix 一般填入域名,rootdn 处是管理 ldap 数据的管理员用户,rootpw 便是使用 slappasswd 生成的加密密码。
2.1.3 启动 slapd 服务
1
|
# /usr/local/openldap-2.4.31/libexec/slapd
|
会自动使用 etc/openldap/slapd.conf
作为配置文件启动,并写入 /usr/local/openldap-2.4.31/var/run/slapd.args
中。这里有个问题未解决,配置 loglevel 和 logfile 但始终都看不到记录的日志,启动时加入 -d 256
能正常输出到屏幕上。
2.1.4 测试数据
编辑一个添加 entries 的文件 test.ldif:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
dn: dc=mydomain,dc=net
objectClass: dcObject
objectClass: organization
dc: mydomain
o: mydomain.Inc
dn: cn=root,dc=mydomain,dc=net
objectClass: organizationalRole
cn: root
dn: ou=itsection,dc=mydomain,dc=net
ou: itsection
objectClass: organizationalUnit
dn: cn=sean,ou=itsection,dc=mydomain,dc=net
ou: itsection
cn: sean
sn: zhouxiao
objectClass: inetOrgPerson
objectClass: organizationalPerson
|
插入数据:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
查看(匿名)
# ldapsearch –x –b ” -s base ‘(objectclass=*)’ namingContexts
添加(读入密码)
# ldapadd –x -D “cn=root,dc=mydomain,dc=net” -W –f test.ldif
验证
# ldapsearch –x –b ‘dc=mydomain,dc=net’ ‘(objectClass=*)’
或手动添加条目
# ldapadd –x -D “cn=root,dc=mydomain,dc=net” -W
Enter LDAP Password:
dn:cn=Angelababy,ou=itsection,dc=mydomain,dc=net
cn:Angelababy
sn:baby
objectClass:inetOrgPerson
objectClass:organizationalPerson
adding new entry “cn=baby,ou=itsection,dc=mydomain,dc=net”
|
到这里,一个简易版的 LDAP 服务就搭建好了,下面介绍一些额外的高级配置。
2.2 配置 TLS 加密传输
在某些应用环境下可能需要加密传输 ldap 里的信息,配置 TLS 难点在于证书的生成。关于 SSL 加密证书的介绍请参考 ssl-tls,下面我们自己搭建 CA,快速自签署 ssl 证书。
2.2.1 自签署 ssl 证书
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
(1) 生成根密钥
(2) 生成根证书,位于 /etc/ssl/demoCA/ 下(CentOS 位于 /etc/pki/CA)
(3) 初始化 CA
demoCA# mkdir private newcerts
(4) 在 ldap 服务器上生成 ssl 密钥(可以是 /tmp/certs 下)
(5) 为 ldap 生成证书签署请求(所填写内容尽量与第 2 步相同)
Common Name 填写主机名或域名,password 留空
(6) ca 根据请求签发证书,得到.crt 证书文件
|
如果在你的环境中已经有一个证书授权中心 CA,那么只需要在 ldap 服务器上使用 openssl 生成密钥 .key
和签署请求.csr
(第 4、5 步),然后将.csr 发给 CA 服务器来生成证书.crt
(第 6 步)。
2.2.2 在 slapd.conf 中加入 TLS
1
2
3
4
5
6
7
8
9
10
|
可以是其它能访问的位置
在 etc
slapd.conf 中加入以下信息TLSCACertificateFile -2.4 openldap cacert.pem
local/openldapTLSCertificateFile -2.4 openldap/ldap.crt
local/openldapTLSCertificateKeyFile -2.4 openldap/ldap.key
local/openldap |
2.2.3 重新启动 slapd
1
2
3
4
|
或只监听 636 加密端口
|
如果是正式环境使用加密的话,389 端口前的 IP 换成 127.0.0.1。
2.2.4 验证
ldapsearch
使用自带的 ldapsearch 或 ldapadd 客户端工具来连接 slapd,需要设置 ldap.conf
或~/.ldaprc
文件中的 TLS_CACERT
为信任的根证书才能使用,否则会提示
1
2
|
TLS certificate verification: Error, self signed certificate in certificate chain
TLS trace: SSL3 alert write:fatal:unknown CA
|
所以在在使用 ldapsearch 的服务器上修改/etc/ldap/ldap.conf
:(man ldap.conf
)
BASE dc=mydomain,dc=net
URI ldaps://apptest.mydomain.net:636
TLS_CACERT /usr/local/openldap-2.4/etc/openldap/cacerts/cacert.pem
(当然也可以 TLS_REQCERT never
来信任根证书)
使用:
ldapsearch -x -D "cn=root,dc=mydomain,dc=net" -W -LLL
或写全
ldapsearch -x -b 'dc=mydomain,dc=net' '(objectClass=*)' -H ldaps://apptest.mydomain.net:636 -D "cn=root,dc=mydomain,dc=net" -W
需要注意的是,URI
后的 Server name 必须与签署证书使用的 Common name 一致。另外在 ldap server 本地执行 ldapsearch 默认使用的客户端配置文件是$LDAP_HOME/etc/openldap/ldap.conf
。
LDAPBrower
另外一种方式是使用第三方 LDAP 客户端连接工具,如 LDAPBrower:
连接:
信任根证书:
查看(可 Add entries):
3 补充
3.1 apt-get 安装
通过 apt-get
在 Ubuntu 上安装 OpenLDAP。
1
2
|
|
安装过程中会提示输入 admin 密码。
安装完成后默认已经启动了 slapd 进程,与自己手动编译不同的是默认采用的配置文件有点区别:
1
2
|
# ps -ef|grep slapd
… /usr/sbin/slapd -h ldap:/// ldapi:/// -g openldap -u openldap -F /etc/ldap/slapd.d
|
/etc/ldap/slapd.d
是 2.4.x 版本新采用的配置文件目录,但手动编辑 slapd.d
目录下 ldif
是非常痛苦的,如果你不习惯新的配置目录格式,你可以通过修改 /etc/default/slapd
中的 SLAPD_CONF=
为SLAPD_CONF="/etc/ldap/slapd.conf"
。
slapd.conf
配置形式官方已经废弃了但依然支持,你还可以选择在编辑完熟悉的 slapd.conf
后使用 openldap 提供的 slaptest 工具将它转换成 slapd.d
配置目录:
1
2
3
|
|
3.2 slapd-config 配置形式的说明
我们把就的配置方式叫 slapd.conf
,新的配置方式叫slapd-config
或 olc(OpenLDAP Configuration,也可以理解为 online config)。slapd.d
目录内包含许多 ldif 文件,就是 slapd.conf
中的内容转化成 ldif 格式,以构成一棵根为 cn=config
的目录树,这棵树包含了许多结点,如:cn=module{0}
, cn=schema
, olcDatabase={1}bdb
……所有配置信息就是这些结点的属性。结构如下图:
使用这种新的配置目录的���处在于:
- 通过 Overlay 截获修改这些目录属性的信息,然后对相应的数据结构进行修改,即管理员可以像修改其它目录属性一样修改
cn=config
目录树下的目录信息,并且修改后即时生效,无需重启服务器。 - 管理员不用像以前那样对服务器的配置文件进行修改,而是可以在任何能够连上 ldap 服务器的地方对配置文件内容进行修改,没有地域的限制。
但是当你需要配置多个 backend 时,slapd-config
方式需要 2.4.33 版本以后才支持,此前的版本还只能使用 slapd.conf
方式。
LDIF 配置格式大致如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
# global configuration settings
dn: cn=config
objectClass: olcGlobal
cn: config
<global config settings>
# schema definitions
dn: cn=schema,cn=config
objectClass: olcSchemaConfig
cn: schema
<system schema>
dn: cn={X}core,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: {X}core
<core schema>
# additional user-specified schema
…
# backend definitions
dn: olcBackend=<typeA>,cn=config
objectClass: olcBackendConfig
olcBackend: <typeA>
<backend-specific settings>
# database definitions
dn: olcDatabase={X}<typeA>,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {X}<typeA>
<database-specific settings>
# subsequent definitions and settings
…
|
我们有时候会发现 ldif 里面会有一些条目是带 {0}
这样的数字,这是因为 ldap 数据库本身是无序的,这些索引一样的数字是用来强制一些依赖于其他配置的设置能够按照正确的顺序先后生效。不过它不用我们去关心,在添加 entries 时如果有需要会自动生成。
ldif 文件中大部分属性和 objectClass 是以 olc
开头的,与就的配置风格 slapd.conf
有着一对一的属性配置选项,如 olcDatabase: {1}hdb
与database bdb
对应。
更多内容请参考 OpenLDAP Software 2.4 Administrator’s Guide。
3.3 slapd-config 修改示例(LDIF)
见 LDIF 修改 LDAP 记录或配置示例。
3.4 LDAP 访问控制示例
待续
3.5 OpenLDAP 复制配置(replication)
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-10/147560.htm