Linux/UNIX OpenLDAP实战指南

978-7-115-40924-9
作者: 郭大勇
译者:
编辑: 傅道坤

图书目录:

详情

OpenLDAP是轻型目录访问协议(Lightweight Directory Access Protocol,LDAP)的一个自由和开源的实现。本书对OpenLDAP的安装、配置、部署进行了详细讲解,还涵盖了多个案例来重点讲解OpenLDAP在实际项目中的应用。本书适合系统管理员、网络实施/运维人员阅读。

图书摘要

版权信息

书名:Linux/UNIX OpenLDAP实战指南

ISBN:978-7-115-40924-9

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。




郭大勇(Sandy),资深系统架构师,从事Linux系统运维管理工作近6年。曾任职于浪潮,担任高级系统运维工程师一职。目前就职于某知名物流公司,担任资深系统架构师一职,主要负责核心系统架构设计及优化。

擅长领域有Linux网站架构规划、Linux应用集群部署、Linux系统安全、MySQL架构设计、自动化运维管理(OpenLDAP、Puppet、Cobbler)、监控平台架构(Zabbix、Nagios+Cacti)、分布式存储(Ceph)、OpenStack云计算、EMC存储架构优化。目前主要关注自动化运维、云计算、大数据相关研究。

主要活跃于51CTO社区,目前兼任51CTO签约Linux讲师,主要培训领域为Linux开源架构、自动化运维领域。

本书特色

本书是第一本深入讲解OpenLDAP应用实战的中文图书 多位业内资深技术专家联袂推荐

本书分为基础篇、高级篇、实战篇,其每篇的章节组成和内容介绍如下。

基础篇

包含第1章~第5章,介绍OpenLDAP的产生、工作原理、OpenLDAP服务器的安装与配置、OpenLDAP的命令、客户端部署以及GUI管理(phpLDAPadmin、LDAPadmin、LAM),帮助读者快速地了解OpenLDAP原理、配置及管理。

高级篇

包含第6章~第10章,介绍OpenLDAP高级主题,如用户权限的控制、密码策略及审计、数据加密传输原理、自建证书颁发机构实现OpenLDAP数据通过SSL加密传输、主机访问控制策略、OpenLDAP同步原理及实现方式、OpenLDAP高可用负载均衡架构及实现方式,帮助读者根据生产环境的需求快速部署OpenLDAP系统架构。

实战篇

包含第11章~第17章,介绍OpenLDAP实战主题,包括OpenLDAP优化、故障解决方案以及与各种应用架构进行集成实现用户的统一管理及授权。详细介绍常见的LAMP、LNMP、Samba(共享服务)、Zabbix(监控平台)、FTP(文件共享)、开源跳板机的实现、Postfix(邮件服务)、Git(代码管理)、Hadoop(大数据)以及自动化部署Puppet解决方案等。让读者从零到一、从不懂到精通OpenLDAP的一本实战指南手册。

本书适合下述读者阅读:


OpenLDAP是Linux操作系统中轻型目录访问协议(Lightweight Directory Access Protocol,LDAP)的一个自由和开源的实现。本书作为国内唯一的一本专门讲解OpenLDAP的图书,循序渐进地讲解了LDAP协议以及OpenLDAP以及在企业中的应用。

本书分为基础篇、高级篇和实战篇,共计17章。基础篇涵盖了OpenLDAP的工作原理、OpenLDAP服务器的安装与配置、OpenLDAP的命令详解、OpenLDAP客户端部署以及GUI管理。高级篇则介绍了OpenLDAP的高级主题,包括OpenLDAP权限、密码策略控制、主机策略控制、加密传输、同步原理及配置、高可用负载均衡架构及实现。实战篇主要介绍了OpenLDAP的具体应用,包括OpenLDAP的优化、故障解决方案,以及与各种应用架构进行集成,以实现用户的统一管理及授权。

本书适合UNIX/Linux系统架构师、开发/运维/管理人员阅读。


作者是51CTO专家博主,也是51CTO学院知名讲师,他发表的文章在技术论坛深受同行关注和认可,其课程也在51CTO学院深受学员欢迎。他不但帮助学员学习企业实用的技术,而且还带领学员顺利获得了红帽相关证书(RHCE、RHCA)。

随着云时代的到来,自动运维成为发展趋势,账号管理面临瓶颈。本书介绍了如何实现系统、应用的用户集中认证管理开源解决方案。本书是作者近6年工作实践经验的总结和结晶,可以带领你遨游OpenLDAP的知识海洋,从基础到实战,玩转UNIX & Linux账号安全自动化运维管理。

——孙琪,51CTO学院高级运营经理


信息技术已经成为现代人类社会及商业活动的基石,并将会扮演越来越重要的作用。适合一个组织或企业使用的信息系统通常由众多具有不同功能的子系统构成,为了保证资源的合理利用,如果每个子系统都各自实现用户信息管理,则势必割裂整个大系统,从而导致用户在各子系统间的切换变得障碍重重,此时就需要一个单点认证系统以及强大的信息存储检索工具来支撑。

虽然诸如MySQL等关系数据库亦能实现用户信息的存储功能,但对于一次或有限次的写入,而需要无数次读取的场景来说,其并非是最佳解决方案。LDAP即是为此而设计。利用LDAP实现系统的单点登录已然成为一种行业标准,而常见的绝大多数系统也均支持LDAP的认证方式。

然而,要想弄懂LDAP相关的技术并能够有效地利用LDAP来解决实际问题,还是需要完备地了解LDAP协议的原理及常用的实践方法。本书以LDAP开源、OpenLDAP实现为主线,循序渐进地讲解了LDAP协议及OpenLDAP的管理技术,尤其对目前企业级应用中涉及的安全传输、同步、负载均衡及高可用等技术都给出了详细的实现方案,这是相当难能可贵的。为了进一步展示OpenLDAP的应用,作者还通过将OpenLDAP整合于FTP、Samba、Zabbix及Apache等时下主流的应用来给出可直接借鉴和参考的实践案例,其将数年浸淫于LDAP应用的经验予以无私分享之诚可见一斑。

如果你想了解LDAP协议并尝试理解其在用户认证管理方面的优秀表现,或者想深入学习LDAP及其实现,那么本书将会带给你惊喜!

——马永亮,马哥教育创始人


随着互联网技术的进步,LDAP技术迅速发展。在企业范围内通过LDAP技术可以让运行在几乎所有计算机平台上的所有应用程序从LDAP目录中获取信息。LDAP目录中可以存储各种类型的数据:电子邮件地址、路由信息、人力资源数据、公匙、联系人列表等。通过把LDAP技术作为系统集成中的一个重要环节,可以简化企业应用系统内部查询信息的步骤,甚至主要的数据源可以放在任何地方。

本书正是讲述LDAP技术应用方面的书籍。作者由浅入深、循序渐进地讲述了OpenLDAP的原理、安装配置、实战案例等LDAP各个方面的具体应用。

在写作特点上,本书通俗易懂;在内容上,本书非常注重实战化,从多个方面以近似真实的环境介绍OpenLDAP的应用。放眼同类技术书籍,本书应该是国内第一本深入介绍OpenLDAP应用实战的图书。因此,向大家强烈推荐本书。

纵观全局,本书对于广大OpenLDAP技术爱好者以及OpenLDAP技术相关从业者人员来说,具有非常实用的指导意义。

——高俊峰,《高性能Linux服务器构建实战》作者


微软公司的活动目录(Active Directory)域控制器早已广为人知,它在企业IT系统中的作用不可小觑。那么,Linux下类似活动目录的开源实现就是OpenLDAP软件,可惜的是,目前市面上的OpenLDAP书籍极其罕见。能够立足企业实战讲解OpenLDAP的中文版书籍目前我还没发现,在我曾经的大规模运维工作及现在的教育教学工作中,都在极力推广使用OpenLDAP开源软件,它是实现企业大规模IT运维自动化管理必不可少的解决方案之一。

不久前,本书作者大勇兄弟和我讲,在写OpenLDAP书籍,并且悉心和我探讨了相关难点问题,这使得我眼前一亮。他能有这样的用心并且愿意分享自己的实战经验,并且努力写书来填补Linux运维界OpenLDAP书籍的空白,对运维界的朋友来说是一件极其难得的大事。OpenLDAP是一个比较复杂的知识体系,限于作者的时间、精力、经验,本书难免有不尽如人意的地方,但无论如何,作为Linux运维界的一员,我仍然毫不犹豫地向所有读者隆重推荐本书,并愿意为阅读本书的读者助一臂之力。

——老男孩,北京老男孩Linux高薪培训创始人


本书作者是51CTO的博客之星,也是资历丰富的系统架构设计师,他根据自己宝贵的运维经验所写的技术文章在51CTO社区深受朋友欢迎,他写的这本书应该是市面上第一本关于OpenLDAP的书籍。OpenLDAP在大规模网站架构和自动化领域的作用举足轻重,希望大家能认真阅读和学习本书。

——余洪春,融贯资讯系统架构师、《构建高可用Linux服务器》作者


本书是国内为数不多的专门讲解OpenLDAP的图书。本书针对Linux环境下OpenLDAP目录服务及诸多网络服务集成方案进行了系统介绍,涵盖了OpenLDAP的工作原理、安装部署、基本GUI配置、管理、负载均衡等各个方面,并借助于贴近实战的案例,展示了OpenLDAP目录服务与Zabbix、FTP、Apache等应用进行整合的技巧。本书注重实际操作,特别适合UNIX/Linux运维人员参考学习。

——李晨光,《UNIX/Linux网络日志分析与流量监控》作者


感谢OpenLDAP开发团队,为Linux & UNIX运维管理提供开源集中账号管理软件。

感谢孙琪、马永亮(马哥)、余洪春(抚琴煮酒)、李晨光、高俊峰(南非蚂蚁)、老男孩在百忙之中阅读本书草稿,并为本书撰写推荐语。

感谢人民邮电出版社编辑傅道坤,为本书写作中的帮助和引导,直到顺利完成本书全部书稿。

感谢我的爱人许情女士在我写作过程中对我父母及儿子的照顾,感谢在工作上帮助我的伙伴们,正因有了你们的支持,本书才能得以出版,并将此书献给热爱开源技术的伙伴们。

郭大勇(Sandy)

中国上海


随着互联网行业的不断发展,企业也在不断壮大,为了满足客户需求,后端服务器数量日益增加。此时对于后端运维管理人员而言,工作量也在不断增加,许多资源管理人力已经无法满足,反复的工作也使运维管理人员变得枯燥无味。此时开源自动化运维管理就进入运维人员眼线,例如账号统一管理的OpenLDAP、自动化部署的Puppet、自动化安装服务器的Cobbler、云管理的OpenStack等。

由于作者工作环境设备数量达1000+、应用管理平台40套+,同时由于服务器设备的增加,账号的数量也在不断增加,账号管理员以无法通过人工对服务器以及应用账号进行管理。此时一款开源账号集中管理软件就出现在作者的系统架构设计中,也就是本书所介绍的OpenLDAP。

本书基于OpenLDAP软件讲解如何实现账号管理以及安全策略管理。例如账号管理、权限控制管理、密码策略管理、密码审计管理、主机控制管理、数据同步架构、高可用负载架构以及通过Puppet实现批量部署客户端等。

目前自动化运维呈现我们的实现,如自动化部署工具Puppet、Ansible、批量安装系统Cobbler、账号集中管理软件OpenLDAP等,由于市面上关于OpenLDAP的资料非常缺乏,因此作者将本书分为三篇详细介绍OpenLDAP工作原理、安装部署、权限控制、密码策略、审计、备份还原、高可用负载架构,以及与企业中各种应用平台的结合实现账号统一管理部署等功能。

作者秉承以理论与实践相结合的思想撰写本书,更多从企业实战角度讲解OpenLDAP开源集中账号管理软件的实现。

本书分为基础篇、高级篇、实战篇,其每篇的章节组成和内容介绍如下。

包含第1章~第5章,介绍OpenLDAP的产生、工作原理、OpenLDAP服务器的安装与配置、OpenLDAP的命令、客户端部署以及GUI管理(phpLDAPadmin、LDAPadmin、LAM),帮助读者快速地了解OpenLDAP原理、配置及管理。

包含第6章~第10章,介绍OpenLDAP高级主题,如用户权限的控制、密码策略及审计、数据加密传输原理、自建证书颁发机构实现OpenLDAP数据通过SSL加密传输、主机访问控制策略、OpenLDAP同步原理及实现方式、OpenLDAP高可用负载均衡架构及实现方式,帮助读者根据生产环境的需求快速部署OpenLDAP系统架构。

包含第11章~第17章,介绍OpenLDAP实战主题,包括OpenLDAP优化、故障解决方案以及与各种应用架构进行集成实现用户的统一管理及授权。详细介绍常见的LAMP、LNMP、Samba(共享服务)、Zabbix(监控平台)、FTP(文件共享)、开源跳板机的实现、Postfix(邮件服务)、Git(代码管理)、Hadoop(大数据)以及自动化部署Puppet解决方案等。让读者从零到一、从不懂到精通OpenLDAP的一本实战指南手册。

尽管作者花费大量时间对本书中所有内容及案例进行核实,但是由于水平有限,本书难免会出现纰漏与错误。当读者在阅读中发现问题时,请将相关信息通过邮件形式发送到作者的邮箱dayong_guo@126.com,且将邮件主题命名为“OpenLDAP勘误/建议”反馈给作者。作者会在第一时间内进行确认,并把勘误通过博客的形式发布,博客地址:guodayong.blog.51cto.com。


OpenLDAP是目前用于实现账号集中管理的开源软件,可以让账号管理人员、系统运维工程师的工作变得灵活轻松,提高工作效率,并且通过一台机器控制上千台机器账号权限的管理,如添加、删除、修改等操作。

要根据需求设计成熟的架构,我们需要学习OpenLDAP的原理、语法、软件的安装及配置,并通过监控软件监控进程运行情况,如Zabbix、Cacti、Nagios、BMC等进行监控管理。说到这里,您还在为成百上千台机器的账号管理愁眉苦脸吗?那就让作者带领您了解并深究OpenLDAP自动化账号管理的神奇之处吧!

本篇为基础篇,主要分为5章。


运维案例

系统运维人员入职新公司后,运维经理将维护的服务器列表、账号、密码、远程管理卡等相关信息进行交付。运维人员通过地址、用户名以及密码了解设备应用环境配置信息,此时通过机器列表、账号和密码尝试登录系统,发现大部分机器无法登录。

登录过程中发现大量以root 超级用户进行登录,无论是测试环境还是生产环境,为了保障系统、应用服务安全,都不建议以root 身份登录系统进行操作。

通过服务器列表发现大部分密码设置过于简单,极其容易被攻击者所破解。同时用户权限没有得到灵活控制,大部分普通用户具有root 权限,这在维护中增加了系统潜在操作的风险。

当系统、应用出现异常时,通过服务器列表提供的地址、账号和密码无法登录系统,只好通过离职人员获取账号和密码进行故障处理,处理时效大大延迟,且账号安全无法得到保障。

从以上案例解读,读者不难发现账号管理存在如下问题:

● 系统账号身份无法集中管理;

● 系统账号权限无法集中控制;

● 系统账号授权无法集中管理;

● 系统账号审计无法集中管理;

● 系统账号密码策略无法集中控制。

为了规避以上问题存在的风险点及维护管理带来的异常,一般可以通过商业化软件以及开源软件实现账号集中管理。由于商业化软件价格昂贵,此时通过开源集中账号管理(OpenLDAP)软件是不错的选择,且它功能强大、灵活性强、架构成熟,其中的权限控制、访问控制、主机权限策略、密码审计、同步机制以及通过第三方开源工具实现负载高可用等,提供一整套安全的账号统一管理机制。

用户通过集中认证管理平台实现身份、权限的验证,获得服务器授权之后登录系统及应用管理平台,此时用户可自我维护账号、密码,且无须管理员干涉密码修改,实现用户账号自身安全性。用户通过验证服务器获取主机登录策略,获取OpenLDAP服务器的授权,从而实现用户登录主机的灵活控制。

本书通过三篇一步步带领读者了解OpenLDAP及其工作原理和实现方式、安装配置、客户端部署、命令GUI管理、加密算法、高级功能模块实现以及企业应用案例等模块。本章介绍什么是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)组成,相当于关系数据库中字段的概念。

我们知道,账号是登录系统的唯一入口。要登录系统,首先系统要存在登录所使用的账号(/etc/passwd)及密码信息(/etc/shadow),然后经过系统查找顺序(/etc/nsswith.conf)及认证模块(/etc/pam.d/ *)验证,得到授权后方可登录系统。如果多个用户登录系统,就需要在每个系统上创建用户名和密码;否则,就无法登录系统。

对于账号管理人员而言,维护10台、100台机器的账号,或许勉强可以维护、管理。如果机器数量达到1000以上时,对于账号的创建、回收、权限的分配、密码策略、账号安全审计等一系列操作,账号管理人员就心有余而力不足了。此时OpenLDAP账号集中管理软件就应用而生,它可以实现账号集中维护、管理,只需要将被管理的机器加入到服务器端即可,此后所有与账号相关的策略均在服务端实现,从而解决了运维案例所产生的众多管理问题。

关于账号的添加、删除、修改、权限的赋予等一系列操作只需要在服务端操作即可,无须在客户端机器进行单独操作。客户端账号及密码均通过OpenLDAP服务器进行验证,从而实现账号集中认证管理,此时账号管理员只须维护OpenLDAP服务器条目即可。

OpenLDAP属于开源软件,且OpenLDAP支持LDAP最新标准、更多模块扩展功能、自定义schema满足需求、权限管理、密码策略及审计管理、主机控制策略管理、第三方应用平台管理以及与第三方开源软件结合实现高可用负载均衡平台等诸多功能,这也是商业化管理软件无可比拟的。所以关于账号的管理OpenLDAP是企业唯一的选择。目前各大著名公司都在使用OpenLDAP实现账号的集中管理,如PPTv、金山、Google、Facebook等,这也是选择OpenLDAP实现账号统一管理的原因之一。

OpenLDAP目录服务有以下10个优点。

在LDAP的功能模型中定义了一系列利用LDAP协议的操作,主要包含以下4部分。

目前OpenLDAP 2.4版本使用V2和 V3两个版本,其V3特点如下所示。

LDAP账号集中管理产品汇总见表1-1。

表1-1 LDAP账号集中管理产品汇总

厂商

产品名称

产品特点

SUN

SUNONE Directory Server

基于文本数据库的存储,速度快

IBM

IBM Directory Server

基于DB2的数据库存储,速度一般

Oracle

Oracle Internet Directory

基于Oracle的数据库,速度一般

Microsoft

Microsoft Active Directory

基于Windows系统用户,数据管理/权限不灵活

Opensource

Opensource OpenLDAP

开源项目、速度快、应用广泛

每一款产品无论是商业软件还是开源软件,都有它们的应用场景。本书主要讲解以开源方式实现账号统一管理的软件OpenLDAP在UNIX/Linux主机上的应用场景及企业应用实例。对于其他LDAP产品,读者可以通过搜索引擎进行了解,在此不作过多阐述。

OpenLDAP账号管理软件适用于所有不同发行版的UNIX系统、Windows系统以及各种应用平台的用户管理,如Apache、Nginx、Zabbix、Postfix、Samba、FTP、SVN、Openvpn、Git、Hadoop、OpenStack以及存储设备控制台等。OpenLDAP适用于少则一台机器,多则千台机器的系统,可实现账号集中式统一管理。

OpenLDAP支持的系统平台如图1-1所示。

图1-1 OpenLDAP支持的系统平台

注:

通过图1-1可以了解到,OpenLDAP支持众多系统平台,例如各种UNIX发行版本、微软Windows、Mac OS、IBM AIX等众多平台。本书重点以红帽系统为蓝本,并以理论与实相结合的思想带领读者熟悉并在企业中熟练使用OpenLDAP产品。

OpenLDAP具有下述高级功能。

作者会在高级篇和实战篇中详解每个功能模块的原理、实现方式以及在企业中如何应用,让读者通过本书详细了解OpenLDAP产品、架构以及与各种应用的结合实现统一账号管理。

目前OpenLDAP目录架构分为两种:一种为互联网命名组织架构;另一种为企业级命名组织架构。本节分别为介绍两种架构的用途,但本书主要以企业级命名组织架构为核心进行阐述OpenLDAP内部逻辑结构、工作原理以及企业实践等相关知识。

LDAP的目录信息是以树形结构进行存储的,在树根一般定义国家(c=CN)或者域名(dc=com),其次往往定义一个或多个组织(organization,o)或组织单元(organization unit,ou)。一个组织单元可以包含员工、设备信息(计算机/打印机等)相关信息。例如uid=babs,ou=People,dc=example,dc=com,如图1-2所示。

图1-2 LDAP互联网命名组织架构(此图来自http://www.openldap.org)

企业级命名组织架构的示例如图1-3所示。

图1-3 LDAP企业规划命名方式

OpenLDAP目前是一款开源账号集中管理软件,且属于C/S架构(见图1-4)。通过配置服务器和客户端,实现账号的管理,并通过与第三方应用相结合,实现客户端所有账号均可通过服务端进行验证,例如Samba、Apache、Zabbix、FTP、Postfix、EMC存储以及系统登录验证并授权。

图1-4 OpenLDAP的C/S架构

OpenLDAP的工作模型如图1-5所示。

图1-5 OpenLDAP的工作模型

OpenLDAP工作模型解释如下:

schema是OpenLDAP软件的重要组成部分,主要用于控制目录树中各种条目所拥有的对象类以及各种属性的定义,并通过自身内部规范机制限定目录树条目所遵循的逻辑结构以及定义规范,保证整个目录树没有非法条目数据,避免不合法的条目存在目录树中,从而保障整个目录树信息的完整性、唯一性。

在OpenLDAP目录树中,schema用来指定一个条目所包含的对象类(objectClass)以及每一个对象类所包含的属性值(attribute value)。其属性又分为必要属性和可选属性两种,一般必要属性是指添加条目时必须指定的属性,可选属性是可以选择或不选择的。schema定义对象类,对象类包含属性的定义,对象类和属性组合成条目。

目录树中条目可理解为是一个具体的对象,它们均是通过schema创建的,并符合schema的标准规范,如对你所添加的数据条目中所包含的对象类级属性进行检测,检测通过完成添加,否则打印错误信息。因此,schema是一个数据模型,数据模型可以理解为关系数据库的存储引擎,如MyISAM、InnoDB,主要用来决定数据按照什么方式进行存储,并定义存储在目录树不同条目中数据类型之间的关系。

schema是一个标准,定义了OpenLDAP目录树对象和属性存取方式,这也是OpenLDAP能够存储什么数据类型的取决因素。因此数据有什么属性等均根据schema来实现。OpenLDAP默认的schema文件一般存放在/etc/openldap/schema/目录下,此目录下每个文件定义了不同的对象类和属性。如果想引用额外的schema,只需要在配置文件中通过include包含所指定的schema即可。

以下代码可用于获取当前系统OpenLDAP所使用的schema规范,了解当前所使用的schema文件,这有助于添加目录树中的条目信息,如对象类以及包含哪些属性及值,减少添加条目提示的各种语法错误。

[root@mldap01 schema]# cat /etc/openldap/slapd.conf | grep '^incl*'
include         /etc/openldap/schema/corba.schema
include         /etc/openldap/schema/core.schema
include         /etc/openldap/schema/cosine.schema
include         /etc/openldap/schema/duaconf.schema
include         /etc/openldap/schema/dyngroup.schema
include         /etc/openldap/schema/inetorgperson.schema
include         /etc/openldap/schema/java.schema
include         /etc/openldap/schema/misc.schema
include         /etc/openldap/schema/nis.schema  #定义网络信息服务
include         /etc/openldap/schema/openldap.schema #OpenLDAP自身
include         /etc/openldap/schema/ppolicy.schema  #定义用户密码规则,例如密码长度及复杂度
include         /etc/openldap/schema/collective.schema

schema在OpenLDAP目录树中承接规范、对条目所包含的objectClass以及数据字节数、格式等来保证整个目录树的完整性。

默认安装OpenLDAP组件后,系统的配置定义一组常用的schema文件,这组文件一般存放在/etc/openldap/schema目录内,可通过include引用。当所定义的objectClass不存在时,该如何获取objectClass?下面就介绍如何获取schema来包含objectClass。

1.服务器自身产生的schema文件

通过服务器自身软件包的安装来生成schema文件,本节以sudo为例演示其过程。

# rpm -ql sudo-1.8.6p3 | grep -i schema
/usr/share/doc/sudo-1.8.6p3/schema.ActiveDirectory
/usr/share/doc/sudo-1.8.6p3/schema.OpenLDAP
/usr/share/doc/sudo-1.8.6p3/schema.iPlanet
#cp-f/usr/share/doc/sudo-1.8.6p3/schema.OpenLDAP/etc/openldap/schema/sudo.schema
#echo "include /etc/openldap/schema/sudo.schema">/etc/openldap/slapd.conf
#slapcat-f~/sudo/sudoSchema.conf-F/tmp/-n0 -s"cn={0}sudo,cn=schema,cn=config"> 
~/sudo/sudo.ldif
#sed -i "s/{0}sudo/{12}sudo/g" ~/sudo/sudo.ldif
#head -n-8 ~/sudo/sudo.ldif > ~/sudo/sudo-config.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f ~/sudo/sudo-config.ldif

此时就可以通过sudo schema文件定义各种sudo规则从而实现用户权限的控制。

2.自定义schema文件

当所定义的objectClass不在规定范围内,就需要定义schema文件来包含objectClass。关于自定义schema在此不作过多的介绍。

关于自定义schema文件,需要注意以下几点。

objectClass类通常分三类:结构型、辅助型、抽象型。

OpenLDAP常见的objectClass类如下所示。

如上对象类由OpenLDAP官方所提供,以满足大部分企业的需求,OpenLDAP还支持系统所提供的对象类,例如sudo、samba等。后续章节将对企业中常用的对象类进行阐述并通过案例演示其实现过程,让读者熟悉其原理及实现过程。

当OpenLDAP官方以及系统提供的对象类无法满足企业的特殊需求时,读者可根据OpenLDAP schema内部结构制定schema规范并生成对象类,来满足当前需求。

在OpenLDAP目录树中,每个条目必须包含一个属于自身条件的对象类,然后再定义其条目属性及对应的值。

OpenLDAP条目的属性能否添加取决于条目所继承的objectClass是否包含此属性。objectClass具有继承关系,也就是说,条目添加的属性最终取决于自身所继承的所有objectClass的集合。如果所添加的属性不在objectClass范围内,此时目录服务器不允许添加此属性。如果要添加,就必须添加schema文件产生objectClass所对应的属性。objectClass和Attribute由schema文件来规定,存放在/etc/openldap/schema目录下,schema文件规范objectClass的构成以及属性和值在目录树中的对应关系。后面章节会介绍如何通过定义schema文件来产生objectClass,从而生成所需要的属性。

每一个属性和值将用作每个条目在目录树中存储信息的标准,例如能包含哪些属性信息。对于objectClass的理解,读者可以将objectClass的属性值理解为一种模板。模板定义哪些信息可以存取,哪些信息不可以存储在目录树中。

下面给出两个对象类案例分析示例。

所有的objectClass定义都存放在/etc/openldap/schema/ *.schema文件中。例如,person属性的定义就存放在core.schema文件中。

objectclass ( 2.5.6.6 NAME 'person'
        DESC 'RFC2256: a person'
        SUP top STRUCTURAL
        MUST ( sn $ cn )
        MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) )

分析:

如果要定义person类型,需要定义顶级为top,并且必须定义sn和cn两个属性,还可以附加userPassword、telephoneNumber、seeAlso、description 4个属性值。邮件地址、国家等属性不可以定义,除非读者添加相关的objectClass条目,否则提示相关属性不允许添加。

objectClass: (2.5.6.0 NAME 'top'
ABSTRACT  
MUST (objectClass))   

objectClass: ( 2.5.6.6 NAME 'person'
SUP top STRUCTURAL
MUST (sn $ cn )
MAY (userPassword $ telephoneNumber $
seeAlso $ description ))

分析:

对于此案例,如果要定义top属性,必须定义一个objectClass属性。因为此案例中还定义了person属性,所以要必须定义sn和cn属性,以及可以附加的属性(userPassword、telephoneNumber、seeAlso、description)。此案例中必须要定义的有3个属性分别是objectClass、sn以及cn。通过此案例下一级的objectClass可以继承上一级objectClass的属性信息。

注:

根据定义,对于不同的objectClass,属性的相关信息也不同。希望通过上面两个案例的介绍,能让读者了解objectClass的含义以及属性的含义。

属性(Attribute)在目录树中主要用于描述条目相关信息,例如用户条目的用途、联系方式、邮件、uid、gid、公司地址等辅助信息。属性由objectClass所控制,一个objectClass的节点具有一系列Attribute,Attribute可以理解为Linux系统当中的变量,每个变量都有对应的值,OpenLDAP Attribute也是有对应的值。这些属性的对应值表示每个对象的特点,但有些属性在添加时是必须指定的,有些属性是非必要的(类似于条目更详细的描述)。在目录树中常用的Attribute有uid、sn、giveName、I、objectClass、dc、ou、cn、mail、telephoneNumber、c等。

目录树中常用的属性及其描述见表1-2。

表1-2 OpenLDAP Attribute及其描述

属性

描述

dn (distinguished name)

唯一标识名,类似于Linux文件系统中的绝对路径,每个对象都有唯一标识名。 例如,uid=dpgdy,ou=People,dc=gdy,dc=com

rdn (relative dn)

通常指相对标识名,类似于Linux文件系统中的相对路径。 例如,uid=dpgdy

uid(user id)

通常指一个用户的登录名称。 例如,uid=dpgdy,与系统中的uid不是一个概念

sn(sur name)

通常指一个人的姓氏。例如,sn:Guo

giveName

通常指一个人的名字。例如,giveName:Guodayong,但不能指姓氏

I

通常指一个地方的地名。例如,I:Shanghai

objectClass

objectClass是特殊的属性,包含数据存储的方式以及相关属性信息

dc (domain component)

通常指定一个域名。例如,dc=example,dc=com

ou (organization unit)

通常指定一个组织单元的名称。 例如,ou=people,dc=example,dc=com

cn(common name)

通常指一个对象的名称,如果是人,需要使用全名

mail

通常指登录账号的邮箱地址,例如,mail:dayong_guo@126.com

telephoneNumber

通常指登录账号的手机号码,例如,telephoneNumber:xxxxxxxxxxx

c(country)

通常指一个二位国家的名称,例如CN、US等国家代号。例如,c:CN

注:

为了方面大家理解OpenLDAP中每个Attribute的含义,读者可通过Linux系统对用户及用户属性的定义(/etc/passwd)来辅助了解,例如:sandy:x:501:501:Check administrator:/home/sandy:/bin/bash

LDIF(LDAP Data Interchanged Format)的轻量级目录访问协议数据交换格式的简称,是存储LDAP配置信息及目录内容的标准文本文件格式,之所以使用文本文件来存储这些信息是为了方便读取和修改,这也是其他大多数服务配置文件所采取的格式。通常用来交换数据并在OpenLDAP服务器之间互相交换数据,并且可以通过LDIF实现数据文件的导入、导出以及数据文件的添加、修改、重命名等操作,这些信息需要按照LDAP中schema的规范进行操作,并会接受schema的检查,如果不符合OpenLDAP schema规范要求,则会提示相关语法错误。

注:

如果读者要手动定义LDIF文件添加修改条目,需要了解以上相关特点;否则,会提示各种各样的语法错误。而且OpenLDAP服务器中定义LDIF文件,每个条目必须包含一个objectclass属性,并且需要定义值,objectclass属性有顶级之分,在定义objectclass之前需要了解objectclass的相关依赖性,否则在添加或者修改时也会提示相关语法错误。

# 注释,用于对条目进行解释
dn:条目名称
objectClass(对象类): 属性值
objectClass(对象类): 属性值
……
dn: uid=Guodayong,ou=people,dc=gdy,dc=com    //DN描述项,在整个目录树上为唯一的
objectClass: top
objectClass: posixAccount
objectClass: shadowAccount
objectClass: person
objectClass: inetOrgPerson
objectClass: hostObject
sn: Guo
cn: Guodayong
telephoneNumber:xxxxxxxxxxx
mail: dayong_guo@126.com

注:

冒号后面有一个空格,然后才是属性的值,schema规范定义要求很严格。(这点请读者切记!)

对象标识符(object identifier)被LDAP内部数据库引用的数字标识。Attribute的名字是为了方便人们读取,但为了方便计算机的处理,通常使用一组数字来标识这些对象,这类同于SNMP中的MIB2。例如,当计算机接收到dc这个Attribute时,它会将这个名字转换为对应的OID:1.3.6.1.4.1.1466.115.121.1.26。

schema定义了OpenLDAP框架目录所应遵循的结构和规则,保障整个目录树的完整性。主要包括4个部分,分别是OID、objectClass、匹配规则、属性,本小节主要介绍OID相关知识点。

每个schema中,都具有合法而全局唯一的对象标识符,简称OID。主要用于被LDAP内部数据库引用的标识,schema生产objectClass,objectClass生成Attribute,Attribute的产生主要是为了方便人们所理解,但为了方便计算机处理,通常使用一组数字来标识这些对象,类似于SNMP中MIB2概念。

OID在OpenLDAP项目中承担重要角色,是存在层级关系的。由表1-3得知,项目ID为1.1,分为6个层级,分别是SNMP元素定义、LDAP元素定义、属性类型、属性名称、对象类型、对象名称。如果你要定义一个OID,需要到http://www.iana.org/申请免费已注册的OID或者通过http://pen.iana.org/pen/PenApplication.page填写信息并提交来完成OID的申请。

表1-3 OID层级关系

OID

Assignment

1.1

Organization's OID

1.1.1

SNMP Elements

1.1.2

LDAP Elements

1.1.2.1

AttributeTypes

1.1.2.1.1

x-my-Attribute

1.1.2.2

objectClasses

1.1.2.2.1

x-my-objectClass

关于OID相关的更多知识,读者可以通过www.openldap.org官网进行详细了解,在此不做过多阐述。

当今局域网、互联网不断发展,其网络规模也在不断扩大,为了集中管理主机及其相关资源,我们可以通过DHCP及DNS服务器来自动分配IP地址、子网掩码、网关、主机名等相关网络配置信息。随着企业规模不断发展,系统规模不断增加,那么作为系统运维管理人员维护服务器有些力不从心,比如:

我们了解了目前企业中面临的各种各样的问题,了解了问题的所在,那就带着这些问题让我们一起看看通过自动化运维是如何解决的。

目前,自动化运维解决方案有以下几种。

企业中批量安装系统是难免的事情,如何在短时间内安装大量系统?为了提高工作效率,一般运维管理员通常会使用PXE +Kickstart、Cobbler开源软件来实现系统的自动安装部署。PXE+Kickstart架构不适合同时安装不同系统平台。目前Cobbler软件在企业中应用比较广泛。

对于自动化部署平台的管理,一般采用开源软件实现,如Puppet(C/S架构)、Ansible(SSH互信实现)、Saltstack等开源架构实现统一管理以及各种应用变更部署。针对每一款产品都有一定的应用场景,大多数企业混合使用,针对不同的场景使用不同的产品,例如,使用Puuppet进行推送,利用Saltstack远程执行命令等,目前Puppet深受运维人员喜爱。

对于线上系统及各种应用平台实现账号统一管理,实现方式有开源软件以及商业软件。例如OpenLDAP(开源软件)、NIS、IBM Tivoli Directory Server(商业管理软件)。针对OpenLDAP软件有众多功能模块,同样也可以通过自定义schema实现企业中特殊的需求以及通过第三方软件实现高可用负载架构等,这是商业软件所没有的特点。商业软件价格比较昂贵,这对中小型企业是一项不菲的开支。

目前OpenLDAP主要在中大(型)企业得到广泛应用,使用LDAP实现各种系统及平台用户集中身份验证,降低账号管理复杂度,增强系统及账号安全性,实现账号统一集中管理。同样本书重点讲解OpenLDAP产品以及在企业中应用的场景。

为了保证线上服务器的安全性,一般会在前端设立安全关卡。满足条件才允许你使用账号进行登录线上服务器。目前保垒机、跳板机的实现方式有采用OpenLDAP+Jumpserver(开源架构)、帕拉迪软件(商业软件)等。对于小型企业,采用商业软件无疑会给企业带来不菲的开支,选择开源的架构无疑是不错的选择。实战章节会介绍Jumpserver软件的使用及其在企业中的应用场景。

本章介绍了OpenLDAP产品、功能及优点、适用场景,让读者慢慢对陌生而强大的自动化账号管理软件进行系统的了解。并针对OpenLDAP的组织架构、OpenLDAP关键术语(schema、objectClass、attribute、LDIF)及相关实现方式进行详细介绍。最后介绍企业中自动化运维解决方案。

OpenLDAP术语对于后期高级配置以及应用平台集成起到非常重要的铺垫作用,希望读者能够认认真真阅读本章。

下面的章节将会介绍OpenLDAP服务器的安装、配置文件组成及含义、搭建案例等相关实战操作。请读者拭目以待。


通过第1章的介绍,相信读者对OpenLDAP的工作原理、应用场景以及相关术语有了一定的了解和认识。

本章主要介绍如何在Linux平台下构建OpenLDAP应用,提供集中账号认证管理。

OpenLDAP属于开源集中账号管理软件。由于支持众多系统平台(Windows、Linux、Centos、Debian、Ubuntu、SUSE、Gentoo、openSUSE、Fedora、FreeBSD等),它被众多互联网企业、证券、银行、物流实现系统等用于账号的集中分配管理。

本书主要以红帽Linux 6.5为例介绍OpenLDAP各个模块所实现的功能。本章主要介绍OpenLDAP的安装和配置,后续章节会介绍OpenLDAP的管理、高级功能(权限控制、密码策略及审计、主机控制策略、同步、高可用负载责架构以及应用平台集成案例讲解等)。

在UNIX发行操作系统环境下安装OpenLDAP软件一般有两种方式:一种是通过源码编译安装,另一种则是通过光盘自带的rpm软件包进行安装。下面会分别介绍这两种安装方式。安装OpenLDAP服务器需要提供守护进程和传统的OpenLDAP管理配置工具,主要是slapd和ldap-utils套件。

要安装OpenLDAP,步骤如下。

1)获取OpenLDAP软件包。

2)安装OpenLDAP软件包(通过rpm或源码编译安装)。

3)生产OpenLDAP配置文件及数据库文件。

4)配置OpenLDAP。

5)添加目录树条目。

6)加载slapd进程。

7)验证。

yum仓库主要用于解决软件包依赖关系(这里以本地yum源为例进行配置)。

yum仓库配置文件的语法及参数如下。

1.yum配置文件语法

yum配置文件语法如下。

# cat /etc/yum.repos.d/define.repo
[repo_name]
name=
baseurl=
enabled=
gpgcheck=
gpgkey=

2. yum配置文件语法解释

yum配置文件的语法解释如下。

[repo_name]
含义:[  ]内是yum仓库的名称,用于区别不同yum仓库及功能
name=yum server    
含义:name=后面跟的是仓库描述的信息
baseurl=path  
含义:baseurl=后面跟仓库的路径
enabled=[0|1]   
含义:enabled=后面跟的数字表示是否启用该仓库,[1]表示启用,[0]表示禁用
gpgcheck=[0|1]
含义:gpgcheck=后面跟的数字表示是否检查软件包的md5sum,用于验证软件包的安全性,[1]表示检查,[0]表示不检查。
gpgkey=path 
含义:gpgkey=后面跟软件包所使用的签名,一般启用gpgcheck时才配置。例如:
gpgkey=/etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

3.yum基本命令参数介绍

读者可以通过man yum来详细了解每个参数的具体说明,在此不做过多解释。

* install package1 [package2] [...]  
软件包的安装
* update [package1] [package2] [...]             
软件包的更新
* check-update    
检测最新的软件包         
* remove | erase package1 [package2] [...]
卸载安装的软件包
* list [...] 
查看安装的软件包列表
* info [...]                                    
查看软件包的相关信息
* provides | whatprovides feature1 [feature2] [...]
查看文件由哪个软件包提供
* clean [ packages | metadata | expire-cache | rpmdb | plugins | all ] 
清除缓存信息
* makecache    
重建缓存文件,一般新建yum仓库时以及使用clean参数时,使用makecache重建缓存
* groupinstall group1 [group2] [...]  
以组的形式安装软件包组件                     
* groupupdate group1 [group2] [...]                   
更新组相关软件包
* grouplist [hidden] [groupwildcard] [...]                
获取已安装和没安装的软件包组件
* groupremove group1 [group2] [...]          
移除软件包组件
* groupinfo group1 [...]               
查看软件包组件相关信息  
* search string1 [string2] [...]                        
以软件包名称在仓库中进行搜索
* localinstall rpmfile1 [rpmfile2] [...]       
(maintained for legacy reasons only - use install)
本地安装软件包
* localupdate rpmfile1 [rpmfile2] [...]          
本地更新软件包

为了简化OpenLDAP的安装复杂度,作者建议使用光盘自带的rpm软件包安装。除非有特殊需求,需要定制安装,才使用编译方式安装OpenLDAP。

1.安装操作步骤

要以软件包rpm形式安装OpenLDAP,步骤如下。

1)配置yum源。

2)安装OpenLDAP组件。

3)初始化OpenLDAP配置。

4)加载slapd进程。

5)获取slapd信息。

2.配置yum仓库

要配置yum仓库,需要先挂载光盘镜像,命令如下。

# mount /dev/cdrom /mnt

配置yun仓库的命令如下:

# cat  >>  /etc/yum.repos.d/rhel-source.repo << EOF
[source-cdrom]
name=software
baseurl=file:///mnt
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
EOF

3.清除缓存并创建缓存

清除和创建缓存的命令如下:

# yum clean all  &&  yum makecache

4.安装OpenLDAP组件

安装OpenLDAP组件的命令如下。

# yum install openldap openldap-servers openldap-clients openldap-devel compat-openldap –y 

此时通过光盘自带的软件包安装OpenLDAP组件完成。

5.初始化OpenLDAP配置

初始化OpenLDAP配置的命令如下:

# cp /usr/share/openldap-servers/DB_CONFIG.example   /var/lib/ldap/DB_CONFIG
# cp /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/slapd.conf
# chown –R ldap.ldap /etc/openldap/
# chown –R ldap.ldap /var/lib/ldap

6.启动LDAP进程slapd

OpenLDAP软件安装完成后,要使用它,需要启动slapd进程来调用程序:

# service slapd restart
Stopping slapd:                                            [FAILED]
Starting slapd:                                            [  OK  ]
# chkconfig slapd on    

7.获取OpenLDAP默认监听的端口

要获取OpenLDAP默认监听的端口,命令如下:

[root@mldap01 ~]# netstat -ntplu | grep -i :389
tcp        0      0 0.0.0.0:389         0.0.0.0:*     LISTEN      1567/slapd
tcp 0 0 :::389 :::* LISTEN 1567/slapd

默认OpenLDAP服务所使用的端口为389,此端口采用明文传输数据,数据信息得不到保障。所以可以通过配置CA及结合TLS/SASL实现数据加密传输,所使用端口为636,后面章节会详细介绍实现过程。

8.获取OpenLDAP进程的状态

要获取OpenLDAP进程的状态,命令如下:

[root@mldap01 ~]# ps aux | grep slapd | grep -v grep
ldap      1567  0.0  1.8 1128948 71880 ?       Ssl  Nov27   0:07 /usr/sbin/slapd -h  ldap:/// ldapi:/// -u ldap

至此,通过光盘自带的软件包安装OpenLDAP就结束了。后续的操作就是配置并添加条目,这部分在本章最后通过案例进行介绍。

1.通过源码编译安装OpenLDAP软件准备工作

由于编译安装OpenLDAP需要数据库支持,因此OpenLDAP软件后端数据库可采用Berkeley DBBDB、Oracle、MySQL、MariaDB、GDBM等数据库软件实现数据的存储。默认OpenLDAP采用Berkeley DB数据库作为后端存储引擎,而且OpenLDAP对Berkey DB的版本有一定要求,以OpenLDAP 2.4软件版本为例,需要Berkeley DB 4.4版本以上,所以在编译OpenLDAP源码包时需要先下载Brekeley DB源码包,并进行编译安装即可。

Berkeley DB是由美国Sleepycat Software公司开发的开源数据库系统,具有高性能、嵌入式数据库编程库,可存取任意类型的键(key)/值(value)对,一键可以存储多个值,且支持在线并发量大的数据查询请求。

2.安装步骤

根据环境需求,读者可以下载相应的源码包进行编译安装,作者所使用的系统为红帽Linux 6.5版本,Berkey DB源码包版本为4.6.21。安装步骤如下。

1)获取源码包。

2)安装编译所依赖的环境。

3)解压并定义安装属性。

4)编译及编译安装源码包。

5)添加库文件及头文件。

3.编译安装Berkeley DB源码包

可以从http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads获取Berkeley DB源码包。

要点:

在编译安装任何开源软件时,解压完成后都会在相应的目录下生成INSTALLT和README文档,里面介绍安装方法以及注意事项,同样可以到官方文档查看软件的安装手册,提高用户安装的灵活性,降低编译复杂度。

# yum install libtool-ltdl  libtool-ltdl-devel gcc openssl openssl-devel  -y  安装依赖的软件包
# tar xfzv db-4.6.21.tar.gz -C /usr/local/src  

解压Berkeley DB源码包到/usr/local/src目录下,此时会在该目录下生成build_unix目录,然后执行下列命令进行配置安装即可。

# cd /usr/local/src/db-4.6.21/build_unix  &&  mkdir  /usr/local/BDB
# ../dist/configure  --prefix=/usr/local/BDB
================================================================== //华丽的省略线
configure: creating ./config.status
config.status: creating Makefile
config.status: creating db_cxx.h
config.status: creating db_int.h
config.status: creating clib_port.h
config.status: creating include.tcl
config.status: creating db.h
config.status: creating db_config.h

通过--prefix指定Berkeley DB安装路径,读者可通过../dist/configure –help命令获取Berkeley DB详细的配置选项。

# make && make install     //编译并进行安装
========================================================================= //华丽的分割线 Installing DB utilities: /usr/local/BDB//bin ... cp -p .libs/db_archive /usr/local/BDB//bin/db_archive cp -p .libs/db_checkpoint /usr/local/BDB//bin/db_checkpoint cp -p .libs/db_codegen /usr/local/BDB//bin/db_codegen cp -p .libs/db_deadlock /usr/local/BDB//bin/db_deadlock cp -p .libs/db_dump /usr/local/BDB//bin/db_dump cp -p .libs/db_hotbackup /usr/local/BDB//bin/db_hotbackup cp -p .libs/db_load /usr/local/BDB//bin/db_load cp -p .libs/db_printlog /usr/local/BDB//bin/db_printlog cp -p .libs/db_recover /usr/local/BDB//bin/db_recover cp -p .libs/db_stat /usr/local/BDB//bin/db_stat cp -p .libs/db_upgrade /usr/local/BDB//bin/db_upgrade cp -p .libs/db_verify /usr/local/BDB//bin/db_verify Installing documentation: /usr/local/BDB//docs ...

添加的库文件和头文件主要作为其他程序编译安装所调用的库文件和头文件。

# cat >> /etc/ld.so.conf.d/bdb.conf << EOF
/usr/local/BDB/lib/
EOF
# ldconfig  –v     //重新让内核读取库文件

通过在ld.so.conf.d目录下创建以.conf配置文件加载Berkeley DB的库文件,同样也可在ld.so.conf里面添加配文件进行加载,ld.so.conf是系统动态链接库配置文件。配置完成后,使用ldconfig –v重新加载库文件,使系统内核重新识别,然后在编译OpenLDAP时,才能找到Berkeley DB相关库文件。

# ln -sv /usr/local/BDB/include /usr/include/bdb
`/usr/include/bdb' -> `/usr/local/BDB/include'

至此,恭喜您!Berkeley DB编译安装到此就完成了。下面我们一起学习如何编译安装OpenLDAP软件。但读者一定注意,在编译安装OpenLDAP软件时,要确认后端数据库是否安装,例如Berkeley DB,否则会提示找不到数据库等错误。

4.编译安装OpenLDAP源码包

读者可通过http://www.openldap.org/software/download/获取OpenLDAP源码包。

# tar xf openldap-2.4.15.tgz  -C /usr/local/src/
# cd /usr/local/src/openldap-2.4.15/
# ldconfig –v 

编译安装OpenLDAP软件时,需要输出库文件(include和lib的路径),否则编译时会提示BDB数据库版本不兼容而中断编译操作。

# ./configure --prefix=/usr/local/openldap2.4
Making servers/slapd/backends.c
    Add config ...
    Add ldif ...
    Add monitor ...
    Add bdb ...
    Add hdb ...
    Add relay ...
Making servers/slapd/overlays/statover.c
    Add seqmod ...
    Add syncprov ...
Please run "make depend" to build dependencies
# make depend
# make  && make test &> /dev/null && make install  
installing slapacl.8 in /usr/local/openldap2.4/share/man/man8
installing slapadd.8 in /usr/local/openldap2.4/share/man/man8
installing slapauth.8 in /usr/local/openldap2.4/share/man/man8
installing slapcat.8 in /usr/local/openldap2.4/share/man/man8
installing slapd.8 in /usr/local/openldap2.4/share/man/man8
installing slapdn.8 in /usr/local/openldap2.4/share/man/man8
installing slapindex.8 in /usr/local/openldap2.4/share/man/man8
installing slappasswd.8 in /usr/local/openldap2.4/share/man/man8
installing slaptest.8 in /usr/local/openldap2.4/share/man/man8
make[3]: Leaving directory `/usr/local/src/openldap-2.4.15/doc/man/man8'

make[2]: Leaving directory `/usr/local/src/openldap-2.4.15/doc/man'

make[1]: Leaving directory `/usr/local/src/openldap-2.4.15/doc'

执行make test时,可能需要花点时间进行检测,如果存在错误make test会提示错误类型。所以作者建议读者在编译安装时,一定要执行make test进行检测,从而保证软件的稳定性和可靠性。

# cat >> /etc/ld.so.conf.d/ldap.conf << EOF
/usr/local/openldap2.4/lib/
EOF
# ldconfig  –v
# ln -sv /usr/local/openldap2.4/include /usr/include/ldap2.4
`/usr/include/ldap2.4' -> `/usr/local/openldap2.4/include'

至此,恭喜您!OpenLDAP编译安装就完成了。

如果在执行make时报如下错误,可以通过以下方法进行解决。

getpeereid.c: In function `lutil_getpeereid’:
getpeereid.c:65: error: storage size of ‘peercred’ isn’t known
make[2]: *** [getpeereid.o] Error 1
make[2]: Leaving directory `/usr/local/src/openldap-2.4.15/libraries/liblutil'
make[1]: *** [all-common] Error 1
make[1]: Leaving directory `/usr/local/src/openldap-2.4.15/libraries'
make: *** [all-common] Error 1

在编译时没有输出库文件和lib的路径,所以在编译时会出现Error,可通过下面的方法进行解决。

# export CPPFLAGS="-I/usr/local/BDB/include  -D_GNU_SOURCE"
# make    //编译前准备相关属性,如果没有配置任何属性信息,就会使用默认定义的属性
# make install    //编译安装

在OpenLDAP 2.4版本中,配置OpenLDAP的方法有两种:一种通过修改配置文件实现配置,另一种通过修改数据库的形式完成配置。

通过配置数据库完成各种配置,属于动态配置且不需要重新启动slapd进程服务。此配置数据库(cn=config)包含一个基于文本的集合LDIF文件(位于 /etc/openldap/slapd.d目录下)。当前仍然可以使用传统的配置文件(slapd.conf)方式进行配置,通过配置文件来实现slapd的配置方式。slapd.conf可以通过编辑器进行配置,但cn=config不建议直接编辑修改,而是采用ldap命令进行修改。

本书中两种配置方式均有介绍,旨在让读者了解两种方法的本质区别。

配置文件路径包括以下几个。

OpenLDAP监听的端口有以下两个。

OpenLDAP主配置文件为/etc/openldap/slapd.conf。此文件默认不存在,需要复制安装OpenLDAP软件包安装所产生的配置文件模板并重命名它为slapd.conf文件,这同样可以通过修改数据库文件实现配置。

1.获取openldap-servers软件包生成的文件

要获取openldap-servers软件包生成的文件,命令如下。

 [root@mldap01 ~]# rpm -ql openldap-servers | egrep -i '(slapd\.conf\.*|DB_CONFIG.example)'
/etc/openldap/slapd.conf
/etc/openldap/slapd.conf.bak
/usr/share/man/man5/slapd.conf.5.gz
/usr/share/openldap-servers/DB_CONFIG.example  
/usr/share/openldap-servers/slapd.conf.obsolete
[root@mldap01 ~]#

2.软件包所产生文件的用途

要配置OpenLDAP服务端,需要将如上配置文件模板复制到/etc/openldap/目录下并命名为slapd. conf,同时将数据库配置文件模板复制到/var/lib/ldap/目录中并将其命名为DB_CONFIG,且/var/lib/ldap/目录权限所有主(owner),所属组(group)必须为ldap用户可读写,否则会在加载slapd进程时显示权限警告。

3.slapd.conf配置文件参数

/etc/openldap/slapd.conf为OpenLDAP主配置文件,以#号开头的为注释说明。

include         /etc/openldap/schema/corba.schema
include         /etc/openldap/schema/core.schema
include         /etc/openldap/schema/cosine.schema
include         /etc/openldap/schema/duaconf.schema
include         /etc/openldap/schema/dyngroup.schema

include行代表当前OpenLDAP服务包含的schema文件。schema是整个OpenLDAP目录树的标准规范,标识数据和类型的关系。例如,要使OpenLDAP服务端支持Samba服务用户验证,此时就需要包含Samba对应的schema文件(samba.schema),关于schema,第1章已经介绍,在此不做过多的解释。

allow bind_v2
pidfile         /var/run/openldap/slapd.pid
argsfile        /var/run/openldap/slapd.args
moduleload ppolicy.la
modulepath /usr/lib/openldap      //32bit的模块文件路径
modulepath /usr/lib64/openldap     //64bit的模块文件路径

在网络上传输极其不安全,所以需通过如下配置将数据加密传输,前提是需要第三方合法的证书机构颁发的数字证书(关于证书的构建及颁发,第8章详细介绍如何通过自建证书实现数据加密传输)。

TLSCACertificatePath /etc/openldap/certs
TLSCertificateFile "\"OpenLDAP Server\""
TLSCertificateKeyFile /etc/openldap/certs/password

OpenLDAP服务后端存储数据库引擎支持的数据库类型有MySQL、DB2、Oracle等关系数据库,默认为bdb数据库。

database bdb

指定要搜索或查询OpenLDAP目录树的后缀名称等同于AD域名。

suffix          "dc=example,dc=com"   

OpenLDAP服务管理员对目录树进行管理,如插入、更新、修改及删除等管理操作,要求系统管理员具有root身份权限,此管理员用户名可以自我修改。

rootdn          "cn=Manager,dc=example,dc=com"

要配置管理员密码,密码可以通过明文添加,也可以通过slappasswd -s gdy@123!来获取加密字符串,然后将加密字符串粘贴在roopw后面,实现密文添加。属性与值之间通常使用三个Tab键进行分开。配置文件要求非常严格,后面不能有任何空格或者制表符。

# rootpw                secret
root  gdy@123!     #明文添加,不建议使用
rootpw   {SSHA}dXWdy83Gn8eg5oD2yUECQzgDnr8LrDqW  #密文添加,建议使用
# cat << EOF | ldapadd -Y EXTERNAL -H ldapi:///
dn: olcDatabase={0}config,cn=config
changetype: modify
delete: olcRootDN

dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootDN
olcRootDN: cn=Admin,cn=config

dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}tDTQMzxQZjv+W2QRnt0Os2KHNp/lbqEQ
EOF
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={0}config,cn=config"

modifying entry "olcDatabase={0}config,cn=config"

modifying entry "olcDatabase={0}config,cn=config" 

此时管理员由“cn=Manager,dc=gdy, dc=com”修改为“cn=Admin,dc=gdy,dc=com”。密码由原来的“gdy@123!”修改为“redhat@123!”。

指定一个目录用于存放OpenLDAP目录树所有数据,如用户及组信息、sudo规则、密码策略等数据。

directory       /var/lib/ldap

通过创建索引(index),提高读写效率,这类似于关系数据库中索引的概念。

index objectClass                       eq,pres
index ou,cn,mail,surname,givenname      eq,pres,sub
index uidNumber,gidNumber,loginShell    eq,pres

安装环境的拓扑图如图2-1所示。

图2-1 安装环境拓扑图

安装环境要求如下。

IP地址及主机名规划如表2-1所示。

表2-1 IP地址及主机名规划

主 机

系统版本

IP地址

主机名

LDAP服务端

RHEL Server release 6.5

192.168.218.206

mldap01.gdy.com

LDAP客户端

RHEL Server release 5.5

192.168.218.207

test02.gdy.com

LDAP客户端

RHEL Server release 6.5

192.168.218.208

test01.gdy.com

OpenLDAP相关软件包套件如表2-2所示。

表2-2 OpenLDAP相关软件包套件

软件包名称

软件包功能描述

openldap

OpenLDAP服务端和客户端必须用的库文件

openldap-clients

在LDAP服务端上使用,用于查看和修改目录的命令行的包

openldap-servers

用于启动服务和设置,包含单独的LDAP后台守护程序

openldap-servers-sql

支持sql模块

compat-openldap

OpenLDAP兼容性库

LDAP服务端和客户端主机名称及对应的IP地址解析服务正常工作,且每个节点的主机名称需要跟“uname –n”命令执行的结果保持一致。这可以通过搭建DNS服务来完成,也可以通过修改两个节点的hosts文件来保持IP地址和主机名之间,互相解析。

[root@localhost ~ ]# sed –i ‘s@\(HOSTNAME=\).*@\1mldap01.gdy.com@g’//开机生效(永久生效)
[root@localhost ~ ]# hostname mldap01.gdy.com      //临时生效
[root@localhost ~ ]# exit     //退出,重新登录
[root@mldap01 ~ ]#

OpenLDAP为C/S架构,加密传输需要使用CA证书,所以需要配置服务端和客户端时间保持同步。可以通过配置NTP服务来提供时间源,然后利用Puppet软件分发功能批量配置NTP客户端,实现时间的同步。本章使用ntpdate+crontab实现主机自动时间同步,在生产环境中建议采用NTP Service来完成时间的同步。

[root@mldap01 ~]# ntpdate 0.rhel.pool.ntp.org
13 Nov 19:46:35 ntpdate[2394]: step time server 202.112.10.36 offset 2.202509 sec
[root@mldap01 ~]# echo "0/5  *  *  *  * root /usr/sbin/ntpdate 0.rhel.pool.ntp.org"  >>
                           /var/spool/cron/root 
[root@mldap01 ~]# crontab -l
0/5  *  *  *  * root /usr/sbin/ntpdate0.rhel.pool.ntp.org

要配置时间同步,可以使用NTP服务实现时间的同步,也可以通过定义计划任务实现时间同步。一般建议搭建NTP服务进行同步,防止出现大量时间片(空白时间),本节以计划任务方式进行配置。

一般生产环境中防火墙和SELinux均处于关闭状态,如果读者要开启服务器防火墙过滤功能以及SELinux,将对应的端口(389/636)开放即可。具体步骤如下。

1)关闭防火墙和SELinux规则。

[root@mldap01 ~ ]# service iptables stop && chkconfig iptables off
iptables: Setting chains to policy ACCEPT: filter        [  OK  ]
iptables: Flushing firewall rules:                       [  OK  ]
iptables: Unloading modules:                             [  OK  ]
[root@mldap01 ~ ]# getenforce 
Enforcing
[root@mldap01 ~ ]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
[root@mldap01 ~ ]# setenforce 0
[root@mldap01 ~ ]# getenforce 
Permissive
[root@mldap01 ~ ]# cat /etc/selinux/config  | grep -i '^SELINUX'
SELINUX=disabled
SELINUXTYPE=targeted 

2)开启防火墙,并配置过滤规则。

# iptables –A INPUT –p tcp –m state –state NEW –dport 389 –j ACCEPT
# iptables –A OUTPUT –p tcp –m state –state NEW –sport 389 –j ACCEPT
# service iptables save
# service iptables restart && chkconfig iptables on
# iptables –A INPUT –p tcp –m state –state NEW –dport 636 –j ACCEPT
# iptables –A OUTPUT –p tcp –m state –state NEW –sport 636 –j ACCEPT
# service iptables save
# service iptables restart && chkconfig iptables on

因为这里使用hosts来解析主机名,所以服务端和客户端都需要配置。如果使用DNS来解析,此步骤可以忽略,也可以作为备用,防止OpenLDAP服务端无法正常解析。如果批量修改hosts文件,可以选择Puppet或者Ansible等自动化部署工具来实现。

[root@mldap01 ~ ]# cat >> /etc/hosts << EOF
>192.168.218.206 mldap01.gdy.com mldap01
>192.168.218.208 test01.gdy.com test01
>192.168.218.207 test02.gdy.com test02
>EOF

通过yum安装OpenLDAP组件,解析软件包的依赖关系。

[root@mldap01 ~ ]# yum install openldap openldap-servers openldap-clients –y

初始化OpenLDAP配置的步骤如下。

1)复制配置模板至/etc/openldap目录下,命令如下。

[root@mldap01 openldap]# cp/usr/share/openldap-servers/slapd.conf.obsolete/etc/   
                                  openldap/slapd.conf 
[root@mldap01 openldap]# cp slapd.d /tmp/slapd.d.bak   //备份默认数据库文件
[root@mldap01 openldap]# rm -rf /etc/openldap/slapd.d/ *

2)创建数据库文件(从模板进行复制),生成DB_CONFIG及启动OpenLDAP进程slapd,命令如下。

[root@mldap01 openldap]# cp/usr/share/openldap-servers/DB_CONFIG.example/var/lib/  
                                   ldap/DB_CONFIG
[root@mldap01 openldap]# chown -R ldap:ldap /var/lib/ldap 

要点:

只有root用户可以使用/usr/sbin/slapadd,然而目录服务器以ldap用户运行,因此目录服务器不能通过slapadd修改任何文件,因此需要需要将/va/lib/ldap的属主属组修改为ldap。

3)查看OpenLDAP是否开启SSL加密功能

这里保持默认设置,第8章将介绍如何配置SSL相关设置以及如何自建CA来完成SSL加密验证功能。

[root@mldap01 ~ ]# cat  /etc/sysconfig/ldap | grep -v -E "^$|^#"
SLAPD_LDAP=yes
SLAPD_LDAPI=yes
SLAPD_LDAPS=no

此处未开启SSL,如果开启SSL功能,可以再使用SLAPD_LDAPS=yes,或者使用SLAPD_URLS进行指定即可。

例如:SLAPD_URLS=ldaps://ldap01.deppon.com。

4)OpenLDAP主配置文件配置。

例如,为了使Samba支持OpenLDAP用户验证登录,此时就需要包含Samba的schema文件。

include                /etc/openldap/schema/samba.schema
pidfile     /var/run/openldap/slapd.pid
argsfile   /var/run/openldap/slapd.args

因为系统分为32位和64位系统,所以要添加32位和64位模块存放的位置。

modulepath /usr/lib/openldap   
modulepath /usr/lib64/openldap

例如,如果让OpenLDAP实现同步,需要加载syncprov.la模块,通过moduleload引用即可。

moduleload syncprov.la
database bdb

suffix域名类似于微软的AD的域名。

suffix  "dc=gdy,dc=com"

OpenLDAP管理员类似于系统用户root,具有对OpenLDAP服务器做任何修改操作的权限,管理员名称可以自我定义。

rootdn  "cn=Manager,dc=gdy,dc=com"

默认OpenLDAP管理员密码使用明文进行管理,在生产环境中,建议使用密文管理。通过使用slappasswd命令创建密码串,然后将密码串复制到rootpw即可。

# slappasswd 
New password: 
Re-enter new password: 
{SSHA}pUr8/1VDGOODRCtaQbMrFa4LYpMLmqXs
# sed –i \'s/rootpw*/rootpw{SSHA}pUr8/1VDGOODRCtaQbMrFa4LYpMLmqXs/g'/etc/openldap/slapd.conf
# cat /etc/openldap/slapd.conf
rootpw  {SSHA}pUr8/1VDGOODRCtaQbMrFa4LYpMLmqXs
directory /var/lib/ldap
# slaptest -f /etc/openldap/slapd.conf 
config file testing succeeded

如果配置文件存在语法错误,通过slaptest –u命令有相应的提示,根据提示对slapd.conf配置文件进行调整即可。

# slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
config file testing succeeded

返回config file testing succeeded表示配置文件生成数据库成功,后边会介绍如何通过修改数据库(cn=config)来完成OpenLDAP的配置,这也是2.4版本推荐配置OpenLDAP的一种方式。

通过“slapd –d ?”来获取OpenLDAP的日志级别,日志主要用于对OpenLDAP排错:

[root@mldap01 ~]# slapd -d ?
Installed log subsystems:

     Any                          (-1, 0xffffffff)    //开启所有的dug信息
     Trace                        (1, 0x1)            //跟踪trace函数调用
     Packets                      (2, 0x2)            //与软件包的处理相关的dug信息
     Args                         (4, 0x4)            //全面的debug信息
     Conns                        (8, 0x8)            //链接数管理的相关信息
     BER                          (16, 0x10)          //记录包发送和接收的信息
     Filter                       (32, 0x20)          //记录过滤处理的过程
     Config                       (64, 0x40)          //记录配置文件的相关信息
     ACL                          (128, 0x80)         //记录访问控制列表的相关信息
     Stats                        (256, 0x100)        //记录链接、操作以及统计信息
     Stats2                       (512, 0x200)        //记录向客户端响应的统计信息
     Shell                        (1024, 0x400)       //记录与shell后端的通信信息
     Parse                        (2048, 0x800)       //记录条目的分析结果信息
     Sync                         (16384, 0x4000)     //记录数据同步资源消耗的信息
     None                         (32768, 0x8000)     //不记录

NOTE: custom log subsystems may be later installed by specific code

通过配置日志,了解OpenLDAP服务运行情况,用于各种错误排查。配置OpenLDAP日志时,需要通过修改rsyslog配置文件,在文件中添加:local4.*/var/log/slapd.log,slapd.log文件要提前存在且ldap用户具有读写权限,然后重启rsyslog进程重新读取配置文件。

根据以上信息,了解OpenLDAP的日志级别,然后根据自己的需求按以下步骤来配置OpenLDAP日志。日志主要可以对OpenLDAP出现的异常、错误进行分析、定位,如进程启动失败、条目同步失败及客户端无法获取用户条目信息等,都会记录到日志中。

1)创建目录及调整权限,用于存放日志文件。

[root@mldap01 openldap]# touch /var/log/slapd.log
[root@mldap01 openldap]# chown ldap.ldap /var/log/slapd.log
[root@mldap01 openldap]# mkdir /var/log/slapd
[root@mldap01 openldap]# chmod 755 /var/log/slapd/
[root@mldap01 openldap]# chown ldap:ldap /var/log/slapd/                      

2)修改日志文件,使其加载OpenLDAP参数。

[root@mldap01 openldap]# sed -i "/local4.*/d" /etc/rsyslog.conf
[root@mldap01 openldap]# cat >> /etc/rsyslog.conf << EOF
local4.*                        /var/log/slapd/slapd.log
EOF
[root@mldap01 slapd.d]# cat /etc/openldap/slapd.conf  | grep -i  loglevel
loglevel 256

3)重新加载rsyslog使其配置生效。

[root@mldap01 ~]# service rsyslog restart
Shutting down system logger:                               [  OK  ]
Starting system logger:                                    [  OK  ]

要配置OpenLDAP日志,按以下步骤操作。

1)通过修改cn=config配置OpenLDAP日志记录的修改及添加,通过cat命令查看数据库配合文件日志级别信息。

[root@mldap01 slapd.d]# cat cn\=config.ldif | grep olcLogLevel
olcLogLevel: Stats

2)通过ldapmodify命令将原来的日志级别进行清除。

[root@mldap01 slapd.d]# cat << EOF | ldapmodify -Y EXTERNAL -H ldapi:///
> dn: cn=config
> changetype: modify
> delete: olcLogLevel
> olcLogLevel: Stats
> EOF
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"
[root@mldap01 slapd.d]# cat cn\=config.ldif | grep olcLogLevel
[root@mldap01 slapd.d]#

3)通过ldapmodify命令重新添加OpenLDAP日志级别。

[root@mldap01 slapd.d]# cat << EOF | ldapmodify -Y EXTERNAL -H ldapi:///
> dn: cn=config
> changetype: modify
> add: olcLogLevel
> olcLogLevel: 32
> EOF
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"

[root@mldap01 slapd.d]# cat cn\=config.ldif | grep olcLogLevel
olcLogLevel: 32
[root@mldap01slapd.d]# 

此时以上操作无须重启slapd进程,即可生效,如果通过配置文件进行修改,需要重新生成数据库文件,且重新启动slapd服务进程。

本章介绍如何通过logrotate实现对OpenLDAP日志的切割,预防日志过大不便于排错以及性能分析。下面通过定制脚本实现当日志大于10MB时,进行切割,便于排错。脚本如下。

#!/bin/bash
########### 通过logrotate实现对OpenLDAP日志进行切割 ##################
FILE= /var/log/slapd/slapd.log
if [ ! -f $FILE ];then
 /bin/touch $FILE &&/bin/chmod 666 $FILE &&/usr/bin/chattr +a $FILE &>/dev/null
cat > /etc/logrotate.d/ldap << "EOF"
/var/log/slapd/slapd.log {
       prerotate
               /usr/bin/chattr -a  /var/log/slapd/slapd.log
       endscript
       compress
       delaycompress
       notifempty
       rotate 100
       size 10M
       postrotate
               /usr/bin/chattr +a  /var/log/slapd/slapd.log
       endscript
}
EOF
     service rsyslog restart   &&    chkconfig  rsyslog on
else
     echo "slapd log is exsit"
fi

以上配置完成后,OpenLDAP日志当超过10MB后,系统会自动进行切割并重新生成新文件,保存OpenLDAP日志,防止单个日志文件过大,不便于日志分析查看。

要加slapd进程、端口状态,可以按如下步骤进行操作。

1)启动OpenLDAP服务slapd进程。

[root@mldap01 openldap]# service slapd restart
Stopping slapd:                                            [FAILED]
Starting slapd:                                            [  OK  ] 

2)设置OpenLDAP slapd进程,系统启动时运行级别。

[root@mldap01 ~]# chkconfig slapd on
[root@mldap01 ~]# chkconfig --list slapd
slapd             0:off    1:off    2:on    3:on    4:on    5:on    6:off

3)检查OpenLDAP服务进程启动所产生的PID文件及参数文件。

[root@mldap01 ~]# ls -l /var/run/openldap/
total 8
-rw-r--r--. 1 ldap ldap 48 Nov 27 08:18 slapd.args
-rw-r--r--. 2 ldap ldap  5 Nov 27 08:18 slapd.pid

4)检查OpenLDAP服务进程是否正常启动。

[root@mldap01 ~]# netstat -ntplu | grep slapd
tcp        0    0 0.0.0.0:389           0.0.0.0:*          LISTEN      1890/slapd
tcp        0    0 :::389                :::*               LISTEN      1890/slapd

通过netstat -ntplu命令的运行结果可知,OpenLDAP服务进程slapd在后端正常运行,默认slapd进程使用TCP协议,默认使用的端口为389(通过SSL协议加密后,slapd进程使用663端口)。

要规划OpenLDAP目录树组织架构,可按以下步骤操作。

1)将规划的DN添加到OpenLDAP目录树中。也可以将如下内容添加至ldif文件中,然后通过ldapadd进行导入即可。

[root@mldap01 ~]# cat << EOF |  ldapadd -x -D cn=Manager,dc=gdy,dc=com -W
dn: dc=gdy, dc=com
dc: gdy
objectClass: top
objectClass: domain

dn: ou=people, dc=gdy, dc=com         
ou: people
objectClass: top
objectClass: organizationalUnit

dn: ou=group, dc=gdy, dc=com
ou: group
objectClass: top
objectClass: organizationalUnit
EOF
Enter LDAP Password: 
adding new entry "dc=gdy, dc=com"

adding new entry "ou=people, dc=gdy, dc=com         "

adding new entry "ou=group, dc=gdy, dc=com"

ldif格式的文件严格要求每一行文本后面都不能有空格,否则会提示相应的语法错误。

2)通过ldapsearch查看当前目录树架构。

[root@mldap01 ~]# ldapsearch -x -LLL
dn: dc=gdy,dc=com
dc: gdy
objectClass: top
objectClass: domain

dn: ou=people,dc=gdy,dc=com
ou: people
objectClass: top
objectClass: organizationalUnit

dn: ou=group,dc=gdy,dc=com
ou: group
objectClass: top
objectClass: organizationalUnit

当执行ldapsearch -x –LLL显示如下结果时,可采用如下方法进行解决。

[root@mldap01 ~]# ldapsearch -x -LLL
No such object (32)

当使用ldapsearch查询目录树条目时,ldapsearch会通过/etc/openldap/ldap.conf配置文件读取base和url值进行查询。默认没有配置这两项,所以需要添加base和url。

编辑/etc/openldap/ldap.conf文件,添加如下内容。

[root@mldap01 ~]# cat >> /etc/openldap/ldap.conf  << EOF
BASE dc=gdy,dc=com    #suffix域名
URI ldap://192.168.218.206   #服务器地址或使用域名形式(能够解析即可)
EOF

添加用户和用户组的方式有两种。一种是将系统用户通过migrationtools工具生成LDIF文件并结合ldapadd命令导入OpenLDAP目录树中,生成OpenLDAP用户。另一种通过自定义LDIF文件并通过OpenLDAP命令进行添加或者修改操作。本节分别介绍两种方法的实现来完成OpenLDAP用户的添加。

migrationtools开源工具通过查找/etc/passwd、/etc/shadow、/etc/groups生成LDIF文件,并通过ldapadd命令更新数据库数据,完成用户添加。具体步骤如下。

1)安装migrationtools工具。

# yum install migrationtools -y

2)创建OpenLDAP根域条目。

# /usr/share/migrationtools/migrate_base.pl > base.ldif

读者可以编辑base.ldif进行修改,将不需要的条目删除,然后通过ldapadd导入至OpenLDAP目录树。

3)添加用户用于生成OpenLDAP用户。

此处添加系统普通用户。通过以下脚本添加user1~user5。

# vim adduser.sh
#!/bin/bash
# Add system user
for ldap in {1..5};do
        if id user${ldap} &> /dev/null;then
                echo "System account already exists"
        else
                adduser user${ldap}
                echo user${ldap} | passwd --stdin user${ldap} &> /dev/null
                echo "user${ldap} system add finish"
        fi
done
# chmod +x adduser.sh
# ./adduser.sh 
# id user1
uid=502(user1) gid=502(user1) groups=502(user1)

4)配置migrationtools配置文件。

migrationtools配置文件
$DEFAULT_MAIL_DOMAIN = "padl.com";

# Default base 
$DEFAULT_BASE = "dc=padl,dc=com";

将以上内容修改为自己所定义的域名,例如本章以gdy.com为准。

$DEFAULT_MAIL_DOMAIN = "gdy.com";

# Default base 
$DEFAULT_BASE = "dc=gdy,dc=com";

5)通过migrationtools工具生成LDIF模板文件并生成系统用户及组LDIF文件。

# tail -n 5 /etc/passwd > system
# /usr/share/migrationtools/migrate_passwd.pl system people.ldif
# tail -n 10 /etc/group > group
# /usr/share/migrationtools/migrate_group.pl group group.ldif

6)查看生成的LDIF文件。

# head -n 5 people.ldif 
dn: uid=user1,ou=People,dc=gdy,dc=com
uid: user1
cn: user1
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt}$6$HtmehKu8$g.vhVs1PjCwzvpO7PiWxaY1E0sQH4M2fOwr/NKAI20q/   
                     c3rWgEbdzPfQS/Bxznhi1IpwMZbQrcNDTt5NFUEYd. 
shadowLastCh ange: 16497
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 502
gidNumber: 502
homeDirectory: /home/user1
# head -n 20 group.ldif 
dn: cn=user1,ou=Group,dc=gdy,dc=com
objectClass: posixGroup
objectClass: top
cn: user1
gidNumber: 502

dn: cn=user2,ou=Group,dc=gdy,dc=com
objectClass: posixGroup
objectClass: top
cn: user2
gidNumber: 503

读者可以将不需要的条目信息进行修改,满足当前需求,然后通过ldapdd导入。

7)利用ldapadd导入模板文件中的内容。

# ldapadd -x -W -D "cn=Manager,dc=gdy,dc=com" -f people.ldif 
Enter LDAP Password:   输入OpenLDAP管理员账号密码  (cn=Manager)
adding new entry "uid=user1,ou=People,dc=gdy,dc=com"

adding new entry "uid=user2,ou=People,dc=gdy,dc=com"

adding new entry "uid=user3,ou=People,dc=gdy,dc=com"

adding new entry "uid=user4,ou=People,dc=gdy,dc=com"

adding new entry "uid=user5,ou=People,dc=gdy,dc=com"
# ldapadd -x -W -D "cn=Manager,dc=gdy,dc=com" -f group.ldif 
Enter LDAP Password:    #输入OpenLDAP管理员账号密码(cn=Manager)
adding new entry "cn=user1,ou=Group,dc=gdy,dc=com"

adding new entry "cn=user2,ou=Group,dc=gdy,dc=com"

adding new entry "cn=user3,ou=Group,dc=gdy,dc=com"

adding new entry "cn=user4,ou=Group,dc=gdy,dc=com"

adding new entry "cn=user5,ou=Group,dc=gdy,dc=com"

8)查询添加的OpenLDAP用户信息。

# ldapsearch -LLL -x -D'cn=Manager,dc=gdy,dc=com'-W -b'dc=gdy,dc=com''uid=user1'
Enter LDAP Password: 
dn: uid=user1,ou=People,dc=gdy,dc=com
uid: user1
cn: user1
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword:: e2NyeXB0fSQ2JEh0bWVoS3U4JGcudmhWczFQakN3enZwTzdQaVd4YVkxRTBzUUg
shadowLastChange: 16497
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 502
gidNumber: 502
homeDirectory: /home/user1

至此通过migrationtools工具实现了本地用户和本地组的迁移,并且通过ldapsearch成功过滤(filter)查询匹配user1的用户属性信息。关于filter的更多信息,可以通过查询ldapsearch的帮助手册来了解。

前面通过定义LDIF文件添加用户和用户组信息,然后通过ldapdd进行添加,同样也可通过下面的方法进行添加。作者强力建议通过定制LDIF文件添加目录树条目。具体步骤如下。

1)定义LDIF用户文件。

前面通过head –n 20 people.ldif定义符合要求的用户属性信息,然后通过ldapadd进行导入即可,这里不做过多阐述。同样可以通过下面这种方法来实现用户和用户组的添加。

cat << EOF |  ldapadd -x -D cn=Manager,dc=gdy,dc=com -W 
dn: uid=gdy,ou=people,dc=gdy,dc=com
objectClass: posixAccount
objectClass: shadowAccount
objectClass: person
objectClass: inetOrgPerson
cn: System
sn: 郭
givenName: 大勇
displayName: 郭大勇
uid: gdy                 //OpenLDAP的uid信息
userPassword: password@123  //账号的密码,可以使用密文也可以使用明文,这里使用明文进行演示
uidNumber: 1001           //账号的UID
gidNumber: 1001            //账号的GID
gecos: System Manager
homeDirectory: /home/gdy    //用户的主目录指定
loginShell: /bin/nologin    //用户登录的SHELL
shadowLastChange: 16020     //用户最后一次修改密码的时间,自1970/1/1起,密码被修改的天数
shadowMin: 0             //密码将允许修改的天数(0代表任何时间都可以进行修改)
shadowMax: 999999           //系统强制用户修改为新密码的天数(1代表永远都不能进行修改)
shadowWarning: 7            //密码过期7天进行报告
shadowExpire: -1          //密码过期后,账号状态
employeeNumber: ******      //工号相关信息
homePhone: 0512********     //家庭电话
mobile: **************      //手机号码信息
mail: dayong_guo@126.com    //邮箱地址
postalAddress: 上海          //住址相关信息
initials: Test
EOF
Enter LDAP Password:  === → 此处要输入Manager用户的密码
adding new entry "uid=gdy,ou=people,dc=gdy,dc=com"

此LDIF文件中存在中文字符,建议使用Linux dos2unix命令进行转换,例如dos2unix -k –n file new_file。作者建议尽可能不要使用中文字符进行添加,而使用英文添加。

2)查看当前OpenLDAP服务器目录树信息。

[root@mldap01 ~]# ldapsearch -x -LLL -H ldap:/// -b dc=gdy,dc=com dn
dn: dc=gdy,dc=com
//基准目录树信息
dn: ou=people,dc=gdy,dc=com
//用户或人员组,相当于系统组概念

OpenLDAP索引(index)可以提高用户对OpenLDAP目录树查询的速度,减轻OpenLDAP服务器的压力,提高性能。那么如何创建OpenLDAP 索引呢?

可通过ldapmodify命令完成索引的创建和修改。下面通过为olcDatabase={2}hdb数据库文件创建一个“sn pres,eq,sub”索引来进行介绍。

要创建索引具体步骤如下。

1)通过ldapsearch命令查看当前olcDatabase={2}hdb有哪些索引。

[root@mldap01 cn=config]# ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:///-b cn=config  
                     '(olcDatabase={2}bdb)' olcDbIndex
dn: olcDatabase={2}bdb,cn=config
olcDbIndex: objectClass pres,eq
olcDbIndex: cn pres,eq,sub
olcDbIndex: uid pres,eq,sub
olcDbIndex: uidNumber pres,eq
olcDbIndex: gidNumber pres,eq
olcDbIndex: loginShell pres,eq
olcDbIndex: ou pres,eq,sub
olcDbIndex: mail pres,eq,sub
olcDbIndex: givenName pres,eq,sub
olcDbIndex: memberUid pres,eq,sub
olcDbIndex: nisMapName pres,eq,sub
olcDbIndex: nisMapEntry pres,eq,sub

上述结果显示当前数据库文件没有关于“sn pres,eq,sub”索引的信息。

2)创建一个ldif文件,用于存放索引命令。

[root@mldap01 cn=config]# cat >> hdb-index.ldif << EOF
dn: olcDatabase={2}bdb,cn=config
changetype: modify
add: olcDbIndex
olcDbIndex: sn pres,eq,sub
EOF

3)通过ldapmodify命令创建olcDatabase={2}hdb数据库相关索引条目。

[root@mldap01 ~]# ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f hdb-index.ldif 
modifying entry "olcDatabase={2}bdb,cn=config"

4)通过ldapsearch进行验证,是否“sn pres,eq sub”添加成功。

[root@mldap01 ~]# ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config   
                        '(olcDatabase={2}bdb)' olcDbIndex | grep -i 'sn' 
olcDbIndex: sn pres,eq,sub

从上述结果得知,索引添加成功。后期针对OpenLDAP服务器性能监控,适当添加索引,不仅能提高查询请求,还能提高服务器的性能。

默认情况下,不允许OpenLDAP用户自身修改密码,仅管理员具有修改权限。为了提高个人账号的安全性,需要让用户自身可以修改并更新密码信息,不需要管理员干涉。具体步骤如下。

1)定义访问控制策略。

编辑slapd.conf配置文件,定位access行,添加如下内容。

access to attrs=shadowLastChange,userPassword
     by self write    #只允许自身修改
     by * auth
access to *
     by * read   #允许授权用户查看信息

2)重新加载slapd进程。

# rm -rf /etc/openldap/slapd.d/ *
# slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d/
# chown -R ldap.ldap /etc/openldap/
# chown -R ldap.ldap /var/lib/ldap
# service slapd restart

要定义用户控制策略,可运行以下代码。

# cat << EOF | ldapmodify -x -D cn=Manager,cn=config -W redhat@123!
dn: olcDatabase={2}bdb,cn=config
add: olcAccess
olcAccess:to attrs=userPassword,shadowLastChange by dn="cn=Manager,dc=gdy,dc=com"
     write by anonymous auth by self write by * none olcAccess: to dn.base="" by * read olcAccess: to * by dn="cn=Manager,dc=gdy,dc=com" write by * read EOF modifying entry "olcDatabase={2}bdb,cn=config"

本章首先介绍了OpenLDAP软件的两种安装方式,读者可根据自己的环境选择适合自己的安装方式。然后介绍了slapd.conf配置文件的语法,让读者熟悉OpenLDAP配置文件的逻辑组成部分。最后通过案例介绍OpenLDAP服务端的安装、配置、单节点配置、目录树规划、用户及用户组配置、访问控制、索引创建,让读者再次熟悉OpenLDAP服务端的安装过程以及slapd.conf配置文件的语法,并对在配置过程中出现的故障进行分析,同时提供解决方案。

通过slapd.conf及cn=config两种方式定义访问控制策略,实现用户自己修改密码、更换管理员操作,此时无须管理员干涉。作者希望读者能够在通过slapd.conf配置文件实现的前提下,然后尝试使用cn=config数据库方式维护条目信息。

后面的章节将介绍如何通过OpenLDAP自带的二进制命令进行维护管理。例如ldapadd、ldapsearch、ldapdelete、ldapmodify、ldapwhoami等命令的使用。


相关图书

Linux常用命令自学手册
Linux常用命令自学手册
庖丁解牛Linux操作系统分析
庖丁解牛Linux操作系统分析
Linux后端开发工程实践
Linux后端开发工程实践
轻松学Linux:从Manjaro到Arch Linux
轻松学Linux:从Manjaro到Arch Linux
Linux高性能网络详解:从DPDK、RDMA到XDP
Linux高性能网络详解:从DPDK、RDMA到XDP
跟老韩学Linux架构(基础篇)
跟老韩学Linux架构(基础篇)

相关文章

相关课程