一、LDAP介绍

目录服务(Directory Service)

    目录是专门为搜索和浏览而设计的专用数据库,支持基本的查找和更新功能。提供目录服务的方式有很多。不同的方法允许将不同类型的信息存储在目录中,对如何引用,查询和更新该信息,如何防止未经授权的访问等提出不同的要求(这些由LDAP定义)。一些目录服务是本地的,提供本地服务;一些目录服务是全球性的,向更广泛的环境(例如,整个Internet)提供服务。全局服务通常是分布式的,这意味着它们包含的数据分布在许多机器上,所有这些机器协作以提供目录服务。通常,全局服务定义统一的名称空间,无论在何处访问,都可以提供相同的数据视图。

LDAP(Lightweight Directory Access Protocol)

    LDAP代表轻型目录访问协议(Lightweight Directory Access Protocol)。顾名思义,它是用于访问目录服务的轻量级协议,特别是基于X.500协议的目录服务。LDAP运行于TCP/IP连接上或其他面向传输服务的连接上。LDAP是IETF标准跟踪协议,并且在“Lightweight Directory Access Protocol (LDAP) Technical Specification Road Map” RFC4510中进行了指定。

从用户角度讲LDAP目录中可以存储哪些信息?

    LDAP信息模型基于条目(entries)。一个条目是属性集合(包含很多属性),并且有一个全局唯一的专有名称(Distinguished Name)。DN用于明确地引用条目。条目的每一个属性都有一个类型和一个或多个值。这些类型通常是便于记忆的字符串,例如“ cn ”表示通用名称(common name),或“ mail ”表示电子邮件地址(email address)。值的语法取决于类型。例如,cn属性可能包含值Babs Jensen。一个邮件属性可能包含值“ babs@example.com ”。一个jpegPhoto属性将包含在一张照片JPEG格式 (二进制)格式。

信息如何排布?

    在LDAP中,目录条目以树状分层结构排列。传统上,此结构反映了地理和组织边界。代表国家的条目显示在树的顶部。它们下面是代表省和国家机构的条目。再下一层可能是代表组织单位,人员,打印机,文档或您想到的几乎所有其他内容的条目。

             LDAP介绍及安装使用_目录服务

    该树还可以基于网络域名进行排列。这种命名方法变得越来越流行,因为它允许使用DNS定位目录服务。图1.2显示了基于域名的LDAP目录树示例。

             LDAP介绍及安装使用_LDAP介绍及安装_02

此外,LDAP允许您通过使用名为objectClass的特殊属性来控制条目中需要和允许哪些属性。objectClass属性的值确定条目必须遵循的结构规则。

如何引用这些信息?

    条目由其DN(专有名称)引用,该专有名称是通过采用条目本身的名称来构造的,称为相对专有名称(Relative Distinguished Name 或 RDN),并连接其上级条目的RDN。

    例如,上面的Internet命名示例中,Barbara Jensen条目的RDN为uid = babs,而DN为uid = babs,ou = People,dc = example,dc = com。完整的DN格式在RFC4514 “ LDAP: String Representation of Distinguished Names”中进行了描述。

如何获取信息?

    LDAP定义用于查询和更新目录的操作,提供了用于在目录中添加和删除条目、更改现有条目以及更改条目名称的操作。但是,在大多数情况下,LDAP用于搜索目录中的信息。

    例如,可能想在dc = example,dc = com及以下的整个目录子树中搜索名称为Barbara Jensen的人员。LDAP可以轻松地执行此操作。或者可能想直接在st = California,c = US条目下面搜索条目,以查找名称中包含字符串Acme且具有传真号码的组织。LDAP也可以支持。

如何保护信息避免未经授权的访问?

    有些目录服务不提供保护,任何人都可以查看信息。LDAP为客户端提供了一种向目录服务器进行身份验证或证明其身份的机制,从而为丰富的访问控制铺平了道路。LDAP还支持数据安全(完整性和机密性)服务。

二、为什么使用LDAP

     随着公司内部各种开源平台越来越多(例如:gitlab、Jenkins、Yapi等等),账号维护变成一个繁琐麻烦的事情,急需有一个统一的账号维护平台,一个人只需一个账号,在公司内部平台通用,而大多数开源平台都支持LDAP;因此只要搭建好LDAP服务,并跟钉钉之类的平台实现账号同步,即可实现统一账号管理;

三、安装openldap包

关闭防火墙以及关闭开机启动防火墙:

systemctl stop firewalld

systemctl disable firewalld

关闭selinux: sed -i 's/enforcing/disabled/' /etc/selinux/config  # 永久

                     setenforce 0  # 临时

# yum 安装相关包

yum install -y openldap openldap-clients openldap-servers

# 复制一个默认配置到指定目录下,并授权,这一步一定要做,然后再启动服务,不然生产密码时会报错

cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG

# 授权给ldap用户,此用户yum安装时便会自动创建

chown -R ldap. /var/lib/ldap/DB_CONFIG

# 启动服务,先启动服务,配置后面再进行修改

systemctl start slapd

systemctl enable slapd

# 查看状态,正常启动则ok

systemctl status slapd

四、修改openldap配置文件

setp 1:生成管理员ldap登录密码 保存后面需要使用

# 生成密码 保存后面配置域的时候需要填写,管理员登录密码

slappasswd -s 123456

 {SSHA}PS3T8Lr6IL7hepAhK3PYnKdtU8qe7Jci

setp 2:  新增修改密码配置文件

由于新版的openldap需要通过命令的方式去动态修改ldap配置,所以这里不要在/etc/openldap/slapd.d/目录下创建类似的ldif文件,直接新建一个ldif文件(文件名随意)然后用命令去配置就ok了,如下:

# 新建一个ldif文件并编辑

vim changepwd.ldif

# 文件内容如下 配置完内容ESC :wq保存

dn: olcDatabase={0}config,cn=config

changetype: modify

add: olcRootPW

olcRootPW: {SSHA}PS3T8Lr6IL7hepAhK3PYnKdtU8qe7Jci

# 然后输入以下命令配置刚刚新增的文件changepwd.ldif

ldapadd -Y EXTERNAL -H ldapi:/// -f changepwd.ldif

             LDAP介绍及安装使用_目录服务_03

可以看到新增了一个entry,这里输入以下命令可以查看我配置文件新增了一个olcRootPW项

# 查看配置文件是否成功的把密码加入进去了

cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{0\}config.ldif

             LDAP介绍及安装使用_配置文件_04

setp 3: 导入基本的ldap的schema文件

注意这里要依次执行下面的所有命令,core.ldif是默认加载项,不用导入

# 共计12个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

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/collective.ldif

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/corba.ldif

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/duaconf.ldif

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/dyngroup.ldif

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/java.ldif

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/misc.ldif

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/openldap.ldif

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/pmi.ldif

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/ppolicy.ldif

             LDAP介绍及安装使用_配置文件_05

可以看到状态都是SASL SSF:0 且都是adding new entry 表示成功

setp 4: 新增文件配置内部域名

此步骤很重要,举例我的管理员用户名为admin dc=ihup 表示公司简称 dc=org 表示域名,根据自己需求进行更改

# 新增编辑文件

vim changedomain.ldif

# 把以下内容都写入进去ESC :wq并保存

# 特别注意:这里可以看到每一段都有空行分割,在编辑的时候dn节点前面不能出现空格否则后面配置出错

下面有一段{SSHA}密码是前面生成的加密密码123456

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=ihup,dc=org" read by * none

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=ihup,dc=org

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=ihup,dc=org

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}PS3T8Lr6IL7hepAhK3PYnKdtU8qe7Jci

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess 
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=ihup,dc=org" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=admin,dc=ihup,dc=org" write by * read

编辑好 确保换行没有任何空格就保存,然后配置

# 上面配置文件执行一下
  
 ldapmodify -Y EXTERNAL -H ldapi:/// -f changedomain.ldi

             LDAP介绍及安装使用_目录服务_06

setp 5: 启用memberof.ldif功能,这里需要添加三个文件

到此步骤就完成了一大半了,喝杯咖啡or红牛继续配置吧,奥里给!

# 第一个文件add-memberof.ldif (文件名可自定义 前面说了)

vim add-memberof.ldif

# 写入以下内容并保存

dn: cn=module{0},cn=config

cn: modulle{0}

objectClass: olcModuleList

objectclass: top

olcModuleload: memberof.la

olcModulePath: /usr/lib64/openldap

# 第二个文件refint1.ldif文件

vim refint1.ldif

# 写入以下内容并保存

dn: cn=module{0},cn=config

add: olcmoduleload

olcmoduleload: refint

# 第三个文件refint2.ldif文件

vim refint2.ldif

# 写入以下内容并保存

dn: olcOverlay=refint,olcDatabase={2}hdb,cn=config

objectClass: olcConfig

objectClass: olcOverlayConfig

objectClass: olcRefintConfig

objectClass: top

olcOverlay: refint

olcRefintAttribute: memberof uniqueMember  manager owner

然后依次执行上面三个文件,顺序不要出错

# 依次执行 顺序不要错

ldapadd -Q -Y EXTERNAL -H ldapi:/// -f add-memberof.ldif

ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f refint1.ldif

ldapadd -Q -Y EXTERNAL -H ldapi:/// -f refint2.ldif

setp 6: 最后一步创建一个组织和管理员

最后一步创建一个组织,并在其组织下创建一个admin角色(该组织角色内的用户具有管理整个LDAP的权限)

# 新增一个配置文件

vim base.ldif  

dn: dc=ihup,dc=org
objectClass: top
objectClass: dcObject
objectClass: organization
o: Ihup Company
dc: ihup
 
dn: cn=admin,dc=ihup,dc=org
objectClass: organizationalRole
cn: admin
 
dn: ou=People,dc=ihup,dc=org
objectClass: organizationalUnit
ou: People
 
dn: ou=Group,dc=ihup,dc=org
objectClass: organizationalRole
cn: Group

ldapadd -x -D cn=admin,dc=ihup,dc=org -W -f base.ldif

会弹出来输入密码界面,这个密码就是之前设置的密码123456

             LDAP介绍及安装使用_目录服务_07

五、安装phpldapadmin LDAP管理UI页面

这步安装根据自己需求来,也可以在你本地安装ldap的客户端来管理ldap就好了,但是我个人觉得phpldapadmin页面还挺方便的

# yum安装phpldapadmin

yum install -y phpldapadmin

如果出现没有找到可用的软件包,就说明yum源有问题,这时候就需要更新yum源

# 针对出现没有可用的安装包的解决办法,更新yum源

yum localinstall http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

然后再次重新执行yum install -y phpldapadmin 进行安装

setp 2: 修改配置文件

这里只修改了2.4版本,如果不知道apache的版本,使用 以下命令进行查询

# 查询apache 版本

rpm -qa|grep httpd

修改配置文件 这里是放开外网访问,修改为 Require all granted

# 修改phpldapadmin配置文件 放开外部端口访问

vim /etc/httpd/conf.d/phpldapadmin.conf

             LDAP介绍及安装使用_配置文件_08

修改uid登录方式和关闭匿名登录和用户属性的唯一性

# 修改文件

vim /etc/phpldapadmin/config.php

# 找到找到398行,把这里的uid改为cn

$servers->setValue('login','attr','cn');

             LDAP介绍及安装使用_LDAP介绍及安装_09

# 找到460行,把true改为false 关闭匿名登录

$servers->setValue('login','anon_bind',false);

             LDAP介绍及安装使用_目录服务_10

# 找到519行,设置用户属性的唯一性,这里我将cn sn给添加上

$servers->setValue('unique','attrs',array('mail','uid','uidNumber','cn','sn'))

             LDAP介绍及安装使用_目录服务_11

最后重启apache服务

systemctl start httpd

systemctl enable httpd

登录地址为http://192.168.1.4/phpldapadmin(192.168.1.4是本机地址)

登录用户名为admin 密码123456

到此所有安装已完成,后续phpldapadmin,可参考官方文档配置,有任何安装问题可以私聊我,也可在评论区留言,收到后我会及时回复大家,谢谢大家支持!