# OpenLdap 配置安装with MDB,使用LAM管理LDAP,同时启用Slave服务器
作者:东西南北
## **前端和后端**
OpenLDAP 服务器(slapd,独立 LDAP 守护程序)架构分为处理网络访问和协议处理的前端和处理数据存储的后端
## **可用的后端**
Openldap提供了以下这些可用数据存储后端, 我们最常用的是hdb这种数据库后端
- back-bdb:OpenLDAP 的第一个事务后端,建立在 Berkeley DB 之上
- back-hdb : back-bdb 的一种变体,完全分层并支持子树重命名
- back-ldif : 建立在纯文本 LDIF 文件之上
- back-mdb:基于 OpenLDAP 的 Lightning 内存映射数据库 (LMDB) 构建的事务性后端
- back-ndb: 基于 MySQL 的 NDB 集群引擎构建的事务性后端
## **mdb** 数据库**后端性能测试**
(参考文献https://www.openldap.org/pub/hyc/mdb-paper.pdf)
[表 1比较了在“快速”模式下使用 slapadd 最初加载测试数据库时,back-mdb 与back-hdb 的基本性能。
| | **real** | **user** | **sys** |
| -------- | ---------- | ----------- | --------- |
| back-hdb | 66m09.831s | 115m52.374s | 5m15.860s |
| back-mdb | 29m33.212s | 22m21.264s | 7m11.851s |
[表 2](#_bookmark2) ldapsearch 比较
| | **first** | **second** | **slapd size** | **DB size** |
| -------- | --------- | ---------- | -------------- | ----------- |
| back-hdb | 4m15.395s | 0m16.204s | 26GB | 15.6GB |
| back-mdb | 0m14.725s | 0m10.807s | 10GB | 12.8GB |
[表 3](#_bookmark3) 总结了 500 万个条目数据库中随机生成的查询的back-hdb与back-mdb 的结果
| | **Searches/sec** | **Duration, msec** |
| -------- | ---------------- | ------------------ |
| back-hdb | 67456.11 | 1.89 |
| back-mdb | 119255.42 | 0.63 |
总结,MDB 的ldap 的查询效率是远高于传统的数据库,而ldap又是以读取为主的应用,可以说MDB这个数据库是专门为ldap量身定做的,近期笔者在工作中发现ldap有一些性能问题,参考很多针对LDAP的优化文章,其中一个就是把数据库后端修改为mdb,所以也有了这篇文章
## **OpenLdap 配置安装with MDB**
安装 openldap package 并启动 ldap 服务
``` yum install openldap-servers openldap-clients systemctl start slapd systemctl enable slapd ```
### 验证默认数据库类型,可以得到默认数据库为hdb
``` ldapsearch -Y EXTERNAL -Q -H ldapi:/// -LLL -o ldif-wrap=no -b cn=config '(objectClass=olcDatabaseConfig)' '' dn: olcDatabase={-1}frontend,cn=configs dn: olcDatabase={0}config,cn=config dn: olcDatabase={1}monitor,cn=config dn: olcDatabase={2}hdb,cn=config ```
Berkeley Database从DB_CONFIG文件中检索其大部分配置和调整选项。将示例数据库配置文件复制到 LDAP 数据目录 /var/lib/ldap 并更新文件权限(ldap用户会在安装ldap包时自动创建)
``` cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG chown ldap: /var/lib/ldap/* ```
### 生成LDAP管理员密码
``` slappasswd ```
``` helloworld123$ New password: Re-enter new password: {SSHA}AuZ3YLeHIIXz4+3d7eDo2uY9i7wm+rxp ```
记下{SSHA}AuZ3YLeHIIXz4+3d7eDo2uY9i7wm+rxp,马上要用
### 配置mdb数据库
创建mdb.ldif 文件用于用户构建mdb数据库
``` vim mdb.ldif ```
配置文件中对应域名请根据需要替换为自己所需要的,需要修改的地方有
olcSuffix: dc=test,dc=com #对应域名
olcRootDN: cn=admin,dc=test,dc=com #对应管理员名称
olcRootPW: {SSHA}AuZ3YLeHIIXz4+3d7eDo2uY9i7wm+rxp #对应刚才哈希后的密码
``` dn: olcDatabase=mdb,cn=config objectClass: olcDatabaseConfig objectClass: olcMdbConfig olcDatabase: mdb olcDbDirectory: /var/lib/ldap olcSuffix: dc=test,dc=com olcRootDN: cn=admin,dc=test,dc=com olcRootPW: {SSHA}AuZ3YLeHIIXz4+3d7eDo2uY9i7wm+rxp olcDbIndex: objectClass eq,pres olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub olcLastMod: TRUE olcDbEnvFlags: nometasync olcDbEnvFlags: writemap olcDbMaxSize: 9048576000 ```
### 添加mdb数据库
``` [root@ldap-01 ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f mdb.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "olcDatabase=mdb,cn=config" ```
### 导入基础** Schemas** 文件
``` [root@ldap-01 ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=cosine,cn=schema,cn=config" [root@ldap-01 ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=nis,cn=schema,cn=config" [root@ldap-01 ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=inetorgperson,cn=schema,cn=config" ```
### 测试配置
[root@ldap-01 ~]# slaptest 637db48b hdb_db_open: DB_CONFIG for suffix "dc=my-domain,dc=com" has changed. 637db48b Performing database recovery to activate new settings. 637db48b hdb_db_open: database "dc=my-domain,dc=com": recovery skipped in read-only mode. Run manual recovery if errors are encountered. config file testing succeeded
其中hdb_db 报错信息可以忽略,因为我们没有使用hdb的数据库
## Monitor 配置
``` vim monitor.ldif ```
``` 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=admin,dc=test,dc=com" read by * none ```
dn.base 注意修改相应信息,于上面定义的管理员一致
然后导入修改后的monitor.ldif
``` [root@ldap-01 ~]# ldapmodify -Y EXTERNAL -H ldapi:/// -f monitor.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "olcDatabase={1}monitor,cn=config" ```
## 添加域信息
### 为你的域生成 basedomain.ldif 文件
``` vim basedomain.ldif ```
``` dn: dc=test,dc=com dc: test objectClass: top objectClass: domain dn: cn=admin,dc=test,dc=com objectClass: organizationalRole cn: admin description: LDAP Manager dn: ou=People,dc=test,dc=com objectClass: organizationalUnit ou: People dn: ou=Group,dc=test,dc=com objectClass: organizationalUnit ou: Group ```
### 导入目录结构
``` [root@lpad-01 ~]# ldapadd -x -W -D "cn=admin,dc=test,dc=com" -f basedomain.ldif Enter LDAP Password: adding new entry "dc=test,dc=com" adding new entry "cn=ldapadmin ,dc=test,dc=com" adding new entry "ou=People,dc=test,dc=com" adding new entry "ou=Group,dc=test,dc=com" ```
### 验证配置信息
``` [root@ldap-01 ~]# ldapsearch -Y EXTERNAL -H ldapi:/// -b "cn=config" '(objectClass=*)' dn -LLL SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 dn: cn=config dn: cn=schema,cn=config dn: cn={0}core,cn=schema,cn=config dn: cn={1}cosine,cn=schema,cn=config dn: cn={2}nis,cn=schema,cn=config dn: cn={3}inetorgperson,cn=schema,cn=config dn: olcDatabase={-1}frontend,cn=config dn: olcDatabase={0}config,cn=config dn: olcDatabase={1}monitor,cn=config dn: olcDatabase={2}hdb,cn=config dn: olcDatabase={3}mdb,cn=config ```
## 开启日志配置
``` vim loglevel.ldif ```
``` dn: cn=config changetype: modify replace: olcLogLevel olcLogLevel: 255 ```
``` [root@ldap-01 ~]# ldapmodify -Y EXTERNAL -H ldapi:/// -f loglevel.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "cn=config" ```
### 修改日志配置文件
``` [root@ldap-01 ~]#touch /var/log/ldap/slapd.log [root@ldap-01 ~]#echo "local4.* /var/log/ldap/slapd.log" >> /etc/rsyslog.conf ```
### 重启相关服务
``` systemctl restart rsyslog systemctl restart slapd systemctl status slapd ```
## 安装配置LAM管理ldap服务器
### 安装apache web服务器
``` yum install httpd ```
### 安装php7
#### 1.安装epel-release
``` rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm ```
#### 2.安装PHP7的rpm源
``` rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm ```
#### 3.安装PHP7
``` yum -y install php72w ```
#### 安装LAM
``` wget https://master.dl.sourceforge.net/project/lam/LAM/7.2/ldap-account-manager-7.2-0.fedora.1.noarch.rpm ```
``` chmod +x chmod +x ldap-account-manager-7.2-0.fedora.1.noarch.rpm rpm -ivh ldap-account-manager-7.2-0.fedora.1.noarch.rpm ```
#### 浏览器访问http://IP/lam
#### 1 配置LAM configuration,默认用户名密码lam:lam
#### 2 Edit server profiles
#### 3 General Settings 修改两处配置对应自己的服务器信息
#### 4 Account types 修改对应信息
#### 5 尝试建立一个新的用户
到此,LDAP主服务器完成
# 配置ldap从属服务器
## 启用syncprov模块,主服务器操作
``` vim mod_syncprov.ldif ```
``` dn: cn=module,cn=config objectClass: olcModuleList cn: module olcModulePath: /usr/lib64/openldap olcModuleLoad: syncprov.la ```
``` [root@ldap-01 ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f mod_syncprov.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=module,cn=config" ```
### 验证加载成功
``` [root@ldap-01 ~]# slapcat -n 0 | grep olcModuleLoad olcModuleLoad: {0}syncprov.la ```
### 配置同步配置文件
``` vim syncprov.ldif ```
``` dn: olcOverlay=syncprov,olcDatabase={3}mdb,cn=config objectClass: olcOverlayConfig objectClass: olcSyncProvConfig olcOverlay: syncprov olcSpCheckpoint: 100 10 olcSpSessionLog: 100 ```
``` [root@ldap-01 ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f syncprov.ldif ```
# Slave操作
## 安装 openldap package 并启动 ldap 服务
``` yum install openldap-servers openldap-clients systemctl start slapd systemctl enable slapd ```
## 准备数据库配置文件
``` cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG chown ldap: /var/lib/ldap/* ```
## 配置mdb数据库,创建mdb.ldif 文件用于用户构建mdb数据库
``` vim mdb.ldif ```
配置文件中对应域名请根据需要替换为自己所需要的,需要修改的地方有
olcSuffix: dc=test,dc=com #对应域名
olcRootDN: cn=admin,dc=test,dc=com #对应管理员名称
olcRootPW: {SSHA}AuZ3YLeHIIXz4+3d7eDo2uY9i7wm+rxp #对应刚才哈希后的密码
``` dn: olcDatabase=mdb,cn=config objectClass: olcDatabaseConfig objectClass: olcMdbConfig olcDatabase: mdb olcDbDirectory: /var/lib/ldap olcSuffix: dc=test,dc=com olcRootDN: cn=admin,dc=test,dc=com olcRootPW: {SSHA}AuZ3YLeHIIXz4+3d7eDo2uY9i7wm+rxp olcDbIndex: objectClass eq,pres olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub olcLastMod: TRUE olcDbEnvFlags: nometasync olcDbEnvFlags: writemap olcDbMaxSize: 9048576000 ```
## 添加mdb数据库
``` [root@ldap-02 ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f mdb.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "olcDatabase=mdb,cn=config" ```
## 导入基础** Schemas** 文件
``` [root@ldap-02 ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=cosine,cn=schema,cn=config" [root@ldap-02 ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=nis,cn=schema,cn=config" [root@ldap-02 ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=inetorgperson,cn=schema,cn=config" ```
### 导入同步配置
``` vim rp.ldif ```
``` dn: olcDatabase={3}mdb,cn=config changetype: modify add: olcSyncRepl olcSyncRepl: rid=001 provider=ldap://ldap-01:389/ bindmethod=simple binddn="cn=admin,dc=test,dc=com" credentials=helloworld123$ searchbase="dc=test,dc=com" scope=sub schemachecking=on type=refreshAndPersist retry="30 5 300 3" interval=00:00:05:00 ``` ``` [root@ldap-02 ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f rp.ldif ```
### 登录主服务器LAM,修改配置信息,验证从服务器已经同步配置
http://主服务器IP/lam
修改Server Address,使用从服务器IP,保存退出
重新登录LAM,使用管理员用户名密码,此时发现刚才在主服务器新建的用户已经出现在从服务器
至此,从服务器部署完毕
网友留言: