1、 前言
本文是基于OpenEuler和CentOS-Stream 9进行OpenLDAP部署的文档,写这篇文档的初衷,是因为发现当前互联网中对OpenLDAP的部署文章都是基于CentOS 7进行的,且存在不同程度的错误之处,而基于CentOS 8之后的版本,或者是其他红帽系的国产Linux发行版的文档却很少甚至是几乎没有,故因此输出本文档。因OpenLDAP无论是在部署还是在配置方面就较为复杂,且不同运维工程师的部署环境不同,所以本文档的部署过程不排除与您存在差异,仅供参考!
2、 LDAP协议基本概念
2.1、LDAP及其相关产品定义
LDAP,即轻型目录访问协议,该协议所定义的是一种树状的数据结构,该数据结构用于存储用户信息和组织架构等,我们所熟知OpenLDAP和Windows AD域等产品都是基于LDAP协议开发而来。而针对于OpenLDAP和Windows AD域等产品,有种说法是将他们定义为树状的数据库,虽然该说法并不是错误的,但要强调的是,OpenLDAP/Windows AD域与MySQL等数据库具有本质上的区别,前者不使用SQL,而使用LDIF,且读性能很优,写性能较差。如下图所示:
2.2、LDAP常见属性与LDIF语法规则
【本章节参考来源:https://www.jianshu.com/p/cce418c6a745 】
2.2.1、LDAP常见属性
在章节2.1的图片中,我们使用了四个属性,分别是dc、ou、cn和uid,这四个属性的含义如下表所示:
属性名称 | 含义 |
---|
dc | 常用来指一个域名的一部分 | ou | 组织单元(如部门)的名字 | cn | 指一个最终对象的名字(如果是人则是全名) | uid | 指一个最终对象的id |
除上述的四个属性之外,LDAP还有其他常用属性,下表将详细列举:
属性名称 | 含义 |
---|
dn | 结构树的完整路径 | dc | 常用来指一个域名的一部分 | c | 国家 | l | 地名 | givenName | 指一个人的名字,不能用来指姓 | o | 组织名字 | ou | 组织单元(如部门)的名字 | cn | 指一个最终对象的名字(如果是人则是全名) | sn | 姓氏 | uid | 一个最终对象的id | mail | 电子邮箱地址 | telephoneNumber | 带国家代码的电话号码 | objectClass | 对象类(特殊属性),声明objectClass后需要定义对象,并对这些对象中必选值和非必选值进行赋值 |
上表提到objectClass是一种较为特殊的属性,在LDAP中,一个条目必须包含一个objectClass属性,objectClass属性可以包含多个值,但必须赋至少一个值。每一个值将用作一条LDAP条目进行数据存储的模板(有些类似于Linux或Windows中的环境变量);模板中包含了一个条目必须被赋值的属性和可选的属性。 objectClass有着严格的等级之分,top和alias是最顶层。例如,organizationalPerson这个objectClass就隶属于person,而person又隶属于top。 objectClass分为以下三类
- 结构型(Structural) :如person和organizationUnit;
- 辅助型(Auxiliary) :如extensibeObject;
- 抽象型(Abstract) :如top,抽象型的objectClass不能直接使用。
在OpenLDAP的schema中定义了很多objectClass,所谓的schema,是指数据库的数据对象集合,也就是组织结构,例如MySQL中,schema指的就是database,而LDAP指的就是树形结构,下面列出部分常用的objectClass的名称:
- account
- alias
- dcobject
- domain
- ipHost
- organization
- organizationalRole
- organizationalUnit
- person
- organizationalPerson
- inetOrgPerson
- residentialPerson
- posixAccount
- posixGroup
各个objectClass对象通常具有必选属性和可选属性,以objectClass=person为例,必选和可选属性如下:
2.2.2、LDIF语法规则
正如SQL用来对常规数据库进行数据管理一样,LDAP通过LDIF脚本来对数据进行管理,其某个条目的基本的语法结构如下:
dn: 条目名
属性描述: 值
属性描述: 值
属性描述: 值
…
字段dn通常用于声明组织结构中的两个顶级域,不能与其他dn重复,一个LDIF文件可以包含多个条目,每个条目之间用空行分隔,需要注意的是,属性描述后面的冒号和值之间有空格。 以创建下图所示的组织结构为例,来编写一个LDIF文件 该图的LDIF文件如下:
dn: dc=yanmuhuan,dc=com
objectclass: top
objectclass: dcobject
objectclass: organization
dc: yanmuhuan
o: yanmuhuan,Inc.
dn: ou=yanmuhuanOU,dc=yanmuhuan,dc=com
ou: yanmuhuanOU
objectclass: organizationalUnit
dn: cn=yanmuhuanCN,ou=yanmuhuanOU,dc=yanmuhuan,dc=com
cn: yanmuhuanCN
sn: yanmuhuanCN
userPassword: {SSHA}dlGcSCEt/TeHsr9kMAqeOTPRocorVJis
objectclass: inetOrgPerson
2.2.3、OpenLDAP常见命令及其常用参数用法
在部署或者是管理OpenLDAP时,可以通过命令行进行相关管理,这些命令行是由openldap-clients提供,可以分为以下两个大类: 第一类,适合本地和远程场景时,所有用户使用的命令: 第二类,适合本地管理者用户使用的命令: 一般情况下,我们使用第一类居多,这类常用命令含义如下:
- ldapsearch:搜索 OpenLDAP 目录树条目;
- ldapadd:通过 LDIF 格式,添加目录树条目;
- ldapdelete:删除 OpenLDAP 目录树条目;
- ldapmodify:修改 OpenLDAP 目录树条目;
- ldapwhoami:效验 OpenLDAP 用户的身份;
- ldapmodrdn:判断 OpenLDAP 目录树 DN 条目;
- ldapcompare:判断 DN 值和指定参数值是否属于同一个条目;
- ldappasswd:修改 OpenLDAP 目录树用户条目实现密码重置。
第二类中的以下几个命令也比较常用:
- slaptest:验证 slapd.conf 文件或 cn=配置目录;
- slapindex:创建 OpenLDAP 目录树索引,提供查询效率;
- slapcat:将数据条目转换为 OpenLDAP 的 LDIF 文件。
针对ldapsearch、ldapadd、ldapdelete、ldapmodify这几条最常用命令,本文涉及到的参数如下:
-x:简单认证;
-Y:静默添加;
-H:ldap网络链接;
-D:指定管理员用户;
-Q:使用SASL快速模式;
-w:密码,和-D指定的管理员配合使用;
-f:指定LDIF文件
-b:ldapsearch命令的参数,指定在何种组织结构范围内搜索
3、 通过包管理器部署OpenLDAP
3.1、安装方式说明和实验拓扑
直接通过包管理器方式部署OpenLDAP的方式目前仅对部分Linux发行版有效,而另一些Linux发行版则因为其软件仓库中不包含相关的安装包而不能直接使用这样的方式,例如在CentOS和RHEL中,CentOS8/RHEL 8及其之后的版本,其软件仓库中已经不含openldap-servers的安装包,因此如要使用包管理器方式部署,则需要安装上游fedora社区的EPEL源,具体命令为“yum install epel-release ”,仓库安装完成后即可使用包管理进行安装,以CentOS-Stream 9为例,如下图所示: 当然也可以使用docker容器方式安装或者是源码安装,docker容器方式安装和源码方式安装适用任何一个Linux发行版。
本实验拓扑如下:
3.2、详细安装步骤
(1) 通过命令“yum install openldap openldap-servers openldap-clients ”安装相应应用,并通过命令“systemctl start slapd ”启动OpenLDAP服务端 (2) 进入到/etc/openldap/slapd.d/cn=config 目录,查看到该目录下存在以下文件,需要注意的是,要留意下图中的红框中的文件,因为不同的服务器中可能名字不一样,本实验中是“{2}mdb.ldif ”,其他服务器可能出现“{1}bdb.ldif ”之类的云云,但只要是以“db.ldif ”结尾的都行 (3) 规划一个管理员密码,本文密码为“yanmuhuan ”,然后输入命令“slappasswd -s yanmuhuan ”生成密文,如下图: (4) 创建“ymh.ldif ”文件(文件名可自定义),并写入如下内容,该文件作用为修改本组织结构的一级域名、二级域名和管理员名称,以及通过密文设置管理员的登录密码:
dn: olcDatabase={2}mdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=yanmuhuan,dc=com
-
replace: olcSuffix
olcSuffix: dc=yanmuhuan,dc=com
-
replace: olcRootPW
olcRootPW: {SSHA}8q0vMxLIf2628l7MbNR1y1rhgHnPFWrh
(5) ymh.ldif文件创建完成后,输入命令“ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f ymh.ldif ”执行该文件,来修改一级域名、二级域名和管理员名称,以及管理员的登录密码,通过查看“olcDatabase={2}mdb.ldif”文件的内容,我们可以看到相关参数被修改: (6) 创建“memberof_config.ldif ”文件(文件名可自定义),并写入如下内容,用于在刚刚安装的OpenLADP中添加memberOf模块,memberOf模块的作用是,当创建一个组的时候,把一些用户添加到这个组里去,它会自动给这些用户添加一个memberOf属性,多数第三方应用在和OpenLDAP对接的时候都会检查这个属性:
dn: cn=module,cn=config
cn: module
objectClass: olcModuleList
olcModuleLoad: memberof
olcModulePath: /usr/lib64/openldap
dn: olcOverlay={0}memberof,olcDatabase={2}mdb,cn=config
objectClass: olcConfig
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: top
olcOverlay: memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfNames
olcMemberOfMemberAD: member
olcMemberOfMemberOfAD: memberOf
首先需要注意olcModulePath 字段,因不同设备存在差异,需要检查OpenLDAP的库文件存放路径是什么地方,通常情况下是/usr/lib64/openldap ;其次,需要留意dn 字段,主要查看olcDatabase 是否为{2}mdb ,如果不是,则以实际环境为准,查看方式见本章节(3.2章节的步骤2) (7) 输入命令“ldapadd -Q -Y EXTERNAL -H ldapi:/// -f memberof_config.ldif ”,执行该文件,以达到添加模块的目的 (8) 此时在路径“/etc/openldap/slapd.d/cn=config ”查看相关文件,如下图所示,可以看到多出来一个模块 (9) 输入以下命令,用于初始化OpenLDAP基础组织结构,当然,在/etc/openldap/schema 目录下有不止以下三种基本结构,针对相关结构的初始化可按实际需要执行:
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
(10) 创建文件“refint1.ldif ”(文件名可以自定义),内容如下,然后输入命令“ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f refint1.ldif ”执行该文件:
dn: cn=module{0},cn=config
add: olcmoduleload
olcmoduleload: refint
(11) 创建文件“refint2.ldif ”(文件名可以自定义),内容如下,然后输入命令“ldapadd -Q -Y EXTERNAL -H ldapi:/// -f refint2.ldif ”执行该文件:
dn: olcOverlay={1}refint,olcDatabase={2}mdb,cn=config
objectClass: olcConfig
objectClass: olcOverlayConfig
objectClass: olcRefintConfig
objectClass: top
olcOverlay: {1}refint
olcRefintAttribute: memberof member manager owner
(12) 编写yanmuhuanCN.ldif 文件(文件名可自定义),创建一个名为“yanmuhuanOU ”的部门,该部门下有一个名为“yanmuhuanCN ”用户,因为在步骤(4)中,我们已经创建了“dc=yanmuhuan,dc=com ”的域名因此本LDIF不再重复声明一级域名和二级域名,最后通过命令“ldapadd -x -D "cn=admin,dc=yanmuhuan,dc=com" -w yanmuhuan -f yanmuhuanCN.ldif ”执行该文件,文件内容和执行方式如下:
dn: ou=yanmuhuanOU,dc=yanmuhuan,dc=com
ou: yanmuhuanOU
objectclass: organizationalUnit
dn: cn=yanmuhuanCN,ou=yanmuhuanOU,dc=yanmuhuan,dc=com
cn: yanmuhuanCN
sn: yanmuhuanCN
userPassword: {SSHA}u8zChO9IP6mE7HwCNE7ovlr1NkFzTO+G
objectclass: inetOrgPerson
(13) 在其他安装有openldap-clients 的Linux系统且保证网络通信的基础上,使用命令“ldapsearch -x -H ldap://192.168.80.129 -D "cn=admin,dc=yanmuhuan,dc=com" -w yanmuhuan -b "dc=yanmuhuan,dc=com" ”如果有结果反馈,则OpenLDAP搭建成功:
4、通过docker容器部署OpenLDAP
4.1、安装说明和实验拓扑
本章描述如何通过docker容器方式部署OpenLDAP,需要注意的是,诸如CentOS-Stream 9、OpenAnolis等Linux发行版的官方软件仓库中并不包含docker的安装包及其依赖,因此本章的docker是通过官方二进制包进行安装的,而如果是OpenEuler,则可以通过命令“yum install docker-engine “完成对docker的安装。 本章实验拓扑与第3章相同。
4.2、详细安装步骤
(1)通过命令“wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.9.tgz ”获取docker官方的二进制包(可以按照实际需求修改为自己需要的版本) (2)通过命令“tar -xvzf docker-20.10.9.tgz “解压该压缩包,解压完成后可在当前目录看到docker文件夹 (3)通过命令“cp docker/* /usr/bin/ ”复制docker文件夹中的二进制文件到/usr/bin目录下 (4)在/etc/systemd/system/ 目录下创建docker.service服务文件,文件内容如下:
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
(5)通过命令“systemctl start docker ”启动docker (6)通过命令“docker run -p 389:389 -p 636:636 --name openldap_docker --network bridge --hostname openldap-host --env LDAP_ORGANISATION="yanmuhuan" --env LDAP_DOMAIN="yanmuhuan.com" --env LDAP_ADMIN_PASSWORD="yanmuhuan" --detach osixia/openldap ”,下载和创建OpenLDAP容器,该命令所用到的参数,含义如下:
-p 389:389 \ 宿主机与容器映射的TCP/IP访问端口,-p 636:636 \ 宿主机与容器映射的SSL连接端口。
–name openldap_docker自行设置容器名称为openldap_docker
–network bridge 连接默认的bridge网络(docker0)
–hostname openldap-host 设置容器主机名称为 openldap-host
–env LDAP_ORGANISATION=“yanmuhuan” 配置LDAP组织名称
–env LDAP_DOMAIN=“yanmuhuan.com” 配置LDAP域名
–env LDAP_ADMIN_PASSWORD=“yanmuhuan” 配置LDAP密码
(7)通过命令“docker ps ”可以看到OpenLDAP相关容器运行正常 (8)关于OpenLDAP容器的配置,需要通过命令“yum install openldap-clients ”安装客户端,用于对组织结构的管理,但无需额外配置,可直接创建相应的OU和CN,例如以第3章中创建cn=yanmuhuanCN,ou=yanmuhuanOU,dc=yanmuhuan,dc=com 的yanmuhuanCN.ldif 为例,命令如下: 可看出,只要容器的389和636端口映射到了宿主机的389和636端口,其管理命令和包管理器方式完全一致。 (9)如果OpenLDAP需要使用docker-compose来编排较为复杂的场景,则可以使用以下脚本来安装docker-compose:
#!/bin/bash
curl -L "https://github.com/docker/compose/releases/download/2.11.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
5、配置zabbix通过OpenLDAP上账户登录
5.1、部署zabbix
详见“https://www.zabbix.com/cn/download”
5.2、配置通过LDAP登录zabbix
(1)设置LDAP信息 (2)对设置的信息进行LDAP连接测试 (3)在zabbix中创建与OpenLDAP的用户的同名用户,如果不创建同名用户,无论是包含Admin超级管理员在内的zabbix默认的认证机制,还是LDAP认证机制,都无法登录到zabbix,此时将会出现使用者被锁在zabbix之外的情况,因此在切换LDAP认证之前,应当创建同名用户 在“用户”和“权限”两张选项卡中分别点击“更新” (4)用户创建成功后,将认证方式切换到LDAP,此时将可以通过OpenLDAP认证登录到zabbix
6、其他注意事项
6.1、不要修改位于/etc/openldap/slapd.d/cn=config路径下面的任何默认LDIF文件,这些默认LDIF是需要通过编写自定义LDIF文件并openldap-clients中的命令进行修改的,相关文件如下所示:
7、参考来源
https://www.jianshu.com/p/cce418c6a745 https://segmentfault.com/a/1190000014683418
|