此篇文章花费了好几个晚上,大部分是软件翻译的英文文档,加上自己的理解所写,希望学习者能尊重每个人的努力.
我有句话想送给每个看我文章的人:
慢就是快,快就是慢!!!
另外更希望更多人能从认真从原理学习,分享更多有质量的文章,而不是仅仅转载别人的文章.
以下仅介绍了OpenLDAP的基本原理和基本配置,至于更高级的配置,还需自行学习,因为有了以下基础,再去建楼,就会
更加容易,网上有太多文章都太老旧,实在难以让初学者对OpenLDAP有一个全面的基础认识,总搞的人云里雾里,这篇文章
希望对想学习OpenLDAP的人,打一个好的基础,从而能深入了解它.基本命令我就不贴出来了,希望想深入学习的人,自行学习
man手册.
--------------马帮弟子:zcf
LDAP:
原理: LDAP: 它是用来做统一用户身份认证的.即: 你访问CSDN它说你可以用微信登录,你登录微博,它也支持微信登录等, 这就是一种目录服务, 当然它们不一定用LDAP来做为他们的目录服务. LDAP(Light Directory Access Portocol),它是基于X.500标准的轻量级目录访问协议。 Linux上实现LDAP的工具是 openladp, 通过配置ldap服务器,将用户信息存储在其中,就可以使用ldap协议, 访问用户数据库,来实现LDAP用户认证. 基本概念: 目录树概念 1. 目录树:在一个目录服务系统中,整个目录信息集可以表示为一个目录信息树,树中的每个节点是一个条目。 2. 条目:每个条目就是一条记录,每个条目有自己的唯一可区别的名称(DN)。 3. 对象类:与某个实体类型对应的一组属性,对象类是可以继承的,这样父类的必须属性也会被继承下来。 4. 属性:描述条目的某个方面的信息,一个属性由一个属性类型和一个或多个属性值组成,属性有必须属性和非必须属性。 名词: dn(Distinguished Name): “uid=songtao.xu,ou=oa组,dc=example,dc=com”,一条记录的位置(唯一) uid(User Id): 用户ID songtao.xu(一条记录的ID) ou(Organization Unit): 组织单位,组织单位可以包含其他各种对象(包括其他组织单元),如“oa组”(一条记录的所属组织) dc(Domain Component) :域名的部分,其格式是将完整的域名分成几部分,如域名为example.com变成dc=example,dc=com(一条记录的所属位置)cn(Common Name): 公共名称,如“Thomas Johansson”(一条记录的名称)
sn(Surname): 姓,如“许” rdn(Relative dn): 相对辨别名,类似于文件系统中的相对路径,它是与目录树结构无关的部分,如“uid=tom”或“cn= Thomas Johansson”配置openLDAP有两种方式: slapd.conf 修改它,需要重新生成数据库文件, 生成后需要重新赋予权限属主属组ldap.ldap . 接着重新加载slapd 进程, 配置才会生效.若使用单机版,不推荐。 cn=config: 修改后,立即生效, 它属于热部署.从16年开始OpenLDAP官方都不推荐使用slapd.conf来配置LDAP,因为它太繁琐,修改完配置必须重新生成OpenLDAP数据库,
这就意味着,OpenLDAP服务器必须停机!!
LDAP初始化 [root@rnode6 ~]# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG #用何种方式都需要. [root@rnode6 ~]# cp /usr/share/openldap-servers/slapd.ldif /etc/openldap/slapd.conf [root@rnode6 ~]# chown -R ldap.ldap /etc/openldap/ [root@rnode6 ~]# chown -R ldap.ldap /var/lib/ldap/ /etc/openldap/ check_password.conf : 用于密码生成 ldap.conf: 可支持匿名方式访问LDAP slapd.d : 此目录就是cn=config方式管理LDAP所需的目录. slapd.ldif : 若需要使用slapd.conf管理LDAP,则需要将此ldif复制到这里,改名为slapd.conf /etc/openldap/slapd.d/cn=config/ olcDatabase={2}hdb.ldif #CentOS6是bdb CentOS7是 hdb 编译安装: 1. yum install openssl-devel gcc libtool-ltdl-devel libtool-ltdl -y 2. 先编译安装Berkeley DB 5.3.28 Berkeley DBv6.0.20后不在被openldap支持, 因为Berkeley现在是Oracle公司的. cd berkeley的安装目录/build_unix/ #必须要先进到此目录下,否则编译时会总报错 ../src/dbinc/configure --prefix=/usr/local/berkeley-db-5.3.28 make make install 3. 编译openldap cd openldap源码目录/ ./configure --enable-wrappers \ #启用TCP-Wrapper CPPFLAGS="-I/usr/local/berkeley-db-5.3.28/include" \ LDFLAGS="-L/usr/local/berkeley-db-5.3.28/lib -Wl,-rpath,/usr/local/berkeley-db-5.3.28/lib" \ --prefix=/usr/local/openldap2.4.44 make make install LDAP的目录信息:它通常就如上图这样组织, 它是倒树结构, 树根一般是 国家(如:c=CN) 或 域名(dc=zcf,dc=com), 其次一般定义一个或多个组织(Organization, 简称 o) 或 组织单元(Organization Unit, ou) 一个组织单元中可包含: 员工, 设备信息(PC/打印机等)相关信息. Entry(条目): uid=tom,ou=People,dc=example,dc=com #这称为一个DN, 也叫一个entry(条目) 目前比较知名的目录服务产品: SUN: SUNONE Directory Server, 特点: 基于文本数据的存储,速度块. IBM: IBM Directory Server: 基于DB2数据库存储, 速度一般. Oracle: Oracle Internet Directory: 基于Oracle的数据库, 速度一般. Mircrosoft:AD :基于Windows系统用户, 数据管理/权限不灵活. OpenLDAP: 开源项目,速度快,应用广泛. Schema: 它是基本数据模式, LDIF语法, LDAP管理,是目录中存储数据的规则的集合, 它是一种规范, 或一种数据存储标准. Schema根据自己内部规范,保证整个目录树的完整性, 无非法数据, 当你需要在LDAP中添加一些自定义的属性时, 你就需要自定义Schema了, 若使用默认Schema你就 无法添加这些自己所独有的属性, 因为,若没有Schema这些规范, 随便添加属性, 整个目录树将变的毫无章法,无法管理! Schema是一个标准,定义了OpenLDAP目录树读写和属性存取方式,这也是OpenLDAP能够存储什么数据类型, 数据有何属性等 均是根据Schema来定义的. OpenLDAP默认的schema文件一般在安装在/etc/openldap/schema/下, 此目录下每个文件定义了不同的对象和不同的属性. 若想使用schema只需要在配置文件中通过include包含即可. grep '*.schema' /etc/openldap/slapd.conf /etc/openldap/schema/ core.schema: OpenLDAP的核心schema.【它是必须加载的】 inetorgperson.schema : 它仅次于core, 我们添加账号时,很多要使用到它里面定义的objectClass. dyngroup.schema : 这是定义组时使用的schema,包括要使用sudo.schema时,也需要它。 ppolicy.schema: 若需要做密码策略时,需要导入此schema. nis.schema: 网络信息服务(FYI),也是一种集中账号管理实现. java.schema: 若需要使用Java程序来操作openLDAP时,需要使用它,让OpenLDAP支持Java. cosine.schema : Cosine 和 Internet X.500 (比较有用, 不太懂.) misc.schema : Assorted (experimental) openldap.schema : OpenLDAP Project(experimental) sudo.schema: 定义sudo规则 在OpenLDAP目录树中,Schema用来指定一个目录中所包含的对象(Objects)的类型(ObjectClass), 以及每一个对象类型(ObjectClass)中必须提供的属性(Atrribute)和可选属性及对应的属性值. 在LDIF文件中的数据条目, 可理解为一个具体的对象,是通过Schema来规划创建的, 符合Schema 标准. 因此Schema是一个数据模型, 用来决定数据按什么方式存储, 并定义存储在OpenLDAP目录树中 不同条目(entry)下的数据之间的关系,schema需要OpenLDAP配置文件(Slapd.conf 或 cn=config)来 指定. 以保证当前OpenLDAP服务器可在目录树中定义那些对象类型(objectClass). ObjectClass: 在OpenLDAP目录树中, 每个条目必须包含一个ObjectClass属性,,或多个非必要的ObjectClass,及对应的值, 有且需至少给一个ObjectClass赋一个值! 每一个值将用作每个条目在目录树中存储信息的标准,如 可包含哪些属性信息, 我们可将ObjectClass属性值 理解为一种模板,模板定义哪些信息可存取, 哪些信息不可在目录树中存储. ObjectClass和Attribute是由Schema文件来规定的, Schema文件规范ObjectClass的构成、Attribute格式 以及继承关系. ObjectClass可分为三类: 1. 结构型(Structural) : person 和 organizationUnit 如person: 它可定义一个人的相关属性,如:他的住址,电话,公司,职位等.. 2. 辅助型(Auxiliary) : extensibeObject 如:以后若想限制登录,就需要通过借助此objectClass来定义. 3. 抽象型(Abstract): top, 抽象型的ObjectClass不能直接使用. Attribute(属性): 一个ObjectClass节点具有一系列的Attribute, Attribute可理解为Linux系统当中的变量, 那么变量都有 相应的值, 那么Attribute也是由相关的值,这些属性的对应值表示每个对象的特点, 但有些条目当中的属性 是必须指定的(如: 有MUST标记的), 有些是非必要的(如: 由MAY标记的). 在目录树中常用的Attribute有: uid, sn, giveName, I, ObjectClass, dc, ou, cn, mail, telephoneNumber, c 等. 注意: uid: 这里的UID不是Linux系统上的UID,这里的UID是用户登录LDAP的账号. sn: 只能写姓. giveName: 只能写名字 ObjectClass示例: objectClass: ( 2.5.6.6 NAME 'person' SUP top STRUCTURAL MUST (sn $ cn) MAY (userPassword $ telephoneNumber $ seeAlso $ description)) 说明: 2.5.6.6 : 这称为Object ID 若要定义 person 属性, 顶级必须为 top, 因为其属性类型为STRUCTURAL, 必须定义 sn 和 cn 属性. MAY定义的userPassword, telephoneNumber, seeAlse, description等4个属性是可有可无的. 若要定义邮件地址, 国家等属性, 是不可以定义的, 除非你自己定义了相关的 ObjectClass条目. 对于此person类型的ObjectClass,后期你要调用,就必须提供sn 和 cn, 查询也一样, 否则Schema检查 将保错. 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, seeAlse, description), 所以此案例中 必须要定义 3 必要个属性, 即objectClass, sn, cn . 此案例的下一级 objectClass 可以继承上一级的 objectClass 的属性信息. 注: ObjectClass类型定义的不同,则其属性的相关值信息也是不同的. Openldap配置: Slapd.conf方式配置Openldap的步骤: 》slaptest :测试对slapd.conf的配置文件. 》service slapd restart olcLogLevel: <日志级别> LDIF格式: LDIF(LDAP Data Interchanged Format)的轻量级目录交换格式. 它是存储LDAP配置信息及目录内容的标准文本文件格式, 之所以使用文本文件来存储这些信息,是为了方便 读取和修改,这也是其它大多数服务配置文件所采用的格式. LDIF通常用来交换数据并在OpenLDAP服务器之间互相交换数据, 并且可通过LDIF实现数据文件的导入, 导出及数据文件的增加, 修改, 重命名等一些操作, 这些信息需要按照LDAP中schema的规范进行操作, 并 会接受schema的检查, 若不符合OpenLDAP Schema规范要求, 则会提示相关语法错误信息. LDIF文件格式: LDIF 文件每行的结尾是不允许有空格或者制表符存在. LDIF 文件允许相关属性可被重复赋值并使用. LDIF 文件以 # 号行为注释行. LDIF 文件所有赋值方式为: 属性:[空格]属性值. LDIF 文件通过空行来区分两条条目. 注意: 若需要手动定义LDIF文件,添加相关条目,需要了解以上相关特点. 在OpenLDAP服务器中定义LDIF文件,每个条目中必须包含一个ObjectClass属性, 并赋值!! ObjectClass属性有顶级之分, 定义时要了解ObjectClass的相关依赖类型, 否则在添加或 修改时,也一样会语法报错!! LDIF文件语法: 基本语法: dn: <distinguished name> #首先要指定要修改那个DN(条目) <attrdesc>: <attrvalue> #最常用的attrdesc是changetype: 其值最常用的是 modify <attrdesc>: <attrvalue> <attrdesc>:: <base64-encoded-value> <attrdesc>:< <URL> ... #: 井号开头行为注释. 1. 可用空格或制表符开始一个新行 dn: cn=Barbara J Jensen,dc=exam ple,dc=com #注意: example是分行写了,一定要注意写法,不要在它中间加任何非空字符!! 2. 多个属性值在单独的行中指定 cn: Barbara J Jensen cn: Babs Jensen 3.以冒号+空格开头的表示,这是一个Base64编码的字符串. cn:: IGJlZ2lucyB3aXRoIGEgc3BhY2U= 4.从文件中获取属性值,当然它还支持ftp,http等. cn:< file:///tmp/value 下面是三个LDAP条目,每个条目要用空行分割 dn: cn=Barbara J Jensen,dc=example,dc=com cn: Barbara J Jensen cn: Babs Jensen objectclass: person description:< file:///tmp/babs sn: Jensen dn: cn=Bjorn J Jensen,dc=example,dc=com cn: Bjorn J Jensen cn: Bjorn Jensen objectclass: person sn: Jensen dn: cn=Jennifer J Jensen,dc=example,dc=com cn: Jennifer J Jensen cn: Jennifer Jensen objectclass: person sn: Jensen jpegPhoto:: /9j/4AAQSkZJRgABAAAAAQABAAD/2wBDABALD A4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQ ERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVG ... 5.修改记录格式 dn: <DistinguishedName> changetype: <[modify|add|delete|modrdn]> add |delete |replace: <attributetype> dn: DN changetype: add <attrdesc1>: <value1> <attrdesc1>: <value2> ... <attrdescN>: <value1> <attrdescN>: <value2> ... - #注意: 他是Entry之间的分隔符!!! 示例: dn: cn=Babs Jensen,dc=example,dc=com changetype: add objectclass: person objectclass: extensibleObject cn: babs cn: babs jensen sn: jensen dn: DN changetype: modify add: <attributetype> <attrdesc>: <value1> <attrdesc>: <value2> ... - replace: <attributetype> #在进行替换操作时,若要替换的DN不存在,它会提示你添加. <attrdesc>: <value1> <attrdesc>: <value2> ... - delete: <attributetype> #若不提供<attributeType>则删除整个dn属性集. <attrdesc>: <value1> <attrdesc>: <value2> ... - 示例: dn: cn=Barbara J Jensen,ou=People,dc=example,dc=com changetype: delete 以上add,replace,delete综合示例: dn: cn=Babs Jensen,dc=example,dc=com changetype: modify add: givenName givenName: Barbara givenName: babs - replace: description description: the fabulous babs - delete: sn sn: jensen - dn: DN changetype: [modrdn | moddn] newrdn: <newrdn> deleteoldrdn: 0 | 1 #1:从条目中删除旧的rdn,0:保留,但修该为非区分属性. newsuperior: <DN> #若存在,则将条目移动到新上级. ... - 示例: dn: cn=Babs Jensen,dc=example,dc=com changetype: modrdn newrdn: cn=Barbara J Jensen deleteoldrdn: 0 newsuperior: ou=People,dc=example,dc=com dn: cn=Barbara J Jensen,ou=People,dc=example,dc=com changetype: delete #这样写,将删除dn这个准确名属性集. 6.包含外部LDIF文件. dn: dc=example,dc=com objectclass: domain dc: example include: file:///tmp/example.com.ldif dn: dc=example,dc=org objectclass: domain dc: example 服务端命令和客户端命令: slap[passwd|...] #凡是slap开头的命令都是服务端命令. ldap[passwd|add|..] #客户端命令 LDIF 示例: dn: uid=Green Tom,ou=people,dc=test,dc=com #DN描述项,在整个目录树上是唯一的. objectClass: top objectClass: posixAccount objectClass: shadowAccount ojbectClass: person objectClass: inetOrgPerson objectClass: hostObject sn: Green cn: Green Tom telephoneNumber: 010 12345678 mail: dayong_guo@126.com 注: 冒号后面必须有一个空格, 然后才是属性值, schema规范定义要求很严格!! openLDAP的使用 openLDAP它可以帮助我们构建自己的企业目录服务, 所谓目录服务,其实就是将一个组织的内部, 各个部门等,使用一种结构构建出来,方便我们来管理整个公司内的所有事物, 包括员工, PC, 打印机 等等... 目录服务帮我们构建的组织架构就如下图: 什么是组织架构? 抽象图:
第一张图就是抽象概念,第二张图就是实际工作中会使用的.
此图是OpenLDAP的倒树架构图 树根: dc=com 这是顶级域 dc=example 这是二级域,也就是我们组织机构的根. ou=People, ou=Servers 这都是组织内部的组织单元,可理解为部门. 其中ou=Servers,它是一个特殊ou,一般使用它表示,它下面可以有很多子ou. uid=babs 这是一个用户相关的条目 企业组织架构图: 这张图中是企业中真正使用的架构图 dc=zcf,dc=com #这就是zcf.com域 它下面有很多ou, 每个ou下面是具体的用户. 注意: 在创建组织架构时, 用户和组是分开的,就类似于MS AD(活动目录). 使用yum安装的openldap做基本初始化步骤 一. 首先配置主机名可被解析 #因为openLDAP执行命令时,它需要解析主机名, 若不能成功解析,它将一直等到解析超时才会 #将命令的执行结果返回. echo IP HostName >> /etc/hosts 二. 导入必要的schema: cd /etc/openldap/slapd.d/cn=config/cn=schema ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/ppolicy.ldif ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif 注: additional info: olcObjectClasses: AttributeType not found: "audio" 若出现这个错误, 就是cosine.ldif还没有导入导致的. ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif 注: additional info: olcObjectClasses: AttributeType not found: "manager" 若出现这个错误, 就是cosine.ldif还没有导入导致的. ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/dyngroup.ldif ls #导入成功后,会有这些文件. 三. 修改域名, 管理员帐户, 禁止匿名查询 cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}hdb.ldif olcSuffix: dc=my-domain,dc=com olcRootDN: cn=Manager,dc=my-domain,dc=com #要将这些信息修改为,自己的域名和RootDN, RootDN就是openldap的管理员账号名. cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{1\}monitor.ldif olcAccess: .... #这里定义了openldap的监控信息, 需要修改为适合自己需要的内容. vim moddomain.ldif dn: olcDatabase={1}monitor,cn=config changetype: modify replace: olcAccess olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=extern al,cn=auth" read by dn.base="cn=Manager,dc=zczf,dc=com" read by * none dn: olcDatabase={2}hdb,cn=config changetype: modify replace: olcSuffix olcSuffix: dc=zczf,dc=com dn: olcDatabase={2}hdb,cn=config changetype: modify replace: olcRootDN olcRootDN: cn=Manager,dc=zczf,dc=com dn: olcDatabase={2}hdb,cn=config changetype: modify add: olcRootPW olcRootPW: {SSHA}GqkPrqlMNqjZVxcRqHPcwqc3usvzYmyd dn: cn=config changetype: modify add: olcDisallows olcDisallows: bind_anon 注: 这里修改了两个文件, 分别是olcDatabase={1}monitor.ldif 和 olcDatabase={2}hdb.ldif 在monitor文件中修改了 olcAccess: 这个字段, 修改方式是替换(replace), 主要是修改值中的域名, 其它字段不变. 数据库文件hdb中是修改了olcSuffix 和 olcRootDN, 修改类型也是替换, 主要是修改成自己的域名. 由于数据库hdb中没有root密码字段, 所以要先添加 olcRootPW, 再赋值为新密码. 最后一个 olcDisallows 是定义禁止登录, 这里是设置匿名用户不能登录LDAP. 执行修改: ldapadd -Y EXTERNAL -H ldapi:/// -f moddomain.ldif 四. 创建自己的组织架构 下面将创建的组织架构图:1. 创建先创建顶级域 和 两个ou(people, group)组织架构: vim newZCFcom.ldif dn: dc=zcf,dc=com objectClass: dcObject objectClass: organization dc: zcf o: zcf.com 注: 这里先定义了一个顶级域zcf.com 并配置了两个objectClass, 这两个对象要引用,必须提供dc 和 o 这两个属性. 因为包含它们的schema定义文件中是这么定义的,你要引用该ObjectClass, 就必须遵守这些规则. 我看到objectClass通常写一块,而这些对象所必须的属性 写一块, 所以,具体dc和o是被他俩谁要求,必须提供的,我还不清楚. dn: ou=People,dc=zcf,dc=com objectClass: organizationalUnit objectClass: top ou: People dn: ou=Group,dc=zcf,dc=com objectClass: organizationalUnit ou: Group dn: cn=Manager,dc=zcf,dc=com #Manger: 是默认管理员的cn名,建议修改. objectClass: organizationalRole cn: Manager #cn: 公共名, 需要注意:冒号前有空格, 结尾不能有空格 这里定义管理员的RootDN.即管理员帐户 dn: cn=appteam,ou=Group,dc=zcf,dc=com objectClass: posixGroup cn: Host gidNumber: 1010 #这里引用了一个posixGroup的对象, 它需要提供cn 和 gidNumber. dn: cn=dbateam,ou=Group,dc=zcf,dc=com objectClass: posixGroup cn: Host gidNumber: 1011 dn: cn=host,ou=Group,dc=zcf,dc=com objectClass: posixGroup cn: Host gidNumber: 1012 #多加一个组,图中没画出来, 它用来存放所有PC的信息. 2. 执行添加: ldapadd -x -D cn=Manager,dc=zcf,dc=com -W -f newZCFcom.ldif #-x: 使用SASL做简单认证. -W: 提示输入密码 -D: 指明LDAP的管理员账号名,即rootdn 3. 接下来对刚创建的组织架构做查询 并 验证: 建议每次配置完成后,都要做验证! 查询可通过GUI工具 或 命令. 1. 命令方式: vim /etc/openldap/ldap.conf BASE dc=zcf,dc=com URI ldap:// #当前主机OpenLDAPServer的IP或主机名 ldapsearch -x -LLL #这样就可以直接获取刚添加的条目信息了 2. GUI工具 ldapadmin #这是一个windows上的绿色小工具,它虽小,但功能却非常强大! 4. 创建要添加的用户: cat addUser.ldif dn: uid=zhangchaofeng,ou=People,dc=zcf,dc=com objectClass: inetOrgPerson objectClass: posixAccount objectClass: shadowAccount homeDirectory: /home/zhangchaofeng userPassword: {SSHA}78DMFNXKLvUl+tjCi2haD+U0DASQ/MJK loginShell: /bin/bash cn: zhangchaofeng uidNumber: 2000 gidNumber: 1010 sn: System Administrator mail: zhangcf9988@aliyun.com postalAddress: Beijing mobile: 12345678900 dn: uid=ldap01,ou=People,dc=zczf,dc=com objectClass: inetOrgPerson objectClass: posixAccount objectClass: shadowAccount homeDirectory: /home/ldap01 userPassword: {SSHA}78DMFNXKLvUl+tjCi2haD+U0DASQ/MJK loginShell: /bin/bash cn: ldap01 uidNumber: 2001 gidNumber: 1011 sn: dba mail: ldap01@aliyun.com postalAddress: Beijing mobile: 12345678901 注: 以上添加了两个条目(entry), 条目和条目之间要用空行隔开!! 5. 执行添加: ldapadd -x -D 'cn=Manager,dc=zcf,dc=com' -W -f addUser.ldif 6. 验证是否添加成功 ldapsearch -x -D 'cn=Manager,dc=zcf,dc=com' -W -LLL 'uid=ldap01' #具体语法参见下文 # -x: 使用SASL做简单认证, SASL是将用户名和密码直接加到URL中传输, 只是它会预先使用共享密钥对密码做加密. #-D 和 -W 要配合使用, -D指明以什么身份登录查询,默认是匿名身份,但前面 通过cn=config方式关闭了匿名,所以必须指明身份, -W:提示输入密码. #-LLL: 这是查询级别, 分三级, -L, -LL, -LLL 五. 配置TLS方式对外提供目录服务 测试环境为RHEL7.4, 客户端为CentOS7.6 , 客户端在连接服务端认证时,若不是安全连接, 将导致客户端能够获取 ldap用户的帐户信息, 但无法获取密码,导致登录失败!! OpenLDAP 向cn=config中添加TLS证书认证的方式: A. 创建CA: 1. 创建的CA的私钥 openssl genrsa -out cakey.pem 2048 2. 创建CA的自签发证书 openssl req -new -x509 -key cakey.pem -out cacert.pem \ -subj /C=CN/ST=Beijing/L=Changping/O=zczf/CN=ca.zczf.com 3. 创建CA签发证书的工作目录: mkdir certs newcerts crl private echo 01 > serial ---->创建证书生成列表的序列号文件 echo 01 > crlnumber ---->创建证书吊销列表的序列号文件;【注意:若不需要吊销证书也可不创建】 mv cakey.pem private/ cp /etc/pki/tls/openssl.cnf . vim openssl.cnf dir = 当前目录的绝对路径. B. 签发证书: 4. 创建LDAPServer的私钥 openssl genrsa -out ldap.key 2048 5. 创建LDAPServer向CA申请签发证书的请求 openssl req -new -key ldap.key -out ldap.csr \ -subj /C=CN/ST=Beijing/L=Changping/O=zczf/CN=ldap.zczf.com 6. 使用CA的私钥签发此证书申请 openssl ca -in ldap.csr -out ldap.crt -days 365 -config openssl.cnf C. 配置LDAP支持证书: 1.将生成的证书复制到: cp ldap.key ldap.crt cacert.pem /etc/openldap/cacerts/ 2. 编写下面的LDIF文件: 以下内容主要是在/etc/openldap/slapd.d/cn=config.ldif 文件添加系统配置. 以下添加的了 OpenLDAP Server将启用TLS功能, 告诉OpenLDAP Server olcTLSCACertificatePath: CA的证书目录在哪里. olcTLSCACertificateFile: CA的证书文件叫什么, 这里建议写绝对路径. olcTLSCertificateFile: 指明OpenLDAP Server的证书在哪里. olcTLSCertificateKeyFile: 指明OpenLDAP Server的Key在哪里 olcTLSVerifyClient: never: 表示从来不对客户端做证书验证. vim updateldapTLS.ldif dn: cn=config changetype: modify replace: olcTLSCACertificatePath olcTLSCACertificatePath: /etc/openldap/cacerts - add: olcTLSCACertificateFile olcTLSCACertificateFile: /etc/openldap/cacerts/cacert.pem - replace: olcTLSCertificateFile olcTLSCertificateFile: /etc/openldap/cacerts/ldap.crt - replace: olcTLSCertificateKeyFile olcTLSCertificateKeyFile: /etc/openldap/cacerts/ldap.key - add: olcTLSVerifyClient olcTLSVerifyClient: never 3.执行添加, 将自动将上面的条目添加/etc/openldap/slapd.d/cn=config.ldif ldapmodify -Y EXTERNAL -H ldapi:/// -f updateldapTLS.ldif 注: -Y EXTERNAL :这个我还不清楚是什么意思. 4. 修改slapd.service脚本的启动参数文件 vim /etc/sysconfig/slapd #若用不到非加密的方式,也可以去掉 ldap:/// (389) #添加ldaps:/// 后,slapd就会监听默认TLS端口636. # ldapi:// : 这个是Socket方式连接. SLAPD_URLS="ldapi:/// ldaps:/// ldap:///" 5. 重启slapd服务 systemctl restart slapd 6. TLS证书添加完成后,还需要在服务器端配置本地openldap 客户端与slapd交互使用的TLS证书. cat /etc/openldap/ldap.conf BASE dc=zcf,dc=com URI ldaps://ldap.zczf.com TLS_CACERT /etc/openldap/cacerts/cacert.pem TLS_CACERTDIR /etc/openldap/cacerts TLS_REQCERT allow 注: URI: 要使用ldaps:// TLS_CACERT: 指名CA的证书在哪里. TSL_CACERTDIR: 指明CA证书所在目录 TLS_REQCERT: allow: 若服务器端证书验证失败,也依然允许连接. 此配置文件修改好后: ldapsearch -D 'cn=admin,dc=zcf,dc=com' -W -LLL #输入密码后, 命令能执行成, 则说明ldaps已经配置成功。 以上所有配置就完成了LDAP Server端的配置. D. 接下来就需要配置客户端访问了: 1. 安装客户端支持包 yum install openldap-clients nss-pam-ldapd authconfig 2. 在做以下配置前, 先做备份 因为openldap认证配置要修改很多系统文件, 为了避免配置错误,而导致手工查找这些 配置文件,去删除,所以建议一定要备份!! 它大概会修改以下文件: CentOS7.6和之前的版本修改的文件多少是不同!!! 相同的文件: /etc/nslcd.conf /etc/openldap/ldap.conf /etc/pam.d/system-auth-ac /etc/nsswitch.conf 不同的文件: /etc/pam.d/password-auth-ac 还有些其他文件, 我没完全测试到. authconfig --savebackup=openldapconf.bak #若需要恢复: authconfig --restorebakcup=openldapconf.bak 或 authconfig --restorelastbakcup #这是在第一次操作时忘记备份了,可用它来恢复到 最进一次操作前的状态, 因为是第一次操作,最近 一次就是系统安装好时的状态!! 3. 接下来就可以配置客户端使用LDAP认证了. authconfig --enableldap --enableldapauth \ --ldapserver=ldaps://ldap.zcf.com \ --ldapbasedn="dc=zcf,dc=com" \ --enableldaptls \ --ldaploadcacert= \ --enablemkhomedir \ #RHCE考试题,中不要加此选项!! --update 注: 启用LDAP, 启用LDAP认证,是必须要有的. 虽然后面指明了要使用TLS,但ldapserver的地址依然不能直接写, 必须要加上ldaps:// 这个协议头部, 另外CA证书必须提供URL地址, 让authconfig自己下载; enablemkhomedir: 若你需要使用autofs, 来自动管理用户家目录的创建,挂载,就不能使用此选项. 另注: authconfig-gtk #这是authconfig的图像工具, 也可使用它来配置LDAP. 4. 在客户端验证是否学习到LDAP服务器上的用户信息: id ldapuser01 getent passwd ldapuser01 getent shadow ldapuser01 #这个好像不能在返回用户密码了. 另外: CentOS7.6上配置LDAP客户端时,若不支持TLS或SSL, 将不允许LDAP用户登录系统. 5. 验证登录 ssh ldapuser01@IP 六. 配置允许用户修改自己的密码 vim allowModPasswd.ldif dn: olcDatabase={2}hdb,cn=config changetype: modify add: olcAccess olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=zczf,dc=com" write by anonymous auth by self write by * none olcAccess: {1}to dn.base="" by * read olcAccess: {2}to * by dn="cn=admin,dc=zczf,dc=com" write by * read ldapmodify -Y EXTERNAL -H ldapi:/// -f allowModPasswd.ldif 验证用户是否可以修改自己的密码. 七. 配置ldap用户在登录时, 使用autofs来自动挂载家目录
NFS Server:
1. mkdir -pv /ldaphome/ldap0{1,2,3} 2. chmod o+w -R /ldaphome/ 3, yum install nfs-utils 4, vim /etc/exports /ldaphome/ldapadmin 192.168.10.0/24(rw,sync) /ldaphome/ldap01 192.168.10.0/24(rw,sync) /ldaphome/ldap02 192.168.10.0/24(rw,sync) 5. systemctl restart nfs 6. showmount -e localhost
Client:
1. yum install autofs sssd 注: sssd: (System Security Services Dameon) 2. vim /etc/auto.master /home/ldap /etc/auto.misc3.mkdir /home/ldap #这个目录必须存在!!!
4.vim /etc/auto.misc * -rw,vers=3,soft,intr nfs.server.com:/userhome/&注: &可匹配到的ldap用户名,* 是前向引用.引用匹配到的用户名.
-fstype=nfs,soft,intr,vers,sync都非必须,但rw是必须的!!
5. 配置LDAP认证
authconfig --savebackup=ldap.bak
authconfig --enableldap --enableldapauth \--ldapserver=ldap://server.group8.example.com --ldapbasedn="dc=group8,dc=example,dc=com" \
--enableldaptls --ldaploadcacert= --update
6. 测试su登录
若能正常挂载NFS共享,并看到其中的文件,则说明成功.
7.若出现autofs挂载失败的情况,可参考:【坑好多,请注意!!!】
1. nfs导出配置是否正确, IP, 权限.
2. autofs中auto.master中填写的目录,必须存在. 3. auto.misc中的配置一定要有rw。 4. 系统时间是否同步 原因不明: autofs 服务启动时报了一个错误: automount[20951]: setautomntent: lookup(sss): setautomntent: No such file or directory 但网上查询,没有找到答案, 我在另一台别人配置好的VM中,查看,他的autofs也报这个错误,但ldap 用户却可以正确自动挂载nfs共享的家目录. 不清楚原因.但最近做成功后,没有这个错误了!! 以上配置完成后, openLDAP的基本使用已经完成! OpenLDAP修改管理员密码 1. 直接回车输入密码,它会生成密码字符串. slappasswd 注: echo 123456 |xargs slappasswd -s #-s: 指定要生成的明文密码 2. 创建一个ldif 文件,来修改管理员密码 vim modrootpw.ldif dn: olcDatabase={0}config,cn=config changetype: modify add: olcRootPW olcRootPW: {SSHA}xxxx 3. 执行修改命令 ldapadd -Y EXTERNAL -H ldapi:/// -f modrootpw.ldif 或 ldapmodify -a -Y EXTERNAL -H ldapi:/// -f modrootpw.ldif #-a: 其实就是 ldapadd, 因为ldapadd是ldapmodify的硬链接 注: [root@rnode6 ~]# cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{0\}config.ldif # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify. # CRC32 ba5c9427 dn: olcDatabase={0}config objectClass: olcDatabaseConfig olcDatabase: {0}config olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=extern al,cn=auth" manage by * none structuralObjectClass: olcDatabaseConfig entryUUID: ec40f8c2-e643-1038-8c1d-e1c3847c1ae1 ....... 查看openldap的olcDatabase={0}config.ldif 这个配置文件,发现其中没有olcRootPW字段,所以 要修改管理员密码,需要先添加该字段才可以. 如: 上面示例中: dn: olcDatabase={0}config,cn=config #这段是告诉,openLDAP,要操作的dn是 olcDatabase={0}config这个配置文件, 它的上级目录是cn=config changetype: modify # 这是告诉openLDAP,我要做修改操作. add: olcRootPW # 这是告诉openLDAP,我要添加一个字段叫 olcRootPW olcRootPW: {SSHA}xx # 这是给olcRootPW 字段 赋值,要注意: 属性必须要有值!! 另外: 属性名: 后必须要有一个空格!! 当执行完成后, cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{0\}config.ldif 就会发现修改了,而且时间戳也修改了. ldap日志: 查看日志级别: slapd -d ? 或 查看官网的说明. debug level: -1: 安装调试时,开启,输出所有信息. 0: 关闭debug 1: 跟踪函数调用 2:跟踪一个包 启用 OpenLDAP 的日志功能: 1. 默认openLDAP使用的rsyslog来处理自己的日志, 它会将日志发送给 local4 这个设备, 来接受. vim /etc/rsyslog.conf local4.* /var/log/ldap.log 2. 使用cn=config方式来管理启用日志 默认openLDAP是不开启日志的, 需要需要首先添加在olcLoglevel对象,并给它赋值. cat << EOF | ldapmodify -Y EXTERNAL -H ldapi:/// dn: cn=config changetype: modify add: olcLoglevel olcLoglevel: -1 EOF 3. 重启rsyslog 和 slapd即可. 注: 若是使用的是slapd.conf 则可使用以下方式来开启.此方式仅做参考,它是slapd.conf配置openLDAP的方式,现在已不建议使用:
vim slapd.conf loglevel [-1 | any]slaptest -f /etc/openldap/slapd.conf #测试配置文件是否有语法错误.
rm -rf /etc/openldap/slapd.d/* #重新生成slapd.d这些系统数据库配置文件. slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d/ chown -R ldap.ldap /etc/openldap #最后还是重启 rsyslog 和 slapd