LDAP

LDAP

目录可以被理解成是一种为查询、浏览或搜索的数据库,但数据库又分为了目录数据库和关系数据库,目录数据库主要用于存储较小的信息(如姓名、电话、主机名等),同时具有很好的读性能,但在写性能方面比较差,所以不适合存放那些需要经常修改的数据。

目录服务则是由目录数据库和一套能够访问和处理数据库信息的协议组成的服务协议,用于集中的管理主机帐号密码,员工名字等数据,大大的提升了管理工作效率。轻量级目录访问协议LDAP(Lightweight Directory Access Protocol)是在目录访问协议X.500的基础上研发的,主要的优势是:

X.500目录协议功能非常臃肿,消耗大量资源,无法做到快速查询且不支持TCP/IP协议网络。
LDAP采用树状结构存储数据(类似于前面学习的DNS服务程序),用于在IP网络层面实现对分布式目录的访问和管理操作,条目是LDAP协议中最基本的元素,可以想象成字典中的单词或者数据库中的记录,通常对LDAP服务程序的添加、删除、更改、搜索都是以条目为基本对象的。
LDAP的读写比例是10:1,读取速度是可取之处。方便人员管理。
名词解释:
dn:每个条目的唯一标识符
rdn:一般为dn值中最左侧的部分
base DN:此为基准DN值,表示顶层的根部

而每个条目可以有多个属性(如姓名、地址、电话等),每个属性中会保存着对象名称与对应值,LDAP已经为运维人员对常见的对象定义了属性,其中有:

属性名称 属性别名 语法 描述 值(举例)
commonName cn Directory String 名字 sean
surname sn Directory String 姓氏
organizationalUnitName ou Directory String 单位(部门)名称 IT_SECTION
organization o Directory String 组织(公司)名称 example
telephoneNumber Telephone Number 电话号码
objectClass 内置属性 organizationalPerson

LDAP服务端配置

设置hosts文件,并安装软件包,migrationtools是一个格式转换工具

~]# echo " 172.16.0.102 ldap.example.com" >> /etc/hosts
~]# setenforce 0       #减少操作过程,将SELINUX设置为允许模式
~]# yum install -y openldap openldap-clients openldap-servers migrationtools

生成密钥文件(记下生成出的值,后面要用)

~]# slappasswd -s password -n > /etc/openldap/passwd
]# cat /etc/openldap/passwd 
{SSHA}rqbxPE4YNh1H/eGvTP2fyjP5NuMcpoMR

因为LDAP目录服务是以明文的方式在网络中传输数据的(包括密码),这样很不安全,所以我们采用TLS加密机制来解决这个问题,使用openssl工具生成X509格式的证书文件(有效期为365天):


 ~]# openssl req -new -x509 -nodes -out /etc/openldap/certs/cert.pem -keyout /etc/openldap/certs/priv.pem -days 365
Generating a 2048 bit RSA private key
...................................................................................................+++
.................................................+++
writing new private key to '/etc/openldap/certs/priv.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:ldap.example.com   #此处输入本地主机名称
Email Address []:

设置证书属主权限

 ~]# chown ldap:ldap /etc/openldap/certs/*
 ~]# chmod 600 /etc/openldap/certs/priv.pem

复制一份LDAP的配置模板:

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

生成数据库文件(不用担心报错信息):

~]# slaptest 
59490c02 hdb_db_open: database "dc=my-domain,dc=com": db_open(/var/lib/ldap/id2entry.bdb) failed: No such file or directory (2).
59490c02 backend_startup_one (type=hdb, suffix="dc=my-domain,dc=com"): bi_db_open failed! (2)
slap_startup failed (test would succeed using the -u switch)

修改LDAP数据库的所属主与组:

 ~]# chown ldap:ldap /var/lib/ldap/*

启动slapd服务程序并设置为开机启动:

~]# systemctl restart slapd
 ~]# systemctl enable slapd

在LDAP目录服务中使用LDIF(LDAP Interchange Format)格式来保存信息,而LDIF是一种标准的文本文件且可以随意的导入导出,所以我们需要有一种“格式”标准化LDIF文件的写法,这中格式叫做“schema”,schema用于指定一个目录中所包含对象的类型,以及每一个类型中的可选属性,我们可以将schema理解为面向对象程序设计中的“类”,通过“类”定义出具体的对象,因此其实LDIF数据条目则都是通过schema数据模型创建出来的具体对象:

ldapadd命令用于将LDIF文件导入到目录服务数据库中,格式为:“ldapadd [参数] LDIF文件”。

参数 作用
-x 进行简单认证。
-D 用于绑定服务器的dn。
-h: 目录服务的地址。
-w: 绑定dn的密码。
-f: 使用LDIF文件进行条目添加的文件。

]# ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/cosine.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=cosine,cn=schema,cn=config"
]# ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/nis.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=nis,cn=schema,cn=config"

创建/etc/openldap/changes.ldif文件,并将下面的信息复制进去(注意有一处要修改的地方):

~]# vim /etc/openldap/changes.ldif
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=example,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=example,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW:{SSHA}rqbxPE4YNh1H/eGvTP2fyjP5NuMcpoMR  #此处秘钥是先前生成的,粘贴到此处

replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/openldap/certs/cert.pem

dn: cn=config
changetype: modify
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/openldap/certs/priv.pem

dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: -1

dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.base="cn=Manager,dc=example,dc=com" read by * none

将新的配置文件更新到slapd服务程序:

 ~]# ldapmodify -Y EXTERNAL -H ldapi:/// -f /etc/openldap/changes.ldif 
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "cn=config"
modifying entry "cn=config"
modifying entry "cn=config"
modifying entry "olcDatabase={1}monitor,cn=config"

创建/etc/openldap/base.ldif文件,并将下面的信息复制进去:

 vim /etc/openldap/base.ldif

dn: dc=example,dc=com
dc: example
objectClass: top
objectClass: domain

dn: ou=People,dc=example,dc=com
ou: People
objectClass: top
objectClass: organizationalUnit

dn: ou=Group,dc=example,dc=com
ou: Group
objectClass: top
objectClass: organizationalUnit

创建目录的结构服务:

~]# ldapadd -x -w password -D cn=Manager,dc=example,dc=com -f /etc/openldap/base.ldif

创建二十个ldap测试用户

~]# for user in $( seq 1 20 );do useradd -d /home/ldapuser$user ldapuser$user ;done

设置帐户的迁移(修改第71与74行)

~]# vim /usr/share/migrationtools/migrate_common.ph
$DEFAULT_MAIL_DOMAIN = "example.com";
$DEFAULT_BASE = "dc=example,dc=com";

将当前系统中的用户迁移至目录服务:

~]# cd /usr/share/migrationtools/
migrationtools]# grep "^ldapuser*" /etc/passwd > passwd
migrationtools]# ./migrate_passwd.pl passwd users.ldif
migrationtools]# ldapadd -x -w passwd -D cn=Manager,dc=example,dc=com -f users.ldif 
adding new entry "uid=ldapuser1,ou=People,dc=example,dc=com"
adding new entry "uid=ldapuser2,ou=People,dc=example,dc=com"
......

将当前系统中的用户组迁移至目录服务:

migrationtools]# grep "^ldapuser*" /etc/group > group
migrationtools]# ./migrate_group.pl group groups.ldif
migrationtools]# ldapadd -x -w passwd -D cn=Manager,dc=example,dc=com -f groups.ldif
adding new entry "cn=ldapuser1,ou=Group,dc=example,dc=com"
adding new entry "cn=ldapuser2,ou=Group,dc=example,dc=com"
......

测试ldapuser1用户的配置文件:

migrationtools]# ldapsearch -x cn=ldapuser1 -b dc=example,dc=com
# extended LDIF
#
# LDAPv3
# base <dc=example,dc=com> with scope subtree
# filter: cn=ldapuser1
# requesting: ALL
#

# ldapuser1, People, example.com
dn: uid=ldapuser1,ou=People,dc=example,dc=com
uid: ldapuser1
cn: ldapuser1
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword:: e2NyeXB0fSEh
shadowLastChange: 17337
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/1

# ldapuser1, Group, example.com
dn: cn=ldapuser1,ou=Group,dc=example,dc=com
objectClass: posixGroup
objectClass: top
cn: ldapuser1
userPassword:: e2NyeXB0fXg=
gidNumber: 1000

# search result
search: 2
result: 0 Success

# numResponses: 3
# numEntries: 2

安装httpd服务程序通过httpd协议传输秘钥文件:

~]# yum install httpd

将密钥文件copy至网站目录:

~]# cp /etc/openldap/certs/cert.pem /var/www/html
~]# systemctl restart httpd
~]# firewall-cmd --permanent --add-service=http
~]# firewall-cmd --reload

在日志记录服务的配置文件中追加下面语句,并重启日志服务:

~]# vim /etc/rsyslog.conf
local4.* /var/log/ldap.log

~]# systemctl restart rsyslog

创建用户家目录的nfs共享

echo "/home 172.16.0.*(rw,sync,root_squash)" >> /etc/exports
exportfs -r				#重读nfs共享配置文件

systemctl restart nfs-server rpcbind
~]# firewall-cmd --permanent --add-service=nfs
~]# firewall-cmd --permanent --add-service=rpc-bind
~]# firewall-cmd --reload

配置LDAP客户端
~]# echo "172.16.0.102 ldap.example.com" >> /etc/hosts
以下有三种挂载方式,任选其一
authconfig-tui方式

 ]#  yum install openldap-clients nss-pam-ldapd authconfig pam_krb5
 ~]# authconfig-tui

此处说明需要把CA证书放入指定目录

拷贝CA的证书文件至本地证书目录

~]# scp root@ldap.example.com:/etc/openldap/certs/cert.pem /etc/openldap/cacerts/cert.pem
更新
~]#  authconfig --enableforcelegacy --update

已成功加入ldap,用户存在但是没有家目录

authconfig命令行方式

# authconfig --enableforcelegacy --update
# authconfig --enableldap --enableldapauth --ldapserver="ldap.example.com" --ldapbasedn="dc=example,dc=com" --update
# scp root@ldap.example.com:/etc/openldap/certs/cert.pem /etc/openldap/cacerts/cert.pem
# authconfig --enableldaptls --update

authconfig-gtk图形方式

~]# system-config-authentication

此处输入证书位置,可以是网络中的,也可以是下载至本地的CA证书路径

用户已加载至本地

为用户创建自动挂载家目录

 ~]# yum install autofs
 ~]# vim /etc/auto.master.d/home.autofs 
	/home /etc/auto.home
~]# vim /etc/auto.home 
	* -rw,sync ldap.example.com:/home/&

 ~]# systemctl restart autofs

用户自动挂载家目录成功

posted on 2017-06-21 09:18  architect&*  阅读(287)  评论(0编辑  收藏  举报

导航