openLDAP入门与安装

openLDAP简介

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)组成,相当于关系数据库中字段的概念。

openLDAP特点

  • OpenLDAP 是一个跨平台的标准互联网协议,它基于 X.500 标准协议。
  • OpenLDAP 提供静态数据查询搜索,不需要像在关系数据中那样通过 SQL 语句维护数据库信息。
  • OpenLDAP 基于推和拉的机制实现节点间数据同步,简称复制(replication)并提供基于 TLS、SASL 的安全认证机制,实现数据加密传输以及 Kerberos 密码验证功能。
  • OpenLDAP 可以基于第三方开源软件实现负载(LVS、HAProxy)及高可用性解决方案,24 小时提供验证服务,如 Headbeat、Corosync、Keepalived 等。
  • OpenLDAP 数据元素使用简单的文本字符串(简称 LDIF 文件)而非一些特殊字符,便于维护管理目录树条目。
  • OpenLDAP 可以实现用户的集中认证管理,所有关于账号的变更,只须在 OpenLDAP 服务器端直接操作,无须到每台客户端进行操作,影响范围为全局。
  • OpenLDAP 默认使用协议简单如支持 TCP/IP 协议传输条目数据,通过使用查找操作实现对目录树条目信息的读写操作,同样可以通过加密的方式进行获取目录树条目信息。
  • OpenLDAP 产品应用于各大应用平台(Nginx、HTTP、vsftpd、Samba、SVN、Postfix、OpenStack、Hadoop 等)、服务器(HP、IBM、Dell等)以及存储(EMC、NetApp等)控制台,负责管理账号验证功能,实现账号统一管理。
  • OpenLDAP 实现具有费用低、配置简单、功能强大、管理容易及开源的特点。
  • OpenLDAP 通过 ACL(Access Control List)灵活控制用户访问数据的权限,从而保证数据的安全性。

openLDAP数据组织

首先需要了解的是Schema(表)Schema可以理解为OOP中的,Schema中定义了objectClass和其他属性,其他属性分为必选属性和可选属性。一个Schema可以看成就是一个objectClass。而之所以在objectClass中还可以定义objectClass,个人觉的是为了方便实现继承。

接着需要了解的是entry(条目)entry可以理解为OOP中的对象,每一个entry的创建都需要根据自身的objectClass进行检查,是否非法,个人理解可以看成是Schema实例化”为entry的过程。

openLDAP采用这样基于Schemaentry的数据组织方式,保证整个目录树没有非法条目数据,避免不合法的条目存在目录树中,从而保障整个目录树信息的完整性、唯一性。

个人理解的openLDAP的数据组织方式如下:
image

openLDAP属性

openLDAP常见的属性如下:

openLDAP 属性名全拼含义
objectClass objectClassobjectClass objectClass是特殊的属性,包含数据存储的方式以及相关属性信息
ccountry通常指一个二位国家的名称,例如CN、US等国家代号。例如,c:CN
II通常指一个地方的地名。例如,I:Shanghai
dcdomain component通常指定一个域名。例如,dc=example,dc=com
ouorganization unit通常指定一个组织单元的名称。 例如,ou=people,dc=example,dc=com
oorganization Name通常指定一个组织的名字
snsur name通常指一个人的姓氏。例如,sn:Guo
giveNamegiveName通常指一个人的名字。例如,giveName:Guodayong,但不能指姓氏
cncommon name通常指一个对象的名称,如果是人,需要使用全名
uiduser id通常指一个用户的登录名称。 例如,uid=dpgdy,与系统中的uid不是一个概念
rdnrelative dn通常指相对标识名,类似于Linux文件系统中的相对路径。 例如,uid=dpgdy
dndistinguished name唯一标识名,类似于Linux文件系统中的绝对路径,每个对象都有唯一标识名。 例如,uid=dpgdy,ou=People,dc=gdy,dc=com
mailmail通常指登录账号的邮箱地址,例如,mail:dayong_guo@126.com
telephoneNumbertelephoneNumber通常指登录账号的手机号码,例如,telephoneNumber:xxxxxxxxxxx

安装配置

使用docker安装openLDAP

使用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 <dc=example,dc=org> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

[...]

# numResponses: 3
# numEntries: 2
openLDAP环境变量

可以通过 --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.org
  • LDAP_BASE_DN Ldap基本DN。如果为空,则自动从LDAP_DOMAIN值设置。默认为(empty)
  • LDAP_ADMIN_PASSWORD Ldap管理员密码。默认为admin
  • LDAP_CONFIG_PASSWORD Ldap配置密码。默认为config
  • LDAP_READONLY_USER 添加只读用户。默认为false
  • LDAP_READONLY_USER_USERNAME 只读用户名。默认为readonly
  • LDAP_READONLY_USER_PASSWORD 只读用户密码。默认为readonly

与TLS相关的环境变量如下:

  • LDAP_TLS 添加openldap TLS功能。设置为true后无法删除。默认为true。
  • LDAP_TLS_CRT_FILENAME Ldap ssl证书文件名。默认为ldap.crt
  • LDAP_TLS_KEY_FILENAME Ldap ssl证书私钥文件名。默认为ldap.key
  • LDAP_TLS_CA_CRT_FILENAME Ldap ssl CA证书文件名。默认为ca.crt
  • LDAP_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 &quot; 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&quot; 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=critical
  • LDAP_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创建的任何内容。

openLDAP数据持久化

为docker run 命令添加如下参数,即可将LDAP数据库文和LDAP配置文件保存在容器外部。下次重新创建容器时同样加上这两个参数,即可以使用现有的ldap数据库。

--volume /data/slapd/database:/var/lib/ldap \
--volume /data/slapd/config:/etc/ldap/slapd.d \
安装phpLDAPadmin
  • 安装Apache和PHP
yum -y install httpd php php-ldap php-gd php-mbstring php-pear php-bcmath php-xml
  • 下载phpldapadmin
wget https://nchc.dl.sourceforge.net/project/phpldapadmin/phpldapadmin-php5/1.2.3/phpldapadmin-1.2.3.tgz
  • 解压phpldapadmin
tar -zxf phpldapadmin-1.2.3.tgz
  • 把phpldapadmin目录放到/var/www/html下
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);
  • 启动httpd服务
systemctl start httpd

如果需要修改配置文件,则需要修改config.php文件,并重启httpd服务,systemctl restart httpd

配置结束后在浏览器输入http://[ip]/phpldapadmin即可访问。注意需要开放80端口或者关闭防火墙。如果成功应该可以看到下图的界面。

image

openLDAP参考 https://github.com/lanniu/docker-openldap

phpLDAPadmin参考 https://github.com/lanniu/docker-phpLDAPadmin https://erniu.me/2018/08/08/OpenLDAP安装-phpLDAPadmin/

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值