• 幕客老师召集小伙伴
  • 运维高手36项修炼
  • python自动化运维项目实战
  • nginx从入门到实战
  • 阿里云与Centos7实战

Openldap2.4搭建

一、LDAP简介

1、LDAP介绍

LDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP。它是基于X.500标准的,但是简单多了并且可以根据需要定制。与X.500不同,LDAP支持TCP/IP,这对访问Internet是必须的。LDAP的核心规范在RFC中都有定义,所有与LDAP相关的RFC都可以在LDAPman RFC网页中找到。

 

2、条目

 条目(Entry)就是目录管理的对象,他是LDAP中最基本的颗粒,就像字典中的词条,或者是数据库中的记录。通常对LDAP的添加、删除、更改、检索都是以条目为基本对象的。

 每一个条目都有一个唯一的标识名(distinguished Name ,DN),比如(1.1中图2互联网域名树形图):cn=doubao,ou=Ops,dc=shuyun,dc=com。DN在语法上是由多个相对的标识名(distinguished Name ,DN)组成的,他们之间由逗号分隔。如果把DN看做对象的全路径,那么RDN就是其中的每一段路径。通过DN的层次型语法结构,可以方便地表示出条目在LDAP树中的位置。有时在不一致引起歧义的情况下,RDN也特指DN中最靠前的一段,而剩余的部分称为父标识(Parent DN,PDN)。此处不再举例。RDN本身也可以由多个值构成,比如OU=Tech+CN=doubao,dc=shuyun,dc=com中的RDN为OU=Tech+CN=doubao,由2个值OU=Tech和CN=doubao组成,他们之间由加好隔开。

 

3、属性(Attribute)

每个条目都可以有很多属性(Attribute),比如常见的人都有姓名、地址、电话等属性。每个属性都有名称及对应的值,属性值可以有单个、多个。比如你有多个电话。

 LDAP为人员组织机构中常见的对象都设计了属性(比如commonName,surname)。下面有一些常用的别名。

属性 别名 语法 描述 值(举例)
commonName cn Directory String 姓名 doubao
surname sn Directory String Chen
organizationalUnitName ou Directory String 单位(部门)名称 Tech
organization o Directory String 组织(公司)名称 shuyun
telephoneNumber   Telephone Number 电话号码 110
owner   DN 该条目的拥有者 cn=doubao,ou=ops,dc=shuyun
jpegPhoto   Binary JPEG照片 ..

 

4、属性类型(AttributeType)

  每个属性都有唯一的属性类型(AttributeType),属性类型约定属性值的数据格式和语法类型(Syntax)。比如,属性cellPhone的类型为telephoneNumber,它规定了电话号码是由数字组成的,其中允许插入一些分隔符,如连接符、括号、空格等。

 属性类型也约定了属性值是否可以有多少个,多值属性类型也可以使人员信息的组织变得更加灵活并接近现实情况,比如:人员的手机、地址、邮箱等属性都可以有多个值。这样,用ldap组织的信息会比简单的表结构更加理想。

  类型也规定了属性查询时的匹配规则、排序顺序、大小写敏感等。

 

5、对象类(ObjectClass)

对象类(ObjectClass)是属性的集合,LDAP预想了很多人员组织机构中常见的对象,并将其封装成对象类。比如人员(person)含有姓(sn)、名(cn)、电话(telephoneNumber)、密码(userPassword)等属性,单位职工organizationalPerson)是人员(person)的继承类,除了上述属性之外还含有职务(title)、邮政编码(postalCode)、通信地址(postalAddress)等属性。

通过对象类可以方便的定义条目类型。每个条目可以直接继承多个对象类,这样就继承了各种属性。如果2个对象类中有相同的属性,则条目继承后只会保留1个属性。对象类同时也规定了那些属性是基本信息,必须含有(Must 活Required,必要属性):哪些属性是扩展信息,可以含有(May或Optional,可选属性)。

对象类有三种类型:结构类型(Structural)、抽象类型(Abstract)和辅助类型(Auxiliary)。结构类型是最基本的类型,它规定了对象尸体的基本属性,每个条目属于且仅属于一个结构型对象类。抽象类型可以是结构类型或其他抽象类型父类,它公国将对象属性中共性的部分组织在一起,称为其他类的模板,条目不能直接集成抽象型对象类。辅助类型规定了对象实体的扩展属性。虽然每个条米只属于一个结构型对象类,但可以同时属于多个辅助型对象类。

 

如果将其中一支 top-->person-->organizationalPerson-->inetOrgPerson的必要属性和可选属性列表(表1-5-2),就会发现这种设计还是非常合理的。我们可以从任何一个对象派生出自己的对象类,比如organizationalPerson派生出职工(employee)对象类,那么它可以含有工号(employeeNumber)、工种(employeeType)等属性。注意,对象类继承的时候会把属性是必须(Must)还是可选(May)的特性也一并继承。也就是说person有cn和sn两个Must属性,organizationalPerson和inetOrgPerson由于直接或间接继承了person,也会有这两个Must属性。

表1-5-2

对象类 必要属性(Required) 可选属性(Optional)
top objectClass
person cn description seeAlso telephoneNumber
sn userPassword    
organizationalPerson destinationIndicator facsimileTelephoneNumber internationalISDNNumber
1 ou physicalDeliveryOfficeName
postalAddress postalCode postOfficeBox
preferredDeliveryMethod registeredAddress st
street teletexTerminalIdentifier telexNumber
title x121Address  

 

 

对象类 必要属性(Required) 可选属性(Optional)
inetOrgPerson   audio businessCategory carLicense
departmentNumber displayName employNumber
employeeType givenName homePhone
homePostalAddress initals jpegPhoto
labeledURL mail manager
mobile o pager
photo preferredLanguage roomNumber
secretary uid userCertificate
userOKCS12 userSMIMECertificate x500UniqueIdentifier

 

6、模式(Schema)

对象类(ObjectClass)、属性类型(AttributeType)、语法(Syntax)分别约定了条目、属性、值,他们之间的关系如下图所示。所以这些构成了模式(Schema),模式中的每一个元素都有唯一的OID编号,如2.5.4.41.条目数据在导入时通常需要接受模式检查,它确保了目录中所有的条目数据结构都是一致的。

OpenLDAP:OpenLDAP轻型目录访问协议(Lightweight Directory Access Protocol,LDAP)的自由和开源的实现,在其OpenLDAP许可证下发行,并已经被包含在众多流行的Linux发行版中,我们这里使用的是openldap2.4版本.

 

二、openldap的搭建

实验环境:

centos6.8两台

ldap01.imoocc.com                         192.168.10.250

ldap02.imoocc.com                         192.168.10.249

1.修改配置文件和主机名(两台都做)

www.iaskjob.com         localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost     localhost.localdomain localhost6 localhost6.localdomain6
192.168.10.250 ldap01.imoocc.cn ldap01
192.168.10.249 ldap02.imoocc.cn ldap02

2.关闭防火墙并重启 让主机名生效

service iptablesstop

chkconfig iptables off reboot

3.yum 安装openldap 

yum install -y openldap-servers openldap-clients

4.启用日志记录

mkdir /var/log/slapd ; chmod 755 /var/log/slapd/ ;chown ldap:ldap /var/log/slapd/

echo 'local4.* /var/log/slapd.log' >> /etc/rsyslog.conf service rsyslog restart

5.创建证书

Country Name = 国家名 
State or Province Name = 州或省名 
Locality Name = 城市名 
Organization Name  = 单位名(oyf) 
Organizational Unit Name = YFLDAP 
Common Name = 主机名(yf01) 
Email Address = 电子邮件

cd /etc/pki/tls/certs

make slapd.pem

//这条命令可以用来查看生成后的证书的信息:openssl x509 -in /etc/pki/tls/certs/slapd.pem -noout -text

chmod 640 /etc/pki/tls/certs/slapd.pem

 chown :ldap /etc/pki/tls/certs/slapd.pem

 ln -s /etc/pki/tls/certs/slapd.pem /etc/openldap/certs/slapd.pem6.slappasswd加密密码

slappasswd

                New password:

                Re-enter new password:

{SSHA}WQ52ZbS9g6iwIe+ubvnTIXWkxHAvhBdQ

6.复制配置文件 

 cp /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/slapd.conf

cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG

配置文件及解析如下

MASTER:

 

vim /etc/openldap/slapd.conf

#
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#

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
include /etc/openldap/schema/ppolicy.schema
include /etc/openldap/schema/collective.schema
include /etc/openldap/schema/radius.schema                   由于我们公司的数据有这个属性,所以这个schema必须导入至/etc/openldap/schema,在配置文件中也必须要写入

# Allow LDAPv2 client connections. This is NOT the default.
allow bind_v2   简单的认证方式,此版本已经支持v3

# Do not enable referrals until AFTER you have a working directory
# service AND an understanding of referrals.
#referral ldap://root.openldap.org

pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args

# Load dynamic backend modules
# - modulepath is architecture dependent value (32/64-bit system)
# - back_sql.la overlay requires openldap-server-sql package
# - dyngroup.la and dynlist.la cannot be used at the same time

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

# moduleload accesslog.la
# moduleload auditlog.la
# moduleload back_sql.la
# moduleload chain.la
# moduleload collect.la
# moduleload constraint.la
# moduleload dds.la
# moduleload deref.la
# moduleload dyngroup.la
# moduleload dynlist.la
# moduleload memberof.la
# moduleload pbind.la
# moduleload pcache.la
# moduleload ppolicy.la
# moduleload refint.la
# moduleload retcode.la
# moduleload rwm.la
# moduleload seqmod.la
# moduleload smbk5pwd.la
# moduleload sssvlv.la
moduleload syncprov.la
# moduleload translucent.la
# moduleload unique.la
# moduleload valsort.la
#overlay ppolicy
#ppolicy_hash_cleartext

# The next three lines allow use of TLS for encrypting connections using a
# dummy test certificate which you can generate by running
# /usr/libexec/openldap/generate-server-cert.sh. Your client software may balk
# at self-signed certificates, however.
#TLSCACertificatePath /etc/openldap/certs
#TLSCertificateFile "\"OpenLDAP Server\""
#TLSCertificateKeyFile /etc/openldap/certs/password

#TLSCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
#TLSCertficateFile /etc/pki/tls/certs/slapd.pem
#TLSCertficateKeyFile /etc/pki/tls/certs/slapd.pem
TLSCACertificatePath /etc/openldap/certs

TLSCertificateFile "\"OpenLDAP Server\""
TLSCertificateKeyFile /etc/openldap/certs/password指定认证证书及密码存在路径

# Sample security restrictions
# Require integrity protection (prevent hijacking)
# Require 112-bit (3DES or better) encryption for updates
# Require 63-bit encryption for simple bind
# security ssf=1 update_ssf=112 simple_bind=64

# Sample access control policy:
# Root DSE: allow anyone to read it
# Subschema (sub)entry DSE: allow anyone to read it
# Other DSEs:
# Allow self write access
# Allow authenticated users read access
# Allow anonymous users to authenticate
# Directives needed to implement policy:
# access to dn.base="" by * read
# access to dn.base="cn=Subschema" by * read
# access to *
# by self write
# by users read
# by anonymous auth
#
# if no access controls are present, the default policy
# allows anyone and everyone to read anything but restricts
# updates to rootdn. (e.g., "access to * by * read")
#
# rootdn can always read and write EVERYTHING!

# enable on-the-fly configuration (cn=config)
database config  访问控制
access to *
by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
by * none

# enable server status monitoring (cn=monitor)
database monitor
access to *
by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read
by dn.exact="cn=Manager,dc=imoocc,dc=com" read
by * none

#######################################################################
# database definitions
#######################################################################

database bdb     数据库类型
suffix "dc=imoocc,dc=com" 服务域名
checkpoint 1024 15      
rootdn "cn=Manager,dc=imoocc,dc=com"   指定OpenLDAP 服务管理员信息
# Cleartext passwords, especially for the rootdn, should
# be avoided. See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
rootpw 123
# rootpw {crypt}ijFYNcSNctBYg
#rootpw {SSHA}bVel0DPxYBzgtj2fZrxtTVUX8s7zzNEf    openldap的密码,可采用加密的方式
# The database directory MUST exist prior to running slapd AND
# should only be accessible by the slapd and slap tools.
# Mode 700 recommended.
directory /var/lib/ldap   数据存放的物理位置

# Indices to maintain for this database
index objectClass eq,pres
index ou,cn,mail,surname,givenname eq,pres,sub
index uidNumber,gidNumber,loginShell eq,pres
index uid,memberUid eq,pres,sub
index nisMapName,nisMapEntry eq,pres,sub
index entryCSN eq
index entryUUID eq       添加openldap的索引

# Replicas of this database
#replogfile /var/lib/ldap/openldap-master-replog
#replica host=ldap-1.example.com:389 starttls=critical
# bindmethod=sasl saslmech=GSSAPI
# authcId=host/ldap-master.example.com@EXAMPLE.COM
#replication
#index entryCSN,entryUUID eq
#overlay syncprov
#syncprov-checkpoint 100 10
#syncprov-sessionlog 100
#server ID 123
#replica host=192.168.8.236:389
# binddn="dc=oyf,dc=xyz"
# bindmethod=simple credentials=123
#master replia server start
overlay syncprov     工作在overlay模式下
syncprov-checkpoint 100 10      同步的满足條件,当满足修改100个条目或10分钟主动进行推送一次   
syncprov-sessionlog 100           会话日志条目的最大数量

SLAVE:

其他基本一样,只是最后添加

loglevel 256                 日志级别
syncrepl rid=123          主机id號(<rid>必须超过三位数字)
provider=ldap://192.168.10.250:389     masterIP
type=refreshOnly            同步模式为拉
retry="5 5 300 +"            连接不上时,重新连接
interval=00:00:00:30      同步频率为30秒
searchbase="dc=imoocc,dc=com"  搜索根目录
filter="(objectClass=*)"          搜索类型为所有
scope=sub                            匹配范围:base只与所给的DN相匹配,one只与父条目是所给DN的条目相匹配,sub只与根为所给DN的子树下是所有条目相匹配
attrs="*,+"                             复制属性(所有)
schemachecking=off            同步时不检查schema的属性
bindmethod=simple              绑定的模式
binddn="cn=Manager,dc=imoocc,dc=com"        绑定的dn
credentials=123                    认证密码

7.开启加密支持

vim /etc/sysconfig/ldap //修改

SLAPD_LDAPS=yes

8.修改ldap配置文件

vim /etc/openldap/ldap.conf //这几个粘贴到最后几行

BASE dc=oyf,dc=xyz URI ldap://localhost

TLS_REQCERT never

9.导入配置文件

首先,编辑需导入的配置文件root.ldif(必须以ldif结尾),然后再将配置文件导入

slapadd -l root.ldif     初次导入

ldapadd -x -D "cn=Manager,dc=imoocc,dc=com" -w123 -f a.ldif  部分导入

chown -R ldap:ldap /var/lib/ldap           修改权限

chown -R ldap:ldap /etc/openldap/slapd.d

10.启动slapd进程

/etc/init.d/slapd start

三、数据导入、导出、删除

1.数据导入

eg:

slapadd -l root.ldif     初次导入

ldapadd -x -D "cn=Manager,dc=imoocc,dc=com" -w123 -f a.ldif  部分导入

2.数据导出

slapcat -v -l ldapbackup.ldif

这种方法将会产生一些无用的信息,需进行过滤

cat >slapcat.regex <<EOF

 /^creatorsName: /d

 /^createTimestamp: /d

 /^modifiersName: /d

 /^modifyTimestamp: /d

 /^structuralObjectClass: /d

 /^entryUUID: /d

 /^entryCSN: /d

EOF

cat ldapback.ldif | sed -f slapcat.regex > slapdata.ldif

或者

ldapsearch -LLL -x -H  ldap://192.168.10.40 -b 'dc=imoocc,dc=com' > slapdata2.ldif

3.数据删除

ldapdelete -x -D "cn=Manager,dc=imoocc,dc=com" -W "cn=wangji,cn=Manager,dc=imoocc,dc=com"

四、2.3与2.4的主从复制对比

OpenLdap v2.3之前的同步复制缺点:

slurpd守护进程是以推模式操作 : 主服务器推送变更的数据到从服务器  (不可靠)
对replog中的记录的次序极为敏感
很容易失去同步, 这时需要手工干预来从主目录重新同步从服务器数据库
如果一个从服务器长时间停机,replog可能变得太大以至于slurpd无法处理
只工作在推模式(也可以设置为拉模式,但是这种感觉类似于将master上的数据做了一个快捷连接到slave上)
需要停止和重新启动主服务器来增加从服务器
只支持单一主服务器复制(1台主对多从)
 

OpenLDAP v2.4之后的同步功能:

 PS:新版最大的功能就是实现了双向复制,即双主、多主模式,无论哪一台master宕机,都不会影响使用。

 新版主从配置有五中方式,这里只讲述最基本也是最简单的Syncrepl主从配置、MirrorMode镜像模式N-Way Multi-Master(多主)三种方式。

Syncrepl

该方式是slave服务器以拉的方式同步master的用户数据

  该方式缺点:当你修改一个条目中的一个属性值(or大批量的万级别的某1属性值),它不是简单的同步过来这些属性,而是把修改的条目一起同步更新来。

Delta-syncrepl

比上一条多了个功能:基于日志同步:

    你在master每更改1条记录,肯定会产生1条日志,那么slave会通过你的master日志进行相应的修改,这就克服了上一条的缺点。

N-Way Multi-Master 多主方式同步LDAP信息
MirrorMode

该方式是服务器互相推送信息的方式同步用户数据

MirrorMode只支持2个主master(2个主master可以+N个slave),但是你如果非得加了3 、4 台master后,那么其余的都只能从前2台master上获取数据,而不能将本身的数据推送过去。

如果你有类似需求,也可以使用这个方式。(比如,你企业分散点多,然后不希望都具有修改功能,可以使用它)

Syncrepl Proxy

代理同步。

意思是将主master隐藏起来,而代理机上边通过Syncrepl从master主机以拉的方式同步master用户数据,当代理主机发生改变时,代理主机的LDAP又以推的方式将数据更新到下属的slave LDAP服务器上。slave LDAP 只有对代理LDAP服务器的读权限。

Openldap2.4搭建

Pingbacks已打开。

引用地址

暂无评论

发表评论