Linux-UNIX OpenLDAP实战指南
上QQ阅读APP看书,第一时间看更新

第1章 OpenLDAP介绍及工作原理详解

运维案例

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

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

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

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

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

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

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

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

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

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

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

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

本书通过三篇一步步带领读者了解OpenLDAP及其工作原理和实现方式、安装配置、客户端部署、命令GUI管理、加密算法、高级功能模块实现以及企业应用案例等模块。本章介绍什么是OpenLDAP、它的工作原理以及相关术语。

1.1 关于OpenLDAP

1.1.1 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)组成,相当于关系数据库中字段的概念。

1.1.2 为什么选择OpenLDAP产品

我们知道,账号是登录系统的唯一入口。要登录系统,首先系统要存在登录所使用的账号(/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实现账号统一管理的原因之一。

1.1.3 OpenLDAP目录服务优点

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

● OpenLDAP是一个跨平台的标准互联网协议,它基于X.500标准协议。

● OpenLDAP提供静态数据查询搜索,不需要像在关系数据中那样通过SQL语句维护数据库信息。

● OpenLDAP基于推和拉的机制实现节点间数据同步,简称复制(replication)并提供基于TLS、SASL的安全认证机制,实现数据加密传输以及Kerberos密码验证功能。

● OpenLDAP可以基于第三方开源软件实现负载(LVS、HAProxy)及高可用性解决方案,24小时提供验证服务,如Headbeat、Corosync、Keepalived等。

● OpenLDAP数据元素使用简单的文本字符串(简称LDIF文件)而非一些特殊字符,便于维护管理目录树条目。

● OpenLDAP可以实现用户的集中认证管理,所有关于账号的变更,只须在OpenLDAP服务器端直接操作,无须到每台客户端进行操作,影响范围为全局。

● OpenLDAP默认使用协议简单如支持TCP/ZP协议传输条目数据,通过使用查找操作实现对目录树条目信息的读写操作,同样可以通过加密的方式进行获取目录树条目信息。

● OpenLDAP产品应用于各大应用平台(Nginx、HTTP、vsftpd、Samba、SVN、Postfix、OpenStack、Hadoop等)、服务器(HP、IBM、Dell等)以及存储(EMC、NetApp等)控制台,负责管理账号验证功能,实现账号统一管理。

● OpenLDAP实现具有费用低、配置简单、功能强大、管理容易及开源的特点。

● OpenLDAP通过ACL(Access Control List)灵活控制用户访问数据的权限,从而保证数据的安全性。

1.1.4 OpenLDAP功能

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

● 查询操作(ldapsearch):允许查询目录并取得条目,其查询性能比关系数据库好。

● 更新操作(ldapupdate):目录树条目支持条目的添加、删除、修改等操作。

● 同步操作:OpenLDAP是一种典型的分布式结构,提供复制同步,可将主服务器上的数据通过推或拉的机制实现在从服务器上更新,完成数据的同步,从而避免OpenLDAP服务器出现单点故障,影响用户验证。

● 认证和管理操作:允许客户端在目录中识别自己,并且能够控制一个会话的性质。

1.1.5 OpenLDAP协议版本概述

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

● RFC 2251:LDAP V3核心协议,定义LDAP V3协议的基本模型和基本操作。

● RFC 2252:定义LDAPV3中的基本数据模式(schema)来保证数据的存取规范。

● RFC 2253:定义LDAP V3中的区别名(DN)表达方式。

● RFC 2254:定义LDAP V3中的过滤器的表达方式。

● RFC 2255:LDAP统一资源地址的格式。

● RFC 2256:在LDAP V3中使用X.500的Schema列表。

● RFC 2820:LDAP通过访问控制列表来控制目录的访问权限。

● RFC 2829:定义LDAP V3中的认证方式。

● RFC 2830:定义如何通过扩展使用TLS服务。

● RFC 2847:定义LDAP数据导入、导出文件接口LDIF。

1.1.6 LDAP产品汇总

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

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

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

1.1.7 OpenLDAP适用场景

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

1.1.8 OpenLDAP支持的系统平台

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

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

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

1.1.9 OpenLDAP高级功能汇总

OpenLDAP具有下述高级功能。

● 实现账号统一集中管理

● 权限控制管理(sudo)

● 密码控制策略管理

● 密码审计管理

● 密码控制策略

● 主机控制管理

● 同步机制管理

● TLS/SASL加密传输

● 高可用负载均衡架构

● 自定义schema

● 各种应用平台集成账号管理

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

1.2 OpenLDAP目录架构

1.2.1 OpenLDAP目录架构介绍

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

1.2.2 互联网命名组织架构

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.2.3 企业级命名组织架构

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

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

1.2.4 OpenLDAP的系统架构

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

图1-4 OpenLDAP的C/S架构

1.2.5 OpenLDAP的工作模型

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

图1-5 OpenLDAP的工作模型

OpenLDAP工作模型解释如下:

● 客户端向OpenLDAP服务器发起验证请求;

● 服务器接收用户请求后,并通过slapd进程向后端的数据库进行查询;

● slapd将查询的结果返回给客户端即可。如果有缓存机制,服务器端会先将查询的条目进行缓存,然后再发给客户端。

1.3 OpenLDAP schema概念

1.3.1 schema介绍及用途

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以及数据字节数、格式等来保证整个目录树的完整性。

1.3.2 获取schema的途径

默认安装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

● 通过配置文件引入schema,代码如下。

    # 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

● 通过schema产生ldif文件,代码如下。

    # 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

● 通过OpenLDAP指令导入目录树,代码如下。

    ldapadd -Y EXTERNAL -H ldapi:/// -f ~/sudo/sudo-config.ldif

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

2.自定义schema文件

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

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

● 保证属性名称唯一性;

● 通过OID标识符定义objectClass;

● 属性的描述;

● 必选属性以及可选属性集合定义。

1.4 OpenLDAP目录条目概述

1.4.1 objectClass分类

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

● 结构型(structural):如person和organizationUnit。

● 辅助型(auxiliary):如extensibleObject。

● 抽象型(abstract):如top,抽象型的objectClass不能直接使用。

1.4.2 OpenLDAP常见的objectClass

OpenLDAP常见的objectClass类如下所示。

● alias

● applicationEntity

● dSA

● applicationProcess

● bootableDevice

● certificationAuthority

● certificationAuthority-V2

● country

● cRLDistributionPoint

● dcObject

● device

● dmd

● domain

● domainNameForm

● extensibleObject

● groupOfNames

● groupOfUniqueNames

● ieee802Device

● ipHost

● ipNetwork

● ipProtocol

● ipService

● locality

● dcLocalityNameForm

● nisMap

● nisNetgroup

● nisObject

● oncRpc

● organization

● dcOrganizationNameForm

● organizationalRole

● organizationalUnit

● dcOrganizationalUnitNameForm

● person

● organizationalPerson

● inetOrgPerson

● uidOrganizationalPersonNameForm

● residentialPerson

● posixAccount

● posixGroup

● shadowAccount

● strongAuthenticationUser

● uidObject

● userSecurityInformation

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

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

1.4.3 objectClass详解

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

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

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

1.4.4 objectClass案例分析

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

● objectClass案例分析示例1

所有的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

    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的含义以及属性的含义。

1.5 属性

1.5.1 属性概述

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

1.5.2 Attribute详解

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

表1-2 OpenLDAP Attribute及其描述

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

    sandy:x:501:501:Check administrator:/home/sandy:/bin/bash

1.6 LDIF详解

1.6.1 LDIF用途

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

1.6.2 LDIF文件特点

● LDIF文件每行的结尾不允许有空格或者制表符。

● LDIF文件允许相关属性可以重复赋值并使用。

● LDIF文件以.ldif结尾命名。

● LDIF文件中以#号开头的一行为注释,可以作为解释使用。

● LDIF文件所有的赋值方式为:属性:[空格]属性值。

● LDIF文件通过空行来定义一个条目,空格前为一个条目,空格后为另一个条目的开始。

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

1.6.3 LDIF格式语法

● LDIF文件存取OpenLDAP条目标准格式:

    # 注释,用于对条目进行解释
    dn:条目名称
    objectClass(对象类): 属性值
    objectClass(对象类): 属性值
    ……

● LDIF格式样例如下:

    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规范定义要求很严格。(这点请读者切记!)

1.7 对象标识符讲解

对象标识符(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相关的更多知识,读者可以通过www.openldap.org官网进行详细了解,在此不做过多阐述。

1.8 自动化运维解决方案

1.8.1 互联网面临的问题

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

● 当公司业务不断发展,当前业务系统无法满足需求,这时该如何快速部署系统并且应用到当前的业务系统?

● 批量对业务系统进行变更以及管理,传统方式需要通过登录每台机器进行操作管理,那么如何在短时间内完成各种应用的变更及日常管理,提高工作效率?

● 随着运维团队的不断扩大,为了保证系统账号安全性,账号管理员需要在线上系统的所有机器进行创建个人运维账号(useradd account && echo "password" | passwd --stdin account ||echo "account add failed")。当运维管理人员异动或者离职时,账号管理员需要登录线上系统,做同样的操作(userdel -r account),这不但容易出错,而且宝贵的时间不知不觉中就浪费。那么如何对账号进行集中管理,提高保障系统账号的安全性?

● 为了保证线上系统的安全性,通常登录堡垒机及跳板机对线上服务器的登录进行维护以及各种变更操作,这通过购买商业软件可以实现,例如帕拉迪软件。那么如何通过开源的方式实现堡垒机以及跳板机的功能?

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

1.8.2 自动化解决方案

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

● 系统安装

企业中批量安装系统是难免的事情,如何在短时间内安装大量系统?为了提高工作效率,一般运维管理员通常会使用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软件的使用及其在企业中的应用场景。

1.9 本章总结

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

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

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