OpenLDAP在linux上的部署和原理应用centos7

轻型目录访问协议(英文:Lightweight Directory Access Protocol,缩写:LDAP)是一个开放的,中立的,工业标准的应用协议,通过IP协议提供访问控制和维护分布式信息的目录信息。

OpenLDAP是轻型目录访问协议(Lightweight Directory Access ProtocolLDAP)的自由和开源的实现,在其OpenLDAP许可证下发行,并已经被包含在众多流行的Linux发行版中。

可以这样讲:市面上只要你能够想像得到的所有工具软件,全部都支持LDAP协议。比如说你公司要安装一个项目管理工具,那么这个工具几乎必然支持LDAP协议,你公司要安装一个bug管理工具,这工具必然也支持LDAP协议,你公司要安装一套软件版本管理工具,这工具也必然支持LDAP协议。LDAP协议的好处就是你公司的所有员工在所有这些工具里共享同一套用户名和密码,来人的时候新增一个用户就能自动访问所有系统,走人的时候一键删除就取消了他对所有系统的访问权限,这就是LDAP

有些领域并不像前端世界那么潮那么性感,但是缺了这个环节又总觉得很别扭。如果深入到运维的世界,你会发现大部分工具还活在上个世纪,产品设计完全反人类,比如cndcdnou这样的命名方式,如果不钻研个一天两天,鬼知道它在说什么,比如说dnsdns是什么鬼?域名吗?不是,它只是某个懒惰的工程师起了dn这么一个缩写,再加一个复数,就成了dns,和域名服务器没有任何关系;cn是什么?中国的缩写?你想多了,这和中国没有任何关系。经过一系列这样疯狂的洗脑之后,你才能逐渐明白LDAP到底想干什么。抛弃你所有的认知,把自己当成一个什么都不懂的幼儿园孩子,然后我们从头学起LDAP

如果你搜索OpenLDAP的安装指南,很不幸地告诉你,网上不管中文的英文的,90%都是错的,它们都还活在上个世纪,它们会告诉你要去修改一个叫做slapd.conf的文件,基本上看到这里,你就不用往下看了,这个文件早就被抛弃,新版的OpenLDAP里根本就没有这个文件!取而代之的是slapd.d的文件夹,然后另一部分教程会告诉你,让你修改这个文件夹下的某一个ldif文件,看到这里,你也不用往下看了,你又看到了伪教程,因为这个文件夹下的所有文件的第一行都明确地写着:『这是一个自动生成的文件,不要修改它!』你修改了它之后,它的md5校验值会匹配不上,造成更多的问题。你应该用ldapmodify来修改这个文件,而关于ldapmodify的教程,可以说几乎就没有!我一开始不知道面临这样荒谬的处境,很多运维人员是怎么活下来的,不过等我自己配通了以后,真的是累到连写教程的精力都没有了,好吧,我已经配通了,你们各人自求多福吧。

架构

实际上,我的操作步骤很多都是反的,架构这部分是最后才意识到的,但实际上从最一开始就应该先想到。实际上整个OpenLDAP的架构大致包含3个部分,而网上没有教材提到这块。

OpenLDAP

首先,是OpenLDAP的服务器本身,这个东西其实只相当于是一个mysql数据库,它是没有酷炫的图形界面的,如果你愿意每次都手敲一大堆代码,也可以用它,但这种反人类的设计真的不是给人用的。

phpLDAPadmin

所以,你需要安装一个叫作phpLDAPadmin的工具,好歹这是一个图形界面,虽然奇丑无比,并且配置起来也并不容易。

PWM

光装管理工具还不够,你总要给用户提供一个修改密码的地方。

客户端

最后,你还需要配置各种工具。

架构图

我画了一个简单的架构图如下:

图片描述

安装

安装OpenLDAP

安装OpenLDAP非常简单,直接安装这3个东西就够了,甚至运气好的话,也许你的操作系统已经自带安装好了:

yum install openldap openldap-clients openldap-servers

安装完了之后可以直接启动OpenLDAP服务,不需要做任何配置,我一开始还有顾虑,后来发现完全不用多想直接启动即可:

service slapd start

配置OpenLDAP

这一块在最一开始是最麻烦的部分,网上所有教程讲的都不对。因为现在是2018年了,而很多教程还停留在2008年甚至1998年。配置OpenLDAP最正确的姿势是通过ldapmodify命令执行一系列自己写好的ldif文件,而不要修改任何OpenLDAP装好的配置文件

举个例子来说,你要想修改RootDN,那么你就自己写这么一个ldif文件,假设给它起名叫a.ldif,然后执行它就可以了:

dn: olcDatabase={2}bdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=qiban,dc=com
-
replace: olcSuffix
olcSuffix: dc=qiban,dc=com

怎么执行呢?

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

这么长的命令是什么意思?-Q表示安静执行,-Y和后面的EXTERNAL表示,好吧,我也不知道什么意思,总之需要这样配合,然后-H表示地址,-f表示文件名。几乎所有的ldapmodify命令都这么执行就好了。

再来讲解一下上面的ldif文件的内容,你不要问为什么叫ldif这么一个破后缀,总之你记住它就是这个后缀就好了。dn表示你要修改什么东西,在这里我们用的是{2}bdb,你的系统不一定是{2}bdb,不管是几,总之你去查一下目录里的内容就好了:

ls /etc/openldap/slapd.d/cn=config/

得到的结果大概如下,不一样也不要害怕:

cn=module{0}.ldif cn=schema/ cn=schema.ldif olcDatabase={0}config.ldif olcDatabase={-1}frontend.ldif olcDatabase={1}monitor.ldif olcDatabase={2}bdb/ olcDatabase={2}bdb.ldif

这里面有一大堆奇奇怪怪的数字,不要担心,其中有一个带什么db.ldif的就是你最终需要修改的数据库文件,我这里是bdb.ldif,你的可能是mdb.ldif,还有人是hdb.ldif,不管什么db,总之你要改的是一个叫db的文件就对了,你可以cat打开看一看,但是不要用vi去修改它。

changetype就是modify,表示我们要修改这个文件。第3行是replace,表示我们要替换里面的某个值,你可以把这个操作理解为mysql数据库的update操作,如果你把第3行改成add,那就是mysqlinsert操作了。不过这里我们操作的只是配置文件本身,还牵涉不到添加用户或者更改用户,如果你以为事情就这么简单,那就是你太天真了。

RootDN在这里就表示你整个OpenLDAP系统的管理员用户名是什么,不要奇怪,后面这一砣都是用户名cn=admin,dc=qiban,dc=com,长的有点像email地址,实际意思也差不多,但总之就不是email就行了。不要问为什么,总之cn就是email前面的那个名字,后面带dc的都是域名。

真实情况是你还需要给这个用户设置一个密码,具体怎么设自行Google,但还是那句话:不要修改系统文件,要用ldapmodify来执行。

添加memberOf模块

这个工作应该一开始就做好,要不然后面要做的话,还得把建好的组全删掉再重建。这个模块的作用是当你建一个组的时候,把一些用户添加到这个组里去,它会自动给这些用户添加一个memberOf属性,有很多应用需要检查这个属性。

添加的时候比较麻烦,需要建3ldif文件,然后1个执行ldapmodify2个执行ldapadd,错一点都不行:

memberof_config.ldif

再一次重申:文件名叫做什么根本无所谓,只要后缀名为ldif即可。

dn: cn=module,cn=config
cn: module
objectClass: olcModuleList
olcModuleLoad: memberof
olcModulePath: /usr/lib64/openldapdn: olcOverlay={0}memberof,olcDatabase={2}bdb,cn=config
objectClass: olcConfig
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: top
olcOverlay: memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfNames
olcMemberOfMemberAD: member
olcMemberOfMemberOfAD: memberOf

小心第5行和第7行,先找到你的模块目录是不是在/usr/lib64下面,然后看清楚你的数据库类型和数字,不要瞎复制。

对于这个文件,我们需要执行ldapadd

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

执行完之后,检查你的/etc/openldap/slapd.d/cn=config/,看是不是多了一个模块,这个模块的数字编号直接影响下一步操作。

refint1.ldif

dn: cn=module{0},cn=config
add: olcmoduleload
olcmoduleload: refint

这个文件里我的memberOf是第一个模块,所以编号是0,你的不一定,要看清楚到底第几号模块是memberof,然后就改成几就可以了,对于这个文件,我们要执行ldapmodify操作:

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

你如果能看懂它的意思的话,它的大意是说要修改我们刚刚添加的那个模块文件的内容。

refint2.ldif

dn: olcOverlay={1}refint,olcDatabase={2}bdb,cn=config
objectClass: olcConfig
objectClass: olcOverlayConfig
objectClass: olcRefintConfig
objectClass: top
olcOverlay: {1}refint
olcRefintAttribute: memberof member manager owner

对这个文件执行ldapadd操作:

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

还是要注意检查db类型,否则你一定不能成功。

安装phpLDAPadmin

好吧,干完了上面这些啰里巴嗦的事情,你可以先给自己泡杯咖啡,接下来还有很多工作要做,不过难度已经没有刚才那么大了。

我们开始安装phpLDAPadmin

yum install phpldapadmin

CentOSyum安装总是这么令人赏心悦目。

配置phpLDAPadmin

接下来让我们在nginx里配置好它,以便让我们的管理员能够看到它。

    location /htdocs {alias /usr/share/phpldapadmin/htdocs;index index.php;location ~ \.php$ {alias /usr/share/phpldapadmin;fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}}

缺省文件安装在/usr/share/phpldapadmin/htdocs下,我们必得要在这里配置一个alias才能访问到它,但在php-fpm时又要配置另外一个alias,这也是比较坑人的一个地方。

接下来你需要修改/etc/phpldapadmin/config.php这个文件,里面有大段大段的注释,看到人头晕,注意这么2点就够了,其它的都不要改:

  • $servers->setValue('login','anon_bind',false);改成false,因为我们不想让人匿名访问;
  • $servers->setValue('login','allowed_dns',array('cn=admin,dc=qiban,dc=com'));,我们只允许管理员访问,其他任何人不得访问。

使用phpLDAPadmin

你现在可以通过URL地址访问phpLDAPadmin了,登录的时候输入你那一坨用户名:cn=admin,dc=qiban,dc=com,然后输入密码,如果你前面一切都设置对了,那么这里就可以登录进去了。

clipboard.png

界面里透出一股浓浓的上世纪九十年代风格,不过好歹我们终于可以脱离纯手写代码管理的窘境了。

这时候你首先要建立两个organizationalUnit,一个叫作groups,一个叫作users。不要问为什么。

然后在users下面建几个inetOrgPerson,这些就是你的用户了。注意,在创建新条目时,一定要选择默认,不要选择什么Posix或者Generic User Account,那只会帮你建出一堆没用的Linux账号出来,我们只想要web用户,不想建什么Linux用户。注意:密码这个地方一定要选md5,否则你后面和其它系统连接会出问题。

然后在groups下面建几个组吧,比如adminsusers等等,注意选择objectClassgroupOfNames就行了。然后把你刚刚建好的几个用户分门别类的给他们加到组里去。

在这一步上,如果你前面配置memberOf模块配置正确的话,你会在user显示内部属性里看到它的memberOf属性,如果看不到,说明你没有配对。

配置第三方应用

到此为止,似乎真没有什么好说的了,PhabricatorConfluenceZabbixGrafana禅道等等,几乎你能想到的任何一个第三方应用都会有说明书教你怎么配置dccnou这些东西,经过了上面这一番折腾,你怎么着也应该对LDAP的一些术语有所了解了,如果还是不行,说明你玩它的时间还是不够长,再多玩两天,也就明白了。

配置好之后的好处就是你再也不用东一块西一块地建用户了,而可以在一个统一的地方集中管理你的用户和群组授权。

结语

总之,配置OpenLDAP不是一个轻松的活,但是考虑到有那么多第三方应用都支持这个鬼东西,花点代价把它配通还是值得的。希望你一切顺利。

更多多资讯或疑问内容请关注 微信公众号 “让梦飞起来” 或添加小编微信, 后台回复 “Python” ,领取更多资料哦

                                    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/547867.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c# 检测cpu使用率[测试通过]

创建一个控制台应用程序,代码如下 代码 usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;//引用2命名空间usingSystem.Diagnostics;usingSystem.Threading;namespaceConsoleApplication1{ classProgram { staticvoidM…

mysql怎么修改表中的文字_mysql表中怎么修改字段?

在mysql表中,可以使用“ALTER TABLE 表名 CHANGE 旧字段名 新字段名 数据类型;”语句来修改字段名称;使用“ALTER TABLE 表名 MODIFY 字段名 新数据类型;”语句来修改字段数据类型。修改字段名称MySQL 中修改表字段名的语法规则如下:ALTER TA…

重置mariadb密码

基本的思路是,以安全模式启动MariaDB,这样不需要密码可以直接以root身份登录,然后重设密码。 在Centos 7.0上的操作步骤如下: 首先,我们停掉MariaDB服务: systemctl stop mariadb.service #停止MariaDB在…

asp.net 取windows的所有进程

代码如下: 代码 #region取得windows的所有进程publicstaticstringGetCourse(){ System.Text.StringBuilder sb newSystem.Text.StringBuilder(); stringtempName ""; intbegpos, endpos; foreach(Process thisProc inSystem.Diagnostics.Proc…

asp.net 操作ftp 通用代码[测试通过]

代码如下: 代码 //建立目录FtpWebRequest Request (FtpWebRequest)WebRequest.Create("ftp://113.107.160.135:2121/vadmin.uuu9.com/aaa"); Request.Credentials newNetworkCredential("wanglei", "}}XnJXt4a\7datr"); …

AirFlow官方入门DAG示例

经过前两篇文章的简单介绍之后,我们安装了自己的AirFlow以及简单了解了DAG的定义文件.现在我们要实现自己的一个DAG. 1. 启动Web服务器 使用如下命令启用: airflow webserver 现在可以通过将浏览器导航到启动Airflow的主机上的8080端口来…

三层业务类(DAL)必用的通用方法之一

写代码有两年多的时间了&#xff0c;越来越觉得代码的通用性是衡量一个程序员的标准。 代码 #regionSqlDataReader > List///<summary>///author:Stone_W///date:2010.11.29///desc:SqlDataReader 转 List///</summary>///<param name"dr">SqlD…

使用 Packer、Ansible 和 Terraform 构建不可变的基础设施Devops工具链

在容器编排领域&#xff0c;Kubernetes 已成为事实上的标准&#xff0c;而容器镜像 (Docker Image) 作为容器技术栈中最关键的创新之一&#xff0c;极大的推动了企业内部 Devops 运动的进程。 容器镜像所具有的轻量性、便携性、分层机制和内核共享机制真正意义上实现了 “Buil…

用于检测敏感词的 PHP 扩展

2019独角兽企业重金招聘Python工程师标准>>> 敏感词过滤是我朝程序员必须具备的一种特殊技能&#xff0c;随着敏感词越来越多&#xff0c;是时候写个扩展来快速的进行敏感词检测了使用说明 1. 安装 libdatrie tar zxf libdatrie-0.2.4.tar.gz cd libdatrie-0.2.4 .…

缓存通用管理类 + 缓存 HttpContext.Current.Cache 和 HttpRuntime.Cache 的区别

以前写asp.net时用HttpContext.Current.Cache存缓存很好用&#xff0c;今天写了一个windows服务程序&#xff0c;HttpContext.Current.Cache存缓存的时候还好&#xff0c;取的时候一直报错“未将对象引用到实例”很郁闷&#xff0c;查询了一下资料才明白引用程序缓存要用HttpRu…

Ubuntu 加速安装Opencv 3.4.3

Ubuntu 18.04 完美安装Opencv 3.4.3 1.1 下载Opencv 3.4.3 在http://opencv.org/网址中找到下载连接&#xff0c;版本选择&#xff1a;https://github.com/opencv/opencv/releases 下载地址&#xff1a;https://github.com/Itseez/opencv/archive/3.4.3.zip (此处可以使用w…

Net和T-sql中的日期函数操作

net中的日期函数代码&#xff1a; 代码 1 DateTime now DateTime.Now; 2 // 当前月的第一天 3 DateTime d1 new DateTime(now.Year, now.Month, 1); 4 // 当前月的最后一天 5 DateTime d2 d1.AddMonths(1).AddDays(-1); 6 if (now.Day d2.Day) 7 { 8 // 当日是当月最后…

kiwiboard 购买记录小结

2019独角兽企业重金招聘Python工程师标准>>> 后悔啊&#xff0c;买前没有做过调研&#xff0c;脑子一热就买了个全套的&#xff0c;现在后悔来不及啦&#xff0c;肠子都青掉了。。。 说说体会吧&#xff1a; 1. 配件很少&#xff0c;没有uart线&#xff0c;也没有…

xml文件转换成图片_怎样能把PDF文件转换成图片?

我们的日常生活工作中时常碰到pdf与Excel、Word、ppt和jpg等文件格式的转换&#xff0c;有时候由于工作的需要&#xff0c;要把PDF文件转换成图片。并且现在网上的很多素材都是PDF文件格式的&#xff0c;如果我们想要里面的图片就变得很难办了。采取截图的方式得到的图片很模糊…

vmware安装渗透系统 Linux Kail最新版

https://mirror-1.truenetwork.ru/kali-images/kali-2020.3/kali-linux-2020.3-installer-amd64.iso Kali Linux安装的磁盘空间的最小值是8GB。为了便于使用&#xff0c;这里推荐至少25GB去保存附加程序和文件。内存最好为512MB以上。Kali Linux的下载地址http://www.kali.org/…

Thread线程的深刻理解和代理方法参数[有图有真相]

在这说的是Thread的基本用法&#xff0c;线程池ThreadPool在这就不说的&#xff0c;以前的blog有写&#xff0c;基本上两个用法都是相同的。基本用法和图&#xff0c;不需要的大鸟请绕行&#xff0c;谢谢&#xff01; 目录&#xff1a; 1.Thread基本用法与异步线程理解。 2.线…

linux ubuntu 编写c/c++ 获取命令行传入参数示例

linux ubuntu 编写c/c 获取命令行传入参数示例 g test.cpp -o test ./test -d video.jpg test.cpp 代码如下 #include <iostream> #include <unistd.h>using namespace std;int main(int argc, char* argv[]) {//参数变量初始化string db_path;int ch;opterr …

python执行系统命令后获取返回值的几种方式

import commands output commands.getstatusoutput(ps -aux) print output更多资讯或疑问内容请关注 微信公众号 “让梦飞起来” 或添加小编微信&#xff0c; 后台回复 “Python” &#xff0c;领取更多资料哦

一些好用的开源控件

工作两年&#xff0c;一直都在做些编码方面的表面功夫&#xff0c;实现了很多很炫的功能&#xff0c;在此写下一些体验。有些比较小的dll文件我会发上来&#xff0c;如果是开源组织的代码我会把地址附上&#xff0c;毕竟人家是会更新的。大家还有什么好用的开源控件欢迎补充。 …

python3爬取百度图片

python3爬取百度图片 最终目的&#xff1a;能通过输入关键字进行搜索&#xff0c;爬取相应的图片存储到本地或者数据库 首先打开百度图片的网站&#xff0c;搜索任意一个关键字&#xff0c;比如说&#xff1a;水果&#xff0c;得到如下的界面 分析&#xff1a; 1、百度图片搜…