OpenLDAP 是一款轻量级目录访问协议(Lightweight Directory Access Protocol,LDAP),属于开源集中账号管理架构的实现,且支持众多系统版本,被广大互联网公司所采用。
LDAP 具有两个国家标准,分别是 X.500 和 LDAP。OpenLDAP 是基于 X.500 标准的,而且去除了 X.500 复杂的功能并且可以根据自我需求定制额外扩展功能,但与 X.500 也有不同之处,例如 OpenLDAP 支持 TCP/IP 协议等,目前 TCP/IP 是 Internet 上访问互联网的协议。
OpenLDAP 则直接运行在更简单和更通用的 TCP/IP 或其他可靠的传输协议层上,避免了在 OSI会 话层和表示层的开销,使连接的建立和包的处理更简单、更快,对于互联网和企业网应用更理想。LDAP 提供并实现目录服务的信息服务,目录服务是一种特殊的数据库系统,对于数据的读取、浏览、搜索有很好的效果。目录服务一般用来包含基于属性的描述性信息并支持精细复杂的过滤功能,但 OpenLDAP 目录服务不支持通用数据库的大量更新操作所需要的复杂的事务管理或回滚策略等。
OpenLDAP 默认以 Berkeley DB 作为后端数据库,Berkeley DB 数据库主要以散列的数据类型进行数据存储,如以键值对的方式进行存储。Berkeley DB 是一类特殊的数据库,主要用于搜索、浏览、更新查询操作,一般对于一次写入数据、多次查询和搜索有很好的效果。Berkeley DB 数据库是面向查询进行优化,面向读取进行优化的数据库。Berkeley DB 不支持事务型数据库(MySQL、MariDB、Oracle等)所支持的高并发的吞吐量以及复杂的事务操作。
OpenLDAP 目录中的信息是按照 树形结构 进行组织的,具体信息存储在条目(entry)中,条目可以看成关系数据库中的表记录,条目是具有区别名(Distinguished Name,DN)的属性(attribute),DN 是用来引用条目,DN 相当于关系数据库(Oracle/MySQL)中的主键(primary key),是唯一的。属性由类型(type)和一个或者多个值(value)组成,相当于关系数据库中字段的概念。
首先需要了解的是Schema(表),Schema可以理解为OOP中的类,Schema中定义了objectClass和其他属性,其他属性分为必选属性和可选属性。一个Schema可以看成就是一个objectClass。而之所以在objectClass中还可以定义objectClass,个人觉的是为了方便实现继承。
接着需要了解的是entry(条目),entry可以理解为OOP中的对象,每一个entry的创建都需要根据自身的objectClass进行检查,是否非法,个人理解可以看成是Schema“实例化”为entry的过程。
openLDAP采用这样基于Schema和entry的数据组织方式,保证整个目录树没有非法条目数据,避免不合法的条目存在目录树中,从而保障整个目录树信息的完整性、唯一性。
个人理解的openLDAP的数据组织方式如下:
openLDAP常见的属性如下:
openLDAP 属性名 | 全拼 | 含义 |
objectClass objectClass | objectClass objectClass | 是特殊的属性,包含数据存储的方式以及相关属性信息 |
c | country | 通常指一个二位国家的名称,例如CN、US等国家代号。例如,c:CN |
I | I | 通常指一个地方的地名。例如,I:Shanghai |
dc | domain component | 通常指定一个域名。例如,dc=example,dc=com |
ou | organization unit | 通常指定一个组织单元的名称。 例如,ou=people,dc=example,dc=com |
o | organization Name | 通常指定一个组织的名字 |
sn | sur name | 通常指一个人的姓氏。例如,sn:Guo |
giveName | giveName | 通常指一个人的名字。例如,giveName:Guodayong,但不能指姓氏 |
cn | common name | 通常指一个对象的名称,如果是人,需要使用全名 |
uid | user id | 通常指一个用户的登录名称。 例如,uid=dpgdy,与系统中的uid不是一个概念 |
rdn | relative dn | 通常指相对标识名,类似于Linux文件系统中的相对路径。 例如,uid=dpgdy |
dn | distinguished name | 唯一标识名,类似于Linux文件系统中的绝对路径,每个对象都有唯一标识名。 例如,uid=dpgdy,ou=People,dc=gdy,dc=com |
通常指登录账号的邮箱地址,例如,mail:[email protected] | ||
telephoneNumber | telephoneNumber | 通常指登录账号的手机号码,例如,telephoneNumber:xxxxxxxxxxx |
使用docker安装openLDAP非常简单。
此处选择的镜像是osixia/openldap:1.2.2,运行以下命令,即可快速的搭建一个openLDAP服务器:
docker run -p 389:389 -p 689:689 --name my-openldap-container --detach osixia/openldap:1.2.2
参数解释:
-p 389:389
将容器的389端口暴露在宿主机的389端口-p 689:689
将容器的689端口暴露在宿主机的689端口--name my-openldap-container
将docker容器命名为’my-openldap-container’--detach
后台运行osixia/openldap:1.2.2
需要运行的image名称运行以上的命令后,即已创建了一个openLDAP服务。
运行以下命令可以测试服务是否已成功启动:
docker exec my-openldap-container ldapsearch -x -H ldap://localhost -b dc=example,dc=org -D "cn=admin,dc=example,dc=org" -w admin
若成功得到类似以下文本的返回值,代表服务启动成功。
# extended LDIF
#
# LDAPv3
# base with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
[...]
# numResponses: 3
# numEntries: 2
可以通过 --env [环境变量名] = [环境变量值]
为启动的openLDAP服务容器设置初始值,例如:
docker run --env LDAP_ORGANISATION="My company" --env LDAP_DOMAIN="my-company.com" \
--env LDAP_ADMIN_PASSWORD="JonSn0w" --detach osixia/openldap:1.2.2
常用的环境变量如下:
LDAP_ORGANISATION
组织名称。默认为Example Inc.LDAP_DOMAIN
Ldap域。默认为example.orgLDAP_BASE_DN
Ldap基本DN。如果为空,则自动从LDAP_DOMAIN值设置。默认为(empty)LDAP_ADMIN_PASSWORD
Ldap管理员密码。默认为adminLDAP_CONFIG_PASSWORD
Ldap配置密码。默认为configLDAP_READONLY_USER
添加只读用户。默认为falseLDAP_READONLY_USER_USERNAME
只读用户名。默认为readonlyLDAP_READONLY_USER_PASSWORD
只读用户密码。默认为readonly与TLS相关的环境变量如下:
LDAP_TLS
添加openldap TLS功能。设置为true后无法删除。默认为true。LDAP_TLS_CRT_FILENAME
Ldap ssl证书文件名。默认为ldap.crtLDAP_TLS_KEY_FILENAME
Ldap ssl证书私钥文件名。默认为ldap.keyLDAP_TLS_CA_CRT_FILENAME
Ldap ssl CA证书文件名。默认为ca.crtLDAP_TLS_ENFORCE
强制执行TLS但ldapi连接除外。设置为true后无法禁用。默认为false。LDAP_TLS_CIPHER_SUITE
TLS密码套件。默认为SECURE256:+SECURE128:-VERS-TLS-ALL:+VERS-TLS1.2:-RSA:-DHE-DSS:-CAMELLIA-128-CBC:-CAMELLIA-256-CBC,基于Red Hat的TLS强化指南LDAP_TLS_VERIFY_CLIENT
TLS验证客户端。默认为demand与复制操作相关的环境变量如下:
LDAP_REPLICATION
添加openldap复制功能。默认为false
LDAP_REPLICATION_CONFIG_SYNCPROV
用于配置数据库的olcSyncRepl选项。没有基于LDAP_REPLICATION_HOSTS自动添加的rid和provider。默认为binddn="cn=admin,cn=config" bindmethod=simple credentials=$LDAP_CONFIG_PASSWORD searchbase="cn=config" type=refreshAndPersist retry="60 +" timeout=1 starttls=critical
LDAP_REPLICATION_DB_SYNCPROV
用于数据库的olcSyncRepl选项。没有基于LDAP_REPLICATION_HOSTS自动添加的rid和provider。默认为binddn=“cn=admin, L D A P B A S E D N " b i n d m e t h o d = s i m p l e c r e d e n t i a l s = LDAP_BASE_DN" bindmethod=simple credentials= LDAPBASEDN"bindmethod=simplecredentials=LDAP_ADMIN_PASSWORD searchbase=”$LDAP_BASE_DN" type=refreshAndPersist interval=00:00:00:10 retry=“60 +” timeout=1 starttls=criticalLDAP_REPLICATION_HOSTS
复制主机列表,必须包含由docker run命令上的–hostname设置的当前容器主机名。默认为:- ldap://ldap.example.org
- ldap://ldap2.example.org
如果要在docker run命令中设置此变量,请添加标记#PYTHON2BASH:并在python中转换yaml:
docker run --env LDAP_REPLICATION_HOSTS="#PYTHON2BASH:['ldap://ldap.example.org','ldap://ldap2.example.org']" --detach osixia/openldap:1.2.2
其他环境变量如下:
KEEP_EXISTING_CONFIG
不要更改ldap配置。默认为false
如果使用现有数据库设置为true,则config将保持不变。image tls和复制配置将不会运行。容器可以使用LDAP_ADMIN_PASSWORD和LDAP_CONFIG_PASSWORD空启动或填充假数据。
如果在引导新数据库时设置为true,则不会添加bootstap ldif和schema,并且不会运行tls和replication config。
LDAP_REMOVE_CONFIG_AFTER_SETUP
安装后删除配置文件夹。默认为true
LDAP_SSL_HELPER_PREFIX
ssl-helper环境变量前缀。默认为ldap,ssl-helper在SSL_HELPER_ *变量之前首先从LDAP_SSL_HELPER_ *变量中搜索配置。
HOSTNAME
设置正在运行的openldap服务器的主机名。默认为docker创建的任何内容。
为docker run 命令添加如下参数,即可将LDAP数据库文和LDAP配置文件保存在容器外部。下次重新创建容器时同样加上这两个参数,即可以使用现有的ldap数据库。
--volume /data/slapd/database:/var/lib/ldap \
--volume /data/slapd/config:/etc/ldap/slapd.d \
yum -y install httpd php php-ldap php-gd php-mbstring php-pear php-bcmath php-xml
wget https://nchc.dl.sourceforge.net/project/phpldapadmin/phpldapadmin-php5/1.2.3/phpldapadmin-1.2.3.tgz
tar -zxf phpldapadmin-1.2.3.tgz
mv phpldapadmin-1.2.3 /var/www/html/phpldapadmin
cd /var/www/html/phpldapadmin/config
cp config.php.example config.php
vim config.php
$servers->newServer('ldap_pla');
$servers->setValue('server','name','LDAP Server');
$servers->setValue('server','host','127.0.0.1');
$servers->setValue('server','port',389);
$servers->setValue('server','base',array('[根据openLDAP配置]'));/*本文默认配置为:dc=example,dc=org*/
$servers->setValue('login','auth_type','session');
$servers->setValue('login','bind_id','[根据openLDAP配置]');/*本文默认配置为:cn=admin,dc=example,dc=org*/
$servers->setValue('login','bind_pass','[根据openLDAP配置]');/*本文默认配置为:admin*/
$servers->setValue('server','tls',false);
systemctl start httpd
如果需要修改配置文件,则需要修改config.php
文件,并重启httpd服务,systemctl restart httpd
配置结束后在浏览器输入http://[ip]/phpldapadmin
即可访问。注意需要开放80端口或者关闭防火墙。如果成功应该可以看到下图的界面。
openLDAP参考 https://github.com/lanniu/docker-openldap
phpLDAPadmin参考 https://github.com/lanniu/docker-phpLDAPadmin https://erniu.me/2018/08/08/OpenLDAP安装-phpLDAPadmin/