@Linux搭建LDAP认证服务

news/2023/12/9 16:21:08

文章目录

    • 1.Ldap概述
    • 2.Ldap的用途
    • 3.Ldap的数据模型
      • 1》数据模型叙述
      • 2》目录树简述
      • 3》Ldap目录树说明
    • 2.搭建LDAP服务器
      • 1》环境准备
      • 2》Ldap服务搭建
    • 3.Ldap Web-UI安装
      • 1》安装PHPLDAPAdmin

1.Ldap概述

LDAP(Light Directory Access Portocol)轻量级目录访问协议:
LDAP是一个开放的,中立的,工业标准的应用协议,通过IP协议提供访问控制和维护分布式信息的目录信息。
简单理解起来就是LADP包含一个数据库存储了树状结构组织数据,和一套协议,第三方可通过这套协议进行数据的查询与搜索的功能。它用的协议基于X.500标准的轻量级目录访问协议,是一种开放Internet标准,LADP协议是跨平台的Internt协议,总结来说LDAP是由目录数据库和一套访问协议组成的系统
现在许多产品都加入了对LDAP的支持,可以通过简单的配置与服务器做认证服务。用户只需要使用一个密码登录众多个支持LDAP协议的应用,由应用自己去LDAP Server去认证用户信息,不仅做到了用户信息的统一管理,对于应用认证也十分方便。

2.Ldap的用途

为什么使用ldap
众所周知,当一个公司规模之后,会有无数的系统进行工作,如果每一个系统都需要注册自己的用户名,每一个系统的用户名与密码可能都不一样。对个人来说就是一件折腾的事情,从公司的IT安全角度来说更是麻烦。所以需要统一认证,单点登录。
LDAP就是最适合在单点登录中使用的系统了。
因为LDAP是一个开放的,中立的,工业标准的应用协议,它支持跨平台,数据配置简单且功能单一,稳定性高且查询性能好,使用它做认证服务可降低重复开发和对接的成本

3.Ldap的数据模型

1》数据模型叙述

LDAP 的基本数据模型就是一种树状的组织数据
LDAP的数据是树状结构, 所有条目(或者对象)都定义在树结构中。条目下的树状结构称为目录信息树(DIT)。一个完整的条目有唯一可识别的名称,我们叫之为区别名(DN)。在DN的子节点下的一个单独节点或者路径,我们称之为RDU。

通常一个条目(或者对象)在存储在这两种类型对象中
1)容器(container):这种对象本身可以包含其他对象。 例如:root(目录树的根元素,它实际上并不存在),c(国家/地区),ou(组织单位)和dc(域)。 容器(container)与与文件系统中的目录相当。
2)叶子节点(leaf):这种对象位于节点的末端,不能再包含其它对象。 例如person,InetOrgPerson,groupofNames。

2》目录树简述

目录树概念:
1)目录树:在一个目录服务系统中,整个目录信息集可以表示为一个目录信息树,树中的每个节点是一个条目。
2)条目:每个条目就是一条记录,每个条目有自己的唯一可区别的名称(DN)。
3)对象类:与某个实体类型对应的一组属性,对象类是可以继承的,这样父类的必须属性也会被继承下来。
4)属性:描述条目的某个方面的信息,一个属性由一个属性类型和一个或多个属性值组成,属性有必须属性和非必须属性。

LDAP里的简称概述:
1)o:organization(组织-公司)
2)ou:organization unit(组织单元-部门)
3)c:countryName(国家)
4)dc:domainComponent(域名)
5)sn:suer name(真实名称)
6)cn:common name(常用名称)

简称名词全称相关含义
dcDomain Component域名的部分,其格式是将完整的域名分成几部分;如域名为example.com变成dc=example,dc=com(一条记录的所属位置)
ouOrganization Unit组织单位,组织单位可以包含其他各种对象(包括其他组织单元),如“oa组”(一条记录的所属组织)
cnCommon Name公共名称,如“Thomas Johansson”(一条记录的名称)
dnDistinguished Name“uid=songtao.xu,ou=oa组,dc=example,dc=com”,一条记录的位置(唯一)

3》Ldap目录树说明

在这里插入图片描述

如上babs条目中:
DN:uid=babs,ou=people,dc=example,dc=com
相对于ou=people,dc=example,dc=com 节点的RDN:uid=babs ObjectClass:Person

2.搭建LDAP服务器

1》环境准备

主机系统服务
192.168.1.10CentOS Linux release 7.4Ldap服务器openldap2.4
192.168.1.11CentOS Linux release 7.4Ldap客户端openldap-clients2.4

2》Ldap服务搭建

#安装OPenLDAP安装包
shell> yum -y install openldap-servers openldap-clients #生成密钥(记住输出结果,后续会将加密后的结果设置为初始用户的密码)
shell> slappasswd -s zeny
{SSHA}jdymV5MGrZt8iI4Wdn0dAqty+LPY0Lq9#修改ldap目录所属用户组
shell> chown ldap:ldap /var/lib/ldap/*#启动ldap服务
shell> systemctl restart slapd#端口确认
shell> netstat -antup | grep -i 389
tcp        0      0 0.0.0.0:389             0.0.0.0:*               LISTEN      1149/slapd          
tcp6       0      0 :::389                  :::*                    LISTEN      1149/slapd #导入基础模块(出现adding new entry字样表示导入成功)
shell> ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif 
shell> ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
shell> ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif#配置域信息(创建changes.ldif文件自定义域,将要替换的部分更改为自己的数据)
vim /etc/openldap/schema/changes.ldif
# 修改域名
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
# 注意修改
olcSuffix: dc=zeny,dc=com# 修改管理员用户
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
# 注意修改
olcRootDN: cn=admin,dc=zeny,dc=com# 修改管理员密码
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
# 替换为 slappasswd 生成后的结果
olcRootPW: {SSHA}jdymV5MGrZt8iI4Wdn0dAqty+LPY0Lq9# 修改访问权限
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=zeny,dc=com" read by * none
#修改dn.base
#dn.base="cn=admin,dc=zeny,dc=com" read by * none#导入ldap配置(输出内容如下为导入成功)
shell> ldapmodify -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/changes.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={2}hdb,cn=config"modifying entry "olcDatabase={2}hdb,cn=config"modifying entry "olcDatabase={2}hdb,cn=config"modifying entry "olcDatabase={1}monitor,cn=config"#创建域和组织(创建文件basedomain.ldif)
shell> cat /etc/openldap/schema/basedomain.ldif
dn: dc=zeny,dc=com
dc: zeny
objectClass: top
objectClass: domaindn: ou=People,dc=zeny,dc=com
ou: People
objectClass: top
objectClass: organizationalUnitdn: ou=Group,dc=zeny,dc=com
ou: Group
objectClass: top
objectClass: organizationalUnit#导入域和组织配置(密码输入初始用户密码:zeny)
shell> ldapadd -x -D cn=admin,dc=zeny,dc=com -W -f /etc/openldap/schema/basedomain.ldif 
Enter LDAP Password: 
adding new entry "dc=zeny,dc=com"adding new entry "ou=People,dc=zeny,dc=com"adding new entry "ou=Group,dc=zeny,dc=com"#查看用户列表
shell> ldapsearch -x -b "ou=People,dc=zeny,dc=com" | grep dn
dn: ou=People,dc=zeny,dc=com#测试配置
shell> slaptest -u 
config file testing succeeded

3.Ldap Web-UI安装

管理Ldap
前面安装完OpenLDAP后,大部分用户/用户组管理操作都是通过命令行方式,操作复杂且容易出错,所以在本文中引入LDAP管理工具的安装使用说明。

常见的LDAP管理工具有:
phpLDAPadmin和LDAP Admin Tool,后者是客户端工具,使用到期后需购买或者破解,笔者尝试使用一段时间发现该工具在Mac上很容易崩溃,所以在此推荐phpLDAPadmin,它是基于php开发的一个web平台,有部署过程,但维护相对简单,唯一的遗憾就是此项目只维护到2012年,所以存在较大的兼容性问题

1》安装PHPLDAPAdmin

yum安装phpldapadmin

#防火墙配置(ldapserver的默认端口为389,开通防火墙端口,否则可能登录会出错,或者直接关闭防火墙也可以
shell> firewall-cmd --zone=public --add-port=389/tcp --permanent
shell> firewall-cmd --permanent --add-service=ldap
shell> firewall-cmd --reload#关闭SELinux
shell> setenforce 0
shell> sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config#安装epel源
shell> wget http://mirror.centos.org/centos/7/extras/x86_64/Packages/epel-release-7-11.noarch.rpm
shell> rpm -ivh epel-release-7-11.noarch.rpm#安装phpldapadmin和依赖包
shell> yum -y install httpd php php-ldap php-gd php-mbstring php-pear php-bcmath php-xml
shell> yum -y install phpldapadmin
-----------------------------------------------------------------------------------------------
#下载不下来,可以手动安装phpldapadmin(正常可忽略此步)
shell> wget https://nchc.dl.sourceforge.net/project/phpldapadmin/phpldapadmin-php5/1.2.3/phpldapadmin-1.2.3.tgz
shell> tar -xvzf phpldapadmin-1.2.3.tgz -C /var/www/
shell> cd /var/www/html/
shell> mv phpldapadmin-1.2.3 phpldapadmin
--------------------------------------------------------------------------------------------#phpldapadmin文件部署到apache
shell> ln -s /usr/share/phpldapadmin /var/www#配置修改(/etc/phpldapadmin/config.php)
vim /etc/phpldapadmin/config.php    #注意行首不要有空格:
$servers->newServer('ldap_pla');
$servers->setValue('server','name','zeny-Ldap');
$servers->setValue('server','host','192.168.1.10');
$servers->setValue('server','port',389); 
$servers->setValue('server','base',array('dc=zeny,dc=com'));
$servers->setValue('login','auth_type','session');
$servers->setValue('login','attr','dn');
// $servers->setValue('login','attr','uid');    //注释这里 因为修改的是php用"//"注释代码#配置修改(/etc/httpd/conf.d/phpldapadmin.conf)
vim /etc/httpd/conf.d/phpldapadmin.conf
<Directory /usr/share/phpldapadmin/htdocs><IfModule mod_authz_core.c># Apache 2.4Require local#Require 172.18.238.34 Require all granted</IfModule><IfModule !mod_authz_core.c>#Apache 2.2Order Deny,AllowAllow from all#Deny from all#Allow from 127.0.0.1#Allow from ::1</IfModule>
</Directory>#服务启动
shell> systemctl restart httpd#web访问phpldapadmin
http://192.168.1.10/phpldapadmin/index.php

在这里插入图片描述

docker安装phpldapadmin:
配置的Ldap地址:–env PHPLDAPADMIN_LDAP_HOSTS=192.168.1.10
配置不开启HTTPS:–env PHPLDAPADMIN_HTTPS=false(默认是true)
容器运行以后访问http://host:10101即可

Docker安装

#容器安装
docker run -d --privileged -p 10101:80 --name myphpldapadmin \
--env PHPLDAPADMIN_HTTPS=false --env PHPLDAPADMIN_LDAP_HOSTS=192.168.1.10  \
--detach osixia/phpldapadmin

在这里插入图片描述


http://www.ppmy.cn/news/36124.html

相关文章

各种卷积性能对比(Conv,DwConv,GhostConv,PConv,DCNV)

1. 各类Conv性能对比 对比的卷积包括: Conv2D,Depth-Conv2d(DW),Ghost-Conv2D,GSConv2D,DSConv2D,PConv2D,DCNV2(可变形卷积)、DCNV3(可变形卷积)可以看出来性能最好的是Ghost-Conv2d,mean_time为0.00623;其次是DSConv2D性能也非常好,mean_time为0.00683。性能最差很自然就是我…

【从零开始学习 SystemVerilog】12.1、SystemVerilog 实战项目1

文章目录 DUTTransaction ObjectDriverMonitorScoreboardEnvironmentTestInterfaceTestbench Top运行日志波形图在之前的文章中,我们讨论了简单TestBench的概念和组件。现在,让我们来看一个实际的SystemVerilog TestBench示例,其中包含所有这些验证组件,并且展示了如何使用…

Spring Boot 各层作用与联系

目录 1 Entity 层 2 DAO 层 3 Service 层 4 Controller 层 Spring Boot 各层之间的联系&#xff1a; controller 层-----> service 层(接口->接口实现类) -----> dao 层的.mapper 文件 -----> 和 mapper 层里的.xml 文件对应 1 Entity 层 实体层&#xff0c;…

【C/C++】模板与泛型编程

目录 1. 函数模板 1.1 函数模板的定义 1.2 函数模板的实例化 1.2.1 隐式实例化 1.2.2 显式实例化 1.3 模板参数的匹配原则 1.4 类型参数 1.5 非类型参数 2. 类模板 2.1 类模板的定义格式 2.2 类模板的实例化 3. 模板的特化 3.1 模板特化的概念 3.2 函数模板特化 …

有效的括号C语言----力扣20题

题目地址->有效的括号 题目 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。 左括号必须以正…

[python tools] 今天看到另一个配置工具 YACS,所以做下笔记

YACS 实际上就只是把别人的readme翻译了一下 github: https://github.com/rbgirshick/yacs 样例代码: https://github.com/Wuziyi616/multi_part_assembly/blob/master/docs/config.md 一、使用方法 1. 首先搞一个config的python文件&#xff0c;用来存一下基本的配置信息 比…

1.9 从0开始学习Unity游戏开发--构建游戏包体

前面我们讲了那么多各种场景编辑,如何写一个基本的代码来实现我们想要的组件,最后在编辑器里面运行我们的游戏,但是这都是我们开发游戏路上的千分之一不到的进程。 在开发的路上我们肯定希望有一定成果后就分享给关注这个游戏的人体验体验,那么如何将自己的游戏发给其他人…

爬虫Day3 csv和bs4

爬虫Day3 csv和bs4 一、CSV的读和写 1. 什么是csv文件 csv文件叫做&#xff1a;逗号分隔值文件&#xff0c;像Excel文件一样以行列的形式保存数据&#xff0c;保存数据的时候同一行的多列数据用逗号隔开。 2. csv文件的读写操作 1) csv文件读操作 from csv import reader…

太奇怪了!小公司面试全挂,大厂面试全过,为什么小公司要求比大厂还高?...

大厂的人才去小公司面试&#xff0c;一定是降维打击吗&#xff1f;还真未必。一位网友很困惑&#xff1a;真的奇怪&#xff0c;小公司面试全挂&#xff0c;大厂面试10个过了9个&#xff0c;感觉小公司要求比大厂还高&#xff0c;这是怎么了&#xff1f;来看看网友们的看法。有人…

Java_Spring:3. IoC 的概念和作用-程序的耦合和解耦

目录 1 案例的前期准备 1.1 准备 spring 的开发包 1.2 创建业务层接口和实现类 1.3 创建持久层接口和实现类 2 基于 XML 的配置 2.1 第一步&#xff1a;拷贝必备的 jar 包到工程的 lib 目录中 2.2 第二步&#xff1a;在类的根路径下创建一个任意名称的 xml 文件&#xf…

防火墙实现NAT地址转换

一、拓扑 二、实验要求 实现NAT地址转换 三、配置 1、根据如图规划配置ip 及区域&#xff0c;以trust为例&#xff08;记得勾选ping服务&#xff09; 其他两个区域依次类推 2、在untrust区域开启ftp服务&#xff0c;并且能让tryst区域访问到&#xff0c;即写一条策略&#x…

MyBatis-Plus联表查询(Mybatis-Plus-Join)

简介 支持连表查询的mybatis-plus,mybatis-plus风格的连表操作提供 wrapper.leftJoin() wrapper.rightJoin()等操作 pom.xml <dependency><groupId>com.github.yulichang</groupId><artifactId>mybatis-plus-join-boot-starter</artifactId><…

创业第三篇——我两次差点就成了狂飙中的石磊,创业中的贷款困境

本文原定标题是&#xff1a;狂飙中的和现实中的高利贷以及曾经的PZP消失的实际原因确实&#xff0c;我差点两次成为石磊&#xff0c;还好我没有走下签字一步&#xff0c;也就是说&#xff0c;我预知到了风险&#xff0c;就躲开了&#xff0c;但是&#xff0c;同样&#xff0c;公…

TypeScrip入门基础

文中示例可直接在 playground 上运行。 一、类型 1️⃣. 基础类型 boolean string number enum undefined null Array tuple any unknown void never 1、boolean、string、number const isRich: boolean true const name: string "Tony" const age: number 1…

GEE:栅格转矢量

本文记录了在Google Earth Engine&#xff08;GEE&#xff09;平台上将栅格数据转换成矢量数据的方法和代码&#xff0c;并以京津冀地区的城市夜光遥感数据为例。 主要用到了image.reduceToVectors()函数。 文章目录一、方法介绍二、代码案例一、方法介绍 image.reduceToVect…

Makefile第九课:Makefile条件控制

目录Makefile的条件规则1.ifeq / else / endif2.ifneq/else/endif3.ifdef/else/endif总结Makefile的条件规则 学习杜老师推荐的Makefile教程视频&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考。 之前有转载过杜老师的从零Makefile落地算法大项目文章&#xff…

【算法总结】拓扑排序

拓扑排序 理论基础 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序&#xff0c;是将G中所有顶点排成一个线性序列&#xff0c;使得图中任意一对顶点uuu和vvv&#xff0c;若边<u,v>∈E(G)<u,v>\in E(G)<u,v>∈E(G)&#xff0c;**则uuu在线性…

【需求响应】分时电价机制下居民用户需求侧对负荷响应研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。⛳座右铭&#…

数据结构——堆

作者&#xff1a;几冬雪来 时间&#xff1a;2023年3月29日 内容&#xff1a; 数据结构堆讲解 目录 前言 1.堆排序的时间复杂度&#xff1a; 2.向下调整建堆&#xff1a; 3.向下调整建堆的时间复杂度&#xff1a; 4.向上调整建堆的时间复杂度&#xff1a; 5TOP-K问题…

C++ find_if函数(在指定范围内查找第一个满足某个条件的元素,并返回该元素的迭代器)

文章目录C find_if函数pred是什么的缩写&#xff1f;C find_if函数 C中的 find_if 函数用于在指定范围内查找第一个满足某个条件的元素&#xff0c;并返回该元素的迭代器。 find_if 函数的原型如下&#xff1a; template <class InputIterator, class UnaryPredicate>…
最新文章