轻量级目录访问协议(简称LDAP)是一个用于访问目录服务的工业标准的、轻量的、广泛使用的协议集。目录服务是一个用于访问、管理、组织和更新每天的项以及网络资源的共享信息基础设施,诸如用户、组、设备、邮件地址、电话号码、卷以及很多其它对象。
LDAP信息模型是基于entries。在一个LDAP目录中一个entry代表一个单元或信息并且唯一地被称为标识名(DN)的东西识别。这个entry的每个属性有一个类型以及一个或多个值。
一个属性是与一个entry关联的一段信息。类型一般是助记字符串,诸如"cn"对应常见名称、或者"mail"对应邮件地址。每个属性被分配一个或多个在空格分隔列表中组成的值。
以下是一个在LDAP目录中如何排列信息的说明。
本文讲解在CentOS7和Debain上如何为集中认证安装和配置OpenLDAP服务器。
1、首先通过以下命令安装OpenLDAP(一个LDAP的开源实现)以及一些传统的LDAP管理工具开始。
- # Debain
- root@gyl-huawei:/home/blctrl# apt install slapd ldap-utils
-
- # CentOS7
- [root@bjAli ~]# yum install openldap openldap-servers openldap-clients nss-pam-ldapd
在Debian上,在这个包安装过程中,将提示你输入在你LDAP目录中用于admin entry的密码,设置一个安全密码并且确认它。
在安装结束时,你可以按如下解释启动这个服务。
2、在CentOS7上,运行以下命令来启动openldap服务器守护进程,使它能在系统启动时自动启动并且检查它是否启动并且这个在运行。
- [root@bjAli ~]# systemctl start slapd
- [root@bjAli ~]# systemctl enable slapd
- Created symlink from /etc/systemd/system/multi-user.target.wants/slapd.service to /usr/lib/systemd/system/slapd.service.
- [root@bjAli ~]# systemctl status slapd
- ● slapd.service - OpenLDAP Server Daemon
- Loaded: loaded (/usr/lib/systemd/system/slapd.service; enabled; vendor preset: disabled)
- Active: active (running) since Tue 2022-09-06 23:30:16 CST; 29s ago
- Docs: man:slapd
- man:slapd-config
- man:slapd-hdb
- man:slapd-mdb
- file:///usr/share/doc/openldap-servers/guide.html
- Main PID: 2649 (slapd)
- CGroup: /system.slice/slapd.service
- └─2649 /usr/sbin/slapd -u ldap -h ldapi:/// ldap:///
3、接着,允许对LDAP服务器的请求通过防火墙。
- [root@bjAli ~]# firewall-cmd --add-service=ldap
- success
通过永远启用以下booleans确认SELinux在服务器和客户端都不妨碍。
[root@localhost ~]# setsebool -P allow_ypbind=0 authlogin_nsswitch_use_ldap=0
此处基于LDAP的授权需要allow_ypbind,并且可能某些程序需要authlogin_nsswitch_use_ldap。
4、由于slapd服务以ldap用户运行(你可以用ps -e -o pid,uname,comm | grep slapd验证它),为了这个服务器能够修改只能由root运行的管理工具创建的entries,这个用户应该拥有/var/lib/ldap目录。
- [root@localhost ~]# ps -e -o pid,uname,comm | grep slapd
- 20267 ldap slapd
在更改递归地更改这个目录所有权前,为slapd复制示例数据库配置文件到它中:
- [root@localhost ~]# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
- [root@localhost ~]# chown -R ldap:ldap /var/lib/ldap
注意:不推荐手动编辑LDAP配置,你需要在一个文件中添加配置并且使用ldapadd或ldapmodify命令来装载它们到LDAP目录。
4、现在创建一个OpenLDAP管理用户并且为那个用户分配一个密码。在以下命令中,为指定密码创建一个哈希值,记住它,你将在LDAP配置文件中使用它。
- [root@localhost ~]# slappasswd
- New password:
- Re-enter new password:
- {SSHA}5sY+fTG3zsPB3D5Xunt3ousmoFhQMTne
5、接着创建一个LDIF文件(ldaprootpasswd.ldif),其用于添加一个entry到LDAP目录。
[root@localhost ~]# vim ldaprootpasswd.ldif
在以上文件中添加以下内容:
- dn: olcDatabase={0}config,cn=config
- changetype: modify
- add: olcRootPW
- olcRootPW: {SSHA}5sY+fTG3zsPB3D5Xunt3ousmoFhQMTne
解释以上的属性-值对:
指向先前提供地理论后台,ldaprootpasswd.ldif文件将添加一个entry到这个LDAP目录。在那个entry中,每行代表一个属性:值对(此处dn,changetype, add和olcRootPW是属性,每个冒号右边的字符串是它们对应的值)。
你会要记住随着深入,并且请注意我们在本文剩下部分使用相同的常见名称(cn=),每一步都取决于前一步。
6、现在,通过指定指向这个ldap服务器的URI添加相应的LDAP entry,此处只允许协议/主机/端口字段。输出应该类似以下:
- [root@localhost ~]# ldapadd -H ldapi:/// -f ldaprootpasswd.ldif
- 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"
并且从/etc/openldap/schema目录导入一些基本的LDAP定义:
- [root@localhost ~]# for def in cosine.ldif nis.ldif inetorgperson.ldif; do ldapadd -H ldapi:/// -f /etc/openldap/schema/$def; done
- 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"
-
- 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"
-
- SASL/EXTERNAL authentication started
- SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
- SASL SSF: 0
- adding new entry "cn=inetorgperson,cn=schema,cn=config"
7、使LDAP使用在其数据库中你的域。创建有以下内容的另一个LDIF文件,我们称其ldapdomian.ldif,恰当地替换你的域(在Domain Component dc=)以及密码:
- 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=mydomain,dc=com" read by * none
-
- dn: olcDatabase={2}hdb,cn=config
- changetype: modify
- replace: olcSuffix
- olcSuffix: dc=mydomain,dc=com
-
- dn: olcDatabase={2}hdb,cn=config
- changetype: modify
- replace: olcRootDN
- olcRootDN: cn=Manager,dc=mydomain,dc=com
-
- dn: olcDatabase={2}hdb,cn=config
- changetype: modify
- add: olcRootPW
- olcRootPW: {SSHA}5sY+fTG3zsPB3D5Xunt3ousmoFhQMTne
-
- dn: olcDatabase={2}hdb,cn=config
- changetype: modify
- add: olcAccess
- olcAccess: {0}to attrs=userPassword,shadowLastChange by
- dn="cn=Manager,dc=mydomain,dc=com" write by anonymous auth by self write by * none
- olcAccess: {1}to dn.base="" by * read
- olcAccess: {2}to * by dn="cn=Manager,dc=mydomain,dc=com" write by * read
接着,按如下装载它:
- [root@localhost ~]# ldapmodify -H ldapi:/// -f ldapdomain.ldif
- SASL/EXTERNAL authentication started
- SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
- SASL SSF: 0
- modifying entry "olcDatabase={1}monitor,cn=config"
-
- modifying entry "olcDatabase={2}hdb,cn=config"
-
- modifying entry "olcDatabase={2}hdb,cn=config"
-
- modifying entry "olcDatabase={2}hdb,cn=config"
-
- modifying entry "olcDatabase={2}hdb,cn=config"
8、现在是时候添加一些entries到我们的LDAP目录。在以下称为baseldapdomain.ldif的文件中,我们通过一个冒号分隔属性和值。
- dn: dc=mydomain,dc=com
- objectClass: top
- objectClass: dcObject
- objectclass: organization
- o: mydomain com
- dc: mydomain
-
- dn: cn=Manager,dc=mydomain,dc=com
- objectClass: organizationalRole
- cn: Manager
- description: Directory Manager
-
- dn: ou=People,dc=mydomain,dc=com
- objectClass: organizationalUnit
- ou: People
-
- dn: ou=Group,dc=mydomain,dc=com
- objectClass: organizationalUnit
- ou: Group
添加entries到LDAP目录:
- [root@localhost ~]# ldapadd -x -D cn=Manager,dc=mydomain,dc=com -W -f baseldapdomain.ldif
- Enter LDAP Password:
- adding new entry "dc=mydomain,dc=com"
-
- adding new entry "cn=Manager,dc=mydomain,dc=com"
-
- adding new entry "ou=People,dc=mydomain,dc=com"
-
- adding new entry "ou=Group,dc=mydomain,dc=com"
9、创建一个称为ldapuser的LDAP用户(adduser ldapuser),接着在ldapgroup.ldif中为一个LDAP组创建定义。
- [root@localhost ~]# adduser ldapuser
- [root@localhost ~]# vim ldapgroup.ldif
添加以下内容:
- dn: cn=Manager,ou=Group,dc=mydomain,dc=com
- objectClass: top
- objectClass: posixGroup
- gidNumber: 1001
此处gidNumber是在/etc/group中对应ldapuser的GID并且装载它:
- [root@localhost ~]# ldapadd -x -W -D "cn=Manager,dc=mydomain,dc=com" -f ldapgroup.ldif
- Enter LDAP Password:
- adding new entry "cn=Manager,ou=Group,dc=mydomain,dc=com"
10、为用户ladpuser添加一个带有定义的LDIF文件(ldapuser.ldif):
- dn: uid=ldapuser,ou=People,dc=mydomain,dc=com
- objectClass: top
- objectClass: account
- objectClass: posixAccount
- objectClass: shadowAccount
- cn: ldapuser
- uid: ldapuser
- uidNumber: 1001
- gidNumber: 1001
- homeDirectory: /home/ldapuser
- userPassword: {SSHA}f5sY+fTG3zsPB3D5Xunt3ousmoFhQMTne
- loginShell: /bin/bash
- gecos: ldapuser
- shadowLastChange: 0
- shadowMax: 0
- shadowWarning: 0
并且装载它:
- [root@localhost ~]# ldapadd -x -D cn=Manager,dc=mydomain,dc=com -W -f ldapuser.ldif
- Enter LDAP Password:
- adding new entry "uid=ldapuser,ou=People,dc=mydomain,dc=com"
同样,你可以删除你刚才创建的用户entry:
ldapdelete -x -W -D cn=Manager,dc=mydomain,dc=com "uid=ldapuser,ou=People,dc=mydomain,dc=com"
11、允许通信通过防火墙:
- [root@localhost ~]# firewall-cmd --add-service=ldap
- success
12、最后,但并非不重要,启用客户端使用LDAP验证。
在最后一步,我们将使用authconfig工具(一个用于配置系统验证资源的接口)。使用以下命令,如果在对LDAP服务器的身份验证成功后,对应被请求用户的家目录不存在,则创建它:
[root@localhost ~]# authconfig --enableldap --enableldapauth --ldapserver=rhel7.mydomain.com --ldapbasedn="dc=mydomain,dc=com" --enablemkhomedir --update